python中生成器
阿新 • • 發佈:2017-08-17
語句 數列 while pytho spa ret yield col ner
1.簡介
通過列表生成式,我們可以直接創建一個列表,但是受到內存的限制,列表容量肯定是有限的。
如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?
在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。
2.示例
2.1列表生成式的[]改成(),就創建了一個generator:
1 s = (x * x for x in range(5)) 2 print(s) # <generator object <genexpr> at 0x02474A80> 3 # 可以通過next(s)不斷獲取返回值;或者使用for循環4 for x in s: 5 print(x)
2.2yield關鍵字
1 # 非波拉契數列: 2 def fib(max): 3 n, a, b = 0, 0, 1 4 while n < max: 5 print b 6 a, b = b, a + b 7 n = n + 1
使用yield 關鍵字:
1 # 把fib函數變成generator,只需要把print b改為yield b. 2 def fib1(max): 3 n, a, b = 0, 0, 1 4 while n < max:5 yield b 6 a, b = b, a + b 7 n = n + 1 8 9 f = fib1(6) 10 print f # <generator object fib1 at 0x026E4B20> 11 for x in f: 12 print x
說明:
1.generator和函數的執行流程不一樣。
2.函數是順序執行,遇到return語句或者最後一行函數語句就返回。
3.generator的函數在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
例如該生成器:
第10行首次調用該生成器,運行到yield n停止(對應結果為16,17行);11行從yield n繼續,由於是while循環體,在遇到yield n後再次停止(對應結果為18,19行);
12行與11行類似。
1 def create_counter(n): 2 print "create counter" 3 while True: 4 yield n 5 print ‘increment n‘ 6 n += 1 7 8 cnt = create_counter(1) 9 print cnt 10 print next(cnt) 11 print next(cnt) 12 print next(cnt) 13 14 # output 15 # <generator object create_counter at 0x0000000001D141B0> 16 # create counter 17 # 1 18 # increment n 19 # 2 20 # increment n 21 # 3
python中生成器