總結:可以把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函式 記錄 當前分析的 狀態,一種是將狀態 由外部呼叫者 傳入,一...