Skip to main content

Python 迭代器

Python 迭代器

在 Python 中,迭代是一个基本概念,它允许我们处理数据集合中的每个元素。本章节将详细介绍迭代、生成器、迭代器和可迭代对象,以及它们之间的关系。

1. 什么是迭代?

在 Python 中,迭代(iteration)是指通过循环逐一访问数据集合(如列表、元组、字符串、字典等)中的每一个元素的过程。Python 中的迭代通常与 for 循环while 循环 结合使用。

示例:

numbers = [1, 2, 3, 4, 5]
for number in numbers:
    print(number)

在这个例子中,for 循环迭代 numbers 列表,并打印每个元素。迭代是 Python 中处理序列数据的基础。

2. 可迭代对象

可迭代对象是任何可以被迭代的 Python 对象。换句话说,它是可以被 for 循环遍历的对象。Python 中的可迭代对象包括:

  • 列表(list
  • 元组(tuple
  • 字符串(str
  • 字典(dict
  • 集合(set
  • 文件对象
  • 以及其他实现了 __iter__ 方法的对象(关于什么是类、对象,后续教程会详细说明)

示例:

text = "Hello"
for char in text:
    print(char)

这里,字符串 text 是一个可迭代对象,我们可以迭代它的每个字符。可迭代对象通过 iter() 函数返回一个迭代器。

3. 迭代器

迭代器是一个表示数据流的对象(关于什么是类、对象,后续教程会详细说明)。它实现了两个方法:

  1. __iter__():返回迭代器对象本身。
  2. __next__():返回数据流中的下一个元素。当没有更多元素时,抛出 StopIteration 异常。

迭代器可以用来遍历可迭代对象。for 循环在内部就是通过迭代器实现的。

示例:

numbers = [1, 2, 3]
iter_obj = iter(numbers)  # 获取迭代器
print(next(iter_obj))     # 输出: 1
print(next(iter_obj))     # 输出: 2
print(next(iter_obj))     # 输出: 3

在这个例子中,iter() 函数从列表 numbers 获取一个迭代器对象 iter_obj,然后使用 next() 函数逐个获取元素。

4. 生成器

生成器算得上是 Python 语言中最吸引人的特性之一,它不需要再像上面的类一样写__iter__()__next__()方法了,只需要一个yiled关键字。

生成器是一种特殊的迭代器,它通过 yield 关键字以延迟计算的方式返回值而不是 return 返回值。主要:延迟计算是在迭代它的时候才计算,而像列表、元组这些是直接保存在内存中的。

生成器有两种实现方法:生成器函数、生成器表达式

生成器函数

当函数通过 yield 关键字返回数据时,这个函数就叫生成器函数,当调用它时返回一个生成器对象。

示例:

def my_generator():
    i = 0
    while i != 10:
        yield i
        i += 1

gen = my_generator()
for d in gen:
    print(d)
# 输出 0 1 2 3 4 5 6 7 8 9

在这个例子中,my_generator 函数通过 yield 生成10个值。生成器对象 gen 可以像迭代器一样使用。

my_generator,生成器函数的运行分析:

  • 第一次运行到 while 循环,判断 i != 0 ,返回 i,在 for 循环里面获得 i 的值赋值给 d 并打印。
  • 继续返回到函数里面,计算 i += 1, 判断 while 循环 i != 10, 返回 i,在 for 循环里面获得 i 的值赋值给 d 并打印。
  • 一直这样下去,直到 while 循环判断为 False,最后完成迭代。

生成器表达式

生成器表达式是创建生成器的另一种方式,类似于列表推导式,但使用 圆括号

示例:

gen_expr = (x * x for x in range(3))
print(next(gen_expr))  # 输出: 0
print(next(gen_expr))  # 输出: 1
print(next(gen_expr))  # 输出: 4

生成器表达式在需要时计算值,非常适合节省内存。

5. 它们之间的关系

  • 迭代:是遍历数据集合的过程,通过 for 循环或 next() 访问元素的过程。
  • 可迭代对象:是可以被迭代的对象,实现了 __iter__ 方法,返回一个迭代器。
  • 迭代器:控制迭代过程,实现了 __iter____next__ 方法,用于遍历数据。
  • 生成器:是高效的迭代器,使用 yield 创建的迭代器,适用于动态生成值。