摘要:原文和傳送門如下官網傳送門翻譯版本恢復執行并將值發送到生成器函數中。所述值參數成為當前產量表達的結果。該方法返回由生成器產生的下一個值,或者如果生成器退出而不產生另一個值則引發。更新對生成器使用方法,解釋器在底層會調用方法,也就是方法
生成器簡介
python中,含有yield關鍵字的對象就是一個生成器,每次調用next方法時會執行到yield后面的語句,然后返回yield后面代碼塊的執行結果。其實也可以調用send方法
下面給個例子方便理解。
def foo(): bar_a = yield 1 # bar_a是語句塊(yield 1)的返回值,默認為None bar_b = yield bar_a yield "最后一個值,再迭代就要報StopIteration了" f = foo() # 創建生成器,此時沒有執行foo()里的任何語句 print(next(f)) # 從foo()里進入,一直執行到(yield 1)處,此時變量bar_a還沒有創建 print(next(f)) # 先將語句塊(yield 1)的返回值賦值個bar_a,此時bar_a的值是None。 # 然后執行到語句塊(yield bar_a),bar_b也還沒有被創建 print(next(f)
輸出:
>>>1 >>>None >>>最后一個值,再迭代就要報StopIteration了
可以看出,f = foo()創建生成器時,每次執行到yield時,會跳出去并將yield關鍵字后面的內容返回給調用者。下一次有別的調用者再次調用生成器時,會先恢復生成器上次的機器狀態,再接著執行指導遇到yield或者元素迭代完畢。
而且我們可以看到bar_a和bar_b是語句yield 1和yield bar_a的返回值,注意:不是生成器的返回值。
這里有個比較繞的地方,我們用bar_a = yield 1做分析:
1是生成器的返回值。因為生成器返回yield后面的代碼塊
bar_a是語句yield 1的返回值,這就好比我們寫
a = print("my lover") print("a的值是:", a)
會輸出:
>>>my lover >>>a的值是: Nonesend方法
def foo(): bar_a = yield 1 bar_b = yield bar_a yield "最后一個值,再迭代就要報StopIteration了" f = foo() print(f.send(None)) print(f.send("my lover")) print(next(f))
輸出:
>>>1 >>>my lover >>>最后一個值,再迭代就要報StopIteration了
這里f.send(None)是初始化生成器,和next(f)的效果一模一樣。但是不推薦這么寫,因為不規范。
注意輸出的第二行是字符串my lover,而不是None。這是因為send函數帶有一個參數,這個參數會覆蓋yield 1語句的返回值,也就是bar_a的值現在不是None了。
官網提到,當我們創建一個生成器時,第一次調用只能用next()或者send(None)。因為此時send傳入其他參數也沒有yield語句去接收。
這句話我看不懂,說的好像傳入None就有yield來接收似的。各位如果明白的歡迎指點。
原文和傳送門如下:
官網傳送門
Resumes the execution and “sends” a value into the generator function. The value argument becomes the result of the current yield expression. The send() method returns the next value yielded by the generator, or raises StopIteration if the generator exits without yielding another value. When send() is called to start the generator, it must be called with None as the argument, because there is no yield expression that could receive the value.
Google翻譯版本:
恢復執行并將值“發送”到生成器函數中。所述 值參數成為當前產量表達的結果。該 send()方法返回由生成器產生的下一個值,或者StopIteration如果生成器退出而不產生另一個值則引發。當send()調用啟動生成器時,必須將其None作為參數調用,因為沒有可以接收該值的yield表達式。
更新:
2018-11-24
對生成器使用send(None)方法,解釋器在底層會調用__next__方法,也就是next()方法
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44930.html
摘要:程序執行,程序會從關鍵字那一行繼續向下運行,會把這個值賦值給變量由于方法中包含方法,所以程序會繼續向下運行執行方法,然后再次進入循環程序執行再次遇到關鍵字,會返回后面的值后,程序再次暫停,直到再次調用方法或方法。 此文轉載,侵刪,原文地址:https://blog.csdn.net/mieleiz... 首先,如果你還沒有對yield有個初步分認識,那么你先把yield看做return...
摘要:結果為對于迭代器和生成器你知道哪些,它們分別應用于什么場景先介紹什么是可迭代的任何可用于循環的都是可迭代的。示例結果為,迭代器任何可以使用函數的都是迭代器,也可使用函數將可迭代對象變為迭代器。未寫完,下次更新補上。 showImg(https://segmentfault.com/img/bVbuN3P); 閱讀本文大約需要 8 分鐘。 7.說一下 Python 中的裝飾器 原理:利用...
摘要:第二次迭代時,使用,那么,就是強行修改表達式的值為,本來是的,那么與都有返回值,它們的返回值是當前迭代遇到時,后面表達式的值,其實就是當前迭代中后面的參數。 yield 為了精通 yield ,你必須要理解:當你調用這個函數的時候,函數內部的代碼并不立馬執行 ,這個函數只是返回一個生成器對象,這有點蹊蹺不是嗎。 那么,函數內的代碼什么時候執行呢?當你使用for進行迭代的時候.現在到了關...
摘要:協程定義協程的底層架構是在中定義,并在實現的。為了簡化,我們會使用裝飾器預激協程。執行上述代碼結果如下出錯的原因是發送給協程的值不能加到變量上。示例使用和方法控制協程。 最近找到一本python好書《流暢的python》,是到現在為止看到的對python高級特性講述最詳細的一本??戳藚f程一章,做個讀書筆記,加深印象。 協程定義 協程的底層架構是在pep342 中定義,并在python2...
摘要:消息向迭代器獲取所表示的底層序列的下一個元素。為了對方法調用做出回應,迭代器可以執行任何計算來獲取或計算底層數據序列的下一個元素。這個迭代器應擁有方法,依次返回序列中的每個元素,最后到達序列末尾時產生異常。 第五章 序列和協程 來源:Chapter 5: Sequences and Coroutines 譯者:飛龍 協議:CC BY-NC-SA 4.0 5.1 引言 在這一章中,我...
閱讀 688·2021-11-18 10:07
閱讀 2878·2021-09-22 16:04
閱讀 873·2021-08-16 10:50
閱讀 3326·2019-08-30 15:56
閱讀 1784·2019-08-29 13:22
閱讀 2647·2019-08-26 17:15
閱讀 1229·2019-08-26 10:57
閱讀 1103·2019-08-23 15:23