前言

  • 库的学习地址:https://pymotw.com/2/itertools/

  • 库的官网地址:https://docs.python.org/2/library/itertools.html

在Python中,迭代器(生成器, iterator)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器,所以,对于读取大文件或者无限集合,最好是使用迭代器。

Python的内置模块 itertools 就是用来操作迭代器的一个模块,包含的函数都是能够创建迭代器来用于 for循环或者 next(), itertools用于高效循环的迭代函数集合,其中很多函数的作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。

其itertools库中的函数主要分为三类,分别为无限迭代器,有限迭代器,组合迭代器。

一.无限迭代器(Infinite Iterators)

这些函数可以生成无限的迭代器,概述如下:


下面详细学习:

1.count()

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

import itertools
natuals = itertools.count(1)
for n in natuals:print(n)if n > 5:break#输出
1
2
3
4
5
6

因为count() 会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出

2.cycle()

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

import itertools
cs = itertools.cycle('ABC') # 注意字符串也是序列的一种
for c in cs:print(c)   # 具有无限的输出,可以按ctrl+c来停止#输出
'A'
'B'
'C'
'A'
'B'
'C'

cycle() 同样停不下来,需要Ctrl+C停止。

3.repeat()

repeat(ele, [, n])是将一个元素重复 n 遍或者无穷多变,并返回一个迭代器。不过如果提供第二个参数就可以限定重复次数。

ns = itertools.repeat('A', 5)
for n in ns:print(n)#输出
A
A
A
A
A

无限序列只有在 for 迭代时才会无限的迭代下去,如果只是创建了一个迭代对象,它不会实现把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。无限序列虽然可以无限迭代下去,但是我们通常会通过 takewhile() 等函数根据条件判断来截取一个有限的序列:

natuals = itertools.count(1)
ns = itertools.takewhile(lambda x: x <= 5, natuals)
for n in ns:print n#输出
1
2
3
4
5

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

这里的函数有十来个,如下:

下面我们学习几个常用的:

1.chain()

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

比如:

for iter in itertools.chain('lebron', 'james'):print(iter)#输出
l
e
b
r
o
n
j
a
m
e
s

2 .groupby()

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

for key, group in itertools.groupby('AAABBBCCAAA'):print(key, list(group))  #输出
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']

实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。如果我们要忽略大小写分组,就可以让元素“A”和‘a’都返回相等的key。

for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):print(key, list(group))#输出
A ['A', 'a', 'a']
B ['B', 'B', 'b']
C ['c', 'C']
A ['A', 'A', 'a']

3.itertools.accumulate()

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

from itertools import accumulate<br>
x = accumulate(range(10))
print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

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

from itertools import accumulate# x1 = accumulate(range(10), max)
# print(list(x1))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]x2 = accumulate(range(10), min)
print(list(x2))
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

三.组合迭代器(Combinatoric Iterators)

组合操作包括排列,笛卡尔积,或者一些离散元素的选择,组合迭代器就是产生这样序列的迭代器,概述如下:

下面我们来看看常用的几个函数:

1.product()

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

import itertoolsfor i in itertools.product([1,2,3],[4,5,6]):print(i)#输出
(1, 4)
(1, 5)
(1, 6)
(2, 4)
(2, 5)
(2, 6)
(3, 4)
(3, 5)
(3, 6)

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

import itertools
for i in itertools.product('ab','cd',repeat = 2):print(i)#输出
('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')

2.permutations()

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

#更多Python相关视频、资料加群778463939免费获取
from itertools import permutationsx = permutations((1,2,3))
print(list(x))
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

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

from itertools import permutationsx = permutations((1, 2, 3), 2)
print(list(x))
# [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

3.combinations()

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

下面对比一下combinations() 与 permutations() 函数:

from itertools import permutations, combinationsx1 = permutations((1, 2, 3))
x2 = combinations((1, 2, 3), 3)
x11 = permutations((1, 2, 3), 2)
x22 = combinations((1, 2, 3), 2)
print(list(x1))
print(list(x2))
print(list(x11))
print(list(x22))
# [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
# [(1, 2, 3)]
# [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
# [(1, 2), (1, 3), (2, 3)]

4 combinations_with_replacement()

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

from itertools import combinations, combinations_with_replacementx1 = combinations((1, 2), 2)
x2 = combinations_with_replacement((1, 2), 2)
print(list(x1))
print(list(x2))
# [(1, 2)]
# [(1, 1), (1, 2), (2, 2)]

结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

