淺議yield 語句

2021-01-11 51Testing軟體測試網

  

python 中最富爭議的語句就是 yield 語句,yield 語句提供了用戶構造實現生成器(generator)的可能,但由於其語法和函數很相像,所以容易誤用和誤解:

  讓我們來看下面一段經典的 yield 語句使用:

  1. yield 使用示例

  以上是 python 官網中對於fibonacci sequence(斐波那契數列)的一個經典實現,其中的 yield 語句每次返回一個 fibo 數;yield 語句的使用使得 fibo()成為了一個生成器函數,該函數需要實例化出一個生成器對象才能被投入使用,語句f = fibo() 正是在做實例化生成器的步驟,這點很關鍵;有了生成器實例對象,利用生成器對象的 next()方法,可以每次當即計算生成一個 fibo 數,並將其返回。生成器對象內部會記憶 上下文狀態 ,簡單來說就是記憶暫停播放的點,在上述示例中就是記住變量a 和 變量b 的當前值。

  生成器對象相比於序列對象(sequence object),例如列表對象,元組對象,字符串對象等的來說,是一種數據的延遲加載方案,可以節約出大量的內存資源,是一種以時間換空間的性能優化策略。下面的示例,能夠體現出yield 生成器對象的這種使用:

  2. yield 生成器作為迭代器示例

  運行的結果如下顯示:

  上述代碼示例中的agen對象作為可迭代對象放入了 for-in語句中,隨著 while 條件滿足的失敗,生成器的生命周期也到了終點,再調用該對象的next()方法,則會拋出StopIteration的異常;從兩次運行的時間耗費長度上來看,顯然 yield 生成器的用時要相對耗時多些,但這是內存節約的代價;deltaNum返回的是完整的列表對象,佔5個整數的內存,而arithmetic僅僅佔用一個整數的內存空間。

相關焦點

  • 理解yield和生成器
    要理解什麼是yield,必須理解什麼是生成器(generator)。在理解生成器之前,讓我們先了解迭代。迭代當你建立了一個列表,你可以逐個地訪問這個列表的元素,而這個訪問的過程叫做迭代(iteration)代碼中的mylist就是一個可迭代對象(iterable),當你使用列表生成式時,你就創建了一個list,同時也創建了一個可迭代對象:凡是能使用for...in...語句的對象,都叫做可迭代對象,例如:list、string、文件等等
  • 讓你徹底明白yield語法糖的用法和原理及在C 函數式編程中的作用
    如果大家讀過dapper源碼,你會發現這內部有很多方法都用到了yield關鍵詞,那yield到底是用來幹嘛的,能不能拿掉,拿掉與不拿掉有多大的差別,首先上一段dapper中精簡後的Query方法,先讓大家眼見為實。
  • Unity3d教程C-sharp實現Coroutines&Yield
    Unity3D教程:c#腳本yield的用法 Coroutines & Yield是Unity3D編程中重要的概念,它可以實現將一段程序延遲執行或者將其各個部分分布在一個時間段內連續執行,但是在Javascript與C#中實現Coroutines & Yield,
  • Python基礎教程——批量任務處理神器yield
    Python中有一個特別晦澀難懂的概念,就是生成器和yield。特別地,如果我們使用scrapy框架進行爬蟲開發,就避不開yield這個關鍵詞,所以,我們需要知道yield是什麼。我們今天不解釋概念,直接用下面的圖說話:
  • Java程式語言中sleep()和yield()的區別
    Java程式語言中sleep()和yield()的區別 Java程式語言在我們使用的時候需要注意很多的東西,下面我們就看看如何才能將sleep()和yield()的區別開?希望大家有所幫助。
  • 陳斌:賈平凹陳彥小說異質性淺議
    #紀錄片中國#賈平凹陳彥小說異質性淺議文/豐陽玢子著名作家賈平凹早期小說的異質性是缺乏的,隨著他創作經驗的日趨成熟,他小說裡的異質性也非常突出的表現出來。《兵娃》是賈平凹的早期小說,作品裡圍繞荷塘展開,異質性缺乏。
  • Verilog HDL基礎之:賦值語句和塊語句
    塊語句通常用來將兩條或多條語句組合在一起,使其在格式上看更像一條語句。塊語句有兩種:一種是begin_end語句,通常用來標識順序執行的語句,用它來標識的塊稱為順序塊;另一種是fork_join語句,通常用來標識並行執行的語句,用它來標識的塊稱為並行塊。下面進行詳細的介紹。
  • Python語言基本語法元素之語句,表達式、賦值語句
    今天筆者想寫Python語言基本語法元素中的語句語句如圖,程序代碼就是一行行語句。語句,簡單粗糙的理解就是一個句子。在中文,語句就是以句號為分界的句子。在程式語言中,語句,就是擁有完整意義的代碼結構。例如:rate = 1.6375 # 1林吉特=1.6375人民幣賦值語句上面是一行代碼,就是一個語句。
  • excel編程系列基礎:常用語句之循環語句的邏輯理解
    今天是第三篇VBA實戰入門教程,我們將給大家帶來VBA中最常見語句之一,循環語句。典型的循環語句有4種,分別是Do While…Loop循環、Do…Loop Until循環、For…Next循環、For Each x In y … Next循環。查看循環邏輯圖可以更快理解循環語句。學習更多技巧,請收藏關注部落窩教育excel圖文教程。
  • R語言中的next語句和break語句的具體用法
    我們知道在像C語言,C#語言,Java語言中可以分別使用continue語句和break語句來實現,那麼在R語言中也是這樣的嗎?回答是不完全是這樣的。在R語言中要終止某一次循環要使用next來實現,要終止整個循環就可以使用break語句來實現。
  • VBA中的If-Then-Else語句
    第一節 If...Then...Else語句大家好,我們再次理解If...Then...Else語句在代碼中的作用,這個語句在VBA代碼中隨處可見,對於VBA而言,條件判斷應用的非常靈活,或者可以說是EXCEL函數的終結者,當你利用VBA上手後,不用再去應用EXCEL函數去解決問題了。
  • VBA中的循環語句
    今日給大家講VBA的循環語句,這個是非常基礎的知識,在VBA的相關內容中我也一直在用,也在不斷的講解,今日專門作為一個專題給大家詳細的說明,中間也有一些有意思的小例子,供大家玩耍。一 FOR NEXT語句 這種循環是以指定的次數,來重複執行的一組語句這個結構一般是這樣的:for counter= start to end [ step 步長值][statements][exit for][statements]Next counter具體解釋一下,初始值指的是循環開始的值
  • Python while循環語句的使用
    本篇介紹Python循環語句的使用,文中主要討論while循環語句,使用while循環語句可以解決程序中需要重複執行的操作,本文講解的每個案例中都配有流程圖和代碼說明。通過本篇的學習,可以達成如下目標。
  • python循環控制語句
    循環語句語句後面一定要跟:冒號for循環:1.for…in range()遍歷格式:for i in range(5);或者for i in range( 0,10,3 );格式中的1列印i是從0開始後列印到5結束
  • python條件判斷語句
    python輸入語句 大家已經練習完了輸出之後呢,我們來繼續看一下輸入語句的用法 input後面加上提示輸入的語句,就可以獲取用戶輸入的語句 舉個小例子: 我們輸入123456後按回車,即可成功輸入
  • Python的range函數與for循環語句
    本篇介紹Python for循環語句和range函數的使用,文中主要討論for循環語句,Python的for循環語句類似於shell或是腳本語言中的foreach循環,可以迭代序列對象。使用range函數可以讓Python的for循環提供類似於傳統的for循環功能。通過本篇的學習,可以達成如下目標。