2015-07-22 45 views
1

我正在閱讀Python基本參考,我無法理解接收和發出返回值的協程。接收和發出返回值的Python協程

以下是作者所說的 - 「如果在yield表達式中提供了值,協程可能會同時使用yield來接收和返回返回值。」

這裏是說明這樣一個例子:

def line_splitter(delimiter=None): 
    print("Ready to split") 
    result = None 
    while True: 
     line = (yield result) 
     result = line.split(delimiter) 

而且筆者補充說, 在這種情況下,我們像以前一樣使用協程以同樣的方式。但是,現在調用 send()也會產生結果。例如:

>>> s = line_splitter(",") 
>>> s.next() 
Ready to split 
>>> s.send("A,B,C") 
['A', 'B', 'C' ] 
>>> s.send("100,200,300") 
['100', '200', '300'] 

我想知道上面的代碼是如何工作的。

感謝您的任何幫助。

+0

http://stackoverflow.com/a/1756156/471899 – Alik

+0

很難回答,除非你能告訴我們你不明白的部分。你對發電機方面有很好的瞭解嗎? –

+0

我對發生器的瞭解是,它使用yield關鍵字並生成一系列用於迭代的值。 我無法理解上述代碼的工作。 – user3379333

回答

1

讓我們看看調用代碼做什麼,一行一行:

  • s = line_splitter(",")此行只是初始化發電機,沒有其內執行任意的代碼。
  • s.next()這將執行代碼,直至包括下一個yield聲明,打印該行併產生None。然而,分配result = ...的執行還不是而是
  • s.send("A,B,C")此發電機設置的yield「值」內"A,B,C"並執行該代碼直到幷包括下一個yield,從而將其分配給result

在某種意義上,所述yield關鍵字可以用於兩個,獲取值離開發生器的(使用next),並在同一時間(使用send注入值代入發電機。

如需更詳細的解釋,您可能還會看到this answer

+0

非常感謝!!!!! – user3379333