Python的生成器Generator小結

2022-03-11 17:17:30 字數 2668 閱讀 9557

一. 生成器的介紹

在介紹生成器(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 in

g:

print

(i) 416

3664

當我們的生成器的需要計算的比較複雜,無法通過類似列表生成式的for迴圈實現時,則需要另外一種實現生成器的方法:在函式中使用'yield'關鍵字

def

fib(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 語句的函式,就是生成器函式,呼叫後返...