Python迭代器和生成器

迭代器和生成器在Python中的引入是为了提供一种更灵活、高效地处理数据集合的方式。

为什么要用迭代器和生成器

  • 内存效率:迭代器和生成器允许按需生成和处理数据,只有在需要的时候会把相应的数据加载到内存,而不需要一次性将整个数据集加载到内存中。
  • 支持无限序列:因为生成器只在需要时生成下一个值,而不是一次性生成整个序列。所以可以支持无限序列
  • 延迟计算:只有在需要时才会计算下一个值,而不是一次性计算所有值。

迭代器(Iterator)

  1. 概念: 迭代器是一个实现了 __iter__()__next__() 方法的对象。__iter__() 返回迭代器对象本身,而 __next__() 返回下一个值。当没有更多元素时,__next__() 应该引发 StopIteration 异常。

  2. 使用:

    >>> s = 'abc'
    >>> it = iter(s) # 返回s本身的迭代器
    >>> it
    <str_iterator object at 0x10c90e650>
    >>> next(it) # 返回下一个值
    'a'
    >>> next(it)
    'b'
    >>> next(it)
    'c'
    >>> next(it) #元素用尽引发异常
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
        next(it)
    StopIteration
    
  3. 示例:自定义一个简单的迭代器:

    class MyIterator:
        def __init__(self, start, end):
            self.current = start
            self.end = end
    
        def __iter__(self):
            return self
    
        def __next__(self): # 可在这里定义序列生成的规则
            if self.current < self.end:
                result = self.current
                self.current += 1
                return result
            else:
                raise StopIteration
    
    my_iter = MyIterator(1, 5) # 在这里直接返回迭代器对象,不会立即生成整个序列
    for value in my_iter: # 这里每次循环调用一次next,每一次调用计算一次序列的值
        print(value)
    

生成器(Generator)

  1. 概念:生成器是一种特殊类型的迭代器,使用函数和 yield 语句来生成值。生成器会记住每次调用 yield 的状态,使得在下一次调用时可以继续执行。yield在生成器迭代时的作用类似于__next__,然而其额外功能是生成器状态保存: 每次调用 yield 语句时,生成器函数的状态(包括局部变量值)都会被保存。下一次迭代时,生成器将从上次保存的状态继续执行。

  2. 使用: 定义一个生成器函数,其中包含 yield 语句。生成器函数在调用时返回一个生成器对象。

    def my_generator(start, end):
        while start < end:
            yield start
            start += 1
    # 生成器函数在调用时不会立即执行,而是返回一个生成器对象,该对象包含生成器函数的代码和状态。
    gen = my_generator(1, 5)
    # 每次循环都会调用生成器函数,调用时生成器函数会将此时start、end的值保存下来。
    for value in gen: 
        print(value)
    
    
  3. 示例:使用生成器实现斐波那契数列:

    def fibonacci_generator(n):
        a, b = 0, 1
        count = 0
        while count < n:
    # 生成器函数执行到 yield 语句时会暂停,并将当前状态保存,包括局部变量 a、b 和 count 的值。
            yield a
            a, b = b, a + b
            count += 1
    
    for value in fibonacci_generator(5):
        print(value)
    

迭代器和生成器的区别

  1. 定义方式:迭代器是实现了 __iter__()__next__() 方法的对象。 生成器是使用函数和 yield 语句定义的。一个是对象一个是函数
  2. 工作原理: 迭代器需要显式地维护状态,状态的管理通常涉及使用类属性或实例属性。 生成器通过 yield 语句来生成值,并在每次调用 yield 时保存状态。
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