yield

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单线程下实现并发

  

posted @ 2022-03-24 21:56  咖喱给给啊  阅读(55)  评论(0)    收藏  举报