作者首先介紹了生成器的作用:是為了讓程式設計師可以更簡單的編寫用來產生值的序列的**,然後又介紹了一些其他知識。
然後介紹了send是pep 342加入的新特性
通過 send 方法來將乙個值」傳送「給生成器。 other = yield foo 這樣的語句的意思是,「返回 foo 的值,這個值返回給呼叫者的同時,將 other 的值也設定為那個 send 傳送的值」
重點:看這句 xx = yield yy
摘要: send() 的作用是使xx賦值為傳送的值(send的引數),然後讓生成器執行到下個 yield … 即先用 send(none) 啟動,然後每次賦值,賦值後就相當於呼叫了 next()
使用 send(params) 需要區分情況。
'''
'''def
consumer()
: r =
''while
true
: n =
yield r
ifnot n:
return
print
('[consumer] consuming %s...'
% n)
r ='200 ok'
defproduce
(c):
c.send(
none
)#先用空值啟動生成器
n =0while n <5:
n = n +
1print
('[producer] producing %s...'
% n)
r = c.send(n)
#啟動後在傳入真實的值
print
('[producer] consumer return: %s'
% r)
c.close()
c = consumer(
)produce(c)
#解釋
注意到consumer函式是乙個generator,把乙個consumer傳入produce後:
首先呼叫c.send(none)啟動生成器;
然後,一旦生產了東西,通過c.send(n)切換到consumer執行;
consumer通過yield拿到訊息(n接受賦值),處理,又通過yield把結果傳回(返回r);
produce拿到consumer處理的結果,繼續生產下一條訊息;
produce決定不生產了,通過c.close()關閉consumer,整個過程結束。』』』
注意:如果生成器未啟動,則必須在使用send()前必須要啟動生成器,而啟動的方法可以是 generator.next() 或是 generator.send(none) 執行到第乙個yield處。之後就可以使用 send(params) 不斷傳入值了。如果是已啟動,則 send(params) 的作用就是對xx賦值為傳送的值(send的引數),然後讓生成器執行到下個yield…
為什麼需要 send(none) ,也很好理解,因為 生成器還沒有走到第乙個 yield 語句,如果我們發生乙個真實的值,這時是沒有人去「接收」它的。一旦生成器啟動了,就物件接受(即=號左邊的左值xx接受了),之後就可以使用 send(params) 不斷傳入值了
每次的 send() 都會執行到 yield 語句,但賦值不會執行,只會有返回值,相當於return後就退出函式了,所以在返回值之後的賦值就不會執行了。(不理解)
在我看來send()的作用是在next()的基礎上,多了個給xx賦值的功能。 consumer 通過 yield 拿到訊息(n接受賦值),處理,又通過 yield 把結果傳回(返回r);然後執行到下乙個 yield 處===>可以看出當send方法的引數為none時,它與next方法完全等價
Python筆記 生成器方法send
日期 20170926 生成器內有乙個方法send,可再次傳入乙個值。上面那句可能聽不懂,但是不要緊,我們先來看看 usr bin python3 defmygenerator value yield 1yield value return done gen mygenerator print ne...
生成器中的send
import time def foo print start print this is the first line r1 yield r1 print this is the second value s r1 r2 yield r2 print this is the third value...
Python生成器及send用法講解
我們呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失。再次呼叫這個函式時,一切都將從頭建立。對於在計算機程式設...