2013-08-17 70 views
4

我念叨發電機下面的教程在Python http://excess.org/article/2013/02/itergen2/Python生成器 - float((yield))?

它包含以下代碼:

def running_avg(): 
    "coroutine that accepts numbers and yields their running average" 
    total = float((yield)) 
    count = 1 
    while True: 
     i = yield total/count 
     count += 1 
     total += i 

我不明白的float((yield))意義。我認爲yield被用來從發生器「返回」一個值。這是yield的不同用法嗎?

+0

http://docs.python.org/2/reference/expressions.html#generator-iterator-methods –

回答

2

是,yield也可以收到,通過向發電機:

>>> avg_gen = running_avg() 
>>> next(avg_gen) # prime the generator 
>>> avg_gen.send(1.0) 
1.0 
>>> print avg_gen.send(2.0) 
1.5 

傳遞給任何價值由yield表達式返回。請參閱yield expressions文檔。

yield在Python 2.5中做了一個表達式;在它只是一個聲明之前,只爲生成器生成值。通過製作yield表達式並添加.send()(以及其他方法來發送異常),發生器現在可用作簡單的coroutines;請參閱PEP 342以瞭解此變更的最初動機。