Python中帶yield關鍵字的函式

2021-10-07 06:11:31 字數 1706 閱讀 1724

函式中包含yield關鍵字,該函式不再是普通函式,而是乙個生成器(generator),首次呼叫該函式即建立乙個生成器。

最簡單的建立生成器的方式是把列表推導式的換成(),其次則是函式中帶yield關鍵字。生成器是python中一邊迴圈一邊計算的機制,無需建立完整的list。

(i)上述兩行**中列表range(10000)中的資料都儲存在記憶體中,如果資料龐大則非常消耗記憶體。而使用生成器可以節約大量內容空間。

帶yield關鍵字的函式示例:

1、建立帶yield關鍵字的函式

def

foo():

print

('starting...'

)while

true

: res=

yield

4#yield的功能與return相似,相當於返回4

print

('res:'

,res)

2、建立生成器

g=foo(

)#首次呼叫即得到生成器g,此處函式並未真正執行

3、生成器迭代

next()函式和send()函式均可讓生成器繼續往下走一步,遇到關鍵字yield即停,因為yield相當於return。send()函式相比於next()函式能傳入乙個值,這個值可以作為yield表示式的結果。

next

(g)#函式開始正式執行,到yield行停止。這裡到yield 4程式即停止,並未完成賦值操作

輸出:

starting…

4

next

(g)#從yield的下一條語句繼續向下執行,仍然到下乙個迴圈的yield行停止。因為上一步並未完成賦值操作,從print('res:',res)語句開始執行,res為none

輸出:

res: none

4

g.send(7)

#send()函式向yield行傳入值:7,同樣從yield的下一條語句print('res:',res)開始執行,因為已經傳入值7,所以res的結果為7

輸出:

res: 7

4通常做法中,基本上不會採用next()來獲取返回值,而是直接使用for迴圈來獲取返回值,完成生成器迭代。因為for迴圈本身的原理就是通過類似於next()函式完成迭代。

for迴圈生成器迭代示例:

def

foo(num)

:print

('starting...'

)while num<10:

num=num+

1yield num

for i in foo(0)

:# foo(0)即建立生成器,for迴圈next迭代機制使得生成器開始迭代執行,直到捕獲乙個異常,迭代結束

print

(i)

輸出:

starting…12

3456

78910

python中yield關鍵字

mylist是乙個可迭代的物件。當你使用乙個列表生成式來建立乙個列表的時候,就建立了乙個可迭代的物件 mylist x x for x in range 3 for i in mylist print i 01 4在這裡,所有的值都存在記憶體當中,所以並不適合大量資料 def creategener...

解析Python中的yield關鍵字

前言 python中有乙個非常有用的語法叫做生成器,所利用到的關鍵字就是yield。有效利用生成器這個工具可以有效地節約系統資源,避免不必要的記憶體占用。一段 def fun for i in range 20 x yield i print good x if name main a fun a....

解析Python中的yield關鍵字

python中有乙個非常有用的語法叫做生成器,所利用到的關鍵字就是yield。有效利用生成器這個工具可以有效地節約系統資源,避免不必要的記憶體占用。def fun for i in range 20 x yield i print good x if name main a fun a.next x...