[Python]NEXT方法
python中,含有yield关键字的对象就是一个生成器;
每次调用next方法时会执行到yield后面的语句,然后返回yield后面代码块的执行结果
其实也可以调用send方法,下面给个例子方便理解
next方法:
def foo(): bar_a = yield 1 # bar_a是语句块(yield 1)的返回值,默认为None bar_b = yield bar_a yield "最后一个值,再迭代就要报StopIteration了" f = foo() # 创建生成器,此时没有执行foo()里的任何语句 print(f) #1 print(next(f)) #2 # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建 print(next(f)) #3 # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。 # 然后执行到语句块(yield bar_a),bar_b也还没有被创建 print(next(f) #4
1处打印出来的内容为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py <generator object foo at 0x00000127A19FAD60>
2处打印出来的内容为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py <generator object foo at 0x000001B4120EAD60> 1
3处打印出来的内容为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py <generator object foo at 0x000002999698AD60> 1 None
4处打印出来的内容为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py <generator object foo at 0x000001E2E9FBAD60> 1 None 最后一个值,再迭代就要报StopIteration了
为了更好的理解程序,采用了新的方法:
def foo(): print("现在执行到了bar_a = yield 1之前") bar_a = yield 1 # bar_a是语句块(yield 1)的返回值,默认为None print("现在执行到了bar_a = yield 1之后") print("经过bar_a = yield 1之后,bar_a的数值为:{}".format(bar_a)) print("现在执行到了bar_b = yield bar_a之前") bar_b = yield bar_a print("现在执行到了bar_b = yield bar_a之后") yield "最后一个值,再迭代就要报StopIteration了" f = foo() # 创建生成器,此时没有执行foo()里的任何语句 print(f) #1 print("*************************************") print(next(f)) #2 # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建 print("*************************************") print(next(f)) #3 # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。Z # # 然后执行到语句块(yield bar_a),bar_b也还没有被创建 print("*************************************") print(next(f)) #4
最后的输出结果为:
(4Project) PS D:\PythonVirtualEnv\PythonVirtualEnv_391\Scripts> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp_2.py <generator object foo at 0x0000028A864B0BA0> ************************************* 现在执行到了bar_a = yield 1之前 1 ************************************* 现在执行到了bar_a = yield 1之后 经过bar_a = yield 1之后,bar_a的数值为:None 现在执行到了bar_b = yield bar_a之前 None ************************************* 现在执行到了bar_b = yield bar_a之后 最后一个值,再迭代就要报StopIteration了
通过上面,大致可以理解, yield 和 return 的区别
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)