400-650-7353
您所在的位置:首頁 > IT干貨資料 > python > 【Python基礎(chǔ)知識(shí)】Python生成器函數(shù)

【Python基礎(chǔ)知識(shí)】Python生成器函數(shù)

  • 發(fā)布: python培訓(xùn)
  • 來源:python干貨資料
  • 2020-11-06 15:33:33
  • 閱讀()
  • 分享
  • 手機(jī)端入口

對于程序而言,內(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ù)的語法格式如下:

  1. >>> def fib():   # 定義生成器函數(shù) 
  2. ...     a, b = 11   # 定義初始值 
  3. ...     while True
  4. ...         yield a   # 暫停執(zhí)行,返回一個(gè)新變量值 
  5. ...         a, b = b, a+b 
  6. ... 
  7. >>> a= fib()   # 調(diào)用生成器函數(shù) 
  8. >>> for i in range(10): 
  9. ...     print(next(a))   # 調(diào)用生成器函數(shù)的yield生成值 
  10. ... 
  11. 1 
  12. 1 
  13. 2 
  14. 3 
  15. 5 
  16. 8 
  17. 13 
  18. 21 
  19. 34 
  20. 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)資料)。

文章“【Python基礎(chǔ)知識(shí)】Python生成器函數(shù)”已幫助

>>本文地址:http://liujunjsxg.cn/zhuanye/2020/59911.html

THE END  

聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。

1 您的年齡

2 您的學(xué)歷

3 您更想做哪個(gè)方向的工作?

獲取測試結(jié)果
  • 大前端大前端
  • 大數(shù)據(jù)大數(shù)據(jù)
  • 互聯(lián)網(wǎng)營銷互聯(lián)網(wǎng)營銷
  • JavaJava
  • Linux云計(jì)算Linux
  • Python+人工智能Python
  • 嵌入式物聯(lián)網(wǎng)嵌入式
  • 全域電商運(yùn)營全域電商運(yùn)營
  • 軟件測試軟件測試
  • 室內(nèi)設(shè)計(jì)室內(nèi)設(shè)計(jì)
  • 平面設(shè)計(jì)平面設(shè)計(jì)
  • 電商設(shè)計(jì)電商設(shè)計(jì)
  • 網(wǎng)頁設(shè)計(jì)網(wǎng)頁設(shè)計(jì)
  • 全鏈路UI/UE設(shè)計(jì)UI設(shè)計(jì)
  • VR/AR游戲開發(fā)VR/AR
  • 網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全
  • 新媒體與短視頻運(yùn)營新媒體
  • 直播帶貨直播帶貨
  • 智能機(jī)器人軟件開發(fā)智能機(jī)器人
 

快速通道fast track

近期開班時(shí)間TIME