生成器
生成器
1、什么是生成器
生成器是一个自定义的迭代器,本质上是一个迭代器,内置有.__ iter__ () 和. __ next__()
2、如何实现生成器
- 在函数内部定义yield
- 调用函数时,函数体代码不会执行
- 会返回一个值,这个返回值就是生成器
3、yield
- 每次yield都会往生成器对象中添加一个值
- yield只能在函数内部定义
- yield让函数执行暂停,下次调用从上次暂停位置继续执行,直到重新遇到yield再次被暂停
4、yield与return的区别
相同点:返回值的个数都是无限制的
不同点:return只能返回一次,函数便终止执行后续代码,yield可以多次使用,让函数执行暂停,下次调用从上次暂停位置继续执行,直到重新遇到yield再次被暂停
def func():
print("函数体代码")
yield
yield 2
yield 3, 4, '5', '6' # yield返回多个值也是默认返回成元组,可修改成其他的类型返回出去
yield ['7', 8, 9]
# 正常执行不会执行函数体代码
# res是一个迭代器,如果不赋值给res会重复执行第一个yield
res = func()
# 当我们通过__next__取值时,才会执行函数体代码。
# res.__next__() # 执行函数体代码,得到返回值none但没打印返回值,所以没有
print(res.__next__())
# yield可以保存函数的暂停状态,下次在上次基础上执行直到遇到下次yield
print(res.__next__())
print(res.__next__())
# print(res.__next__()) # StopIteration报错
>>>
函数体代码
None
2
(3, 4, '5', '6')
# next(迭代器对象)相当于迭代器对象.__next__()
next(res) # 执行函数体代码,得到返回值none但没打印返回值,所以没有
print(next(res))
print(next(res))
print(next(res))
>>>
函数体代码
2
(3, 4, '5', '6')
['7', 8, 9]
# 如果不报错想自动执行
while True:
try:
print(next(res))
except StopIteration:
break
自定义range,实现range功能
def my_range(start,end,move=1):
while start < end:
yield start
start += move
for i in my_range(1,5):
print(i)
>>>
1
2
3
4
for i in my_range(1,6,2):
print(i)
>>>
1
3
5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!