不确定为什么 StopIteration 不由“yield from”处理

查看“Fluent Python”书中解释 的“双向隧道”功能的以下示例代码yield from,我有以下问题。


from collections import namedtuple


Result = namedtuple('Result', 'count average')



# the subgenerator

def averager():  # <1>

    total = 0.0

    count = 0

    average = None

    while True:

        term = yield  # <2>

        if term is None:  # <3>

            break

        total += term

        count += 1

        average = total/count

    return Result(count, average)  # <4>



# the delegating generator

def grouper(results, key):  # <5>

    while True:  # <6>

        results[key] = yield from averager()  # <7>



# the client code, a.k.a. the caller

def main(data):  # <8>

    results = {}

    for key, values in data.items():

        group = grouper(results, key)  # <9>

        next(group)  # <10>

        for value in values:

            group.send(value)  # <11>

        group.send(None)  # important! <12>

        print("wrapped up grouper")

    print(results)



data = {

    'girls;kg':

        [40.9, 38.5, 44.3, 42.2, 45.2, 41.7, 44.5, 38.0, 40.6, 44.5],

    'girls;m':

        [1.6, 1.51, 1.4, 1.3, 1.41, 1.39, 1.33, 1.46, 1.45, 1.43],

    'boys;kg':

        [39.0, 40.8, 43.2, 40.8, 43.1, 38.6, 41.4, 40.6, 36.3],

    'boys;m':

        [1.38, 1.5, 1.32, 1.25, 1.37, 1.48, 1.25, 1.49, 1.46],

}

StopIteration当我用下面的委托生成器替换上面的委托生成器时,为什么会出现异常?


def grouper(results, key):

    results[key] = yield from averager()

从我到目前为止所学到的,从理论上讲,删除while True应该没问题。group.send(None)将导致averager()协程break并返回Result(...),该 将被传递给委托生成器。然后委托生成器将通过将其分配Result(...)给results[key].


但正在发生的事情如下。


Traceback (mostrecent call last):

  File "coroaverager3.py", line 111, in <module>

    main(data)

  File "coroaverager3.py", line 83, in main

    group.send(None)  # important! <12>

StopIteration

任何见解?


慕标琳琳
浏览 176回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python