摘要:顯然,要理解,首先要了解迭代器,接著了解什么是生成器。生成器上述代碼中,就是一個(gè)迭代器,循環(huán)部分就是迭代過(guò)程。迭代器和生成器的執(zhí)行效率因?yàn)樯善鬟叺吷?,所以占用?nèi)存極少,執(zhí)行效率也更高。
顯然,要理解yield,首先要了解迭代器(iterator),接著了解什么是生成器(generator)。
迭代器通俗的講,迭代器就是可以逐個(gè)訪問(wèn)的容器,而逐個(gè)逐步訪問(wèn)的過(guò)程成為迭代。
iterator = [item for item in range(5)] for i in iterator: print(i)
0 1 2 3 4生成器
上述代碼中,iterator就是一個(gè)迭代器,for循環(huán)部分就是迭代過(guò)程。生成器同樣也是可供迭代訪問(wèn)的容器,與迭代器不同的是,生成器中的元素不會(huì)一次性存入內(nèi)潤(rùn)中,而是一邊迭代一邊生成。
generator = (item for item in range(5)) for i in generator: print(i)
0 1 2 3 4迭代器和生成器的執(zhí)行效率
因?yàn)樯善鬟叺吷?,所以占用?nèi)存極少,執(zhí)行效率也更高。
def go_thru_iterator(item_len): iterator = [item for item in range(item_len)] for i in iterator: pass
def go_thru_generator(item_len): generator = (item for item in range(item_len)) for i in generator: pass
%time go_thru_iterator(100000000)
CPU times: user 12 s, sys: 11.8 s, total: 23.8 s Wall time: 23.8 s
%time go_thru_generator(100000000)
CPU times: user 12.7 s, sys: 0 ns, total: 12.7 s Wall time: 12.6 syield
yield的使用和return的使用沒(méi)有什么區(qū)別,只是yield會(huì)返回一個(gè)生成器。當(dāng)代碼執(zhí)行到y(tǒng)ield時(shí),該函數(shù)會(huì)返回yield之后的值,并在原地等待下一次迭代;當(dāng)執(zhí)行到下一次迭代時(shí),代碼接著上一次等待的地方執(zhí)行:
若使用生成器的send方法,則yield語(yǔ)句的返回值send中的參數(shù)
若使用next函數(shù)迭代,則在yield的返回值為None
注: next相當(dāng)于mgen.send(None),但mgen.send在生成器第一次迭代時(shí)不可調(diào)用
def create_generator(): mylist = range(3) for i in mylist: ret = yield i * i print("ret:", ret)
mgen = create_generator()
next(mgen)
0
next(mgen)
ret: None 1
mgen.send("The yield return value.")
ret: The yield return value. 4
try: next(mgen) except StopIteration: print("Already arrive the end of the generator element.")
ret: None Already arrive the end of the generator element.
原文地址:github:jasonTu/python-material-collection 當(dāng)我們調(diào)用yield,它究竟做了什么
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41615.html
摘要:輕量級(jí)集合迭代器泊學(xué)視頻鏈接泊閱文檔鏈接是加入的新語(yǔ)言特性。接下來(lái),我們可以像訪問(wèn)一個(gè)普通集合一樣使用現(xiàn)在重新執(zhí)行我們的文件,就不會(huì)再報(bào)錯(cuò)了。簡(jiǎn)單來(lái)說(shuō),就是一個(gè)輕量級(jí)的,可以記住自身狀態(tài)的集合迭代器。 輕量級(jí)集合迭代器-Generator泊學(xué)視頻鏈接泊閱文檔鏈接Generator是PHP 5.5加入的新語(yǔ)言特性。但是,它似乎并沒(méi)有被很多PHP開(kāi)發(fā)者廣泛采用。因此,在我們了解PHP 7對(duì)...
摘要:關(guān)鍵字表示代碼在該處將會(huì)被阻塞式暫停阻塞的僅僅是函數(shù)代碼本身,而不是整個(gè)程序,但是這并沒(méi)有引起函數(shù)內(nèi)部自頂向下代碼的絲毫改變。通過(guò)實(shí)現(xiàn)模式在通過(guò)實(shí)現(xiàn)理論的過(guò)程中已經(jīng)有一些有趣的探索了。 至此本系列的四篇文章翻譯完結(jié),查看完整系列請(qǐng)移步blogs 由于個(gè)人能力知識(shí)有限,翻譯過(guò)程中難免有紕漏和錯(cuò)誤,望不吝指正issue ES6 Generators: 完整系列 The Basics...
摘要:當(dāng)前的部分代碼狀態(tài)超時(shí)再縮小了范圍以后,進(jìn)一步進(jìn)行排查。函數(shù)是一個(gè)很簡(jiǎn)單的一次性函數(shù),在第一次被觸發(fā)時(shí)調(diào)用函數(shù)。因?yàn)樯鲜鍪褂玫氖?,而非,所以在獲取的時(shí)候,肯定為空,那么這就意味著會(huì)繼續(xù)調(diào)用函數(shù)。 有時(shí)候,所見(jiàn)并不是所得,有些包,你需要去翻他的源碼才知道為什么會(huì)這樣。 背景 今天調(diào)試一個(gè)程序,用到了一個(gè)很久之前的NPM包,名為formstream,用來(lái)將form表單數(shù)據(jù)轉(zhuǎn)換為流的形式進(jìn)行...
關(guān)注公眾號(hào):「Python專欄」,后臺(tái)回復(fù)「爬蟲(chóng)書籍」,即可獲得2本Python爬蟲(chóng)相關(guān)的電子書showImg(https://segmentfault.com/img/remote/1460000018448215?w=860&h=860); 無(wú)意間,看到這么一道Python面試題:以下代碼將輸出什么? def testFun(): temp = [lambda x : i*x for ...
閱讀 1878·2023-04-26 02:46
閱讀 2010·2021-11-25 09:43
閱讀 1151·2021-09-29 09:35
閱讀 2107·2019-08-30 15:56
閱讀 3431·2019-08-30 15:54
閱讀 2640·2019-08-29 16:35
閱讀 3127·2019-08-29 15:25
閱讀 3298·2019-08-29 14:01