python中的yield關鍵字詳解

2021-09-17 23:53:17 字數 1035 閱讀 5274

需求::

你需要產生乙個按照特定規則增減的序列,比如最簡單的遞增序列:1,2,3.....1000000,第一印象是可以把產生號的序列放到list中,使用的時候直接取值就好,但是這種做法有個致命的缺點,即需要預先儲存這些序列,這會耗費大量的記憶體,那麼有沒有更好的方法呢?

這是yield出來拯救世界了:

呼叫方法:

另外,yield其實可以有返回值,也可以從外界改變yield的返回值:

輸出:

上面列印出的res取值都是none,yield將index的值返回給呼叫方後,res賦的值為none,但是我們也可以從外界手動給res賦值

輸出:上述**先呼叫next(seq)主要是使getseq函式暫停到yield語句的地方,暫停在yield語句後才能使用send方法給yield返回值賦值,否則會報錯。

在執行seq = getseq(5)的時候,函式並沒有執行,此時seq的型別是物件,更具體一點seq是生成器型別(generator)

每個generator型別物件主要有兩個方法:send和next,next用來迭代,send用來給yield返回值賦值,預設情況下yield的返回值是none

每乙個send方法中隱式呼叫了next方法

send方法是給yield表示式返回值賦值,所以函式必須暫停在yield**處的時候才能呼叫send方法(其實就是呼叫send方法前至少呼叫一次next方法)

for i in getseq 其實就是對generator進行迭代,和next方法類似

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