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