摘要:顯然,要理解,首先要了解迭代器,接著了解什么是生成器。生成器上述代碼中,就是一個迭代器,循環部分就是迭代過程。迭代器和生成器的執行效率因為生成器邊迭代邊生成,所以占用內存極少,執行效率也更高。
顯然,要理解yield,首先要了解迭代器(iterator),接著了解什么是生成器(generator)。
迭代器通俗的講,迭代器就是可以逐個訪問的容器,而逐個逐步訪問的過程成為迭代。
iterator = [item for item in range(5)] for i in iterator: print(i)
0 1 2 3 4生成器
上述代碼中,iterator就是一個迭代器,for循環部分就是迭代過程。生成器同樣也是可供迭代訪問的容器,與迭代器不同的是,生成器中的元素不會一次性存入內潤中,而是一邊迭代一邊生成。
generator = (item for item in range(5)) for i in generator: print(i)
0 1 2 3 4迭代器和生成器的執行效率
因為生成器邊迭代邊生成,所以占用內存極少,執行效率也更高。
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的使用沒有什么區別,只是yield會返回一個生成器。當代碼執行到yield時,該函數會返回yield之后的值,并在原地等待下一次迭代;當執行到下一次迭代時,代碼接著上一次等待的地方執行:
若使用生成器的send方法,則yield語句的返回值send中的參數
若使用next函數迭代,則在yield的返回值為None
注: next相當于mgen.send(None),但mgen.send在生成器第一次迭代時不可調用
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 當我們調用yield,它究竟做了什么
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41615.html
摘要:輕量級集合迭代器泊學視頻鏈接泊閱文檔鏈接是加入的新語言特性。接下來,我們可以像訪問一個普通集合一樣使用現在重新執行我們的文件,就不會再報錯了。簡單來說,就是一個輕量級的,可以記住自身狀態的集合迭代器。 輕量級集合迭代器-Generator泊學視頻鏈接泊閱文檔鏈接Generator是PHP 5.5加入的新語言特性。但是,它似乎并沒有被很多PHP開發者廣泛采用。因此,在我們了解PHP 7對...
摘要:關鍵字表示代碼在該處將會被阻塞式暫停阻塞的僅僅是函數代碼本身,而不是整個程序,但是這并沒有引起函數內部自頂向下代碼的絲毫改變。通過實現模式在通過實現理論的過程中已經有一些有趣的探索了。 至此本系列的四篇文章翻譯完結,查看完整系列請移步blogs 由于個人能力知識有限,翻譯過程中難免有紕漏和錯誤,望不吝指正issue ES6 Generators: 完整系列 The Basics...
摘要:當前的部分代碼狀態超時再縮小了范圍以后,進一步進行排查。函數是一個很簡單的一次性函數,在第一次被觸發時調用函數。因為上述使用的是,而非,所以在獲取的時候,肯定為空,那么這就意味著會繼續調用函數。 有時候,所見并不是所得,有些包,你需要去翻他的源碼才知道為什么會這樣。 背景 今天調試一個程序,用到了一個很久之前的NPM包,名為formstream,用來將form表單數據轉換為流的形式進行...
關注公眾號:「Python專欄」,后臺回復「爬蟲書籍」,即可獲得2本Python爬蟲相關的電子書showImg(https://segmentfault.com/img/remote/1460000018448215?w=860&h=860); 無意間,看到這么一道Python面試題:以下代碼將輸出什么? def testFun(): temp = [lambda x : i*x for ...
閱讀 1863·2023-04-26 02:46
閱讀 1995·2021-11-25 09:43
閱讀 1140·2021-09-29 09:35
閱讀 2095·2019-08-30 15:56
閱讀 3419·2019-08-30 15:54
閱讀 2627·2019-08-29 16:35
閱讀 3116·2019-08-29 15:25
閱讀 3282·2019-08-29 14:01