【Python培訓基礎知識】Python生成器函式

千鋒教育qyf發表於2021-03-23

  對於程式而言,記憶體也是很重要的,因為程式中很多資料都是儲存在記憶體中的,如果記憶體中儲存的資料過多,那麼系統就會崩潰,這是人們不希望發生的。

  可以採用生成器推導式來解決記憶體不足的問題。例如,利用生成器推導式建立一個生成器n,資料為1~33數字,可以寫成n = (i for i in range(1, 34))。這樣當程式需要一個數時,程式才生成資料,可以節省記憶體。然而生成器推導式太過簡單,只能用一行程式碼的形式實現,如果要建立複雜的生成器,如建立一個生成器f,生成前10個斐波那契數字,生成器推導式已經不能滿足需求了,因為斐波那契數列最開始的兩個數都無法賦值。

  函式可以實現複雜的功能,然而要節省記憶體,就需要使用生成器函式。生成器函式與普通函式的區別是函式中包含關鍵字yield。實際上只要含有yield關鍵字的函式就是生成器函式。

  生成器函式是用函式實現生成器。定義生成器函式的語法格式如下:

  

1

  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……以此類推,就得到了整個斐波那契數列。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996644/viewspace-2764535/,如需轉載,請註明出處,否則將追究法律責任。

相關文章