Python 迭代器与生成器

person smartzeng    watch_later 2024-08-14 20:18:12
visibility 132    class Python    bookmark 专栏

Python 迭代器与生成器

Python 中的迭代器和生成器是用于遍历和生成数据的强大工具,它们能够高效地处理大量数据或复杂的迭代任务。

1. 迭代器的概念与使用

迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器的特点:
  • 实现了 __iter__()__next__() 方法:迭代器对象实现了这两个方法,因此可以用于 for 循环或手动调用 next() 进行遍历。
  • 惰性计算:迭代器在每次调用 next() 时,返回一个元素,直到没有元素为止抛出 StopIteration 异常。
创建一个迭代器:

任何实现了 __iter__()__next__() 方法的对象都是一个迭代器。你可以通过实现这些方法来自定义一个迭代器。

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:
            value = self.current
            self.current += 1
            return value
        else:
            raise StopIteration

# 使用自定义迭代器
it = MyIterator(1, 5)
for num in it:
    print(num)  # 输出 1, 2, 3, 4

2. 生成器的使用

生成器是简化了迭代器的定义,它使用 yield 关键字来生成一个元素,每次调用 next() 时,生成器会从上次 yield 语句暂停的地方恢复执行,并继续生成下一个值。

生成器的特点:
  • 语法简单:使用 yield 关键字,而不需要 __iter__()__next__() 方法。
  • 节省内存:生成器是惰性求值的,只在需要时才生成数据,因此比完整存储数据的方式更节省内存。
创建一个生成器:
def my_generator(start, end):
    current = start
    while current < end:
        yield current
        current += 1

# 使用生成器
gen = my_generator(1, 5)
for num in gen:
    print(num)  # 输出 1, 2, 3, 4

3. 列表生成式与生成器表达式

列表生成式(List Comprehensions)是一种简洁的创建列表的方式,适用于简单的过滤和变换操作。

生成器表达式与列表生成式类似,但生成器表达式返回的是一个生成器对象,而不是列表,生成器表达式是惰性求值的,更节省内存。

列表生成式的使用:
# 创建一个包含 1 到 4 的平方的列表
squares = [x**2 for x in range(1, 5)]
print(squares)  # 输出 [1, 4, 9, 16]
生成器表达式的使用:
# 使用生成器表达式生成 1 到 4 的平方
squares_gen = (x**2 for x in range(1, 5))

# 生成器表达式使用 for 循环遍历
for num in squares_gen:
    print(num)  # 输出 1, 4, 9, 16

4. 迭代器与生成器的应用场景

  • 迭代器:适合用于实现更复杂的迭代逻辑,比如自定义迭代规则或需要在多处重复使用的迭代逻辑。
  • 生成器:适合用于生成大量数据时节省内存,或需要逐步生成数据、数据流式处理的场景。

总结

  • 迭代器 通过实现 __iter__()__next__() 方法,自定义遍历行为,适用于需要自定义迭代逻辑的场景。
  • 生成器 使用 yield 关键字简化了迭代器的实现,更适合生成序列或流式数据。
  • 列表生成式生成器表达式 提供了简洁的语法用于创建列表和生成器,生成器表达式尤其适合处理大数据量或节省内存的场景。
评论区
评论列表
menu