IT培訓(xùn)網(wǎng)
IT在線學(xué)習(xí)
對于程序而言,內(nèi)存也是很重要的,因?yàn)槌绦蛑泻芏鄶?shù)據(jù)都是保存在內(nèi)存中的,如果內(nèi)存中存儲(chǔ)的數(shù)據(jù)過多,那么系統(tǒng)就會(huì)崩潰,這是人們不希望發(fā)生的。
可以采用生成器推導(dǎo)式來解決內(nèi)存不足的問題。例如,利用生成器推導(dǎo)式創(chuàng)建一個(gè)生成器n,數(shù)據(jù)為1~33數(shù)字,可以寫成n = (i for i in range(1, 34))。這樣當(dāng)程序需要一個(gè)數(shù)時(shí),程序才生成數(shù)據(jù),可以節(jié)省內(nèi)存。然而生成器推導(dǎo)式太過簡單,只能用一行代碼的形式實(shí)現(xiàn),如果要?jiǎng)?chuàng)建復(fù)雜的生成器,如創(chuàng)建一個(gè)生成器f,生成前10個(gè)斐波那契數(shù)字,生成器推導(dǎo)式已經(jīng)不能滿足需求了,因?yàn)殪巢瞧鯏?shù)列最開始的兩個(gè)數(shù)都無法賦值。
函數(shù)可以實(shí)現(xiàn)復(fù)雜的功能,然而要節(jié)省內(nèi)存,就需要使用生成器函數(shù)。生成器函數(shù)與普通函數(shù)的區(qū)別是函數(shù)中包含關(guān)鍵字yield。實(shí)際上只要含有yield關(guān)鍵字的函數(shù)就是生成器函數(shù)。
生成器函數(shù)是用函數(shù)實(shí)現(xiàn)生成器。定義生成器函數(shù)的語法格式如下:
- >>> def fib(): # 定義生成器函數(shù)
- ... a, b = 1, 1 # 定義初始值
- ... while True:
- ... yield a # 暫停執(zhí)行,返回一個(gè)新變量值
- ... a, b = b, a+b
- ...
- >>> a= fib() # 調(diào)用生成器函數(shù)
- >>> for i in range(10):
- ... print(next(a)) # 調(diào)用生成器函數(shù)的yield生成值
- ...
- 1
- 1
- 2
- 3
- 5
- 8
- 13
- 21
- 34
- 55
def 函數(shù)名(參數(shù)):
函數(shù)體
yield 變量名
函數(shù)體
由語法格式可知,生成器函數(shù)與普通函數(shù)的區(qū)別在于函數(shù)體部分,生成器函數(shù)的函數(shù)體含有“yield 變量名”語句。yield的功能類似于return,return是函數(shù)返回值,yield的功能也是返回變量,但是它僅返回變量而不退出函數(shù),因此,yield可以看作是多次返回變量且不會(huì)退出函數(shù)的return。
在調(diào)用生成器函數(shù)時(shí),寫上函數(shù)名與參數(shù),并通過一個(gè)變量接收返回值,語法格式如下:
變量名 = 函數(shù)名(參數(shù))
調(diào)用生成器函數(shù)的yield生成值的第一種方法如下:
next(變量名)
第二種方法如下:
變量名.__next__()
在掌握了生成器函數(shù)的定義和調(diào)用之后,就可以使用生成器函數(shù)實(shí)現(xiàn)生成前10個(gè)斐波那契數(shù)字的案例了。這個(gè)案例主要分為三步,第一步是定義生成器函數(shù),第二步是調(diào)用并賦值,第三步是打印結(jié)果,代碼如下:
在上述程序中,首先定義生成器函數(shù)fib(),函數(shù)內(nèi)先定義斐波那契數(shù)列的兩個(gè)初始值,再寫一個(gè)while True死循環(huán)。這個(gè)死循環(huán)有些特別,先是用yield生成待使用的數(shù)字,再通過賦值語句“a, b = b, a+b”將b的值賦給a,將a+b的值賦給b,每次循環(huán)都是如此。然后調(diào)用生成器函數(shù)fib(),再調(diào)用生成器函數(shù)的yield生成值,最后打印結(jié)果。由于需要生成前10個(gè)斐波那契數(shù)字,因此可以采用for循環(huán),每循環(huán)一次生成并打印一個(gè)斐波那契數(shù)字,共循環(huán)10次。第一次循環(huán)時(shí),調(diào)用yield生成值a,即1;第二次循環(huán)時(shí),調(diào)用yield生成值a,a被賦值成b的值,即1,而b被賦值成a+b的值,即2;第三次循環(huán)時(shí),調(diào)用yield生成值a,a被賦值成b的值,而此時(shí)b的值是上次賦值的a+b的值,即2……以此類推,就得到了整個(gè)斐波那契數(shù)列。
如果對Python開發(fā)感興趣或者想要深入學(xué)習(xí)的現(xiàn)在可以免費(fèi)領(lǐng)取學(xué)習(xí)大禮包哦(點(diǎn)擊領(lǐng)取80G課程資料 備注:領(lǐng)資料)。
>>本文地址:http://liujunjsxg.cn/zhuanye/2020/59911.html
聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
1 您的年齡
2 您的學(xué)歷
3 您更想做哪個(gè)方向的工作?