生成器

生成器

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
posted @   Mr沈  阅读(246)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示

目录