Python中yield深入理解
众所周知,python中的yield
有这样的用法:
def test(alist):
for i in alist:
yield i
这样,这个test
函数就变成了一个生成器,当每次调用的时候,就会自动返回当前值。比如:
a = [1,2,3,4,5]
for i in test(a):
print(i)
我们也可也手动遍历这个生成器:
test(a).__next__()
yield进阶
当某个函数包含了yield
,就表示这个函数为一个生成器,在执行上会和普通的函数有很多不同。比如:
def test():
print('This is a test!')
yield 5
直接调用test函数的时候(test()
),print函数是不会执行的,只有通过__next__()
方法才能真正调用这个函数:test().__nexty__()
. 再来一个例子:
def test():
print('This is a test!')
yield 5
print('Written by Eric')
>>> t = test() #注意这里一定要先实例化,如果直接用test().__next__()会反复返回第一次的值,不会报错
>>> t.__next__()
This is a test!
5
>>> t.__next__() #第二次调用的时候会执行到第二个yield,由于不存在,则返回错误
written by eric
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
t.__next__()
StopIteration
send函数
__next__()
函数和send()
函数在某些情况下是一样的:
__next__() 等效于 send(None)
send()函数的作用是向yield表达式中传参数. 举个例子:
def test():
print('This is a test!')
v = yield 5
print('The value of v is :', v)
yield 10
print('Written by Eric')
>>> t = test()
>>> t.send(None) #等效于t.__next__()
This is a test!
5
>>> t.send(66)
The value of v is: 66 #v值已改变
10
值得注意的是,send更改的是在yield调用之后的值:
>>> t = test()
>>> v_temp = t.__next__()
This is a test!
>>> print(v_temp) #此时v的值为5
5
>>> t.send(66) #此时v的值被更改为66
The value of v is: 66
10
也就是说,我们可以利用这个send函数更改yield断点的值从而影响后面的部分,但是不影响之前的部分
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 提示词工程师自白:我如何用一个技巧解放自己的生产力
· 一文搞懂MCP协议与Function Call的区别
· 如何不购买域名在云服务器上搭建HTTPS服务