Python中的yield到底是個什麼鬼?

2021-01-08 網易

2021-01-02 05:06:16 來源: 私享生活

舉報

  Python大數據分析

  記錄 分享 成長

  相信你已經不止一次在函數中看到關鍵詞,它起著什麼作用?返回什麼?和又有著什麼區別呢?這篇文章將會揭開的神秘面紗,並給出最淺顯易懂的例子。

  

  關鍵字做了什麼?

  如果不太好理解,可以先把當作的同胞兄弟來看,他們都在函數中使用,並履行著返回某種結果的職責。

  這兩者的區別是:

  有的函數直接返回所有結果,程序終止不再運行,並銷毀局部變量;

  

  而有的函數則返回一個可迭代的 generator(生成器)對象,你可以使用for循環或者調用next()方法遍歷生成器對象來提取結果。

  什麼是生成器呢?在 Python 中,使用了的函數被稱為生成器。有點套娃的感覺,但事實就是這樣,調用一個函數,就會返回一個生成器對象。

  

  在調用生成器函數的過程中,每次遇到 時函數會暫停並保存當前所有的運行信息(保留局部變量),返回的值, 並在下一次執行方法時從當前位置繼續運行,直到生成器被全部遍歷完。

  

  先看一個簡單的例子:

  

  上面函數返回一個生成器,現在對該生成器進行遍歷:

  

  或者調用next()方法:

  

  可以看到,simple_generator函數返回一個生成器,調用方法後,函數開始運行,遇到第一個關鍵字,返回生成的值(1),程序暫停;

  第二次調用方法,代碼從上次暫停的位置開始執行,並遇到了第二個關鍵字,再返回生成的值(2),程序暫停;

  第三次調用也是如此,返回生成的值(3),生成器耗盡,程序終止;

  到這裡你可能就明白和的關係和區別了,帶的函數是一個生成器,這個生成器有一個方法就是next,next就相當於「下一步」生成哪個數,這一次的next開始的地方是接著上一次的next停止的地方執行的。

  所以調用next的時候,生成器並不會從函數的開始執行,只是接著上一步停止的地方開始,然後遇到後,return出要生成的數,此步就結束。

  有個經典的例子就是使用yield生成斐波那契數列:

  生成器有哪些作用?

  如果想具體化數據的形式,通常會將數據存儲在一個列表中。但這樣做,列表的內容將佔用有形內存。列表越大,佔用的內存資源就越多。

  但是,如果數據集有某種邏輯,就不必存儲在一個列表中,只需編寫一個生成器,它將在需要時生成這些值,基本不佔用內存。

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關焦點

  • 淺議yield 語句
    python 中最富爭議的語句就是 yield 語句,yield 語句提供了用戶構造實現生成器(generator)的可能,但由於其語法和函數很相像,所以容易誤用和誤解:  讓我們來看下面一段經典的 yield 語句使用:  1. yield
  • Python基礎教程——批量任務處理神器yield
    Python中有一個特別晦澀難懂的概念,就是生成器和yield。特別地,如果我們使用scrapy框架進行爬蟲開發,就避不開yield這個關鍵詞,所以,我們需要知道yield是什麼。我們今天不解釋概念,直接用下面的圖說話:
  • 學校組織「扮鬼」,到底是個什麼鬼
    (原標題:學校組織「扮鬼」,到底是個什麼鬼)
  • 讓你徹底明白yield語法糖的用法和原理及在C 函數式編程中的作用
    如果大家讀過dapper源碼,你會發現這內部有很多方法都用到了yield關鍵詞,那yield到底是用來幹嘛的,能不能拿掉,拿掉與不拿掉有多大的差別,首先上一段dapper中精簡後的Query方法,先讓大家眼見為實。
  • python迭代器和生成器總結——新的斐波那契數列
    給定一個集合,循環對集合中的每個元素應用某個操作,稱之為迭代。python迭代器題目:給定一個序列,循環輸出序列中的每個元素。通過一個for循環就可以實現,如下:for循環遍歷以上demo中,我們使用了print函數的雙參數形式,通過第二個參數end,指定以一個空格作為結尾,以代替原來的換行。控制臺結果如下:
  • 「沒茅臺」到底是個什麼鬼?
    剛出現「沒茅臺」這個鬼的時候,它是被灌水一族稱為「戒菸神曲」,同時又被彈幕網民們尊之為「吸菸神曲」,一切皆源於網絡上一段「哥哥」張國榮的吸菸視頻,以及那視頻中出現的神秘配樂,本尊初次聽到這個「吸菸神曲」的時候,竟被此曲的旋律搞的惆悵不已,一種時光流逝的浩瀚威壓,不講任何道理的直接撞進本尊那顆悠閒、慵懶的強大內心,竟把本尊搞的緊張兮兮,就像初次參加高考一樣,生怕倒計時已臨近了終點。
  • 理解yield和生成器
    要理解什麼是yield,必須理解什麼是生成器(generator)。在理解生成器之前,讓我們先了解迭代。但是同時也需要將所有的值存入內存當中,無論你是不是需要所有的值,可能對於一個列表[x for x in range(100000)],你僅僅想拿到裡面的素數,但當這個列表生成式被執行的時候,已經將所有100000個數字存入了內存中。
  • 科悟學院介紹什麼是Python、python能做什麼?
    2020年什麼是另一個風口?哪些人能再一次的崛起?這是很多人想知道的,今天小編就給你揭秘一個行業——Python(AI人工智慧),有人會問python到底是什麼?能做什麼?下面科悟學院介紹什麼是python和python能做什麼,希望對於正在學習的你有所幫助。
  • 「量化多因子」到底是個什麼鬼?
    量化基金到底是怎麼運作的?經常聽到的量化基金名字中的「多因子」又是個什麼鬼?今天,我就和大家一起來巴拉巴拉。  那所謂的「量化多因子」到底是個什麼鬼?「機器智能分析選股」、「量化模型選股」,聽上去很高端,到底有沒有用呢?我們先來了解下「量化選股」的簡單原理。
  • Python數據讀取之生成器(generator)
    簡單來說,生成器是一個函數,它返回一個我們可以迭代的對象(迭代器),迭代器一次返回一個值較使用列表將所有數據都加載到內存中,生成器節省了大量內存空間。深度學習的數據讀取部分一般都需要使用迭代器。創建生成器生成器有兩種創建方式:列表生成式的 [] 改成 ()使用yield方法1 列表生成式的 [] 改成 ()把列表生成式中的 [] 改成 () 就創建了一個generator>>> L = [x * x for x in range(10)]>>>
  • 環境變量到底是個什麼鬼?
    環境變量到底是個什麼鬼你是否會遇到這種情況,在黑窗口輸入javac xxx.java回車之後的結果是javac不是內部命令也不是外部命令,不僅如此,其它程式語言配置開發環境的時候也會遇到此類問題,說到底是「環境變量」配置出現了問題。
  • 初識python
    2,python歷史。宏觀上:python2 與 python3 區別:python2 源碼不標準,混亂,重複代碼太多,python3 統一 標準,去除重複代碼。3,python的環境。編譯型:一次性將所有程序編譯成二進位文件。缺點:開發效率低,不能跨平臺。優點:運行速度快。
  • 鬼壓床到底是什麼鬼?
    鬼壓床到底是什麼鬼? 還有外國貴「鬼」壓床
  • python時間序列平穩性檢驗專題及常見問題 - CSDN
    這裡筆者給出3個例子,因為時序圖過於簡單,所以筆者在這裡直接用Excel作時序圖,用python也可以,不過沒有Excel簡單。第一個例子是1964-1999年中國紗年產量時間序列(該數據來自北京統計局),其數據如圖2所示,序列圖如圖3所示。圖3中明顯可以看出,中國紗年產量序列有明顯的遞增趨勢,所以它一定不是平穩序列。圖2.
  • 攜程的遊遊到底是個什麼鬼?
    話說旅遊行業向來喜歡以動物來進行代言,比如說什麼魚啊,駱駝啊,牛啊,當然,那麼自然就不能忽視了最有影響力的攜程家的海豚遊遊什麼?你一直以為這是泥鰍?好吧,雖然看著像泥鰍,但是,人家確實是海豚。還記得上次小編把騰訊家的企鵝家族譜翻了個底朝天,好好研究了下到到底是個神馬品種點擊查看。那麼這次就來好好研究下遊遊到底是個什麼鬼。額……不對,是什麼品種的海豚。
  • 全固態鋰離子電池到底是個什麼鬼?
    看到這則新聞之後第一個想到的就是BMW什麼時候才能學會我朝的一貫作風啊?2026年還有9年時間呢,最差也要說(chui)是(niu)2020年量產讓我等先興奮幾分鐘吧?先開個玩笑,下面言歸正傳。新聞裡講的更為先進的電池就是傳說中的全固態鋰離子電池。今天就跟大家簡單聊聊全固態鋰離子電池的現狀和未來,一起看看全固態鋰離子電池到底是個什麼鬼。
  • 趣話化學史——火焰到底是個什麼鬼(上)
    黑夜中的火焰,驅趕黑暗,溫暖人心,照亮前方的道路,給人無限的希望與光明。早在幾百萬年以前,人類就已經逐漸地掌握並使用著火,它是人類掌握的第一個自然力。然而,火到底是個什麼東西?不論是西方的「四元素說」還是中國古代的「五行學說」,火都被認為是重要的物質組成元素。那麼,作為元素的火,到底是個什麼物質呢?很顯然,亞里斯多德和他的逍遙學派們沒有深究這個火到底是個什麼物質。
  • 相比於Java,python到底有哪些優勢?
    導讀 日新月異,在計算機行業中更是如此。談到編程,首先不可避免的是程式語言。由於在AI的帶動下python更是異軍突起,撼動了許多老大哥的地位。可唯獨java穩如泰山,不可動搖!自然而然的就會出現python與Java的討論聲。
  • 完美契合人類習慣的Python變量和基本數據類型
    Python中的變量到底是什麼,該怎麼樣掌握變量?從我接觸的語言中,Python和Matlab幾乎是最簡單的,特別容易掌握。變量到底是什麼變量的概念來源於數學中的函數概念,直觀理解是可以變化的量。為了方便大家理解,我講一個容易理解的生活例子。
  • Java程式語言中sleep()和yield()的區別
    Java程式語言中sleep()和yield()的區別 Java程式語言在我們使用的時候需要注意很多的東西,下面我們就看看如何才能將sleep()和yield()的區別開?希望大家有所幫助。