加入收藏 | 设为首页 | 会员中心 | 我要投稿 咸宁站长网 (https://www.0715zz.cn/)- 文字识别、智能机器人、媒体智能、低代码、运维!
当前位置: 首页 > 运营中心 > 交互 > 正文

通过例子由浅入深的理解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

(编辑:咸宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读