python之彻底搞懂迭代、可迭代、迭代器的区别(五)

yield from从容器中取值

yield from从容器中取值,容器包含生成器,也就是说yield from让一个生成器将其部分操作委派给另外一个生成器。

def reverse(x):
    while x-1>=0:
        yield x-1
        x -=1

def list_number(x):
    yield from range(x)
    yield from range(x-1, -1, -1)
    yield from reverse(x)

for i in list_number(3):
    print(i,end=',')

out:
0,1,2,2,1,0,2,1,0,

关于send方法的案例

def count():  # 子生成器,将yield传来的数字累加,若传来的值为None,则返回累加结果
    result = 0
    while 1:
        x = yield
        if x is None:
            return result
        result += x


def count_list(x):  # 父生成器,将累加任务委托给子生成器
    while 1:
        y = yield from count()
        x.append(y)


plus_list = []
cal = count_list(plus_list)
next(cal)  # 使生成器可以接收传入值
for i in range(1, 5):
    cal.send(i)
cal.send(None)  # 实际收到None的是count函数,结束累加

for i in range(1, 11):
    cal.send(i)
cal.send(None)  # 结束第二次累加

print(plus_list)  # 输出最终结果

out:
[10, 55]

send方法两个注意点

  1. send方法要配合yield语句使用。
  2. send方法可以给yield传值,但yield尚未产生断点时传值会报错,所以先要对生成器执行一次next,然后才能正常传值。

深入理解send和yield from机制

send和yield from配合可以在调用者和生成器之间形成透明的双向数据通道,包括从生成器获取数据以及向生成器传送数据。

要更加深入理解send和yield机制需要学习和理解协程相关的知识点。留待日后梳理协程知识点时再细讲send和yield from。

上一篇:获取本周一的日期和本周日的日期


下一篇:JAVA获取当前周的周一的日期