欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)也沒(méi)關(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)題,例如常見(jià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基于多線程操作數(shù)據(jù)庫(kù)相關(guān)問(wèn)題分析

    Python基于多線程操作數(shù)據(jù)庫(kù)相關(guān)問(wèn)題分析

    這篇文章主要介紹了Python基于多線程操作數(shù)據(jù)庫(kù)相關(guān)問(wèn)題,結(jié)合實(shí)例形式分析了Python使用數(shù)據(jù)庫(kù)連接池并發(fā)操作數(shù)據(jù)庫(kù)避免超時(shí)、連接丟失相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-07-07
  • Pytorch框架之one_hot編碼函數(shù)解讀

    Pytorch框架之one_hot編碼函數(shù)解讀

    這篇文章主要介紹了Pytorch框架之one_hot編碼函數(shù)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python實(shí)現(xiàn)字典合并的五種方法(附示例代碼)

    python實(shí)現(xiàn)字典合并的五種方法(附示例代碼)

    在Python中,有多種方法可以通過(guò)使用各種函數(shù)和構(gòu)造函數(shù)來(lái)合并字典,在本文中,我們將討論一些合并字典的方法,并通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-04-04
  • 利用 PyCharm 實(shí)現(xiàn)本地代碼和遠(yuǎn)端的實(shí)時(shí)同步功能

    利用 PyCharm 實(shí)現(xiàn)本地代碼和遠(yuǎn)端的實(shí)時(shí)同步功能

    這篇文章主要介紹了利用 PyCharm 實(shí)現(xiàn)本地代碼和遠(yuǎn)端的實(shí)時(shí)同步功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python計(jì)算圓周率的5種方法

    python計(jì)算圓周率的5種方法

    這篇文章主要給大家介紹了關(guān)于python計(jì)算圓周率的5種方法,圓周率(Pi)是圓的周長(zhǎng)與直徑的比值,一般用希臘字母π表示,是一個(gè)在數(shù)學(xué)及物理學(xué)中普遍存在的數(shù)學(xué)常數(shù),需要的朋友可以參考下
    2023-07-07
  • 詳解Python函數(shù)可變參數(shù)定義及其參數(shù)傳遞方式

    詳解Python函數(shù)可變參數(shù)定義及其參數(shù)傳遞方式

    這篇文章主要介紹了詳解Python函數(shù)可變參數(shù)定義及其參數(shù)傳遞方式的相關(guān)資料,這里提供實(shí)例代碼幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • Python生成指定數(shù)量的優(yōu)惠碼實(shí)操內(nèi)容

    Python生成指定數(shù)量的優(yōu)惠碼實(shí)操內(nèi)容

    在本篇文章里小編給大家整理了關(guān)于Python生成指定數(shù)量的優(yōu)惠碼的實(shí)例內(nèi)容以及相關(guān)代碼,有需要的朋友們學(xué)習(xí)下。
    2019-06-06
  • Python全棧之模板渲染詳解

    Python全棧之模板渲染詳解

    這篇文章主要為大家詳細(xì)介紹了Python全棧之模板渲染,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Django解決CORS跨域問(wèn)題的方案

    Django解決CORS跨域問(wèn)題的方案

    Cross-Origin Resource Sharing(CORS) 跨域問(wèn)題,在前后端后離項(xiàng)目,selenium , playweight 自動(dòng)化測(cè)試代碼中經(jīng)常遇到,本文給大家介紹了Django解決CORS跨域問(wèn)題的方案,文中有詳細(xì)的代碼講解,需要的朋友可以參考下
    2024-03-03
  • python中JSON數(shù)據(jù)格式的詳細(xì)使用教程

    python中JSON數(shù)據(jù)格式的詳細(xì)使用教程

    這篇文章主要給大家介紹了關(guān)于python中JSON數(shù)據(jù)格式的詳細(xì)使用,JSON是一種用于存儲(chǔ)和交換數(shù)據(jù)的語(yǔ)法,JSON是文本,使用JavaScript對(duì)象表示法編寫,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02

最新評(píng)論