十 python3 生成器

2022-08-25 14:12:25 字數 2447 閱讀 4128

生成器(generator):在 python 中,不必建立完整的 list,從而節省大量的空間。一邊迴圈一邊計算的機制。

建立乙個 generator,有很多種方法。第一種方法很簡單,只要把乙個列表生成式的 改成 () ,就建立了乙個 generator:

>>> l = [x * x for x in range(10)]

>>> l

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> g = (x * x for x in range(10))

>>> g

at 0x1022ef630>

>>> next(g)

0>>> next(g)

1>>> next(g)

4...

...>>> next(g)

81>>> next(g)

traceback (most recent call last):file "", line 1, in stopiteration

常用的方法是使用for 迴圈,因為 generator 也是可迭代物件:

>>> g = (x * x for x in range(10))

>>> for n in g:

... print(n)

...014

9162536

4964

81

generator 非常強大。如果推算的演算法比較複雜,用類似列表生成式的 for迴圈無法實現的時候,還可以用函式來實現。

比如,著名的斐波拉契數列(fibonacci),除第乙個和第二個數外,任意乙個數都可由前兩個數相加得到:  

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契數列用列表生成式寫不出來,但是,用函式把它列印出來卻很容易:

def fib(max):

n, a, b = 0, 0, 1

while n < max:

print(b)

a, b = b, a + b

n = n + 1

return 'done'

>>> fib(6)
1
1
2
3
5
8
'done'

上面的函式和 generator 僅一步之遙。要把 fib 函式變成generator,只需要把 print(b) 改為 yield b 就可以了:

def fib(max):

n, a, b = 0, 0, 1

while n < max:

yield b

a, b = b, a + b

n = n + 1

return 'done'

如果乙個函式定義中包含 yield 關鍵字,那麼這個函式就不再是乙個普通函式,而是乙個 generator:

>>> f = fib(6)

>>> f

函式是順序執行,遇到 return 語句或者最後一行函式語句就返回。而變成

generator 的函式,在每次呼叫 next() 的時候執行,遇到 yield 語句返回,

再次執行時從上次返回的 yield 語句處繼續執行。

for 迴圈呼叫 generator 時,發現拿不到 generator 的 return 語句的返回值。如果想要拿到返回值,必須捕獲 stopiteration 錯誤,返回值包含在 stopiteration 的 value 中:

>>> g = fib(6)

>>> while true:

...  try:

...    x = next(g)

... print('g:', x)

...  except stopiteration as e:

...    print('generator return value:', e.value)

... break

...g: 1

g: 1

g: 2

g: 3

g: 5

g: 8

generator return value: done

小結generator 是非常強大的工具,在 python 中,可以簡單地把列表生成式改成 generator,也可以通過函式實現複雜邏輯的 generator。

要理解 generator 的工作原理,它是在 for 迴圈的過程中不斷計算出下乙個元素,並在適當的條件結束 for 迴圈。對於函式改成的 generator 來說,遇到 return 語句或者執行到函式體最後一行語句,就是結束 generator的指令, for 迴圈隨之結束。

python3生成器 Python3 生成器

python3 生成器 閱讀 125 發布於 2020 05 19 14 29 25 在python中,一邊迴圈一邊計算出元素的機制,稱為生成器 generator。生成器的優點 一次返回乙個結果,延遲計算。這對於大資料量處理,是個非常有用的優勢。占用記憶體量是工程師必須考慮的乙個問題。提高 可讀性...

Python3 生成器與yield

斐波那契數列指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 importtime def fib times a 0 b 1 n 1 while n times print b a,b b,a b n 1 fib 7 生成器寫法 deffib times a 0 b 1 n 1 whi...

python 3 生成器 and 迭代器

迭代器官方文件 大多是的檔案物件可以用for迴圈語句,例如 for element in 1,2,3 print element for element in 1,2,3 print element for key in print key for char in 123 print char fo...