python筆記 生成器

2021-10-08 09:39:45 字數 3677 閱讀 1104

python筆記 生成器

好記性不如爛筆頭,學習從摘抄開始!

1.通過列表生成式(列表推導式),我們可以直接建立乙個 列表。但是,受到記憶體限制,列表容量肯定是有限的。

2.建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,

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

4.如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?

5.這樣就不必建立完整的list,從而節省大量的空間。

6.在python中, 這種邊迴圈一邊j計算的機制,稱為生成器: generator.

格式:與列表推導式類似,將換成了()

=(

《表示式》

for《變數》

in《舊列表》

)=(《表示式》

for《變數》

in《舊列表》

if《條件》

)=(《表示式1

>

if《條件》

else

《表示式2

>

for《變數》

in《舊列表》

)

注意:當生成的元素超出預設個數時,會丟擲異常

例子:name.next() 一次生成乙個元素

g =

(i *

3for i in

range(30

))print

(type

(g))

ans = g.__next__(

)print

(ans)

ans = g.__next__(

)print

(ans)

ans = g.__next__(

)print

(ans)

結果:

<

class

'generator'

>03

6

只要函式**現關鍵字yield,說明函式變成了生成器

步驟:

1.定義乙個函式,函式中使用關鍵字yield

2.呼叫函式,接收呼叫的結果

3.得到的結果就是生成器

4.借助 next(《生成器name>) 《生成器name>.next()得到元素

例子1:g.next() 和 next() 一次生成乙個元素

def

func()

: n =

0while

true

: n = n +

1yield n # yield 相當於return+暫停

print

('第{}測試:'

.format

(n), n)

g = func(

)print

(type

(g))

ans = g.__next__(

)print

('接收到的返回值:'

, ans)

ans = g.__next__(

)print

('接收到的返回值:'

, ans)

ans =

next

(g)print

('接收到的返回值:'

, ans)

ans =

next

(g)print

('接收到的返回值:'

, ans)

結果:

<

class

'generator'

>

接收到的返回值:

1第1測試: 1

接收到的返回值:

2第2測試: 2

接收到的返回值:

3第3測試: 3

接收到的返回值:

4

例子2:name.send() 一次生成乙個元素的同時並傳入生成器乙個引數

第一次呼叫.send(),必須傳入none,

def

func()

: n =

0while

true

: n = n +

1 temp =

yield n # yield 相當於return+暫停 將 n 返回,並接受到的引數賦值給temp

print

('第{}測試:'

.format

(n), temp)

g = func(

)print

(type

(g))

# 第一次呼叫.send(),必須傳入none

ans = g.send(

none

)print

('接收到的返回值'

, ans)

# 第二次呼叫 可以傳入其他引數,先執行yield後面的語句,在迴圈執行到yield

ans = g.send(

"hello"

)print

('接收到的返回值'

, ans)

# 第三次呼叫 可以傳入其他引數,先執行yield後面的語句,在迴圈執行到yield

ans = g.send(

"world"

)print

('接收到的返回值'

, ans)

結果:

<

class

'generator'

>

接收到的返回值 1

第1測試: hello

接收到的返回值 2

第2測試: world

接收到的返回值 3

例子:通過生成器控制兩個任務交替進行

def

task1()

: n=

0while

true

: n=n+

1print

('任務1第{}次執行'

.format

(n))

yield

none

deftask2()

: n =

0while

true

: n = n +

1print

('任務2第{}次執行'

.format

(n))

yield

none

g1 = task1(

)g2 = task2(

)g1.__next__(

)g2.__next__(

)g1.__next__(

)g2.__next__(

)g1.__next__(

)g2.__next__(

)

結果:

任務1第1次執行

任務2第1次執行

任務1第2次執行

任務2第2次執行

任務1第3次執行

任務2第3次執行

Python筆記 生成器

日期 20170925 python中有乙個很有趣的東東,叫生成器。我們先來看看簡單的 1,usr bin python3 defmygenerator for n in range 1,4 yield n return done print mygenerator print num mygene...

python生成器筆記

生成器 自動實現了迭代器協議 物件必須提供乙個next方法,執行改方法要麼返回迭代中的下一項,要麼就引起乙個stopiteration的異常,以終止迭代 只能往後走不能往前進 第一種形式 idter i for i in range 10 idter為乙個生成器,有next 方法,idter.nex...

Python生成器筆記

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