古文生成器python python(生成器)

2021-10-11 22:23:55 字數 1724 閱讀 4677

生成器

先從列表生成式說起

可以通過簡單的式子,生成有規律的列表

如果把 [ ] 換為 ( ) 會發生什麼呢?

看到 x 存的不再是列表,而是乙個位址,而這個位址就是我們的生成器物件的位址

這東西有什麼用呢? 當然時,節省記憶體啦

假設現在有很龐大的一組資料要處理,貌似不可能把它一次性載入記憶體再進行處理,這時候就體現出了生成器的好處,因為它只占用乙個資料的記憶體空間,當需要訪問下乙個

資料時,當前的資料會被覆蓋掉,所以有多少資料都無所謂啦,都是可以處理的。可以通過 next() 或 __next__() 方法訪問下乙個資料。

當然還是要借助迴圈來進行對元素的訪問,100w個資料不可能敲一百萬個 next() 吧。

當然如果這些資料不能用表示式表示怎麼辦?答案就是用函式 + yield 關鍵字,有yield關鍵字的函式就是乙個生成器。

來個栗子(列印斐波那契數列):

yield a 可以理解為返回乙個a,但會記下當前**的位置,下次將從yield a 的下一句開始執行**。拿這段**來說,從最後的迴圈說起。

1.next() 方法啟動生成器,生成器要執行一次

2.程式進入wile迴圈

3.遇到yield a 返回a值並幾下斷點

4.for 迴圈的print語句受到a的值列印a=1

5.for繼續迴圈,有呼叫了next()方法,生成器再次啟動

6.生成器找到上次斷點的位置執行**(a,b = b,a+b)...

7.再次遇到yield語句,回到步驟 3

除了 next()方法 ,send ( )也可以啟動生成器,但是send可以給生成器傳值,而這個值將強制替換上次斷點的處的返回值

看到 send 傳入的引數替換的是 res 的值,而不是 a 的值!!!,至於為什麼會列印 『none』 其實 next 預設傳入乙個 none 所以一呼叫 next() 就會列印 none,而呼叫 send 則

列印 sned 傳入的引數。

最後來乙個經典的生產者消費者問題吧

1 import time

2 def consumer(name):

3 print("%s is ready to consume" % name)

4 while true:

5 res = yield

6 print("%s has consumed goods %d" % (name,res))

7 def producer(name):

8 print("%s is ready to produce" % name)

9 while true:

10 time.sleep(3)

11 succ = yield

12 print("produce goods %d and goods %d successfully" % (succ,succ+1))

13 c1 = consumer('c1')

14 c2 = consumer('c2')

15 c1.__next__()

16 c2.__next__()

17 p1 = producer('p1')

18 p1.__next__()

19 for i in range(10):

20 p1.send(i+1)

21 c1.send(i+1)

22 c2.send(i+2)

標籤:__,python,生成器,send,next,yield,print

python 生成器作用 Python生成器

生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...

python生成器好處 Python生成器筆記

python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...

生成器python python生成器是怎樣工作的

第一部分 在掌握python生成器之前,你需要理解普通的python函式是如何工作的。通常,當乙個python函式呼叫乙個子程式時,子程式保留控制權直到它返回,或者丟擲乙個異常。然後控制權被交還給呼叫者 父程式 def foo bar def bar pass python的標準直譯器是由c寫成的。...