Python中关于yield的详解

偶然遇到yield这个关键字,百度的时候,发现大都是千篇一律的答案,一头雾水的点进来,在一头雾水的出去,根本没有搞明白啥意思。试问一位新手,如何理解这些,今天就整理了一下简单易懂的。

普通函数

Python 中的普通函数大都是这样的:

def normal():
    print("I'm a return value_1..")
    return 1

函数里的语句将依次执行,并在遇到 return 时立即终止函数的运行并返回值。
因此,像下面这样连续写多个 return 是没有意义的:

def normal():
    print("I'm a return 1..")
    return 1
    # 下面语句永远不会被执行
    print("I'm a return 2..")
    return 2

生成器

简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,
于是下面把这个函数给修改一下变成一个生成器:

def gen():
    print('yield 1..')
    yield 1

    print('yield 2..')
    yield 2

    print('yield 3..')
    yield 3

执行这个函数:

>>> gen = my_gen()
>>> gen
<generator object my_gen at 0x000002102AC5EAC0>

可以看到,gen 变量被赋值为一个 generator ,即生成器。

生成器有一个最重要的特点,即当它执行到 yield 语句并返回后,生成器不会被立即终止,而是暂停在当前 yield 的位置,等待下一次调用:

>>> next(gen)
yield 1..

>>> next(gen)
yield 2..

>>> next(gen)
yield 3..

>>> next(gen)
Traceback (most recent call last):
  File "<ipython-input-34-6e72e47198db>", line 1, in <module>
    next(gen)
StopIteration

生成器用 next() 函数调用,且每次调用都从上一次 yield 暂停的位置开始继续向下执行。当所有的 yield 执行完毕后,再一次调用 next() 就会抛出 StopIteration 错误,提示你生成器已经结束了。既然会抛出错误,用 try 语句完善一下就可以了:

def my_gen():
    print('yield 1..')
    yield 1
    print('yield 2..')
    yield 2
    print('yield 3..')
    yield 3

gen = my_gen()
while True:
    try:
        next(gen)
    except StopIteration:
        print('Done..')
        break
        
# 输出结果为:
# yield 1..
# yield 2..
# yield 3..
# Done..

就这么简单的几行代码就让你明白什么是yield,一句话概况就是把yield看成是一个return就行。

return和yield区别

return:在函数中返回某个值,返回之后函数不在继续执行,直接退出结束。

yield: 带有yield的函数是一个迭代器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容