def func():
ll = []
i = 0
while True:
i = i + 1
# res = yield ll
res = yield
ll.append(i)
print('-------',res)
g = func()
#第一次执行的时候程序正常执行,直到遇到yield,在执行yield时候就是相当于return ll,然后跳出了返回打印,但是func函数内是阻塞在了yield的那一行的,
#当再次执行一次next的时候,就会继续从yield出执行,那执行的时候肯定是把yield处没执行完的代码继续执行,那没执行完的代码是什么
#很显然就是赋值res,它会把yield后面的值赋给res,但此时ll是数据已经被返回出去了,所以赋了一个None,但是我又觉得是因为没有send才是None的,因为yield后面可以不跟变量
#res接收的话就是个None,我单步调试的再次进入的时候,直接就到了yield的下一行,res就已经赋好值了是一个None,后面的ll依然是有之前的值,
#所以不晓得是yield是因为没有send才是None,还是把值返出去了才是是None,具体怎么着就这样理解吧
#将值赋值给接收者之后,yield也执行完毕了,就会继续往下走执行其他代码,如果往下执行的时候又遇到了yield,就又会返回数据+阻塞
print(next(g))
print(next(g))
print(next(g))
# print(g.send(111))
# print(g.send(111))
print('----------------------------------------------------')
#send就是传值给yield:
#步骤还是一样的,先next让程序执行到yield,碰到yield还是先返回数据+阻塞,
#然后在send把值给yield,赋值给res,然后继续往下走,又遇到yield还是返回数据+阻塞
#简单实现一个用yidle读写的操作
def read():
i = 0
while True:
res = yield i
i = i + 1
# print(res)
def write():
ll = []
while True:
ret = yield ll
ret = str(ret) + '---' + 'write'
ll.append(ret)
# print(ret)
r = read()
w = write()
# numb = next(r) #返回数据+阻塞
# print(numb) 打印数据
numb1 = next(w) #返回数据+阻塞
print(numb1) #第一次执行到yield 返回空列表+阻塞
for i in range(50):
numb = next(r) # 返回数据+阻塞
##第一次执行到yield 返回i + 阻塞
ret = w.send(numb)
print(ret)
#等会来试试用yield单线程下实现并发