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