日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

【Python基础】弄懂这几个问题,拿下 Python 生成器!

發(fā)布時(shí)間:2025/3/8 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python基础】弄懂这几个问题,拿下 Python 生成器! 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我的施工之路

1我的施工計(jì)劃

2數(shù)字專題

3字符串專題

4列表專題

5流程控制專題

6編程風(fēng)格專題

7函數(shù)使用

8面向?qū)ο缶幊?上篇)

9面向?qū)ο缶幊?下篇)

10十大數(shù)據(jù)結(jié)構(gòu)

11包和模塊使用總結(jié)

12Python正則專題總結(jié)

13設(shè)計(jì)模式

14Python時(shí)間模塊總結(jié)

15?Python 裝飾器

16?Python 迭代器

今天介紹生成器和yield的用法,通過(guò)如下8、9個(gè)小問(wèn)題,相信大家會(huì)對(duì)它們有一點(diǎn)新的認(rèn)識(shí)。

1 什么是可迭代對(duì)象?

可迭代對(duì)象,英文Iterable,是一個(gè)形容詞,這類對(duì)象和Java語(yǔ)言類似,都可看作是一類接口,抽象地描述事物具備怎樣的能力。所以,Iterable自然具備可迭代能力。

如下,常見(jiàn)的list,Iterator等都是Iterable對(duì)象:

In?[33]:?from?collections.abc?import?Iterable,Iterator??????????????????????In?[34]:?issubclass(list,Iterable)?????????????????????????????????????????? Out[34]:?TrueIn?[35]:?issubclass(Iterator,Iterable)?

2 什么是一個(gè)生成器?

生成器是可迭代的(Iterable),最簡(jiǎn)單的創(chuàng)建生成器方法是通過(guò)一對(duì)(),如下所示:

In?[37]:?g?=?(i*i?for?i?in?[1,4,0])?????????????????????????????????????????In?[38]:?g?????????????????????????????????????????????????????????????????? Out[38]:?<generator?object?<genexpr>?at?0x7fe8956e96d0>

g 是一個(gè)生成器對(duì)象,generator object

獲取生成器對(duì)象的元素,可使用next函數(shù),如下所示,獲取第一個(gè)元素:

In?[39]:?next(g)???????????????????????????????????????????????????????????? Out[39]:?1

獲取第二個(gè)元素:

In?[40]:?next(g)???????????????????????????????????????????????????????????? Out[40]:?16

3 創(chuàng)建生成器的幾種方法?

如上所見(jiàn),使用一對(duì)()能夠創(chuàng)建一個(gè)生成器對(duì)象。

除此之外,想必大家也都知道,是使用關(guān)鍵字 yield. yield出現(xiàn)在一個(gè)函數(shù)中,運(yùn)行到y(tǒng)ield處,返回的對(duì)象便是生成器對(duì)象(generator object).

4 生成器是迭代器嗎?

生成器對(duì)象(generator object)一定也是迭代器對(duì)象(Iterator object),如上面的生成器g,使用內(nèi)置函數(shù)isinstance驗(yàn)證,返回True:

In?[43]:?isinstance(g,Iterator)????????????????????????????????????????????? Out[43]:?True

因此,它具備一切迭代器的特性,關(guān)于迭代器我們已在上一個(gè)話題討論,簡(jiǎn)而言之,迭代器的幾個(gè)特點(diǎn):

  • 是有去無(wú)回的,

  • 迭代器無(wú)需提前知道整個(gè)列表的所有元素,

  • 無(wú)需加載所有元素到RAM中盡而它是節(jié)省內(nèi)存的(memory-efficient).

  • 生成器同樣具備這些特性。除此之外,它還有一些獨(dú)有的特性,下面跟隨yield 我們便能看出來(lái)。

    5 如何用一句話描述 yield?

    yield 關(guān)鍵字的用法在stackoverflow上也是最熱的問(wèn)題之一,借用一個(gè)最熱回答中的解釋:

    yield is a keyword that is used like return, except the function will return a generator.

    yield 是一個(gè)特殊的return, 它返回一個(gè)生成器對(duì)象。

    說(shuō)實(shí)話,理解這些只是皮毛。那么,如何精通yield的用法呢?

    6 如何精通yield的用法?

    要想精通yield,你必須首先搞清楚一點(diǎn):

    當(dāng)你調(diào)用帶有yield的函數(shù)時(shí),函數(shù)并沒(méi)有執(zhí)行任何一行,只是返回一個(gè)生成器對(duì)象

    為了幫助大家理解,創(chuàng)建一個(gè)帶有yield的函數(shù):

    def?gfun():mylist?=?range(3)for?i?in?mylist:yield?i*ig?=?gfun() print(g)

    為了加深印象,你可以自己調(diào)試驗(yàn)證一遍,函數(shù)第一行打的斷點(diǎn)始終未被命中。

    帶yield的函數(shù)和for結(jié)合使用,第一次調(diào)用上一步創(chuàng)建的生成器對(duì)象后,將會(huì)進(jìn)入函數(shù)體直到遇到y(tǒng)ield返回值。

    然后,for循環(huán)再進(jìn)入函數(shù)時(shí),直接跑到y(tǒng)ield的下一句。直到生成器對(duì)象變空為止。

    使用下面代碼演示yield的上面過(guò)程:

    def?createGenerator():mylist?=?range(3)for?i?in?mylist:yield?i*iprint(i*i)g?=?createGenerator() print(g) for?gi??in?g:pass

    參考錄制的gif:

    7 yield 都有哪些重要價(jià)值?

    Python引入yield后,便擁有具備實(shí)現(xiàn)協(xié)程的能力,協(xié)程的確是一種高效的編程模型,關(guān)于協(xié)程的理解,后面專題會(huì)詳細(xì)討論。包括更高級(jí)的功能如異步等,根基都是yield.

    8 yield 和 itertools

    yield重要性和使用廣泛性還提現(xiàn)在,Python單獨(dú)一個(gè)模塊專門(mén)用于管理迭代器和生成器對(duì)象,便是itertools,里面封裝的方法特性后面再討論。

    9 yield 使用案例

    yield實(shí)現(xiàn)浮點(diǎn)數(shù)步長(zhǎng)的frange:

    def?frange(start,end,step):i?=?startwhile?i<end:yield?round(i,3)i+=step

    調(diào)用frange:

    for?item?in?frange(10,14,0.8):print(item)

    結(jié)果:

    10 10.8 11.6 12.4 13.2

    最后總結(jié)今天討論的幾個(gè)問(wèn)題:

    • 1 什么是可迭代對(duì)象?

    • 2 什么是一個(gè)生成器?

    • 3 創(chuàng)建生成器的幾種方法?

    • 4 生成器是迭代器嗎?

    • 5 如何用一句話描述 yield?

    • 6 如何精通yield的用法?

    • 7 yield 都有哪些重要價(jià)值?

    • 8 yield 和 itertools

    • 9 yield 使用案例

    往期精彩回顧適合初學(xué)者入門(mén)人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開(kāi):https://t.zsxq.com/662nyZF本站qq群704220115。加入微信群請(qǐng)掃碼進(jìn)群(如果是博士或者準(zhǔn)備讀博士請(qǐng)說(shuō)明):

    總結(jié)

    以上是生活随笔為你收集整理的【Python基础】弄懂这几个问题,拿下 Python 生成器!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。