<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

帶你一起學習徹底搞懂Python生成器

電子工程師 ? 來源:lq ? 2019-02-25 09:13 ? 次閱讀

寫在之前

Python 的高級語言特性一直是我們學習 Python 的一個難點,大部分人并沒有做到熟練的掌握,甚至去學習它都感覺很困難,「生成器」作為其中甚是有用的特性之一,更是如此。

因為在其它的主流語言(C/C++/JAVA)中并沒有生成器的概念,加之其具有一定的難度,學習起來花費的時間成本較大,很多人自我安慰式的視其為“雞肋”,然后果斷放棄如此有用的一個高級語言特性,實在是一件很惋惜的事情。

其實不光是對于「生成器」而言,對于其它的高級語言特性還是建議大家要花點時間去搞懂的,不說其它,這些東西作為面試中??嫉膬热菀矐撘鹉愕闹匾?,畢竟公司不是傻瓜,沒有用的東西干嘛要考你?

接下來就讓我們來一起學習「生成器」,我盡量用大家都聽的懂的話,層層遞進的講解,保證大家都能看懂,前提是要有耐心,文章較長,建議先收藏再看。

答應我,一定要有耐心。

迭代器

在這說「迭代器」的原因是「生成器」自動實現了「迭代器協議」,所謂協議,就是一種約定。為了更好的理解生成器,我們需要簡單知道一下「迭代器協議」到底是個什么東西。其實只需要滿足兩個兩個條件:1.實現 __iter__ 方法;2.對象實現 next() 方法,要么返回迭代中的下一項,要么就是以 StopIteration 異常終止迭代。

對象就是「可迭代對象」,即實現了迭代器協議的對象,它實現了迭代器協議。其實像是 Python 中 for 循環,sum 函數等等就是使用迭代器協議訪問對象。

你可能看著有點懵,怎么又是「迭代」又是「迭代器」又是「可迭代對象」的,這對大家來說是很抽象的概念,但是不用怕,我在很久之前的文章中,已經很詳細的介紹過這倆哥們,你只需要點擊下面的鏈接去看就好了,這也是面試中常見的問題哦:

零基礎學習 Python 之初識迭代

Python 拓展之迭代器

生成器

如果你理解了上一節的內容,那么恭喜你,接下來學習「生成器」就會簡單很多。Python 使用生成器對「延遲操作」提供了支持,所謂「延遲操作」就是在需要它的時候才產生結果,而不是說立即產生結果。

首先我們先來看一個入門級別的版本,你只需要點擊下面的鏈接即可:

零基礎學習 Python 之初識生成器

接下來講的相當于是上面文章的一個延伸和再拓展。

Python 其實有兩種不同的方法來提供生成器,一種是函數形式,另一種是表達式形式,說全一點兒就是「生成器函數」和「生成器表達式」。

1.生成器函數

「生成器函數」和普通的函數定義類似。區別在于普通函數使用 return 返回結果,生成器函數是用yield返回結果。

yield的作用是在調用的時候返回相應的值,一次返回一個結果,在每個結果中間掛起函數的狀態(即暫停執行),下一次執行是從上次暫停的位置開始,繼續向下執行。

下面我們來做一道題,要求寫出「將一個全是整數的列表進行操作后只保留奇數」。相信大多數人都能很快的寫出下面這樣的函數:

defget_odd(lst): res = [] foriinlst: ifi %2: res.append(i) returnresdefmain(): lst = range(10) foriinget_odd(lst): print(i)if__name__ =='__main__': main()

上面這個沒什么難度,既然我們學了「生成器」,我在前面還這么舔它,是不是我們該用生成器來做一下這道題?看看用生成器來做同樣的功能,到底有什么不同:

defget_odd(lst): foriinlst: ifi %2: yieldidefmain(): lst = range(10) foriinget_odd(lst): print(i)if__name__ =='__main__': main()

對比一下這個功能的兩種做法,使用「生成器」以后,代碼變的行數更少了(省去了對 res 的操作,不用把結果存在 res 里),代碼整體看起來更清晰了(一看就知道干嘛的,不用一上來去想 res 是個什么鬼,append 進去的是個什么玩意兒)。

2.生成器表達式

「生成器表達式」和列表推導式類似。區別在于使用列表推導,一次會產生所有的結果,而用「生成器表達式」則不會這樣,它是按需產生。

列表推導式的寫法如下:

>>> res = [xforxinrange(5)]>>> res[0, 1, 2, 3, 4]

