生成器和迭代器

2022-07-11 10:03:09 字數 1265 閱讀 3230

如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

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

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

>>>g

at 0x1022ef630>

我們可以直接列印出list的每乙個元素,但我們怎麼列印出generator的每乙個元素呢?

最難理解的就是generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

def

fib(max):

n, a, b = 0, 0, 1

while n yield

b a, b = (b, a +b)

n += 1

for i in fib(6):

print(i)

我們在迴圈過程中不斷呼叫yield,就會不斷中斷。當然要給迴圈設定乙個條件來退出迴圈,不然就會產生乙個無限數列出來。

>>> g = fib(6)

>>> while

true:

...

try:

... x =next(g)

...

print('g:'

, x)

...

except

stopiteration as e:

...

print('

generator return value:

', e.value)

...

break

...g: 1g: 1g: 2g: 3g: 5g: 8generator

return value: done

把list、dict、str等iterable變成iterator可以使用iter()函式:

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...

生成器和迭代器

1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...