python3基礎之生成器

2021-01-07 程式設計師fearlazy

初識生成器

說到生成器還是要從列表推導式說起,關於列表推導式可以看看《python3基礎之如何使用列表推導式》。先看一個簡單的列表推導式:

可以看到列表推導式是用中括號將式子括起來的,如果把中括號改成小括號,那它就變成一個生成器了:

按照推導式的理論,看這式子的結構我還以為list2是一個元組推導式呢。看來python裡應該沒有元組推導式了。現在已經知道生成器長什麼樣了,那生成器又有什麼用呢?寫個例子測試一下吧:

這麼看生成器和列表好像是一樣的,那要生成器幹什麼呢?實際上生成器像是保存了一套算法的一個對象,剛開始的時候並它沒有實際的值,只有在使用時才去生成。也就是說到第二for執行之前list2裡並沒有2和3這兩個值。而列表推導式會先計算出所有的元素,也就是說list1在第一個for執行之前已經存在2和3這兩個值了。為了驗證這點寫個例子測試一下:

為了看到效果,我們將列表推導式和生成器的range改為了200000.程序運行時看到list2直接列印出來了,而list1要經過十幾秒才列印出來(生成列表花費了十幾秒)。經過這麼比較生成器的優勢就體現出來了,對於列表內的元素數量較大的情況下,生成器可以減少內存。而對於列表中存在耗時操作的對象時,生成器又能提高運行效率(因為它生成一個就能先用一個)。

函數生成器

上面那種生成器是通過一個表達式來表示的,如果邏輯需要很複雜的話,用式子就不好表示了。這時候可以用函數的方式來創建生成器。函數創建生成器的形式又是怎樣的呢?舉個例子:

函數中包含yield (e後面是小寫的字母'L'),那麼函數返回的就是一個生成器對象。 生成器也是一種可迭代對象,yield的作用就是返回一次迭代的值。我們通過next獲取生成器的值:

從例子中可以看到我們首先創建了一個生成器,第一次調用next獲取了第一yield返回的值,第二次調用next獲取的是第二個yield返回的值。它並不是整個函數直接返回一個結果,而是在使用時才生成數據。yield返回結果後好像暫停了一樣,直到要獲取生成器的下一個值時,再從剛才的yield後面繼續運行。

