授课语音

Python 中 itertools 模块的常见用法

itertools 是 Python 的一个标准模块,提供了一组高效处理迭代器的工具。这些工具实现了许多内置迭代器和生成器的功能扩展,主要用于简化复杂的数据流操作。


1. itertools 的作用与特点

特点:

  • 提供内存高效的迭代器操作。
  • 适用于组合、排列、过滤、累积等操作。
  • 灵活性高,能够和其他迭代器自由组合。

常用工具分类:

  1. 无限迭代器:如 count()cycle()repeat()
  2. 组合生成器:如 product()permutations()combinations()combinations_with_replacement()
  3. 迭代器操作工具:如 chain()islice()tee()zip_longest() 等。

2. 无限迭代器

2.1 itertools.count()

生成一个从指定值开始的无穷整数序列。

代码示例:

import itertools

# 从 10 开始生成无限整数序列
for num in itertools.count(10, step=2):  # 步长为 2
    print(num)
    if num > 20:  # 限制输出防止无限循环
        break

运行结果:

10
12
14
16
18
20
22

2.2 itertools.cycle()

对一个可迭代对象进行无限循环。

代码示例:

import itertools

# 对字符串 "ABC" 进行无限循环
count = 0
for char in itertools.cycle("ABC"):
    print(char)
    count += 1
    if count > 6:  # 限制循环次数
        break

运行结果:

A
B
C
A
B
C
A

2.3 itertools.repeat()

重复生成一个指定的值。

代码示例:

import itertools

# 重复生成数字 5,共生成 4 次
for value in itertools.repeat(5, 4):
    print(value)

运行结果:

5
5
5
5

3. 组合生成器

3.1 itertools.product()

生成笛卡尔积,相当于嵌套的循环。

代码示例:

import itertools

# 生成两个序列的笛卡尔积
result = itertools.product("AB", [1, 2])
for item in result:
    print(item)

运行结果:

('A', 1)
('A', 2)
('B', 1)
('B', 2)

3.2 itertools.permutations()

生成指定长度的排列。

代码示例:

import itertools

# 从序列中生成长度为 2 的排列
result = itertools.permutations("ABC", 2)
for item in result:
    print(item)

运行结果:

('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')

3.3 itertools.combinations()

生成指定长度的组合。

代码示例:

import itertools

# 从序列中生成长度为 2 的组合
result = itertools.combinations("ABC", 2)
for item in result:
    print(item)

运行结果:

('A', 'B')
('A', 'C')
('B', 'C')

4. 迭代器操作工具

4.1 itertools.chain()

连接多个可迭代对象。

代码示例:

import itertools

# 将多个序列连接为一个迭代器
result = itertools.chain("AB", [1, 2])
for item in result:
    print(item)

运行结果:

A
B
1
2

4.2 itertools.islice()

切片一个迭代器。

代码示例:

import itertools

# 对无限序列 count() 取前 5 个值
result = itertools.islice(itertools.count(10), 5)
for item in result:
    print(item)

运行结果:

10
11
12
13
14

4.3 itertools.tee()

将一个迭代器分成多个独立的迭代器。

代码示例:

import itertools

# 将一个迭代器分成两个独立迭代器
iterator1, iterator2 = itertools.tee(range(5), 2)
print(list(iterator1))  # 输出第一个迭代器的结果
print(list(iterator2))  # 输出第二个迭代器的结果

运行结果:

[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]

4.4 itertools.zip_longest()

将多个可迭代对象逐元素配对,不足部分使用填充值。

代码示例:

import itertools

# 对两个长度不同的序列进行配对
result = itertools.zip_longest("AB", [1, 2, 3], fillvalue="None")
for item in result:
    print(item)

运行结果:

('A', 1)
('B', 2)
(None, 3)

5. 注意事项与最佳实践

  1. 迭代器的惰性计算:

    • itertools 的函数通常是惰性生成数据,需使用循环或转换为列表查看结果。
    • 惰性计算可以节省内存,但注意避免无限循环。
  2. 安全性与效率:

    • 在使用无限迭代器时,需明确限制条件,避免程序卡死。
  3. 组合使用:

    • itertools 与其他标准库(如 functools)结合使用,可以更高效地处理复杂数据流。

通过熟悉 itertools 的这些工具,您可以编写更高效、更优雅的迭代器代码,同时提升对 Python 数据处理的掌控能力。

去1:1私密咨询

系列课程: