12  迭代器

12.1 概念

迭代器(Iterator)是Python中用于实现迭代器协议的对象,它提供了一种按需生成值的方式,可以用于逐个访问数据集合中的元素。迭代器是一种惰性计算的方式,它只在需要时才生成下一个值,而不是一次性生成所有值,这样可以节省内存和计算资源。

迭代器对象必须实现两个方法:

  1. __iter__(): 返回迭代器对象自身,通常用于支持迭代器对象在 for...in 循环中的使用。
  2. __next__(): 返回迭代器的下一个值,如果没有下一个值,则抛出 StopIteration 异常。

在Python中,迭代器通常是通过生成器函数或自定义类来实现的。生成器函数是一种简洁地创建迭代器的方式,而自定义类则提供了更多灵活性,可以根据特定需求实现迭代器协议。

迭代器的工作方式是在每次调用 __next__() 方法时生成下一个值,并记录当前状态以供下次调用。这种按需生成值的方式使得迭代器非常适合处理大型数据集或无限序列,因为它们不需要一次性加载所有数据到内存中,而是可以逐个生理数据。

总之,迭代器是一种强大的工具,用于按需生成数据集合中的元素,并支持高效地处理大型数据集或无限序列。

12.2 创建

使用生成器函数来创建迭代器,通过 yield 关键字按需生成值。

当我们需要使用这些值时,才会进行计算和生成,而不是一次性生成所有值。这种惰性计算的方式使得迭代器非常适合处理大规模或无限的数据集合。

12.3 用途

12.3.1 遍历集合

  1. 遍历列表
my_list = [1, 2, 3, 4, 5]
iter_list = iter(my_list)
for item in iter_list:
    print(item)
1
2
3
4
5
  1. 遍历元组
my_tuple = (1, 2, 3, 4, 5)
iter_tuple = iter(my_tuple)
for item in iter_tuple:
    print(item)
1
2
3
4
5
  1. 遍历集合
my_set = {1, 2, 3, 4, 5}
iter_set = iter(my_set)
for item in iter_set:
    print(item)
1
2
3
4
5
  1. 遍历字典的键
my_dict = {'a': 1, 'b': 2, 'c': 3}
iter_keys = iter(my_dict)
for key in iter_keys:
    print(key)
a
b
c
  1. 遍历字典的键值对
my_dict = {'a': 1, 'b': 2, 'c': 3}
iter_items = iter(my_dict.items())
for key, value in iter_items:
    print(key, value)
a 1
b 2
c 3

12.3.2 惰性计算

当需要处理大量数据或者无法一次性加载所有数据到内存中时,迭代器的惰性计算特性非常有用。

  1. 生成无限序列
def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

# 仅获取前10个元素
inf_seq = infinite_sequence()
for _ in range(10):
    print(next(inf_seq))
0
1
2
3
4
5
6
7
8
9
  1. 逐行读取大文件
def read_large_file(file_path):
    with open(file_path, 'r') as f:
        for line in f:
            yield line.strip()

# 处理大文件
file_path = 'large_data.txt'
lines = read_large_file(file_path)
for line in lines:
    process_line(line)
  1. 按需计算斐波那契数列
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 仅获取前10个斐波那契数
fib_seq = fibonacci()
for _ in range(10):
    print(next(fib_seq))
0
1
1
2
3
5
8
13
21
34