Python生成器的用法,使用生成器灵活的生成斐波那契数列
生成器,一定情況下可以節(jié)省很多空間
比如:
>>> b = (x for x in range(10))>>> b<generator object <genexpr> at 0x02A17120> 這就是一個(gè)生成器,占的內(nèi)存空間要比列表小得多
需要取值的話,可以用next()函數(shù),或者_(dá)_ next__()方法,比如取上面的b的值:
>>> next(b)0>>> b.__next__()1>>> next(b)2>>> b.__next__()3>>>……Ps:當(dāng)然也可以使用for遍歷b的值
生成器的另外一種寫法和應(yīng)用:
斐波那契數(shù)列是說(shuō)后面一個(gè)數(shù)始終是前面兩個(gè)數(shù)的和,比如:1,1,2,3,5,8,13,21……,可以使用下面的方式來(lái)創(chuàng)建這樣的一組數(shù):
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' def createNum():print("start----------------")a,b = 0,1for i in range(1000):#只要函數(shù)里面有yield這個(gè)關(guān)鍵字,就表示這個(gè)函數(shù)是一個(gè)生成器yield b a,b = b,a+bprint("stop--------")a = createNum()
走第一次next(a),上面這個(gè)函數(shù)的執(zhí)行步驟:
1、 執(zhí)行print(“start----------------”)
2、 a = 0, b = 1
3、 第一次循環(huán),走到y(tǒng)ield b,打印一個(gè)b出來(lái),當(dāng)前是1,遇到y(tǒng)ield,程序會(huì)停止往下運(yùn)行
4、 走第二次next(a),程序繼續(xù)執(zhí)行,從剛才停止的位置yield b的下面開(kāi)始,也就是執(zhí)行:a,b = b,a+b,此時(shí)b=0+1=1,然后進(jìn)行第二次for循環(huán),又一次執(zhí)行到y(tǒng)ield b,打印b的值為1,又一次停止運(yùn)行。
5、 再次走next(a),重復(fù)上面的步驟,打印2出來(lái)
6、 直到for循環(huán)完畢
這個(gè)生成器的作用就是說(shuō)你可以事先定義一個(gè)可以生成很多斐波那契數(shù)列的數(shù)值的一個(gè)函數(shù),這個(gè)函數(shù)占用空間很小,到需要用的時(shí)候,再用next函數(shù)去生成,需要多少個(gè)就next多少次
另外,還有一種情況,可以完成兩個(gè)函數(shù)交叉調(diào)用:
def test1(): #定義一個(gè)帶有yield None的生成器while True:print(“----111------”)yield Nonedef test2(): #定義另外一個(gè)帶有yield None的生成器while True:print(“----222------”)yield Nonea = test1() #創(chuàng)建兩個(gè)生成器對(duì)象b = test2()def test(): #定義一個(gè)函數(shù),調(diào)用生成器對(duì)象while True:a.__next__()b.__next__()#調(diào)用test test()結(jié)果:
----111----------222----------111----------222----------111----------222----------111----------222------……總結(jié)
以上是生活随笔為你收集整理的Python生成器的用法,使用生成器灵活的生成斐波那契数列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何写一个Python万能装饰器,既可以
- 下一篇: Python字符串和正则表达式中的反斜杠