相關焦點

  • python入門基礎之生成器與yield詳解
    >使用生成器的好處(作用)生成器概念:Python使用生成器對延遲操作提供了支持。3.調用的時候返回生成器對象。生成器的用法:1、close()方法close()方法就是關閉生成器。生成器被關閉後,再次調用next()方法,不管能否遇到yield關鍵字,都會立即拋出StopIteration異常。2、send()方法這是我認為生成器最重要的功能,我們可以通過send()方法,向生成器內部傳遞參數。
  • python基礎:range方法在Python2和Python3中的不同
    range(0, 5)step:步長,既下一次生成的數和這次生成的數的差,例如range(1, 10, 2) 生成[1,3,5,7,9],再如range(1,10,3) 生成[1, 4, 7]代碼示例:使用區別在python2中,range方法得到的結果就是一個確定的列表對象,列表對象所擁有的方法,range方法生成的結果對象都可以直接使用,而在python3
  • Python生成器next方法和send方法區別詳解
    1.和傳統的容器相比,生成器更節省內存. 2.延遲計算,在我們需要結果時就調用一下生成器的next()方法即可. 3.可迭代,你可以像遍歷list一樣,遍歷生成器 三.如何創建生成器?提到生成器,總不可避免地要把迭代器拉出來對比著講,生成器就是一個在行為上和迭代器非常類似的對象,如果把迭代器比作 Android 系統,那麼生成器就是 iOS,二者功能上差不多,但是生成器更優雅.
  • Python3與Python2 區別
    接天蓮葉無窮碧,映日荷花別樣紅--楊萬裡《曉出淨慈寺送林子方》1、整數相除: python2結果為整數, 捨棄餘數部分;python3
  • Python 生成器之細說 yield
    本文字數:1763 字閱讀本文大概需要:5 分鐘寫在之前在前天的文章(零基礎學習 Python 之初識生成器)中我們留了這麼一個問題:「yield 除了作為生成器的標誌以外,還有一個「返回值」的功能,我們知道 return 也有這個功能,那麼它跟 return 的這個返回值有什麼區別呢」?
  • JAVA代碼生成器,快速開發平臺之魂
    雖然在前後端上選擇了SSH框架系統作為基礎,但還是耗費了太多時間補代碼,再加上業務需求並不明確,導致後期頻繁的改動令人頭大,當時就想,如果有一種方式能將精力集中到業務上就好了。所以,就有了做一個高效寫碼工具的想法。當代年輕人就是這樣,想要就回去做,我在參考CMS網站時,發現很多都是能用模板填充的,且都是統一的實現方式。
  • Python數據讀取之生成器(generator)
    Python生成器是創建迭代器的簡單方法。簡單來說,生成器是一個函數,它返回一個我們可以迭代的對象(迭代器),迭代器一次返回一個值較使用列表將所有數據都加載到內存中,生成器節省了大量內存空間。深度學習的數據讀取部分一般都需要使用迭代器。
  • 二維碼生成器
    二維碼生成器 系統安全 大小: 1.92M
  • 快速開發平臺之代碼生成器——實例分享
    ,今天為大家介紹快速開發平臺的代碼生成器功能。快速開發平臺是開發人員將各種需要的功能以目前流行的多種web技術,包括springboot, JPA,Druid, Activiti,Lombok,swagger,poi,WebSocket,Jquery,BootStrap, maven,Jenkins 等等 )為基礎封裝在不同的層中,給大家調用,而大家在調用時不需要清楚這些方法裡面是如果實現的,只需要關注輸出的結果是否是自己想要的就可以了
  • python之generator生成器模擬資料庫主鍵自增
    在python中,生成器就可以做到這一點。生成器語法格式1、同列表生成式一樣,唯一區別是將「[]」換成「()」。2、生成器函數(函數內部使用yield)說明:如果在函數中出現了yield關鍵字,則這個函數不再是普通的函數,而是一個生成器,其實這個yield的含義就是將一個普通函數變成一個生成器。這種方式下,生成器可以實現無限制的列表元素,而列表生成式就無法做到這一點。
  • 腦科學方向|Python3的安裝與環境搭建
    本節來學習python3的安裝與環境搭建。考慮到大部分人的需求與原有經驗,之後的學習都會以 windows 10(64位) 作業系統為系統平臺,而不是Ubuntu 16等linux系統。對於基礎篇,實際上python各版本的差異無須考慮,然而,如果後續到了學習如tensorflow\pytorch 框架裡 nvdia cuda 的顯卡gpu模型訓練時,對python版本這類基礎開發環境的更換就幾乎沒有容忍度。或許會提出疑問,假如兩個會產生不兼容的python版本或第三方庫都需要怎麼辦呢?
  • 時空之門前端代碼生成器 Swing 獨立版嘗鮮版公布,歡迎使用
    時空之門前端代碼生成器Swing獨立版嘗鮮版公布,歡迎使用
  • Javascript 生成器
    在 javascript 中,如果想要使用生成器,則需要: 定義特殊的生成器函數 調用該函數創建一個生成器對象 在循環中使用該生成器對象,或直接調用其 方法 我們以下面這個簡單的程序做為起點,並執行以下每個步驟:
  • 營銷號生成器的工作原理是什麼 有哪些好玩的營銷號生成器
    在B站上,你甚至可以看到上百個關於「營銷號生成器」的相關內容。標題也一如既往的精彩,例如「還在為成不了營銷號而煩惱嗎,那就進來試試營銷號文章生成器吧」「用營銷號打開核彈狂魔程世濤的考古————悖論篇」「營銷號生成器之營銷號做不到系列」「用[營銷號生成器]打開OMO」「以【黑人抬棺】為題
  • 時空之門前端代碼生成器獨立嘗鮮版 4.5 公布,歡迎使用
    時空之門前端代碼生成器開發者手冊已公布讓代碼生成器成為大家開發程序的一項優勢簡介時空之門前端代碼生成器,是第四代動詞算子式代碼生成器,經過徹底的重構的先進動詞算子式代碼生成器,也是專用的Vue+ElementUI前端代碼生成器,可以和多種後端代碼生成器搭配。和平之翼和光對前端代碼生成的支持是通過引用不同的時空之門的版本實現的。
  • 萬聖節定製「喪屍生成器」,編輯部親測,效果鬼畜
    原創 Synced 機器之心機器之心報導作者:張倩、魔王get 了這個網站,今年萬聖節 C 位就是你的!AI 是一個盛產陰間產品的領域,這一點似乎已經毋庸置疑。看來,有了這個生成器,萬聖節不用愁換什麼頭像了。
  • python3處理JSON數據
    前言使用python做開發,經常會遇到json數據解析問題,本文,我將帶領大家學習使用python3處理json數據,並將字典反轉義為json數據。一、基礎知識1.什麼是JSONJSON是一種輕量級的數據交換格式,便於任何機器理解,採用完全獨立於程式語言的文本格式來存儲和表示數據。