itertools -- 高效迭代器│Python标准库

本文详细介绍了Python内置的itertools模块,包括无穷迭代器如count、cycle和repeat,以及迭代器的操作与处理如accumulate、chain、compress等。此外,还涵盖了排列组合的相关函数如product、permutations、combinations。这些工具函数在处理迭代器时提供了高效且节省内存的方法。
摘要由CSDN通过智能技术生成

前情提示: 测试代码中,右尖括号(>)表示命令行中输入的命令; 单独一行并以井字符(#)开头的为输出内容; 库的导入仅在本文的第一个测试代码中展现,其他代码块均省略库的导入代码。

  • 系统类型: Windows 10
  • python 版本: Python 3.9.0

itertools 模块标准化了一个快速、高效利用内存的核心工具集,主要用来实现一系列迭代器。这些工具函数本身或工具函数之间的组合都是非常有用的。它们一起形成了 迭代器代数

itertools 模块中所有的函数都是创建并返回一个迭代器。它们的区别就是迭代器生成的内容,以及使用场景。

无穷迭代器

无穷迭代器最大的特点是可无限迭代元素,所以在使用时要注意一定要有限制条件来控制迭代器的停止,否则将造成死循环。

itertools.count(start=0, step=1)
    start: int | float, 起始值
    step: int | float, 步长

创建一个迭代器,第一个元素的值为参数 start 的值,之后元素的值按照参数 step 的值依次累加。

import itertools

'''打印一下迭代器本身'''
print(itertools.count(7, 1))
# count(7)

'''迭代器类型'''
print(type(itertools.count(7, 1)))
# <class 'itertools.count'>

'''一个简单的小应用'''
for i in itertools.count(7, 1):
    print(i)
    if i > 10:
        break
# 7
# 8
# 9
# 10
# 11

itertools 模块中使用函数返回的迭代器的类型与函数同名,可直接在使用迭代器的场景使用。

itertools.cycle(iterable)
iterable: 可迭代对象

创建一个迭代器,以传入的迭代器中的元素为基础,返回这些元素,当这些元素被取完时,会重新从第一个元素获取,无限重复。

'''小应用, 当取到第三个 A 时停止'''
test_str = ''
for i in itertools.cycle('ABC'):
    test_str += i
    if test_str.count('A') >= 3:
        break
print(test_str)
# ABCABCA
itertools.repeat(object[, times])
object: python 对象, 可以是任何数据
times: int, 迭代次数, 可选参数, 默认为无限次

创建一个迭代器,不断重复 object。若设定了 times,则最多重复 times 次,否则将重复无限次。通常用于 map() 函数中当作其中一个参数。

'''有限的迭代器'''
print(list(itertools.repeat(10, 3)))
# [10, 10, 10]

'''使用 map() 函数将两个迭代器元素之间的 pow() 结果收集起来'''
print(list(map(pow, range(10), itertools.repeat(2))))
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

以上这些无穷迭代器在测试时都是使用自身条件或外部限制来使它迭代有限的次数,这些函数生成的迭代器通常用于不确定要迭代次数的场景。

迭代器的操作与处理
itertools.accumulate(iterable[, func, *, initial=None])
iterable: 可迭代对象
func: 带有两个参数的函数, 可选参数
initial: 关键字参数, 默认为 None, 若此参数传参, 则此参数作为 iterable 的第一个元素

创建一个迭代器,默认情况下返回累计汇总值,若传入 func,则按照 func 中的方法执行。例如: 若 iterable[1, 2, 3],则返回的迭代器为 [1, 1+2, 1+2+3]

'''默认情况, 返回累计汇总值'''
print(list(itertools.accumulate([1, 2, 3, 4, 5])))
# [1, 3, 6, 10, 15]

'''方法修改为计算累计的乘积'''
print(list(itertools.accumulate([1, 2, 3, 4, 5], lambda x, y: x * y)))
# [1, 2, 6, 24, 120]

'''在迭代器起始位置添加一个元素, 方法不变, 返回累计汇总值'''
print(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值