1. itertools模块的介绍

在Python中,迭代器(Iterator)是常用来做惰性序列的对象,只有当迭代到某个值的时候,才会进行计算得出这个值。因此,迭代器可以用来存储无限大的序列,这样我们就不用把他一次性放在内存中,而只在需要的时候进行计算。所以,对于读取大文件或者无线集合,最好是使用迭代器。实际上,Python2的大多数函数都是返回列表等序列,而Python3都已经改进为返回迭代器。

Python的内置模块itertools就是用来操作迭代器的一个模块,包含的函数都是能够创建迭代器来用于for循环或者next()。其中函数主要可以分为三类,分别是无限迭代器,有限迭代器,组合迭代器。

2. 无限迭代器(Infinite Iterators)

这些函数可以生成无限的迭代器,我们主要学习以下三个函数的用法。

2.1 count()

count([start=0, step=1]) 接收两个可选整形参数,第一个指定了迭代开始的值,第二个指定了迭代的步长。此外,start参数默认为0,step参数默认为1,可以根据需要来把这两个指定为其它值,或者使用默认参数。

import itertools
for i in itertools.count(10,2):print(i)if i>20: break[Running] python -u "e:\pythonee\code\test.py"
10
12
14
16
18
20
22

2.2 cycle()

cycle(iterable) 是用一个可迭代对象中的元素来创建一个迭代器,并且复制自己的值,一直无限的重复下去。

import itertools
for i in itertools.cycle("abcd"):print(i)     # 具有无限的输出,可以按ctrl+c来停止。[Running] python -u "e:\pythonee\code\test.py"
a
b
c
d
a
b
c
d
a
b

2.3 repeat()

repeat(elem [,n])是将一个元素重复n遍或者无穷多遍,并返回一个迭代器。

import itertools
for i in itertools.repeat("abcd",5):print(i)[Running] python -u "e:\pythonee\code\test.py"
abcd
abcd
abcd
abcd
abcd

3. 组合迭代器(Combinatoric Iterators)

组合操作包括排列,笛卡儿积,或者一些离散元素的选择,组合迭代器就是产生这样序列的迭代器。我们来看看这几个函数的用法。

3.1 product()

product(*iterables, repeat=1) 得到的是可迭代对象的笛卡儿积,*iterables参数表示需要多个可迭代对象。这些可迭代对象之间的笛卡儿积,也可以使用for循环来实现,例如 product(A, B) 与 ((x,y) for x in A for y in B)就实现一样的功能。

import itertools
for i in itertools.product([1,2,3],[4,5,6]):print(i)[Running] python -u "e:\pythonee\code\test.py"
(1, 4)
(1, 5)
(1, 6)
(2, 4)
(2, 5)
(2, 6)
(3, 4)
(3, 5)
(3, 6)

3.2 repeat()

而 repeat 参数则表示这些可迭代序列重复的次数。例如 product(A, repeat=4) 与 product(A, A, A, A)实现的功能一样。

import itertools
for i in itertools.product('ab','cd',repeat = 2):#左右两边进行排列组合,用2次,生成元组内元素数为 序列数*重复次数print(i)[Running] python -u "e:\pythonee\code\test.py"
('a', 'c', 'a', 'c')
('a', 'c', 'a', 'd')
('a', 'c', 'b', 'c')
('a', 'c', 'b', 'd')
('a', 'd', 'a', 'c')
('a', 'd', 'a', 'd')
('a', 'd', 'b', 'c')
('a', 'd', 'b', 'd')
('b', 'c', 'a', 'c')
('b', 'c', 'a', 'd')
('b', 'c', 'b', 'c')
('b', 'c', 'b', 'd')
('b', 'd', 'a', 'c')
('b', 'd', 'a', 'd')
('b', 'd', 'b', 'c')
('b', 'd', 'b', 'd')

3.3 permutations()

permutations(iterable,r=None)返回的是可迭代元素中的一个排列组合,并且是按顺序返回的,且不包含重复的结果。

import itertools
for i in itertools.permutations('abc'):print(i)[Running] python -u "e:\pythonee\code\test.py"
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

当然,第 2 个参数默认为None,它表示的是返回元组(tuple) 的长度,我们来尝试一下传入第二个参数。

import itertools
for i in itertools.permutations('abc',2):print(i)[Running] python -u "e:\pythonee\code\test.py"
('a', 'b')
('a', 'c')
('b', 'a')
('b', 'c')
('c', 'a')
('c', 'b')

3.4 combinations

combinations(iterable,r) 返回的是可迭代对象所有的长度为 r 的子序列,注意这与前一个函数 permutation 不同,permutation 返回的是排列,而 combinations 返回的是组合。

import itertools
for i in itertools.combinations('1234',2):print(i)[Running] python -u "e:\pythonee\code\test.py"
('1', '2')
('1', '3')
('1', '4')
('2', '3')
('2', '4')
('3', '4')

3.5 combinations_with_replacement()

combinations_with_replacement(iterable, r) 返回一个可与自身重复的元素组合,用法类似于 combinations 。

import itertools
for i in itertools.combinations_with_replacement('1234',2):print(i)[Running] python -u "e:\pythonee\code\test.py"
('1', '1')
('1', '2')
('1', '3')
('1', '4')
('2', '2')
('2', '3')
('2', '4')
('3', '3')
('3', '4')
('4', '4')

