python yield 生成器用法

2021-09-23 17:23:07 字數 2691 閱讀 3495

總結:可以把send()看成是next()的公升級版。send()不僅能像next()一樣觸發生成器的乙個迭代,還能傳入乙個值給yield語句

看下面乙個列子:

def func():

y = 1

while true:

x = yield y

y += 1

print('接收了x = {}'.format(x))

f = func() # f是乙個初始化好的生成器

# print('傳入send(100):', f.send(100)) # 在生成器剛初始化時,不能用send()傳入資料,否則會報錯。 可以用send(none)。

print('第一次 next():', next(f)) # 生成器啟動(啟用生成器),**停在『x = yield y』這裡,

# 傳入的值為none, next()相當於send(none),產生第乙個yield值1。

print('第二次 next():', next(f)) # next()函式觸發生成器,從『y+=1』開始執行,y變成了2,

# 最後再次停在『x=yield y』處,產生乙個yield值2,因為沒有接收到send值,所以x=none。

print('傳入send(10):', f.send(10)) # 此時收到send(10), yield語句被賦值為10,即『x=yield y =10』,⇨ 『x=10』。

# 但不影響yield自身產生的值,會接著執行『y+=1『,y變成3,

# 所以仍會有乙個『next()』產生乙個yield值3,再次停在『x=yield y』處。

# 此處敲黑板:send()帶有next()功能。

print('第三次 next():', next(f)) # next()函式觸發生成器,從』y+=1『開始執行,y變成了4,

# 然後再次停在』x=yield y『,產生乙個yield值4,沒有接收到send值,所以x=none。

f.close() # close()關閉生成器.

#print('第四次 next():', next(f)) # 因為 close()關閉生成器,所以會產生stopiteration錯誤。

執行後的結果為:

第一次 next(): 1

接收了x = none

第二次 next(): 2

接收了x = 10

傳入send(10): 3

接收了x = none

第三次 next(): 4

def fun_yield():

yield 1

a = yield 2

print(a)

yield 3

return 4

f = fun_yield()

print(next(f)) # 啟動生成器,第一次迭代出 1, **停在此處。

print(f.send('這是在第二次迭代中傳遞的值')) # 這時send傳進去的值是賦給**所停的yield位置處,即上面 1 的地方。

# 再實現」next()「功能,迭代出 第二個值 2,然後**停在 yield 2 的地方 。

print(f.send('這是在第三次迭代中傳遞的值')) # 因為此時**停在 yield 2 的地方,所以這時 send()進去的值 賦給了 a,相當於給a重新賦值了。

# 再實現 next() 功能,**執行到下個 yield 處,所以會 print(a),再迭代出 3。

得到的結果為:

1

2這是在第三次迭代中傳遞的值

3

這說明,雖然 a = yield 2 是在第二個迭代中的,但實際上 a 的值是第三次迭代時傳進去的。

具體理解,可以看上面**的注釋。

def foo():    # 定義乙個返回 0,1,2,3, 4 五個數字的生成器。

n = 0

while true:

yield n

n = n+1

if n == 5:

break

return 1111 # 前5次的迭代不都會執行return,

# 等foo()中的元素迭代完後,再一次迭代會報錯: 「stopiteration」,並返回乙個 1111 的值。

def func():

a = yield from foo() # 呼叫 foo()生成器。

print('foo() 最後的返回值 a = {}'.format(a)) # 當foo()生成器的元素全部迭代完後,再次呼叫 next(),就執行這句**。

yield 2222 # 呼叫 next()執行上面這句**後,馬上執行這句**,yield 出 2222。

f = func()

for i in range(6):

print(next(f))

# 迭代6次,前面5次從 foo()中取出,

# 第6次迭代時,foo()產生乙個stopiteration錯誤,並返回乙個值 1111 給func()中的a

# 然後 func()自身 yield 出 2222 給第六次的迭代結果。

python yield建立生成器

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

Python yield生成器 函式

def count num yield 1 yield 2 yield 3 yield 4 return num count num 呼叫next 依次向下取值,yield類似return,中斷流程,記錄返回當前的值,一直往下執行,直到執行生成器函式中的return觸發生成器物件丟擲stopiter...

python yield 生成器 的作用

編譯器 中最初級的模組是進行詞法分析,將源 轉化成 token流。可以 一次性將所有 字元轉換成token list 之後再處理 也可以每次獲取乙個 token,處理之後,接著再獲取下乙個token,即邊分析邊處理,這就需要token函式 記錄 當前分析的 狀態,一種是將狀態 由外部呼叫者 傳入,一...