python 生成器與推導式

生成器 與類和對象無關,與魔法方法沒有關係。
生成器,實際上就是迭代器的一種實現
爲什麼有了迭代器,還要有一個生成器呢?

首先我們來講一下迭代器的缺點,迭代器必須要定義一個類,重寫__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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章