4. 有限迭代器(Iterators Terminating on the Shortest Input Sequence)

这里的函数有十来个,主要为大家介绍其中几个常用的函数。

4.1 chain()

chain(*iterables) 可以把多个可迭代对象组合起来,形成一个更大的迭代器。

import itertools
for i in itertools.chain('good','bye'):print(i)[Running] python -u "e:\pythonee\code\test.py"
g
o
o
d
b
y
e

4.2 groupby()

groupby(iterable,key=None) 可以把相邻元素按照 key 函数分组,并返回相应的 key 和 groupby,如果key函数为 None,则只有相同的元素才能放在一组。

import itertools
for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):print(list(group))[Running] python -u "e:\pythonee\code\test.py"
['A', 'a', 'a']
['B', 'B', 'b']
['c', 'C']
['A', 'A', 'a']

4.3 accumulate()

accumulate(iterable [,func]) 可以计算出一个迭代器,这个迭代器是由特定的二元函数的累计结果生成的,如果不指定的话,默认函数为求和函数。

import itertools
for i in itertools.accumulate([0,1,0,1,1,2,3,5]):print(i)[Running] python -u "e:\pythonee\code\test.py"
0
1
1
2
3
5
8
13

如果我们指定这个累计函数,则还能有不同的用法,例如,指定一个最大值函数,或者自己定义的函数。

import itertools
for i in itertools.accumulate([2,1,4,3,5],max):print(i)[Running] python -u "e:\pythonee\code\test.py"
2
2
4
4
5

Python_itertools模块相关推荐

  1. etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程

    1. etcd 项目结构和功能 etcd 项目代码的目录结构如下: $ tree ├── auth ├── build ├── client ├── clientv3 ├── contrib ├── ...

  2. OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能

    1. OpenCV 概念 图像处理( Image Processing )是用计算机对图像进行分析, 以达到所需结果的技术, 又称影像处理. 图像处理技术一般包括图像压缩, 增强和复原, 匹配.描述和 ...

  3. Python 多线程总结(1)- thread 模块

    thread 模块 1. 单线程 首先看下单线程程序运行的例子,如下所示, import timedef loop0():print 'start loop0 begin', time.ctime() ...

  4. 关于python导入模块和package的一些深度思考

    背景 在python中有导入模块和导入package一说,这篇文章主要介绍导入模块和package的一些思考. 首先什么是模块?什么是package? 模块:用来从逻辑上组织python代码(变量,函 ...

  5. Python Re 模块超全解读!详细

    内行必看!Python Re 模块超全解读! 2019.08.08 18:59:45字数 953阅读 121 re模块下的函数 compile(pattern):创建模式对象 > import ...

  6. python性能分析之line_profiler模块-耗时,效率 时间

    20210203 直接用pycharm 自带的 20201215 直接装不上的情况下 先下载安装文件 再安装 line_profiler使用装饰器(@profile)标记需要调试的函数.用kernpr ...

  7. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  8. 关于python 中的__future__模块

    Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动.有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了. 具体说来就是,某个版本中出现了某个 ...

  9. GPUtil是一个Python模块,使用nvidia-smi从NVIDA GPU获取GPU状态

    GPUtil是一个Python模块,使用nvidia-smi从NVIDA GPU获取GPU状态 一个Python模块,用于在Python中使用nvidia-smi以编程方式从NVIDA GPU获取GP ...

最新文章

  1. LeetCode简单题之有多少小于当前数字的数字
  2. 模糊推理 控制 易于实现_代码“易于推理”是什么意思?
  3. @ImportResource-SpringBoot使用xml配置Bean
  4. 【 C 】高级字符串查找之 strspn 和 strcspn 的思考
  5. nginx+uWSGI+django+virtualenv+supervisor发布web服务器
  6. centos标准分区调整大小_去繁化简解决CentOS下调整home和根分区大小的方法
  7. Linux程序设计01:开发工具和开发平台
  8. 云图说|AI开发难!难!难!端云协同多模态AI开发套件你需要了解一下
  9. 《Python游戏趣味编程》 第9章 贪吃蛇
  10. oppo手机android是多,OPPO手机卡屏?教你三招轻松解决卡顿问题,大部分安卓都适用...
  11. php7.1.1一键安装/配置文件简单优化
  12. 基于C++的简易的国际象棋双人对战程序设计
  13. qt 合并单元格 tablewidget 合并单元格
  14. 好玩的黑客游戏(过把黑客的瘾)
  15. 什么是JAVA SWING
  16. 计算机视觉 — Harris角点检测
  17. 什么是php微信开发,php微信公众号开发模式详解
  18. js中数组的entries方法
  19. OpenYurt 在龙源 CNStack 云边协同项目的应用
  20. Ubuntu 22.04 LTS 是史诗级的版本?

热门文章

  1. Saltstack之Grains组件
  2. 最新注册gmail邮箱收不到验证码解决方法
  3. 银河麒麟高级服务器双网卡绑定
  4. 二级计算机c语言模拟考试程序,计算机二级c语言模拟考试题
  5. Matlab CSF地面点滤波(插件)
  6. 腾讯金融云新战略:“技术、敏捷、生态”三位一体推动企业数字化转型
  7. jQuery.parseJSON(json)方法将字符串转换成js对象
  8. Color Tunnels(翻译)
  9. 26(2)Spring 核心功能演示 + 面试题
  10. 常用锁原理的介绍(上)