魅力程序猿

  • 首页
  • Java
  • Android
  • APP
    • 扑克计分器
    • Video Wallpaper
  • 联系我
  • 关于我
  • 资助
道子
向阳而生
  1. 首页
  2. AI技术
  3. 正文

生成器与迭代器

2026年4月24日 8点热度 0人点赞 0条评论

📰 来源: 博客园


在Python中,迭代器和生成器是处理数据流的灵魂,它们的核心目标只有一个————节省内存。

迭代器(Iterator)

  • 迭代器就是能够将一堆数据一个个吐出来的对象,而不是一次性输出。
  • nums = [1, 2, 3]
    it = iter(nums)  # 获取迭代器
    
    print(next(it))  # 1
    print(next(it))  # 2
    print(next(it))  # 3
    
  • 任何一个对象要想成为迭代器,需要满足以下两个方法:
  • __iter__()   # 返回自身
    __next__()   # 返回容器的下一个元素。如果没有元素了,则抛出 StopIteration 异常。
    
    class MyIterator:
        def __init__(self, n):
            self.n = n
            self.cur = 0
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.cur < self.n:
                self.cur += 1
                return self.cur
            else:
                raise StopIteration
    
    
    if __name__ == '__main__':
        it = MyIterator(3)
        for i in it:
            print(i)
    
  • 惰性计算(用一个取一个)
  • 生成器(Generator)

  • 生成器是“自动帮你写好的迭代器”。不用写 next,Python帮你做。
  • 因此生成器也是一种特殊的迭代器。
  • def gen():
        yield 1
        yield 2
        yield 3
    
    
    if __name__ == '__main__':
        g = gen()
        print(g)
        print(next(g))
        print(next(g))
        print(next(g))
    
  • 执行过程:函数执行到 yield 关键字
    • 暂停
    • 返回当前值
    • 下次从暂停位置继续
  • 生成器表达式(类似列表推导式)
  • g = (x*x for x in range(5))
    
    [x*x for x in range(5)]  # 列表(一次性全部生成)
    (x*x for x in range(5))  # 生成器(按需生成)
    
  • 总结:生成器 = 更高级、更方便的迭代器
  • 可迭代对象 (Iterable)

  • 可迭代对象 (Iterable): 像 list, dict, str 这种可以用 for 循环遍历的都是可迭代对象,但它们不是迭代器。
  • Python 规定:一个对象内部实现了 iter() 方法,就是可迭代对象。
  • 转换: 可以用 iter() 函数把可迭代对象转成迭代器。
  • 可迭代对象 Iterable
          ↓ 调用 __iter__() 可以得到
    迭代器 Iterator
          ↓ 生成器是它的子类
    生成器 Generator
    

    yield和return的区别

  • 当你调用一个带 return 的函数时,它会从第一行开始运行,直到遇到 return。一旦 return 执行,函数就把结果扔给调用者,然后原地解散,内存中的局部变量全部回收。
  • def normal_func():
        return "第一步"
        return "第二步"  # 永远不会被执行
    
    print(normal_func()) # 输出: 第一步
    
  • 当你调用带 yield 的函数时,它并不会立即执行代码,而是返回一个生成器对象。每次你对这个对象执行 next(),它就运行到下一个 yield 处,把值交给你,然后原地休眠。它会记住所有的变量、当前的循环进度和执行行数。
  • def generator_func():
        yield "第一步"
        yield "第二步"
        yield "第三步"
    
    gen = generator_func()
    print(next(gen)) # 输出: 第一步 (函数在此处暂停)
    print(next(gen)) # 输出: 第二步 (函数从刚才暂停的地方恢复)
    
  • 在 Python 3.3 之后,同一个函数里可以同时出现 return 和 yield:
    • yield 负责产生数据流。
    • return 负责彻底结束生成器。如果在生成器中执行了 return value,这实际上会引发一个 StopIteration 异常,并将 value 作为异常的说明信息。
  • yield 负责产生数据流。
  • return 负责彻底结束生成器。如果在生成器中执行了 return value,这实际上会引发一个 StopIteration 异常,并将 value 作为异常的说明信息。

  • 🔗 原文链接: 点击阅读原文

    标签: AI 人工智能 技术博客
    最后更新:2026年4月24日

    daozi

    这个人很懒,什么都没留下

    点赞
    < 上一篇

    文章评论

    razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复
    搜索
    联系方式

    QQ群:179730949
    QQ群:114559024
    欢迎您加入Android大家庭
    本人QQ:136049925

    赐我一丝安慰
    给我一点鼓励

    COPYRIGHT © 2023 魅力程序猿. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    豫ICP备15000477号