Python高階 生成器及yield關鍵字

2021-09-27 19:06:37 字數 1854 閱讀 5820

列表生成器

求斐波拉契數列

yield關鍵字

指能夠快速生成列表的**推導式。

例如:(1)求0到100的數字列表:

[i for i in range(101)]

(2)求0到100的偶數列表:

[i for i in range(101) if i % 2 == 0]

(3)求0到100的奇數列表:

[i for i in range(101) if i % 2 != 0]

(4)9×9乘法表的數值列表:

[i*j i for i in range(1,10) for j in range(1,10)]

優點:功能強大,可以快速生成列表。

缺點:直接生成列表,當列表的元素很多的時候對記憶體的占用會非常誇張。

指將推導式的計算結果不一次性返回,而是通過全域性函式中的next( )函式來返回數值。

將列表推導式的方括號轉換為圓括號就成為了列表生成器。

將列表推導式–>列表生成器

[ ] ==> ( )

例如:9×9乘法表的數值列表:

a = [i*j for i in range(1,10) for j in range(1,10)]

a#返回列表生成器物件及位址

next(a)

#返回生成的列表中的第乙個數

next(a)

#返回生成的列表中的第二個數

也可以使用迭代:

for x in a :

print(x)

選取其中的值:

for x in a :

if x == 20:

print(x)

ps:(1)next( )返回的值不能後退只能前進,返回到最後乙個值的時候該列表為空。

(2)當next( )返回到最後乙個值之後再次使用則會報錯。

(3)魔法屬性方法中的__next__( ) 等價於全域性函式中的next( )

求取複雜列表的通式,單純的使用列表生成器是很困難的,可能需要寫成函式才能得到。

ls = 

def fibonacci(num):

first,second = 1,2

count = 0

while count < num:

first, second = second, first + second

count += 1

fibonacci( )

print(ls)

上述的函式在呼叫後會直接將所有的值返回,當列表的元素很多的時候對記憶體的占用會非常誇張。這時就需要使用yield關鍵字將函式轉換為列表生成器。

yield關鍵字在函式**現,和return類似,用來返回結果。但是yield返回的結果是乙個生成器,當我們使用next函式呼叫這個生成器的結果時,在第一次進入函式後**會從yield返回,再次呼叫時會回到yield之後繼續執行並返回至第一次進入的位置再次迴圈。

因此上述的求斐波拉契數列的函式可以寫成:

def fibonacci(num):

first,second = 1,2

count = 0

while count < num:

first, second = second, first + second

yield second

count += 1

res = fibonacci( )

#迴圈出生成器res中的值

for x in res:

print(x)

php的Generator生成器及yield

官方文件 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現iterator介面的方式,效能開銷和複雜性大大降低。生成器允許你在foreach 塊中寫 來迭代一組資料而不需要在記憶體中建立乙個陣列,那會使你的記憶體達到上限,或者會佔據可觀的處理時間。相反,你可以寫乙個生成器函式,就像...

015 python函式式程式設計 生成器 yield

在乙個函式中經常使用return關鍵字返回資料,但是有時候會使用yield關鍵字返回資料。使用yield關鍵字的函式返回的是乙個生成器 generator 物件,生成器物件是一種可迭代物件。def square num 定義引數函式 n list for i in range 1,num 1 ret...

生成器高階

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...