来源 : 忆先

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相关推荐

  1. python内置库有哪些_python 内置库

    广告关闭 回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你! version: 0. 2.0, configurations: }, de ...

  2. python内置库之学习configparser库(一)

    python内置库之学习configparser库(一) 1.引言 ini文件简介 [节] 键=值 注:节不能重复出现 2.自己封装了一个增删改查的类,可以参考一下 import configpars ...

  3. random输出1到10之间_第43P,随机数,Python内置库之random

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第43篇文章,第二阶段的课程:Python基础知识:Python内置库之random随机库. 学习本课程,建议先看一遍:[计算机基础 ...

  4. python内置库之学习ctypes库(二)

    ctypes库踩坑日记2 一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰 二.生成dll文件 三.ctypes库调用 一.自己实现一个dll文件,再用python的cty ...

  5. Python内置库修炼——turtle绘图库指令大全

    文章目录 一.设置画布大小 二.画笔的属性 三.画笔控制命令 四.画笔运动命令 五.全局控制命令 六.其他命令 七.弧形绘制 一.设置画布大小 1.screensize() turtle.screen ...

  6. 一个 零差评的 Python 内置库

    前言 最近事情不是很多,想写一些技术文章分享给大家,同时也对自己一段时间来碎片化接受的知识进行一下梳理,所谓写清楚才能说清楚,说清楚才能想清楚,就是这个道理了. 很多人都致力于把Python代码写得更 ...

  7. python内置库之学习ctypes库(一)

    ctypes库踩坑日记1 1.引言(这里是讲的windows下调用的方式) 2.结构体 3.联合体(共用体) 和上面结构体用法类似,只不过这里继承的是`Union`类 4.进阶用法 5.接受返回的值 ...

  8. Python编程模块里一些小众但是却比较实用的python内置库

    今天带来的是python里一些小众但是却比较实用的python库,一起来看看吧! 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...

  9. python内置库之学习ctypes库(三)--调用Win32API

    ctypes库踩坑日记3 1.调用win32的api 2.最好让结构体和程序分开 3.取完数据找到对应信息,创建code.py 4.创建main.py,代码这样看着就很简洁 1.调用win32的api ...

最新文章

  1. AtCoder AGC005E Sugigma: The Showdown (博弈论)
  2. 什么情况下会用到try-catch
  3. makefile中的patsubst, wildcard, notdir
  4. scroll-view 横向滑动无效的问题
  5. 不停止nginx服务的情况下替换nginx执行文件
  6. js es6 map 与 原生对象区别
  7. APUE 第四章总结
  8. 华罗庚数学竞赛如何报名?
  9. 工具 | 实用的嵌入式软件测试工具
  10. SIMD and Avx2
  11. Excel做文件归档
  12. 字节跳动2020春招笔试 - 研发岗位(Java、C++、大数据)
  13. 对draw.io第一次加载慢的探讨
  14. python-web开发[16-18]之Django开发
  15. transformer变体
  16. 云原生会统领SaaS服务的原因
  17. PPT文档如何快速复制粘贴幻灯片
  18. 与bootstrap相配合使用的插件
  19. 2007-1-14日 周日 agilepoint的讲座
  20. hp台式计算机生产日期,如何查询hp笔记本生产日期

热门文章

  1. c语言程序 用追赶法求解方程组,编写用追赶法解三对角线性方程组的程序,并解下列方程组(3页)-原创力文档...
  2. Android--使用VideoView播放视频
  3. 查看ecshop广告位对应的广告详细信息
  4. gradle 2.1构建android出现错误的解决方案
  5. 【6】nagios从零学习使用 - centreon发送邮件报警
  6. Apache虚拟主机指南
  7. 《OPhone应用开发权威指南》全面上市
  8. 软件业的作业示意流程图
  9. 72.Minimum Window Substring(最小子串窗口)
  10. Ubuntu开启防火墙