迭代器之:itertools
1、引言
小鱼:小屌丝,我问问你你?
小屌丝:问我?我没做错啥吧?
小鱼:那倒没有,就是想问问你一件事。
小屌丝:惊慌失措… 这… 我最近可是认真的看书,没做啥事。
小鱼:你慌什么? 我还没问呢。
小屌丝:(⊙o⊙)… 那你问,问…吧~
小鱼:也没有别的事,你知道迭代器吗?
小屌丝:唉… 迭代器啊, 那我知道啊
小鱼:噢,那你说说,迭代器。
小屌丝:range。
小鱼:嗯,继续说。
小屌丝:鱼哥,你说吧,我可能不善言辞。
小鱼:我xxxx,跟我想的一样。
小屌丝:你都预料到了,还来问我。
小鱼:怪我咯
2、itertools
2.1 定义
其实迭代器,不仅仅range,在Python内置库有一个很强大的迭代器,
如果没印象的话,可以看看小鱼的这篇博客《Python3,不知道Python内置库函数,不要错过这篇,必须收藏!!!》
当然,今天我们基于这篇,在进行拓展,让我们看看,python内置库的强大。
话不多说,我上一张图, 先感受一下迭代器的功能。
接着,就是我们今天的主角, itertools。
- itertools是Python内置的一个非常强大的模块,提供了许多用于创建迭代器的函数。
- 它可以生成一系列有用的结果集合,而不需要创建中间列表,这大大节省了空间并且提高了效率。
接下来,我们就看看itertools强大的功能。
2.2 常用功能
2.2.1 无限迭代器
- count():接收两个可选整形参数,第一个指定迭代开始的值,第二个指定迭代的步长。
- 例如,itertools.count(10, 2) 将生成一个从10开始的,每次增加2的无限迭代器。
- cycle():用一个可迭代对象中的元素来创建一个迭代器,并且复制自己的值,一直无限的重复下去。
- 例如,itertools.cycle(“abcd”) 将创建一个无限的迭代器,不断重复输出 “abcd”。
- repeat():将一个元素重复 n 遍或者无穷多遍,并返回一个迭代器。
- 例如,itertools.repeat(“abcd”, 5) 将创建一个迭代器,重复输出 “abcd” 五次。
2.2.2 组合迭代器
- combinations_with_replacement():从输入的可迭代对象中生成所有有重复元素的组合。
- 例如,itertools.combinations_with_replacement([‘A’, ‘B’, ‘C’, ‘D’], 3) 将生成所有从 [‘A’, ‘B’, ‘C’, ‘D’] 中取3个元素且允许重复的组合。
2.2.3 其他常用函数
- islice():用于切割可迭代对象,返回一个迭代器。
- 例如,itertools.islice(range(10), 3, 7) 将从 range(10) 中切割出索引从3到7的部分,返回一个迭代器。
- tee():用于将一个可迭代对象复制到多个通道,返回一个迭代器。
- 例如,itertools.tee(range(10), 3) 将把 range(10) 复制到3个通道,返回一个包含3个迭代器的元组。
- product():用于计算输入可迭代对象的笛卡尔积。
- 例如,itertools.product([‘A’, ‘B’, ‘C’], [1, 2]) 将计算出所有 [‘A’, ‘B’, ‘C’] 和 [1, 2] 的排列组合。
- pairwise():从 Python 3.10 引入的一个方法,用于按顺序返回一个可迭代对象中每两个相邻的元素构成的元组的列表。
- 例如,itertools.pairwise(range(5)) 将返回 [(0, 1), (1, 2), (2, 3), (3, 4)]。
看到这里,是不是瞬间觉得,这个itertools还挺香的呢。
2.3 代码示例
因为内置库, 所以,不需要安装,我们直接调用内置库就可以哦了
2.3.1 count()
count(): 创建一个无限递增或递减的整数序列。
- Demo1:无限递增
# -*- coding:utf-8 -*-
# @Time : 2023-11-26
# @Author : carl_DJ
from itertools import count
#无限递增整数序列,达到20,跳出循环
for i in count(1):
print(i)
if i >20:
break
运行结果
- Demo2:无限递减
# -*- coding:utf-8 -*-
# @Time : 2023-11-26
# @Author : carl_DJ
from itertools import count
#从10开始递减整数,直到-1
for i in count(10,-1):
print(i)
if i < 0:
break
运行结果
2.3.2 cycle()
cycle(): 将可迭代对象变为无限循环迭代器。
# -*- coding:utf-8 -*-
# @Time : 2023-11-26
# @Author : carl_DJ
from itertools import cycle
my_list = ['A', 'B', 'C']
for char in cycle(my_list):
print(char)
if char == 'C':
break
运行结果
2.3.3 combinations()
combinations(): 返回给定 iterable 的所有组合。
# -*- coding:utf-8 -*-
# @Time : 2023-11-26
# @Author : carl_DJ
import itertools
s = "ABCD"
for i in range(2, len(s)+1):
for subset in itertools.combinations(s, i):
print(subset)
运行结果
2.3.4 product()
product(): 返回笛卡尔积(所有可能的排列)。
# -*- coding:utf-8 -*-
# @Time : 2023-11-26
# @Author : carl_DJ
from itertools import product
a = [1,2]
b = [3,4]
print(list(product(a,b)))
运行结果
3、总结
看到这里, 关于itertools的知识的分享,也差不多该完事了。
在实际的工作中, itertools的使用频次还是很高的。
所以,至于迭代器,不要仅仅 局限于range哦。
多尝试些新的技能,还是很有好处的哦。
我是小鱼:
- CSDN 博客专家;
- 阿里云 专家博主;
- 51CTO博客专家;
- 51认证讲师等;
- 认证金牌面试官;
- 职场面试及培训规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)测评一、二等奖获得者;
关注小鱼,带你学习更多更专业更前言的人工智能相关技术。