2024年8月31日 Python - asycnio

参考

yield

介绍

  • yield x

    • 生成一个内容
  • yield from

    • 委托给子生成器,yield from iterable 本质上只是 for item in iterable 的简写形式
  • yield 和 yield from 配合使用

    • 形成一个通道,调用者可以通过 send 向子生成器发送内容,子生成器通过yield 接受内容

示例

yield 和 yield from 简单使用

def func1():
    yield 11
    yield from func2()  # 委托给子生成器,yield from iterable 本质上只是 for item in iterable 的简写形式
    yield 12
    yield from func2()
    yield 13


def func2():
    yield 21
    yield 22


if __name__ == '__main__':
    for item in func1():
        print(item)  # 注意结果:11; 21; 22; 12; 21; 22; 13
    # for item in func2():
    #     print(item)   # 21; 22

yield 和 yield from 配合使用

累加器,最好配合调试理解

send 会将数据发往子生成器中的 yield

或者可以理解成子生成器中的 yield 向调用方要求数据

def accumulate():
    tally = 0
    while 1:
        next = yield
        if next is None:
            return tally
        tally += next


def gather_tallies(tallies):
    while 1:
        tally = yield from accumulate()
        tallies.append(tally)


tallies = []
acc = gather_tallies(tallies)
next(acc)  # Ensure the accumulator is ready to accept values
for i in range(4):
    acc.send(i)

acc.send(None)  # Finish the first tally
for i in range(5):
    acc.send(i)

acc.send(None)  # Finish the second tally
print(tallies)  # [6, 10]
posted @ 2024-08-31 15:32  流星<。)#)))≦  阅读(9)  评论(0编辑  收藏  举报