这是继上就是一个最简单的生成器的概念,生成器的概念就是为了防止一次需要计算大量的数据的情况下使用的,所以,这个时候,我们就采用生成器的概念,
废话不多说,代码:
import time
def A():
i=0
while True:
print('---A______')
z=yield 1
print('打印一下实际的结果z',z)
time.sleep(0.5)
def B(c):
# c.__next__()
while True:
print('-------B---------')
# print(c.__next__())
# x=c.__next__()
# print('打印x',x)
# y=c.send(100)
y=c.__next__()
print('打印send100的结果y',y)
# print(c.__next__())
# c.send(1000)
time.sleep(0.5)
if __name__=='__main__':
a=A()
B(a)
执行结果:
分析:
首先主函数执行了a=A() 生成了一个生成器对象的函数、
当我们执行了B(a)的情况下:
1、首先执行B函数,print('---------B---------')
2、然后执行y=c.__next__(),跳入到a函数当中去,
2.1 执行 print('------A____')
2.2 执行 z=yield(实际上,这个地方是接收来自使用生成器函数的地方发送过来的数值),由于我们使用的是next 所以z是none
2.3 执行 yield 1 将得到数值1 返回给y变量 (这个时候 A函数实际上 就卡在这个地方不动了呢!)
3、print('打印send100的结果y',y)
上面是第一轮的结果
下面第二轮循环
4、print('-------B---------')
5、当我们开始执行y=c.next()的时候,A函数从2上面的2.3 开始继续执行,而B函数要等待A函数再次返回的yield
2.4print('打印一下实际的结果z',z) time.sleep(0.5)
2.5 print('-----A_____')
2.6 当执行到z=yield 1 这一行的时候,我们就又要停止了
6 A函数接收到了当前返回yield1 ,这个时候,B函数开始执行打印 print('打印send100的结果y',y)
7、当再次执行到c.next的时候 执行A函数的yield的后面的东西
part2 send 情况
import time
def A():
i=0
while True:
print('---A______')
z=yield 1
print('打印一下实际的结果z',z)
time.sleep(0.5)
def B(c):
c.__next__()
while True:
print('-------B---------')
# print(c.__next__())
# x=c.__next__()
# print('打印x',x)
y=c.send(100)
# y=c.__next__()
print('打印send100的结果y',y)
# print(c.__next__())
# c.send(1000)
time.sleep(0.5)
if __name__=='__main__':
a=A()
B(a)
执行结果:
分析:
大家可以看到我们的send函数这个实际上起到了和next同样的作用,只不过是多了一个功能,这个功能就是能够给A函数的yield 的前面的东西发送数据