通过例子由浅入深的理解yield协程
发布时间:2022-08-25 10:30:05 所属栏目:交互 来源:互联网
导读:基本概念 生成器:只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数,调用生成器函数返回的是生成器对象 yield关键字:总的来说就是:产出和让步,产出结果,让出控制权 send:send() 方法致使协程前进到下一个yield 语句,另外,生成器可
|
基本概念 生成器:只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数,调用生成器函数返回的是生成器对象 yield关键字:总的来说就是:产出和让步,产出结果,让出控制权 send:send() 方法致使协程前进到下一个yield 语句,另外,生成器可以作为协程使用 例子说明 yield的执行流程, 并制作了一个生成器调用的共同方法print_value def yield1(): ''' 整体解释:1将作为第一个send方法的返回值,b是第二个send方法的参数, 最后的return是作为最后一个send方法的返回值 ''' # 4.yield1()协程:阻塞在此,执行yield产出结果为1,把控制权给主线程 # 9.yield1()协程:阻塞解除,获得输入值2,并赋值给b b = yield 1 # 10.yield1()协程:返回b return b def yield2(): ''' 协程阻塞在此,执行yield产出结果为None,并交出控制权给主线程 注: 因为yield后面没有值,所以是None ''' yield # 如果没有返回值,会return None pass def yield3(): yield 1 def print_value(f, args): try: # 3.print_value方法:对yield1()协程执行send # 5.print_value方法:接收yield1()协程的返回值1,并赋值给b # 8.print_value方法:对yield1()协程再次执行send,并传入2 b = f.send(args) except StopIteration as e: ''' 11.print_value方法:接收yield1()协程的返回值, 如果是最后一个迭代,就会进入到这个异常捕获 ''' print(f'{f.__name__}返回值 {e.value}') return e.value else: # 6.print_value方法:打印b print(f'{f.__name__}接收 {b}') ''' 1.主线程:`yield1`是生成器函数,`yield1()`调用生成器函数, 返回生成器对象也可以称作协程 ''' ys = [yield1(), yield2(), yield3()] for y in ys: # 2.主线程:y是yield1()生成器对象,第一次发送None # 12.主线程:y是yield2()生成器对象,第一次发送None. # 注:yield2 yield3根yield1差不多所以12步以后的都略过了 print_value(y, None) # 7.主线程:第二次send参数为2 print_value(y, 2) 结果: yield1接收 1 yield1返回值 2 yield2接收 None yield2返回值 None yield3接收 1 yield3返回值 None (编辑:咸宁站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
