1. 程式人生 > >Python 第十八天學習筆記

Python 第十八天學習筆記

迭代器

提供迭代方法的容器稱為迭代器,通常接觸的迭代器有序列(列表,元組,字串)和字典

字典:   {鍵:項}

links = {"爸爸":"father",\

         "媽媽":"mother",\
         "妹妹":"sister"}
for each in links:

    print("%s -> %s" % (each,links[each]))          %s表示字串

結果:

爸爸 -> father
媽媽 -> mother
妹妹 -> sister

關於迭代,Python有兩個BIF,分別是:

iter()      

next()

>>> string = "fishc"
>>> it = iter(string)

>>> while True:
try:
each = next(it)
except StopIteration:
break

print(each)

與for迴圈結果相同:

>>> for each in string:

print(each)

魔法方法:

__iter()__

__next()__

#斐波那契數列,一個數是前兩個數的和
class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def __iter__(self):
        return self
    def __next__(self):
        self.a, self.b=self.b, self.a + self.

       譯為:self.a = self.b  同時  self.b = self.a+self.b  ,一定是同時,不能分開寫

        return self.a

>>> fibs = Fibs():

>>> for each in fibs:
if each < 20:

print(each)

生成器

def fibs():
a = 0
b = 1
while True:
a,b = b,a+b
yield a

for each in fibs():
if each <20:

print(each)

列表推導式

求100 以內,能被2整除,但不能被3整除的所有整數:

>>> a = [i for i in range(100) if not(i % 2) and (i % 3)

]
>>> a
[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]

如果i是偶數,則  i%2 == 0  , 0 表示False,not(i % 2)  表示1,True  

如果i不能被3整除,則i%3不等於0,表示True             

True and True 表示True  , 但是注意 False and False 還是等於 False


字典推導式

>>> b = {i:i%2==0 for i in range(10)}
>>> b
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}

集合推導式

>>> c = {i for i in [1,1,2,3,3,4,5,5,6,7,7]}         (去除重複數)
>>> c
{1, 2, 3, 4, 5, 6, 7}

生成器推導式   用小括號括起來

>>> e = (i for i in range(10))
>>> e
<generator object <genexpr> at 0x0000005D9EDE87D8>
>>> next(e)
0
>>> next(e)
1

>>> sum (i for i in range(10) if i %2 == 0)

20

第十三章  模組

匯入模組:

import 模組名

from 模組名 import函式名

import 模組名 as 新名字

__name__ == "__main__":

     test()

有了這個程式碼可以確保只有單獨執行某一程式碼時才會執行  test()函式

檢視檔案路徑

檢視說明


更常用print(),給人看


檢視變數說明


但是並不是所有這些名字對我們都有用,所以要過濾一些不需要的東西

用__all__屬性


不是所有的模組都有 __all__屬性,

如果一個模組設定了 __all__屬性,那麼使用  from timeit import * 這樣的形式匯入名稱空間,就只有__all__屬性這個列表裡邊的名字才會被匯入,其他的名字不受影響

如果沒有設定__all__屬性,那麼使用  from timeit import * 這樣的形式匯入名稱空間,就會把所有不以下劃線開頭的名字都匯入到當前的名稱空間

所以建議在編寫模組時,將對外提供的介面函式和類都設定到__all__屬性這個列表裡

課後題:


>>> a = range(5)

>>> it = iter(a)

>>> while True:
try:
each = next(it)
except StopIteration:
break

print(each)