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