最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python生成器generator和yield關(guān)鍵字的使用

 更新時(shí)間:2024年09月12日 13:36:30   作者:江南野梔子  
生成器是一種特殊的迭代器,可以通過(guò)列表推導(dǎo)式的修改或者使用yield關(guān)鍵字來(lái)創(chuàng)建,生成器函數(shù)能夠在迭代時(shí)動(dòng)態(tài)產(chǎn)生值,而不是一次性生成所有值,這有助于節(jié)省內(nèi)存,yield關(guān)鍵字使函數(shù)執(zhí)行暫停并保存當(dāng)前狀態(tài),下次調(diào)用時(shí)從停止處繼續(xù)執(zhí)行

Python生成器generator和yield關(guān)鍵字

生成器 generator 是一個(gè)返回迭代器的函數(shù),只能用于迭代操作,更簡(jiǎn)單點(diǎn)理解生成器就是一個(gè)迭代器。

實(shí)現(xiàn)生成器有兩種方式:

第一:將列表推導(dǎo)式種的 [] 改成 ()

a=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
   ["a","b","c","d","e","f","g","h","i","j"],
  ["A","B","C","D","E","F","G","H","I","J"]]
res=(tmp for ele in a for tmp in ele )
type(res)

可以看出 res 已經(jīng)是一個(gè)生成器了

那么使用生成器有什么用途呢?

1)迭代器能做的,它也能做,例如 next() 方法

2) 也可以使用 for 循環(huán)

3)最重要的是,它是隨用隨取的,不會(huì)像列表生成式 [] 那樣一下子全生成,只是在迭代時(shí)候才會(huì)生成(雖然對(duì)于用戶而言,遍歷時(shí)候可能感受不到)。

第二:使用 yield 關(guān)鍵字

yield 關(guān)鍵字是很特殊的,一個(gè)函數(shù)里有了 yield 后,執(zhí)行到 yield 就會(huì)停住,下載再次調(diào)用時(shí)繼續(xù)從上一次中斷的位置繼續(xù)執(zhí)行代碼并返回值。所以生成器函數(shù)即使是有無(wú)限循環(huán)也沒關(guān)系,它需要算到多少就會(huì)算多少,不需要就不往下算。

請(qǐng)注意,有 yield 關(guān)鍵字的函數(shù)不是生成器,是該函數(shù)的運(yùn)行結(jié)果是一個(gè)生成器!

先說(shuō)說(shuō)最簡(jiǎn)單的情況

我先創(chuàng)建一個(gè)函數(shù) f ,依次生成100以內(nèi)的數(shù), 使用 type 函數(shù)可以看到這是一個(gè) function

def f():
    i=0
    yield i
    while(i<100):
        i+=1
        yield i

那么執(zhí)行這個(gè)函數(shù)呢

res=f()type(res)

這個(gè)函數(shù)執(zhí)行的結(jié)果是一個(gè)生成器!

對(duì)這個(gè)返回的生成器,可以使用 next() 方法

使用生成器解決實(shí)際問(wèn)題,例如常見的斐波拉契數(shù)列。

斐波拉契數(shù)列:指的是這樣一個(gè)數(shù)列:1、1、2、3、5、8、13、21、34、……在數(shù)學(xué)上,斐波那契數(shù)列以如下被以遞推的方法定義:F(0)=0,F(xiàn)(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

1) 一個(gè)簡(jiǎn)單的無(wú)線循環(huán)的 fib 生成器

def fib():
    a=[0,1]
    yield a[0]
    yield a[1]
    while True:
        tmp=a[0]+a[1]
        a=[a[1],a[0]+a[1]]
        yield tmp

運(yùn)行結(jié)果是

2)一個(gè)有限循環(huán)的(n 次數(shù))的 fib 生成器

def fib(n):
    i=0
    a,b=0,1
    yield a
    while(i<n):
        a,b=b,a+b
        i+=1
        yield a

運(yùn)行結(jié)果如下,當(dāng)?shù)螖?shù)小于等于 n 時(shí)候,可以輸出相應(yīng)的數(shù)列數(shù),大于 n 時(shí)候則報(bào)錯(cuò)。

3)斐波拉契數(shù)列的一個(gè)變形,即返回包含前 n 個(gè) 數(shù)的列表

理論上1)2) 都可以實(shí)現(xiàn),但是有一個(gè)額外要求,即不需要反復(fù)去從 1 計(jì)算起。

