生成器 與類和對象無關,與魔法方法沒有關係。
生成器,實際上就是迭代器的一種實現。
爲什麼有了迭代器,還要有一個生成器呢?
首先我們來講一下迭代器的缺點,迭代器必須要定義一個類,重寫__iter__(self)
, __next__(self)
這兩個方法,纔可以對某一個對象進行迭代。
生成器,只需要在普通的函數中,加入 yield 這個語句即可,使它編程一個特殊的函數。
生成器類似一個協同程序。
協程程序:可以運行的獨立函數調用,函數可以暫停或者掛起,並且在需要的時候從程序離開的地方繼續,或者重新開始。
舉一個例子
def myGen():
print("生成器被執行")
#第一次執行結束返回1
yield 1
#處理......
#第二次執行,可以從頭開始,也可以從yield 1 之後繼續執行,然後返回 yield 2
yield 2
#後面已經沒有語句了,如果接着調用myGen()這個函數,就會拋出 StopIteration 異常。
實現斐波那契額數列,打印前10個
def fibs():
f1 = 0
f2 = 1
while True:
f1 , f2 = f2 , f1+f2
yield f1
times = 0
for item in fibs():
if times == 9:
break
print(item,end=" ")
times+=1
列表推導式
列表推導式是python3 的一個特性。
舉個例子
(Python中 0爲假 其餘的數爲真)
a = [i for i in range(100) if not(i % 2) and i % 3]
print(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]
也就是這個列表保存的是可以被 2 整除,不能被 3 整除的數。
字典推導式
b = {i :(i % 2 == 0) for i in range(10)}
#{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
也就是如果這個 key 是偶數,值爲真,如果爲奇數,值爲假。
集合推導式
c = {i for i in [1,1,2,3,5,8,13]}
print(c)
#結果:{1, 2, 3, 5, 8, 13}
注意沒有字符串推導式,也沒有元組推導式。
生成器推導式,自動生成一個推導式,使用next() 進行調用
e = (i for i in range(10))
print(next(e))
#0
print(next(e))
#1