0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

帶你一起學(xué)習(xí)徹底搞懂Python生成器

電子工程師 ? 來(lái)源:lq ? 2019-02-25 09:13 ? 次閱讀

寫(xiě)在之前

Python 的高級(jí)語(yǔ)言特性一直是我們學(xué)習(xí) Python 的一個(gè)難點(diǎn),大部分人并沒(méi)有做到熟練的掌握,甚至去學(xué)習(xí)它都感覺(jué)很困難,「生成器」作為其中甚是有用的特性之一,更是如此。

因?yàn)樵谄渌闹髁髡Z(yǔ)言(C/C++/JAVA)中并沒(méi)有生成器的概念,加之其具有一定的難度,學(xué)習(xí)起來(lái)花費(fèi)的時(shí)間成本較大,很多人自我安慰式的視其為“雞肋”,然后果斷放棄如此有用的一個(gè)高級(jí)語(yǔ)言特性,實(shí)在是一件很惋惜的事情。

其實(shí)不光是對(duì)于「生成器」而言,對(duì)于其它的高級(jí)語(yǔ)言特性還是建議大家要花點(diǎn)時(shí)間去搞懂的,不說(shuō)其它,這些東西作為面試中常考的內(nèi)容也應(yīng)該引起你的重視,畢竟公司不是傻瓜,沒(méi)有用的東西干嘛要考你?

接下來(lái)就讓我們來(lái)一起學(xué)習(xí)「生成器」,我盡量用大家都聽(tīng)的懂的話,層層遞進(jìn)的講解,保證大家都能看懂,前提是要有耐心,文章較長(zhǎng),建議先收藏再看。

答應(yīng)我,一定要有耐心。

迭代器

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

對(duì)象就是「可迭代對(duì)象」,即實(shí)現(xiàn)了迭代器協(xié)議的對(duì)象,它實(shí)現(xiàn)了迭代器協(xié)議。其實(shí)像是 Python 中 for 循環(huán),sum 函數(shù)等等就是使用迭代器協(xié)議訪問(wèn)對(duì)象。

你可能看著有點(diǎn)懵,怎么又是「迭代」又是「迭代器」又是「可迭代對(duì)象」的,這對(duì)大家來(lái)說(shuō)是很抽象的概念,但是不用怕,我在很久之前的文章中,已經(jīng)很詳細(xì)的介紹過(guò)這倆哥們,你只需要點(diǎn)擊下面的鏈接去看就好了,這也是面試中常見(jiàn)的問(wèn)題哦:

零基礎(chǔ)學(xué)習(xí) Python 之初識(shí)迭代

Python 拓展之迭代器

生成器

如果你理解了上一節(jié)的內(nèi)容,那么恭喜你,接下來(lái)學(xué)習(xí)「生成器」就會(huì)簡(jiǎn)單很多。Python 使用生成器對(duì)「延遲操作」提供了支持,所謂「延遲操作」就是在需要它的時(shí)候才產(chǎn)生結(jié)果,而不是說(shuō)立即產(chǎn)生結(jié)果。

首先我們先來(lái)看一個(gè)入門(mén)級(jí)別的版本,你只需要點(diǎn)擊下面的鏈接即可:

零基礎(chǔ)學(xué)習(xí) Python 之初識(shí)生成器

接下來(lái)講的相當(dāng)于是上面文章的一個(gè)延伸和再拓展。

Python 其實(shí)有兩種不同的方法來(lái)提供生成器,一種是函數(shù)形式,另一種是表達(dá)式形式,說(shuō)全一點(diǎn)兒就是「生成器函數(shù)」和「生成器表達(dá)式」。

1.生成器函數(shù)

「生成器函數(shù)」和普通的函數(shù)定義類(lèi)似。區(qū)別在于普通函數(shù)使用 return 返回結(jié)果,生成器函數(shù)是用yield返回結(jié)果。

yield的作用是在調(diào)用的時(shí)候返回相應(yīng)的值,一次返回一個(gè)結(jié)果,在每個(gè)結(jié)果中間掛起函數(shù)的狀態(tài)(即暫停執(zhí)行),下一次執(zhí)行是從上次暫停的位置開(kāi)始,繼續(xù)向下執(zhí)行。