使用 1) 中無(wú)限循環(huán)函數(shù)

%%time
# 一個(gè)簡(jiǎn)單的無(wú)線循環(huán)的,生成fib 數(shù)列的生成器
def fib():
    a=[0,1]
    yield a[0]
    yield a[1]
    while True:
        tmp=a[0]+a[1]
        a=[a[1],a[0]+a[1]]
        yield tmp

# 只要前 n 個(gè) fib 數(shù)字
i=0
n=10
res=[]
gen=fib()
# 簡(jiǎn)單的 while 循環(huán) 因?yàn)槭褂胣ext 不需要重復(fù)計(jì)算
while(i<n):
    res.append(next(gen))
    i+=1
res

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python 給圖像添加透明度(alpha通道)

    python 給圖像添加透明度(alpha通道)

    這篇文章主要介紹了python 給圖像添加透明度,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python如何輸入根號(hào)

    python如何輸入根號(hào)

    這篇文章主要介紹了python如何輸入根號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Django的性能優(yōu)化實(shí)現(xiàn)解析

    Django的性能優(yōu)化實(shí)現(xiàn)解析

    這篇文章主要介紹了Django的性能優(yōu)化實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python的進(jìn)程及進(jìn)程池詳解

    Python的進(jìn)程及進(jìn)程池詳解

    這篇文章主要為大家介紹了Python的進(jìn)程及進(jìn)程池,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • Python正則表達(dá)式常用函數(shù)總結(jié)

    Python正則表達(dá)式常用函數(shù)總結(jié)

    這篇文章主要介紹了Python正則表達(dá)式常用函數(shù),結(jié)合實(shí)例形式總結(jié)分析了Python正則表達(dá)式常用函數(shù)功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-06-06
  • 遺傳算法python版

    遺傳算法python版

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)遺傳算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 詳解Python如何利用Pandas與NumPy進(jìn)行數(shù)據(jù)清洗

    詳解Python如何利用Pandas與NumPy進(jìn)行數(shù)據(jù)清洗

    許多數(shù)據(jù)科學(xué)家認(rèn)為獲取和清理數(shù)據(jù)的初始步驟占工作的 80%,花費(fèi)大量時(shí)間來(lái)清理數(shù)據(jù)集并將它們歸結(jié)為可以使用的形式。本文將利用 Python 的 Pandas和 NumPy 庫(kù)來(lái)清理數(shù)據(jù),需要的可以參考一下
    2022-04-04
  • python實(shí)現(xiàn)Simhash算法

    python實(shí)現(xiàn)Simhash算法

    這篇文章主要介紹了python實(shí)現(xiàn)Simhash算法,simhash算法用來(lái)進(jìn)行文本比對(duì)的,simhash包含分詞、hash、加權(quán)、合并、降維五大步驟,下文圍繞更多相關(guān)資料介紹,需要的小伙伴可以參考一下
    2022-02-02
  • Python實(shí)現(xiàn)Windows鍵盤鼠標(biāo)自動(dòng)化模擬器

    Python實(shí)現(xiàn)Windows鍵盤鼠標(biāo)自動(dòng)化模擬器

    這篇文章主要為大家詳細(xì)介紹了一個(gè)基于Python的Windows鍵盤鼠標(biāo)自動(dòng)化模擬器,適合自動(dòng)化測(cè)試、游戲輔助等場(chǎng)景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-10-10
  • python灰色預(yù)測(cè)法的具體使用

    python灰色預(yù)測(cè)法的具體使用

    灰色系統(tǒng)理論認(rèn)為對(duì)既含有已知信息又含有未知或非確定信息的系統(tǒng)進(jìn)行預(yù)測(cè),本文就介紹了python灰色預(yù)測(cè)法的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-03-03

最新評(píng)論

乐亭县| 临海市| 莎车县| 静海县| 马公市| 遂川县| 河北区| 平安县| 涿州市| 阿巴嘎旗| 高州市| 山阴县| 建湖县| 桓台县| 寻乌县| 徐汇区| 建德市| 法库县| 澳门| 福建省| 清徐县| 顺义区| 唐海县| 中江县| 招远市| 微博| 曲周县| 瑞安市| 白朗县| 金乡县| 绥芬河市| 乡宁县| 揭东县| 潜山县| 清水县| 封开县| 隆德县| 江门市| 汾阳市| 桂林市| 太白县|