Python基础入门教程推荐:←点击左边蓝色文字就可以跳转观看了

Python爬虫案例教程推荐:←点击左边蓝色文字就可以跳转观看了

Python itertools库详细教程相关推荐

  1. python添加库详细教程_Python 中如何自动导入缺失的库?|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No mo ...

  2. Python数据分析【1】:matplotlib库详细教程

    Python数据分析:matplotlib库详细教程 一.基本介绍 1. 数据分析 2. 环境安装 二.matplotlib 1. 基本介绍 2. 基本要点 3. 散点图/直方图/柱状图 4. 画图工 ...

  3. ubuntu下完全卸载 opencv库 详细教程

     ubuntu下完全卸载 opencv库 详细教程 1:首先你需要先进入安装 opencv的build目录下(这个目录一般都会在你的 home里),进入build目录 执行卸载命令,这个命令执行起来比 ...

  4. 基于JUPYTER的python主流库新手教程(上)

    基于JUPYTER的python主流库新手教程(上) 作者:二马传奇 0. 基本测试 for i in range(5):print(i,end=",") 0,1,2,3,4, 1 ...

  5. Linux下利用python实现语音识别详细教程

    Linux下python实现语音识别详细教程 语音识别工作原理简介 选择合适的python语音识别包 安装SpeechRecognition 识别器类 音频文件的使用 英文的语音识别 噪音对语音识别的 ...

  6. Linux离线安装python第三方库详细步骤

    Linux离线安装python第三方库详细步骤 01 查看服务器上的OS版本 02 查看已安装的python版本 03 查看python3支持的whl 04 国内镜像源网站下载whl 05 最后执行 ...

  7. Python 自动发送邮件详细教程

    自动发送邮件能应用于许多场景中,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费时间了.为什么不把这一套流程放到服务器上,然后到点自动运行并发送邮件呢 ...

  8. [转载] python标准库系列教程(三)——operator库详细教程

    参考链接: Python中的Inplace运算符| 2(ixor(),iand(),ipow()等) python进阶教程 机器学习 深度学习 长按二维码关注 进入正文 Python基础学习:oper ...

  9. Python之Numpy详细教程

    NumPy - 简介 NumPy 是一个 Python 包. 它代表 "Numeric Python". 它是一个由多维数组对象和用于处理数组的例程集合组成的库. Numeric, ...

最新文章

  1. OpenSuse Linux 的单用户模式
  2. html自适应pc窗口大小_自适应技术很难吗?为什么Shopyy平台将网站分为PC端和移动端...
  3. python真的这么厉害吗-Python为什么这么厉害?——Python ,能用来做什么
  4. 伦敦大学 机器人科学(研究型硕士) 项目介绍!干货满满!
  5. 深入理解Activity启动流程(二)–Activity启动相关类的类图
  6. 百度地图上的标注物太多导致界面卡顿的解决办法
  7. 三星固态驱动安装失败_三星950 Pro固态硬盘用U盘装win7失败解决教程
  8. openSUSE 11.2 上试动Mono
  9. 【小旭学长-使用python进行城市数据分析】笔记篇(中)
  10. 计算机网络有什么部分组成,计算机网络有哪些组成部分和详细对比
  11. [虚幻引擎] UE4/5数字孪生 制作城市光束效果
  12. sinc插值原理及其实现
  13. 气传导耳机是什么原理?气传导蓝牙耳机优缺点分析
  14. CPU中运算器的功能
  15. linux添加五笔输入法,在Ubuntu16.04中为fctix小企鹅增加五笔输入法
  16. 【JAVA枚举类型】
  17. CentOS7.2 Django + uwsgi + Nginx 部(cǎi )署(kēng)指(zhī)南(lǜ)
  18. C#基础------常用软件官方下载
  19. 日本准备推行AI婚配,年轻人会为“爱情算法”买单吗?
  20. ubuntu18.04上的draftsight 2D的安装

热门文章

  1. 净化网络环境!可信数字内容版权服务解决方案发布
  2. MariaDB Window Functions窗口函数分组取TOP N记录
  3. Linux查看swap使用情况小脚本
  4. ASP.NET应用程序使用NLog记录日志
  5. 2007微软技术大会(TechEd)开幕式
  6. js正则贪婪模式_JavaScript正则表达式迷你书之贪婪模式-学习笔记
  7. Eclipse与MyEclipse的选择问题
  8. 修改ALSM_EXCEL_TO_INTERNAL_TABLE的限制
  9. SAP中采购订单状态与MRP的关系
  10. alv+checkbox+select all