Python 自學筆記31 生成器

2021-10-04 22:28:37 字數 3067 閱讀 9662

鋪墊

大家都知道,有列表推導式,那麼,其他序列有沒有推導式呢? 有!

>>

> a =

[i for i in

range

(100)if

not(i%2)

and(i%3)

]'''列表推導式'''

>>

> a[2

,4,8

,10,14

,16,20

,22,26

,28,32

,34,38

,40,44

,46,50

,52,56

,58,62

,64,68

,70,74

,76,80

,82,86

,88,92

,94,98

]>>

> b =

'''字典推導式'''

>>

> b

>>

> c =

'''集合推導式'''

>>

> c

>>

> e =

(i for i in

range(10

))'''此處試圖寫乙個元組推導式'''

>>

> e '''下面的東西看不懂,說明沒有元組推導式'''

at 0x02f416b8

>

沒有元組推導式,那麼括號及其裡面的東西是什麼呢?

沒錯! 就是生成器推導式

1). 生成器定義

在python中,一邊迴圈一邊計算的機制,稱為生成器:generator。

2). 為什麼要有生成器

列表所有資料都在記憶體中,如果有海量資料的話將會非常耗記憶體。

如:僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

如果列表元素按照某種演算法推算出來,那我們就可以在迴圈的過程中不斷推算出後續的元素,這樣就不必建立完整的list,從而節省大量的空間。

簡單一句話:我又想要得到龐大的資料,又想讓它占用空間少,那就用生成器!

通過next()方法可以乙個乙個的訪問生成器推導式中的結果

>>

> c =

>>

> c

>>

> e =

(i for i in

range(10

))>>

> e

at 0x02f416b8

>

>>

>

next

(e)0

>>

>

next

(e)1

>>

>

next

(e)2

>>

>

next

(e)3

>>

>

for i in e :

print

(i)456

789>>

>

sum(i for i in

range

(100

)if i %2)

2500

3).yield語句

yield相當於 return 返回乙個值,並且記住這個返回的位置,下次迭代時,**從yield的下一條語句開始執行。

>>

>

defmyegn()

:print

('生成器被執行'

)yield

1yield

2>>

> mygen = myegn(

)>>

>

next

(mygen)

生成器被執行

1>>

>

next

(mygen)

2>>

>

next

(mygen)

traceback (most recent call last)

: file ""

, line 1,in

next

(mygen)

stopiteration

利用生成器實現輸出斐波那契數列

>>

>

deffibs()

: a =

0 b =

1while

true

: a,b = b,a+b

yield a

>>

>

for each in fibs():

if each >

100:

break

print

(each)11

2358

1321

3455

89

4).生成器的工作原理

(1)生成器(generator)能夠迭代的關鍵是它有乙個next()方法,

工作原理就是通過重複呼叫next()方法,直到捕獲乙個異常。

(2)帶有 yield 的函式不再是乙個普通函式,而是乙個生成器generator。

可用next()呼叫生成器物件來取值。next 兩種方式 t.next() | next(t)。

可用for 迴圈獲取返回值(每執行一次,取生成器裡面乙個值)

(基本上不會用next()來獲取下乙個返回值,而是直接使用for迴圈來迭代)。

(3)yield相當於 return 返回乙個值,並且記住這個返回的位置,下次迭代時,**從yield的下一條語句開始執行。

(4).send() 和next()一樣,都能讓生成器繼續往下走一步(下次遇到yield停),但send()能傳乙個值,這個值作為yield表示式整體的結果

——換句話說,就是send可以強行修改上乙個yield表示式值。比如函式中有乙個yield賦值,a = yield 5,第一次迭代到這裡會返回5,a還沒有賦值。第二次迭代時,使用.send(10),那麼,就是強行修改yield 5表示式的值為10,本來是5的,那麼a=10

Python筆記003 生成器和生成器表示式

以下是我學習 流暢的python 後的個人筆記,現在拿出來和大家共享,希望能幫到各位python學習者。生成器使用yield做關鍵字,一次只返回乙個值給呼叫者,然後暫停執行,其作用是 節省記憶體空間。生成器可以用next 函式,也可以用for迭代的方式獲取元素值,中間還可以用close 來隨時終止生...

python3生成器 Python3 生成器

python3 生成器 閱讀 125 發布於 2020 05 19 14 29 25 在python中,一邊迴圈一邊計算出元素的機制,稱為生成器 generator。生成器的優點 一次返回乙個結果,延遲計算。這對於大資料量處理,是個非常有用的優勢。占用記憶體量是工程師必須考慮的乙個問題。提高 可讀性...

Python(九)生成器

該系列文章用來記錄一下自己在b站學習python時,進行上機練習用的 使用 pycharm 2020.3.3 慕課 python語言基礎與應用 北京大學 陳斌 字幕校對 編寫程式,輸入兩個數,輸出它們的商,採用例外處理來處理兩種錯誤,給出使用者友好的提示資訊 1 除數為0 2 輸入了非數值 try ...