文章背景: 在看别人写的Python代码时,有时会遇到yield
这个生僻的关键字,影响了代码的阅读进度。因此,本文在查阅相关资料的基础上,对yield
的用法进行了介绍。
yield
关键字 yield
在函数中的功能类似于return,不同的是yield每次返回结果之后函数并没有退出,而是 每次遇到yield
关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。如果 一个函数需要多次循环执行一个动作,并且每次执行的结果都是需要的,这种场景很适合使用yield
实现。
包含yield的
函数成为一个生成器,生成器同时也是一个迭代器,支持通过next
方法获取下一个值。
使用yield
的好处是通过使用生成器,避免占用内存,提高运行效率。
示例代码块如下:
def foo():
print("starting...")
while True:
result = yield 4
print("result:", result)
test = foo()
print(next(test))
print("*"*20)
print(next(test))
运行结果:
starting...
4
********************
result: None
4
代码分析:
(1) 针对test = foo()
,由于函数foo
中存在yield关键字,所以函数foo
内的代码一开始并不执行,而是得到一个生成器test(相当于一个对象)。
(2) 针对print(next(test))
。由于调用了next
方法,foo
函数开始执行。先输出starting...
,然后进入while循环。在循环内,遇到yield
关键字。这里可以把yield
想象成return
。因此,foo
函数返回4,并通过print
函数输出。注意:这里并没有执行result
的赋值操作。
(3) 针对print("*"*20)
。程序输出20个星号。
(4)针对print(next(test))
。这句代码是接着步骤(2)结束的地方开始执行,执行的是result
的赋值操作。注意:由于在步骤(2)的时候,4已经return出去,并没有完成赋值操作。因此,现在给result
赋的值是None
。所以输出的结果是result: None
。程序接着在While内继续执行,又一次碰到yield
关键字,同样返回4,并通过print
函数输出。
总结一下,带yield
的函数是一个生成器,而不再是一般意义上的一个函数了,这个生成器有一个方法就是next
方法,next
就相当于“下一步”生成哪个数,这一次的next
开始的地方是接着上一次的next
停止的地方执行的,所以第二次调用next
的时候,生成器并不会从foo
函数最开始的地方执行,而是接着上一步停止的地方开始,然后遇到yield
后,return出要生成的数,此步就结束。
(1)除了next
方法,yield
得到的生成器还支持send
方法。该方法可以向生成器传递参数。
代码块示例如下:
def foo():
print("starting...")
while True:
result = yield 4
print("result:", result)
test = foo()
print(next(test))
print("*"*20)
print(test.send(7))
运行结果:
starting...
4
********************
result: 7
4
针对最后一条语句print(test.send(7))
,send
函数开始执行的时候,接着上一回next
方法结束的地方,先完成赋值操作,将7赋值给变量result
。然后执行next方法的功能。先输出结果result: 7
。然后在While内继续执行,又一次碰到yield
关键字,同样返回4,并通过print
函数输出。
(2)对于yield
得到的生成器,当调用方法next
时,将获取生成器yield
后边表达式的值;当执行完最后一次循环后,结束yield
语句;此时,如果继续调用next
方法,生成器会抛出StopIteration
异常。
代码块示例如下:
def func():
for i in range(0, 2):
yield i
f = func()
print(next(f))
print(next(f))
print(next(f))
运行结果:
当第三次调用next
函数时,由于yield
语句已经结束,因此, 程序抛出StopIteration
异常。
参考资料:
[1] python中yield用法(https://blog.csdn.net/dcrmg/article/details/78128041)
[2] python中yield的用法详解——最简单,最清晰的解释(https://blog.csdn.net/mieleizhi0522/article/details/82142856)
[3] Python yield 使用浅析(https://www.runoob.com/w3cnote/python-yield-used-analysis.html)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有