相见恨晚的 Python 内置库:itertools
来源 : 忆先
01 前言
很多人都致力于把Python代码写得更Pythonic,一来更符合规范且容易阅读,二来一般Pythonic的代码在执行上也更有效率。今天就先给大家介绍一下Python的系统库itertools。
02 itertools库
迭代器(生成器)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器。
话虽这么说但大家平时用到的迭代器大概只有range了,而通过iter函数把列表对象转化为迭代器对象又有点多此一举,这时候我们今天的主角itertools就该上场了。
03 使用itertools
itertools中的函数大多是返回各种迭代器对象,其中很多函数的作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。
itertools.accumulate
简单来说就是累加。
>>> import itertools
>>> x = itertools.accumulate(range(10))
>>> print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
itertools.chain
连接多个列表或者迭代器。
>>> x = itertools.chain(range(3), range(4), [3,2,1])
>>> print(list(x))
[0, 1, 2, 0, 1, 2, 3, 3, 2, 1]
itertools.combinations
求列表或生成器中指定数目的元素不重复的所有组合
>>> x = itertools.combinations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]
itertools.combinations_with_replacement
允许重复元素的组合
>>> x = itertools.combinations_with_replacement('ABC', 2)
>>> print(list(x))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
itertools.compress
按照真值表筛选元素
>>> x = itertools.compress(range(5), (True, False, True, True, False))
>>> print(list(x))
[0, 2, 3]
itertools.count
就是一个计数器,可以指定起始位置和步长
>>> x = itertools.count(start=20, step=-1)
>>> print(list(itertools.islice(x, 0, 10, 1)))
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11]
itertools.cycle
循环指定的列表和迭代器
>>> x = itertools.cycle('ABC')
>>> print(list(itertools.islice(x, 0, 10, 1)))
['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']
itertools.dropwhile
按照真值函数丢弃掉列表和迭代器前面的元素
>>> x = itertools.dropwhile(lambda e: e < 5, range(10))
>>> print(list(x))
[5, 6, 7, 8, 9]
itertools.filterfalse
保留对应真值为False的元素
>>> x = itertools.filterfalse(lambda e: e < 5, (1, 5, 3, 6, 9, 4))
>>> print(list(x))
[5, 6, 9]
itertools.groupby
按照分组函数的值对元素进行分组
>>> x = itertools.groupby(range(10), lambda x: x < 5 or x > 8)
>>> for condition, numbers in x:
... print(condition, list(numbers))
True [0, 1, 2, 3, 4]
False [5, 6, 7, 8]
True [9]
itertools.islice
上文使用过的函数,对迭代器进行切片
>>> x = itertools.islice(range(10), 0, 9, 2)
>>> print(list(x))
[0, 2, 4, 6, 8]
itertools.permutations
产生指定数目的元素的所有排列(顺序有关)
>>> x = itertools.permutations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 3), (0, 3, 1), (0, 3, 2), (1, 0, 2), (1, 0, 3), (1, 2, 0), (1, 2, 3), (1, 3, 0), (1, 3, 2), (2, 0, 1), (2, 0,3), (2, 1, 0), (2, 1, 3), (2, 3, 0), (2, 3, 1), (3, 0, 1), (3, 0, 2), (3, 1, 0), (3, 1, 2), (3, 2, 0), (3, 2, 1)]
itertools.product
产生多个列表和迭代器的(积)
>>> x = itertools.product('ABC', range(3))
>>>
>>> print(list(x))
[('A', 0), ('A', 1), ('A', 2), ('B', 0), ('B', 1), ('B', 2), ('C', 0), ('C', 1), ('C', 2)]
itertools.repeat
简单的生成一个拥有指定数目元素的迭代器
>>> x = itertools.repeat(0, 5)
>>> print(list(x))
[0, 0, 0, 0, 0]
itertools.starmap
类似map
>>> x = itertools.starmap(str.islower, 'aBCDefGhI')
>>> print(list(x))
[True, False, False, False, True, True, False, True, False]
itertools.takewhile
与dropwhile相反,保留元素直至真值函数值为假。
>>> x = itertools.takewhile(lambda e: e < 5, range(10))
>>> print(list(x))
[0, 1, 2, 3, 4]
itertools.tee
这个函数我也不是很懂,似乎是生成指定数目的迭代器
>>> x = itertools.tee(range(10), 2)
>>> for letters in x:
... print(list(letters))
...
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
itertools.zip_longest
类似于zip,不过已较长的列表和迭代器的长度为准
>>> x = itertools.zip_longest(range(3), range(5))
>>> y = zip(range(3), range(5))
>>> print(list(x))
[(0, 0), (1, 1), (2, 2), (None, 3), (None, 4)]
>>> print(list(y))
[(0, 0), (1, 1), (2, 2)]
04 结语
大概就总结到这里,不过老实说Python的各种语言特性和库还是要多用才能熟练,最终达到随手拈来的程度,装逼的说就是由术入道。
- END -
对比Excel系列图书累积销量达15w册,让你轻松掌握数据分析技能,可以在全网搜索书名进行了解:
相见恨晚的 Python 内置库:itertools相关推荐
- python内置库有哪些_python 内置库
广告关闭 回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你! version: 0. 2.0, configurations: }, de ...
- python内置库之学习configparser库(一)
python内置库之学习configparser库(一) 1.引言 ini文件简介 [节] 键=值 注:节不能重复出现 2.自己封装了一个增删改查的类,可以参考一下 import configpars ...
- random输出1到10之间_第43P,随机数,Python内置库之random
大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第43篇文章,第二阶段的课程:Python基础知识:Python内置库之random随机库. 学习本课程,建议先看一遍:[计算机基础 ...
- python内置库之学习ctypes库(二)
ctypes库踩坑日记2 一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰 二.生成dll文件 三.ctypes库调用 一.自己实现一个dll文件,再用python的cty ...
- Python内置库修炼——turtle绘图库指令大全
文章目录 一.设置画布大小 二.画笔的属性 三.画笔控制命令 四.画笔运动命令 五.全局控制命令 六.其他命令 七.弧形绘制 一.设置画布大小 1.screensize() turtle.screen ...
- 一个 零差评的 Python 内置库
前言 最近事情不是很多,想写一些技术文章分享给大家,同时也对自己一段时间来碎片化接受的知识进行一下梳理,所谓写清楚才能说清楚,说清楚才能想清楚,就是这个道理了. 很多人都致力于把Python代码写得更 ...
- python内置库之学习ctypes库(一)
ctypes库踩坑日记1 1.引言(这里是讲的windows下调用的方式) 2.结构体 3.联合体(共用体) 和上面结构体用法类似,只不过这里继承的是`Union`类 4.进阶用法 5.接受返回的值 ...
- Python编程模块里一些小众但是却比较实用的python内置库
今天带来的是python里一些小众但是却比较实用的python库,一起来看看吧! 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...
- python内置库之学习ctypes库(三)--调用Win32API
ctypes库踩坑日记3 1.调用win32的api 2.最好让结构体和程序分开 3.取完数据找到对应信息,创建code.py 4.创建main.py,代码这样看着就很简洁 1.调用win32的api ...
最新文章
- AtCoder AGC005E Sugigma: The Showdown (博弈论)
- 什么情况下会用到try-catch
- makefile中的patsubst, wildcard, notdir
- scroll-view 横向滑动无效的问题
- 不停止nginx服务的情况下替换nginx执行文件
- js es6 map 与 原生对象区别
- APUE 第四章总结
- 华罗庚数学竞赛如何报名?
- 工具 | 实用的嵌入式软件测试工具
- SIMD and Avx2
- Excel做文件归档
- 字节跳动2020春招笔试 - 研发岗位(Java、C++、大数据)
- 对draw.io第一次加载慢的探讨
- python-web开发[16-18]之Django开发
- transformer变体
- 云原生会统领SaaS服务的原因
- PPT文档如何快速复制粘贴幻灯片
- 与bootstrap相配合使用的插件
- 2007-1-14日 周日 agilepoint的讲座
- hp台式计算机生产日期,如何查询hp笔记本生产日期
热门文章
- c语言程序 用追赶法求解方程组,编写用追赶法解三对角线性方程组的程序,并解下列方程组(3页)-原创力文档...
- Android--使用VideoView播放视频
- 查看ecshop广告位对应的广告详细信息
- gradle 2.1构建android出现错误的解决方案
- 【6】nagios从零学习使用 - centreon发送邮件报警
- Apache虚拟主机指南
- 《OPhone应用开发权威指南》全面上市
- 软件业的作业示意流程图
- 72.Minimum Window Substring(最小子串窗口)
- Ubuntu开启防火墙