摘要:前文我們了解如果書(shū)寫(xiě)一個(gè)以及怎樣在一個(gè)類(lèi)中安裝一個(gè)但有時(shí)候我們只想要一個(gè)簡(jiǎn)單的而且并不想這么復(fù)雜處于這個(gè)目的變成語(yǔ)言里面出現(xiàn)了這個(gè)概念根據(jù)的解釋同樣也有的優(yōu)勢(shì)在輸出值的過(guò)程中是分散性的即他不會(huì)保存每一次輸出值這樣在循環(huán)里面更高效并且更節(jié)省效
前文我們了解如果書(shū)寫(xiě)一個(gè)Iterator,以及怎樣在一個(gè)類(lèi)中安裝一個(gè)Iterator. 但,有時(shí)候我們只想要一個(gè)簡(jiǎn)單的iterator, 而且并不想這么復(fù)雜. 處于這個(gè)目的, 變成語(yǔ)言里面出現(xiàn)了generator 這個(gè)概念. 根據(jù)wiki的解釋:
In fact, all generators are iterators
generator 同樣也有iteartor的優(yōu)勢(shì), 在輸出值的過(guò)程中,是分散性的, 即他不會(huì)保存每一次輸出值, 這樣在循環(huán)里面更高效, 并且更節(jié)省效率.
generator syntaxgenerator的格式和一個(gè)函數(shù)非常類(lèi)似, 他使用yield代替return, 來(lái)返回一個(gè)expression.
def a_gen: yield 1 yield 2
使用generator實(shí)際上就和使用iteartor對(duì)象一樣. 因?yàn)間enerator 返回的就是iterator:
gen = a_gen() print(next(gen))
既然, generator是Iterator, 那我們能不能在上面使用for...in...循環(huán)呢?
Yes~
for x in a_gen(): print(x)
另外, 在python中, 提供了一個(gè)常見(jiàn)匿名generator的辦法. 使用 ( ) 即可. 里面放的就是 list comprehension.
a = (x for x in range(10))
這里需要注意, 上面 匿名 generator的返回值是一個(gè)generator object. 這點(diǎn)很重要, 這也是區(qū)分list comrehension 的關(guān)鍵點(diǎn). generator 延續(xù)著iterator的特性: 你要我才給 . 這樣, 不必先生成大量的數(shù)據(jù). 所以,generator 這個(gè)也常常用于處理數(shù)據(jù)較大的集合中.
如果僅僅是造了一個(gè)語(yǔ)法糖, 那generator的存在不就無(wú)意義了嗎? 所以,generator的優(yōu)勢(shì),或者說(shuō)用途還是挺廣泛的.
用來(lái)快速生成Iterator對(duì)象. 即, 以前需要這樣寫(xiě),才能生成一個(gè)Iterator.
class Xlist: def __init__(self,a_list): self.list = a_list self.index = 0 def __iter__(self): return self def __next__(self): length = len(self.list) if(length==self.index): # 提出異常 raise StopIteration else: result = self.list[self.index] self.index += 1 return result
現(xiàn)在只需要, 使用generator即可
def Xlist(arr): for x in arr: yield x
省略的不止一點(diǎn)點(diǎn)
2.異步序列的操作
在python中,有時(shí)候讀取文件,可能會(huì)存在異步方式的讀取. 而且,現(xiàn)在主流的后臺(tái)處理程序都是NodeJS, 一種完全異步的編程語(yǔ)言. 而generator 本省就繼承了Iterator的特性, 有一種狀態(tài)暫停的效果. 這種效果, 也可以用來(lái)作為異步序列的處理. 比如我們這里可以編寫(xiě)一個(gè)普通串行:
def co(*callback): length = 0 while length!=len(callback): yield callback[length]() length+=1 for x in co(lambda :1,lambda: 2): print(x)
簡(jiǎn)單總結(jié):
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/45471.html
摘要:上下文路徑為了方便文件流的輸入輸出,使用兩種位置環(huán)境。目標(biāo)上下文目標(biāo)上下文定義為當(dāng)前工作目錄或含文件最接近的父文件夾。這確保了用戶(hù)行為的一致。幫助用戶(hù)嚴(yán)重需要覆蓋的內(nèi)容。 摘要 隨著 Web 2.0 和 HTML 5 的流行,現(xiàn)在的 Web 應(yīng)用所能提供的功能和交互能力比之前傳統(tǒng)的 Web 應(yīng)用要強(qiáng)大很多。應(yīng)用的很多實(shí)現(xiàn)邏輯被轉(zhuǎn)移到了瀏覽器端來(lái)實(shí)現(xiàn)。瀏覽器不再只提供單一的數(shù)據(jù)接收和展現(xiàn)...
摘要:在這里匯總了一個(gè)現(xiàn)在和經(jīng)常使用的論文,所有文章都鏈接到了上面。如果你對(duì)感興趣,可以訪問(wèn)這個(gè)專(zhuān)題。作者微信號(hào)簡(jiǎn)書(shū)地址是一個(gè)專(zhuān)注于算法實(shí)戰(zhàn)的平臺(tái),從基礎(chǔ)的算法到人工智能算法都有設(shè)計(jì)。加入實(shí)戰(zhàn)微信群,實(shí)戰(zhàn)群,算法微信群,算法群。 作者:chen_h微信號(hào) & QQ:862251340微信公眾號(hào):coderpai簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/b7f... sh...
摘要:不參與迭代迭代會(huì)執(zhí)行所有的,也就是說(shuō),在迭代后的對(duì)象將不會(huì)再返回任何有效的值我們可以在迭代器對(duì)象上直接調(diào)用,來(lái)終止后續(xù)的代碼執(zhí)行。 前兩年大量的在寫(xiě)Generator+co,用它來(lái)寫(xiě)一些類(lèi)似同步的代碼 但實(shí)際上,Generator并不是被造出來(lái)干這個(gè)使的,不然也就不會(huì)有后來(lái)的async、await了 Generator是一個(gè)可以被暫停的函數(shù),并且何時(shí)恢復(fù),由調(diào)用方?jīng)Q定 希望本文可...
摘要:生成對(duì)抗網(wǎng)絡(luò)的各種變體非常多,的發(fā)明者在上推薦了這份名為的各種變體列表,這也表明現(xiàn)在確實(shí)非常火,被應(yīng)用于各種各樣的任務(wù)。了解這些各種各樣的,或許能對(duì)你創(chuàng)造自己的有所啟發(fā)。這篇文章列舉了目前出現(xiàn)的各種變體,并將長(zhǎng)期更新。 生成對(duì)抗網(wǎng)絡(luò)(GAN)的各種變體非常多,GAN 的發(fā)明者 Ian Goodfellow 在Twitter上推薦了這份名為T(mén)he GAN Zoo的各種GAN變體列表,這也表明現(xiàn)...
摘要:同時(shí),迭代器有一個(gè)方法來(lái)向函數(shù)中暫停處拋出一個(gè)錯(cuò)誤,該錯(cuò)誤依然可以通過(guò)函數(shù)內(nèi)部的模塊進(jìn)行捕獲處理。 本文翻譯自:Diving Deeper With ES6 Generators 由于個(gè)人能力有限,翻譯中難免有紕漏和錯(cuò)誤,望不吝指正issue ES6 Generators:完整系列 The Basics Of ES6 Generators Diving Deeper With E...
摘要:每個(gè)任務(wù)必須顯式地掛起自己,在任務(wù)切換發(fā)生時(shí)給予它完全的控制。在這些嘗試中,數(shù)據(jù)經(jīng)常在任務(wù)之間共享。但由于明確的暫停,幾乎沒(méi)有風(fēng)險(xiǎn)。 翻譯自 github 概述 什么是generators? 我們可以把generators理解成一段可以暫停并重新開(kāi)始執(zhí)行的函數(shù) function* genFunc() { // (A) console.log(First); yi...
閱讀 2943·2023-04-25 19:08
閱讀 1428·2021-11-16 11:45
閱讀 1991·2021-10-13 09:40
閱讀 4160·2021-09-30 09:47
閱讀 2425·2019-08-30 15:44
閱讀 2303·2019-08-30 13:03
閱讀 1401·2019-08-30 12:56
閱讀 1901·2019-08-26 14:04