下面我們來(lái)做一道題,要求寫(xiě)出「將一個(gè)全是整數(shù)的列表進(jìn)行操作后只保留奇數(shù)」。相信大多數(shù)人都能很快的寫(xiě)出下面這樣的函數(shù):

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

上面這個(gè)沒(méi)什么難度,既然我們學(xué)了「生成器」,我在前面還這么舔它,是不是我們?cè)撚蒙善鱽?lái)做一下這道題?看看用生成器來(lái)做同樣的功能,到底有什么不同:

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

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

2.生成器表達(dá)式

「生成器表達(dá)式」和列表推導(dǎo)式類(lèi)似。區(qū)別在于使用列表推導(dǎo),一次會(huì)產(chǎn)生所有的結(jié)果,而用「生成器表達(dá)式」則不會(huì)這樣,它是按需產(chǎn)生。

列表推導(dǎo)式的寫(xiě)法如下:

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

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

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

我們也順便簡(jiǎn)單的看一下「生成器」的優(yōu)勢(shì)在「生成器表達(dá)式」中是怎么體現(xiàn)的。如果我們想對(duì)一系列整數(shù)求和,直接用生成器可以寫(xiě)成下面這樣:

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

當(dāng)然為了方便起見(jiàn),也可以省略圓括號(hào),即寫(xiě)成下面這樣:

>>> sum(xforxinrange(5))10

但是如果你用常規(guī)的寫(xiě)法去寫(xiě),就會(huì)寫(xiě)成下面這樣:

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

上面的代碼先構(gòu)造了一個(gè)列表,然后再用 sum 函數(shù)求和,多了一步,天差地別,光在時(shí)間效率上,就已經(jīng)輸?shù)袅搜澴印?/p>

所以綜合上面文章所講,「生成器」光在明面上的優(yōu)點(diǎn)就有好幾個(gè):代碼行數(shù)更少;代碼更易讀;時(shí)效更高...

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4361

    瀏覽量

    63580
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    322

    瀏覽量

    21471
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4821

    瀏覽量

    85625

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

文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    python生成器

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

    pim卡資料生成器

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

    自制酸奶生成器

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

    LED段碼生成器

    本文提供的LED段碼生成器,希望對(duì)你的學(xué)習(xí)有所幫助!
    發(fā)表于 06-03 15:19 ?98次下載

    代碼生成器的應(yīng)用

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

    STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版

    STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版 STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版
    發(fā)表于 07-25 18:52 ?0次下載

    AN-113:精密坡道生成器

    AN-113:精密坡道生成器
    發(fā)表于 05-16 12:04 ?6次下載
    AN-113:精密坡道<b class='flag-5'>生成器</b>

    python生成器是什么

    python生成器 1. 什么是生成器? 生成器(英文名 Generator ),是個(gè)可以像迭代器那樣使用for循環(huán)來(lái)獲取元素的函數(shù)。
    的頭像 發(fā)表于 02-24 15:53 ?3810次閱讀

    Arduino贊美生成器

    電子發(fā)燒友網(wǎng)站提供《Arduino贊美生成器.zip》資料免費(fèi)下載
    發(fā)表于 11-09 14:22 ?1次下載
    Arduino贊美<b class='flag-5'>生成器</b>

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

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

    通用RFID生成器

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

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

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

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

    Python種以靈活性和多功能性著稱(chēng)的語(yǔ)言,它提供了種稱(chēng)為生成器的強(qiáng)大功能。
    發(fā)表于 07-19 14:33 ?572次閱讀

    Python生成器的使用方法

    個(gè)例子,編寫(xiě)個(gè)函數(shù)計(jì)算串?dāng)?shù)字里所有偶數(shù)的個(gè)數(shù),其實(shí)是很簡(jiǎn)單的問(wèn)題,但是有些人是用生成器這么寫(xiě)的: In [ 66 ]: def f1 ( x ): ....: return s
    的頭像 發(fā)表于 11-03 15:41 ?595次閱讀

    Python中的迭代器與生成器

    Python迭代器與生成器 列表生成式 列表生成式也叫做列表推導(dǎo)式,它本身還是列表,只不過(guò)它是根據(jù)我們定義的規(guī)則來(lái)生成
    的頭像 發(fā)表于 02-20 10:43 ?211次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品