当前位置:   article > 正文

yield函数

yield函数

yield是python的一个关键字,一个带有yield的函数就是一个生成器generator.当你使用一个yield的时候,对应的函数就是一个生成器了。生成器的功能就是在yield的区域进行迭代进行。

yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。return 的作用:如果没有 return,则默认执行至函数完毕,返回的一 般是  yield的变量

在python的函数(function)定义中,只要出现了yield表达式(Yield expression),那么事实上定义的是一个generator function, 调用这个generator function返回值是一个generator。这根普通的函数调用有所区别,For example:

  1. def gen_generator():
  2. yield 1
  3. def gen_value():
  4. return 1
  5. if __name__ == '__main__':
  6. ret = gen_generator()
  7. print(ret, type(ret)) # <generator object gen_generator at 0x7fa1e40dc150> <class 'generator'>
  8. ret = gen_value()
  9. print(ret, type(ret)) # 1 <class 'int'>

从上面的代码可以看出,gen_generator函数返回的是一个generator实例,generator有以下特别:

  • 遵循迭代器(iterator)协议,迭代器协议需要实现__iter__、next接口
  • 能过多次进入、多次返回,能够暂停函数体中代码的执行

  下面看一下测试代码

  1. def gen_example():
  2. print ('before any yield')
  3. yield 'first yield'
  4. print ('between yields')
  5. yield 'second yield'
  6. print ('no yield anymore')
  7. gen= gen_example()
  8. gen.__next__()# 第一次调用显示 before any yield
  9. gen.__next__() #第二次调用 显示 between yields
  10. gen.__next__() #第三次调用 显示 no yield anymore
  11. gen.__next__() # 这个时候函数已经调用完了,就会迭代结束,报错Traceback (most recent call last):
  12. # File "/home/jerry/PY_project/object_detect_factory/yolo/training/copyyyy.py", line 29, in <module>
  13. # gen.__next__() #no yield anymore
  14. # StopIteration

 调用gen example方法并没有输出任何内容,说明函数体的代码尚未开始执行。当调用generator的next方法,generator会执行到yield 表达式处,返回yield表达式的内容,然后暂停(挂起)在这个地方,所以第一次调用next打印第一句并返回“first yield”。 暂停意味着方法的局部变量,指针信息,运行环境都保存起来,直到下一次调用next方法恢复。第二次调用next之后就暂停在最后一个yield,再次调用next()方法,则会抛出StopIteration异常。 

调用gen example方法并没有输出任何内容,说明函数体的代码尚未开始执行。当调用generator的next方法,generator会执行到yield 表达式处,返回yield表达式的内容,然后暂停(挂起)在这个地方,所以第一次调用next打印第一句并返回“first yield”。 暂停意味着方法的局部变量,指针信息,运行环境都保存起来,直到下一次调用next方法恢复。第二次调用next之后就暂停在最后一个yield,再次调用next()方法,则会抛出StopIteration异常。 

  因为for语句能自动捕获StopIteration异常,所以generator(本质上是任何iterator)较为常用的方法是在循环中使用:

  1. def generator_example():
  2. print('me')
  3. yield 1
  4. print('you')
  5. yield 2
  6. a=[4,5]
  7. b=[3,9,9]
  8. batch_size=8
  9. # yield tf.constant( [a, *b], np.zeros(batch_size))
  10. yield [a, b], np.zeros(batch_size)
  11. # yield [image_data, *y_true], np.zeros(batch_size)
  12. if __name__ == '__main__':
  13. for e in generator_example():
  14. print(e)
  15. # me
  16. # 1
  17. # you
  18. # 2
  19. # ([[4, 5], [3, 9, 9]], array([0., 0., 0., 0., 0., 0., 0., 0.]))

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42256
推荐阅读
相关标签
  

闽ICP备14008679号