如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。
要建立乙個generator,有很多種方法。第一種方法很簡單,只要把乙個列表生成式的改成
()
,就建立了乙個generator:
>>> g = (x * x for x in range(10))>>>g
at 0x1022ef630>
我們可以直接列印出list的每乙個元素,但我們怎麼列印出generator的每乙個元素呢?
最難理解的就是generator和函式的執行流程不一樣。函式是順序執行,遇到return
語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()
的時候執行,遇到yield
語句返回,再次執行時從上次返回的yield
語句處繼續執行。
deffib(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...