1. 程式人生 > >python中生成器

python中生成器

語句 數列 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中生成器