摘要:第二次迭代時,使用,那么,就是強行修改表達式的值為,本來是的,那么與都有返回值,它們的返回值是當前迭代遇到時,后面表達式的值,其實就是當前迭代中后面的參數。
yield
為了精通 yield ,你必須要理解:當你調用這個函數的時候,函數內部的代碼并不立馬執行 ,這個函數只是返回一個生成器對象,這有點蹊蹺不是嗎。
那么,函數內的代碼什么時候執行呢?當你使用for進行迭代的時候.
現在到了關鍵點了!
第一次迭代中你的函數會執行,從開始到達 yield 關鍵字,然后返回 yield 后的值作為第一次迭代的返回值. 然后,每次執行這個函數都會繼續執行你在函數內部定義的那個循環的下一次,再返回那個值,直到沒有可以返回的。
1、通常的for...in...循環中,in后面是一個數組,這個數組就是一個可迭代對象,類似的還有鏈表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。
它的缺陷是所有數據都在內存中,如果有海量數據的話將會非常耗內存。
2、生成器是可以迭代的,但只可以讀取它一次。因為用的時候才生成。比如 mygenerator = (x*x for x in range(3)),注意這里用到了(),它就不是數組,而上面的例子是[]。
3、我理解的生成器(generator)能夠迭代的關鍵是它有一個next()方法,工作原理就是通過重復調用next()方法,直到捕獲一個異常。
4、帶有 yield 的函數不再是一個普通函數,而是一個生成器generator,可用于迭代,工作原理同上。
5、yield 是一個類似 return 的關鍵字,迭代一次遇到yield時就返回yield后面(右邊)的值。重點是:下一次迭代時,從上一次迭代遇到的yield后面的代碼(下一行)開始執行。
6、簡要理解:yield就是 return 返回一個值,并且記住這個返回的位置,下次迭代就從這個位置后(下一行)開始。
7、帶有yield的函數不僅僅只用于for循環中,而且可用于某個函數的參數,只要這個函數的參數允許迭代參數。比如array.extend函數,它的原型是array.extend(iterable)。
8、send(msg)與next()的區別在于send可以傳遞參數給yield表達式,這時傳遞的參數會作為yield表達式的值,而yield的參數是返回給調用者的值。——換句話說,就是send可以強行修改上一個yield表達式值。比如函數中有一個yield賦值,a = yield 5,第一次迭代到這里會返回5,a還沒有賦值。第二次迭代時,使用.send(10),那么,就是強行修改yield 5表達式的值為10,本來是5的,那么a=10
9、send(msg)與next()都有返回值,它們的返回值是當前迭代遇到yield時,yield后面表達式的值,其實就是當前迭代中yield后面的參數。
10、第一次調用時必須先next()或send(None),否則會報錯,send后之所以為None是因為這時候沒有上一個yield(根據第8條)。可以認為,next()等同于send(None)。
代碼示例1:
#encoding:UTF-8 def yield_test(n): for i in range(n): yield call(i) print("i=",i) #做一些其它的事情 print("do something.") print("end.") def call(i): return i*2 #使用for循環 for i in yield_test(5): print(i,",")
結果是:
yield from0 ,
i= 0
2 ,
i= 1
4 ,
i= 2
6 ,
i= 3
8 ,
i= 4
do something.
end.理解的關鍵在于:下次迭代時,代碼從yield的下一跳語句開始執行。
python yield from 語法
yield from 是 Python3.3 后新加的語言結構。和其他語言的await關鍵字類似,它表示:*在生成器 gen 中使用 yield from subgen()時,subgen 會獲得控制權,把產出的值傳個gen的調用方,即調用方可以直接控制subgen。于此同時,gen會阻塞,等待subgen終止。yield語法比較簡單, 教程也很多 , yield from的中文講解很少 , python官網是這樣解釋的
PEP 380 adds the yield from expression, allowing a generator to delegate part of its operations to another generator. This allows a section of code containing yield to be factored out and placed in another generator. Additionally, the subgenerator is allowed to return with a value, and the value is made available to the delegating generator.
官網鏈接
大意是說 yield from 表達式允許一個生成器代理另一個生成器, 這樣就允許生成器被替換為另一個生成器, 子生成器允許返回值
def g1(x): yield range(x) def g2(x): yield from range(x) it1 = g1(5) it2 = g2(5) #it1[0] = range(0,5) #it2 = range(0,5) print( [ x for x in it1] ) #out [range(0, 5)] print( [ x for x in it2] ) #out [0, 1, 2, 3, 4]
可以看到 , yield返回一個生成器 , 這個生成器就是range自身 , yield from 也返回一個生成器, 這個生成器是由range代理的
yield from 在遞歸結構中常用 , 例如
class Node: def __init__(self, value): self._value = value self._children = [] def __repr__(self): return "Node({!r})".format(self._value) def add_child(self, node): self._children.append(node) def __iter__(self): return iter(self._children) def depth_first(self): yield self for c in self: yield from c.depth_first()
如果不加上from , depth_first 只能返回根節點的值
yield from 詳細解釋http://blog.gusibi.com/post/p...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41053.html
摘要:在種,使用關鍵字定義的迭代器也被稱為生成器迭代器迭代器是訪問集合內元素的一種方式。調用任何定義包含關鍵字的函數都不會執行該函數,而是會獲得一個隊應于該函數的迭代器。 上一篇文章:Python:Tornado 第一章:異步及協程基礎:第一節:同步與異步I/O下一篇文章:Python:Tornado 第一章:異步及協程基礎:第三節:協程 協程是Tornado中進行異步I/O代碼開發的方法...
摘要:與子生成器是開始引入的新特性。我們把這種一個生成器中調用的另一個生成器叫做子生成器,而這個子生成器由關鍵字生成。由于子生成器很常用,所以引入了新的語法來簡化這個代碼。下次,會繼續對之前的結果進行乘方,直到結果超過為止。 Python高級語法中,由一個yield關鍵詞生成的generator生成器,是精髓中的精髓。它雖然比裝飾器、魔法方法更難懂,但是它強大到我們難以想象的地步:小到簡單的...
摘要:是的一個關鍵字,剛接觸的時候對這個關鍵字一知半解,掌握之后才發現這關鍵字有大用,本文將對的使用方法好好梳理一番。使用創建生成器在中,生成器是一種可迭代對象,但可迭代對象不一定是生成器。 yield是python的一個關鍵字,剛接觸python的時候對這個關鍵字一知半解,掌握之后才發現這關鍵字有大用,本文將對yield的使用方法好好梳理一番。 1 使用yield創建生成器 在python...
摘要:于此同時,會阻塞,等待終止。子生成器返回之后,解釋器會拋出異常,并把返回值附加到異常對象上,只是委派生成器恢復。實例運行完畢后,返回的值綁定到上。這一部分處理調用方通過方法傳入的異常。之外的異常會向上冒泡。 上一篇python協程1:yield的使用介紹了: 生成器作為協程使用時的行為和狀態 使用裝飾器預激協程 調用方如何使用生成器對象的 .throw(...) 和 .close()...
閱讀 4693·2021-11-18 13:23
閱讀 896·2021-09-22 15:24
閱讀 1920·2021-09-06 15:00
閱讀 2619·2021-09-03 10:30
閱讀 1278·2021-09-02 15:15
閱讀 2056·2019-08-30 15:54
閱讀 3030·2019-08-30 15:44
閱讀 1449·2019-08-29 15:12