生成器表達式就是將上面的 [] 變成 () 即可:

>>> res = (xforxinrange(5))>>> res at 0x109d9f570>>>> next(res)0>>> next(res)1>>> next(res)2>>> next(res)3

我們也順便簡單的看一下「生成器」的優勢在「生成器表達式」中是怎么體現的。如果我們想對一系列整數求和,直接用生成器可以寫成下面這樣:

>>> sum((xforxinrange(5)))10

當然為了方便起見,也可以省略圓括號,即寫成下面這樣:

>>> sum(xforxinrange(5))10

但是如果你用常規的寫法去寫,就會寫成下面這樣:

>>> sum([xforxinrange(5)])10

上面的代碼先構造了一個列表,然后再用 sum 函數求和,多了一步,天差地別,光在時間效率上,就已經輸掉了褲子。

所以綜合上面文章所講,「生成器」光在明面上的優點就有好幾個:代碼行數更少;代碼更易讀;時效更高...

所以,你還敢視它為“雞肋”嗎?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4117

    瀏覽量

    61465
  • 生成器
    +關注

    關注

    7

    文章

    306

    瀏覽量

    20425
  • python
    +關注

    關注

    52

    文章

    4698

    瀏覽量

    83610

原文標題:面試必備|帶你徹底搞懂Python生成器

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    bootloader生成器中的中斷跳轉怎么避免中斷跳躍

    您好,BootRADER生成器在中斷向量中寫入跳躍。我不想使用Bootloader中的中斷,因為我想避免中斷跳躍。它是否與Bootloader生成器一起工作,或者我必須用腳踏寫引導程序嗎? 以上
    發表于 10-11 08:36

    如何去使用生成器

    生成器的工作原理是什么?如何去使用生成器呢?
    發表于 10-25 08:44

    榮小菜補鈣記第54期:報文序列生成器3

    本帖最后由 榮琪 于 2022-1-20 23:31 編輯 榮小菜補鈣記第54期:報文序列生成器3同步更新于 WeChat:榮小菜在補鈣歡迎關注 內容更豐富大家好,我是榮小菜,上期進行了報文
    發表于 01-07 22:49

    python生成器

    python生成器1. 什么是生成器?生成器(英文名 Generator ),是個可以像迭代器那樣使用for循環來獲取元素的函數。
    發表于 02-24 15:56

    pim卡資料生成器

    pim卡資料生成器
    發表于 11-22 23:23 ?6次下載

    自制酸奶生成器

    自制酸奶生成器
    發表于 04-23 11:48 ?888次閱讀
    自制酸奶<b class='flag-5'>生成器</b>

    LED段碼生成器

    本文提供的LED段碼生成器,希望對你的學習有所幫助!
    發表于 06-03 15:19 ?96次下載

    c語言流程圖生成器下載

    本內容提供了c語言流程圖生成器下載,歡迎大家下載學習
    發表于 05-10 11:10 ?178次下載

    代碼生成器的應用

    jeesite框架代碼生成器,可以很方便的生成代碼,挺不錯的。
    發表于 01-14 15:19 ?0次下載

    STM32庫函數代碼自動生成器V1.2

    stm32庫函數代碼自動生成器是STM32學習的小工具。 stm32庫函數代碼自動生成器可以根據你的配置生成相應的庫函數代碼。
    發表于 06-17 17:55 ?0次下載

    python生成器是什么

    python生成器 1. 什么是生成器? 生成器(英文名 Generator ),是一個可以像迭代器那樣使用for循環來獲取元素的函數。 生成器
    的頭像 發表于 02-24 15:53 ?3174次閱讀

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目
    發表于 01-11 19:00 ?0次下載
    將使用代碼<b class='flag-5'>生成器</b><b class='flag-5'>生成</b>的項目移植到與智能配置器<b class='flag-5'>一起</b>使用的項目

    通用RFID生成器

    通用RFID生成器資料分享
    發表于 02-10 15:35 ?1次下載

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目
    發表于 06-30 20:54 ?0次下載
    將使用代碼<b class='flag-5'>生成器</b><b class='flag-5'>生成</b>的項目移植到與智能配置器<b class='flag-5'>一起</b>使用的項目

    Python中的生成器是什么?它們的效率和可用性如何?

    Python 是一種以靈活性和多功能性著稱的語言,它提供了一種稱為生成器的強大功能。
    發表于 07-19 14:33 ?363次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>