python三大神器===》生成器

lee_lgw發表於2021-09-09

1. 認識生成器

  利用迭代器,我們可以在每次迭代獲取資料(透過next()方法)時按照特定的規律進行生成。但是我們在實現一個迭代器時,關於當前迭代到的狀態需要我們自己記錄,進而才能根據當前狀態生成下一個資料。為了達到記錄當前狀態,並配合next()函式進行迭代使用,我們可以採用更簡便的語法,即生成器(generator)。生成器是一類特殊的迭代器

2.如何建立一個生成器:

  生成器時一種特殊的迭代器,我們既然知道迭代器的建立方法,那麼建立一個生成器也不是一件難事,首先我們先認識第一種生成器的建立的方法:

利用生成器推導式的方法建立一個生成器

  


# 第一種生成器建立方法my_list = (x for x in range(10)) print(my_list)print(next(my_list))print(next(my_list))print(next(my_list))

  執行結果


012

  怎麼樣這樣方式建立一個生成器是不是特別簡單呢?需要注意的是列表推導式是[ ]而生成器推導式是(),這一點不要搞錯了。

3.利用生成器編寫斐波那序數列

  我們已經知道了一種生成器的建立方法,接下來我們將透過建立生成器的第二種方法來建立一個斐波那序數列

  首先我們先了解下斐波那序數列,斐波那序數列定義了第一個數為0第二個為1,之後的每個數字都為前兩個數字之和,簡單來說就是類似與 0,1,1,2,3,5.......的數列

  


# 生成器的第二種建立方法def dome(num):    a = 0    b = 1    # 定義下標值    iter_index = 0    while iter_index         item = a        a, b = b, a + b        iter_index+=1        # 返回自定義的值 ,yield xxx相當於一個暫停jian,下次接著從這裡的下一行開始執行,和return有很大的區別        send_values = yield item        print(send_values) test = dome(5)values = next(test)print(values)values = next(test)print(values)
values
= next(test)
print(values)
values
= next(test)
print(values)

 執行結果


0112

 我們可以看到,這種定義方法與定義一個迭代器差不多,比較明顯的區別就是yeild 替代了return,那麼yeild與return有什麼區別呢?

 首先return是返回並終止函式的執行,如果return有值則返回return後的值,而yeild則是展廳函式的執行,下次執行函式會接著執行yeild只有的程式碼,如果yeild後有值則返回yeild後的值

4.生成器的send方法

  yeild函式除了能暫停函式的執行外,還能透過send()方法向其傳送一個值,接下來我們驗證一下:

 


def dome(num):    a = 0    b = 1    # 定義下標值    iter_index = 0    while iter_index         item = a        a, b = b, a + b        iter_index+=1        # 返回自定義的值 ,yield xxx相當於一個暫停jian,下次接著從這裡的下一行開始執行,和return有很大的區別        send_values = yield item        print(send_values)   # 生成器send問題test = dome(5)print(test)values = test.send(None)print(values)values = test.send(10)print(values)values = test.send(100)print(values)

 執行結果


01011001

需要注意的是,第一個send()傳的值必須為none,否則會報錯。這是為什麼呢?這是因為第一次執行時yeild返回了result = ?寧沒有被執行,如果直接傳過去一個非none的值會因為沒有人接收而報錯。

 原文出處:https://www.cnblogs.com/xuchuankun/p/9514545.html


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

相關文章