生成器generator
目的:list容量太大佔太多記憶體而操作時卻僅僅訪問前幾個元素,generator可以通過迴圈不斷推算出後面的元素,邊迴圈邊計算,節省大量空間;
建立乙個generator:
>>>vlist=[a*a for a in range(3)]
>>>vlist
[0,1,4]
>>>vgenerator=(b*b for b in range(3))
>>>vgenerator
at 0x0000001c9c7702620>
列印generator的值:
>>>next(vgenerator)
0>>>next(vgenerator)
1>>>next(vgenerator)
4
>>>for i in vgenerator:
... print(i)
...0
14
如果推算的演算法比較複雜,用類似列表生成式的for迴圈無法實現的時候,還可以用函式來實現,這是乙個generator:
>>>def fib(max):
... n, a, b = 0, 0, 1
... while n < max:
... yield b
... a, b = b, a + b
... n = n + 1
... return 'done'
...
generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
用for迴圈呼叫generator時,發現拿不到generator的return語句的返回值。如果想要拿到返回值,必須捕獲stopiteration錯誤,返回值包含在stopiteration的value中:>>>def odd():
... print('step 1')
... yield 1
... print('step 2')
... yield(3)
... print('step 3')
... yield(5)
...
>>> o = odd()
>>> next(o)
step 1
1>>> next(o)
step 2
3>>> next(o)
step 3
5>>> next(o)
traceback (most recent call last):
file "", line 1, in stopiteration
>>> 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函式的「呼叫」實際返回乙個generator物件。
迭代器一類是集合資料型別,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。
這些可以直接作用於for迴圈的物件統稱為可迭代物件:iterable。
可以使用isinstance()判斷乙個物件是否是iterable物件:
>>> from collections import iterable
>>> isinstance(, iterable)
true
>>> isinstance({}, iterable)
true
>>> isinstance('abc', iterable)
true
>>> isinstance((x for x in range(10)), iterable)
true
>>> isinstance(100, iterable)
false
可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterator。例如生成器generator.
可以使用isinstance()判斷乙個物件是否是iterator物件:
(將上述**括號裡面的iterable改為iterator)
把list、dict、str等iterable變成iterator可以使用iter()函式:
>>> isinstance(iter(), iterator)
true
>>> isinstance(iter('abc'), iterator)
true
python的迭代器iterator物件表示的是乙個資料流,iterator物件可以通過next()函式呼叫並不斷返回下乙個資料,直到沒有下乙個資料丟擲stopiteration錯誤,這個資料流可看作有序數列,但我們卻不能知道這個有序數列的長度,只能通過next()函式不斷計算出所需的下乙個資料,甚至可以表示乙個無限大的資料流,例如 全體自然數,而list永遠不能儲存全體自然數。
python中圍繞yield的生成器和迭代器詳解
首先,如果你還沒有對yield有個初步分認識,那麼你先把yield看做 return 這個是直觀的,它首先是個return,普通的return是什麼意思,就是在程式中返回某個值,返回之後程式就不再往下執行了。看做return之後再把它看做乙個是生成器 generator 的一部分 帶yield的函式...
生成器高階
def generator print 123 count yield 1 print count print 456 yield 2g generator ret g.next print ret ret g.send 套你大象 send的效果與next一樣 send在獲取下乙個值時,會在上乙個y...
Python高階 生成器(Generators)
迭代器是乙個讓程式設計師可以遍歷乙個容器 特別是列表 的物件。然而,乙個迭代器在遍歷並讀取乙個容器的資料元素時,並不會執行乙個迭代。維基百科 可迭代物件 iterable python中任意的物件,只要它定義了可以返回乙個迭代器的iter方法,或者定義了可以支援下標索引的getitem方法 這些雙下...