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. 迭代器
迭代器是一个表示数据流的对象(关于什么是类、对象,后续教程会详细说明)。它实现了两个方法:
__iter__()
:返回迭代器对象本身。__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
创建的迭代器,适用于动态生成值。