一. 生成器的介紹
在介紹生成器(generator)之前,我們首先需要熟悉列表生成式,列表生成式是python內建的簡單又強大的用來建立列表的生成式。
舉個例子,
如果我們想生成[1*1,2*2,3*3,4*4,5*5,6*6,7*7,8*8,9*9]
比較笨的方法是
l =for i in range(1,10):
而列表生成式可以用一句語句代替上述的迴圈語句:
[i*i for i in range(1,10)]
更方便的是我們可以新增條件判斷,或者使用多層迴圈,達成我們想要的結果:
#用if判斷來獲取偶數的平方
[ i*i for i in range(1,10) if i%2==0 ]
#二重迴圈實現排列組合
[ x + y for x in
'abc
'for y in
'123
' ]
言歸正傳,回到生成器。生成器典型的應用場景是這樣的: 假如我們需要生成100萬個元素,但是我們需要用到的往往只有幾個怎麼辦?如果用列表生成式全部建立的話,則會浪費大量的空間: 為了需要用到的幾個元素,我們建立了100萬個元素的列表。
而生成器正是這樣可以不必建立完成列表,可以一邊迴圈一邊計算出後續元素的機制。
建立生成器的方法很簡單,只需要把建立列表生成式時的''改成'()'即可
#list
l = [ i*i for i in range(1,10) if i%2==0 ]
#generator
g = ( i*i for i in range(1,10) if i%2==0 )
>>>next(g)4>>>next(g)
16>>>next(g)
36>>>next(g)
64>>>next(g)
traceback (most recent call last):
file
"", line 1, in
next(g)
stopiteration
更科學的方法是使用for
迴圈,因為generator也是可迭代物件,並且不需要關心stopiteration
的錯誤。
>>> for i ing:
(i) 416
3664
當我們的生成器的需要計算的比較複雜,無法通過類似列表生成式的for迴圈實現時,則需要另外一種實現生成器的方法:在函式中使用'yield'關鍵字
deffib(max):
n, a, b = 0, 0, 1
while n yield
b a, b = b, a +b
n = n + 1
return
'done
'
對上述**有以下幾點:
1. **的作用是用生成器的方法實現斐波那契數列
2.函式中使用關鍵字''yield"之後,函式就不再是普通的函式了,而變成了生成器
3.generator和函式的執行流程不一樣。函式是順序執行,遇到return
語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()
的時候執行,遇到yield
語句返回,再次執行時從上次返回的yield
語句處繼續執行。
4.生成器中可以沒有return語句,並不影響生成器的功能。上述**例子中帶的return 'done',將會在丟擲stopiteration
的錯誤時列印出來。你可以用next()函式觸發stopiteration錯誤試一試。
二. 迭代器和可迭代物件
迭代器:迭代器就是iterator,意思指可以作用於for
迴圈,還可以被next()
函式不斷呼叫並返回下乙個值,直到最後丟擲stopiteration
錯誤表示無法繼續返回下乙個值。毫無疑問,我們的生成器就屬於迭代器(iterator)。
可迭代物件:iterable object,可以直接作用於for
迴圈的物件統稱為可迭代物件:iterable object
。顯然,生成器也屬於可迭代物件。list, tuple, dict, set, str因為可以直接作用於for迴圈,所以也是可迭代物件;但是無法被next()函式呼叫返回下乙個值,所以不屬於迭代器。
總結:生成器generator即是迭代器(iterator),也是可迭代物件(iterable object)。其實從定義上分析,迭代器一定是可迭代物件。
list, tuple, dict, set, str是可迭代物件(iterable object),但不是迭代器(iterator)。
python 生成器作用 Python生成器
生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...
python生成器好處 Python生成器筆記
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...