函式中包含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...