首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python内置模块-itertools

今天接到了需求,要我讲一下python的各个内置模块,总感觉这是个大坑

我想了一下,内置模块实在太多了,我会先挑一些我用过的说一说,其他的如果想看哪个模块,可以留言告诉我,我再来分享

顺便贴一个模块列表: https://docs.python.org/2/py-modindex.html

关于分享的方式:

模块介绍这类文章,总感觉谁讲都大同小异,我的计划是这样:

给出官方文档

给出我觉得比较清晰的,其他人讲这个模块的文章

用我自己的理解,把上面两条复述一遍,并添加自己的笔记和扩展

给出我的测试代码

如果有什么我遗漏的,欢迎补充,会给置顶评论

计划是这样样子,我们来试试看吧,首先是前两天提到过几次的itertools模块

itertools 推荐链接:

官方文档:

https://docs.python.org/2.7/library/itertools.html

官方文档的部分中文解释:

https://www.jb51.net/article/55626.htm

廖雪峰讲解(py3):

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143200162233153835cfdd1a541a18ddc15059e3ddeec000

模块源码(是C语言写的,代码看不懂没关系,我们可以看注释):

https://github.com/python/cpython/blob/2.7/Modules/itertoolsmodule.c

具体内容

下面是对其中内容的分类介绍:

第一部分: 无限迭代器

这里提供了三个无限迭代器,只要没有去终止,他们就会不停跑下去

count(start=0, step=1)

一个无限+1的迭代器,可以调整start和step

有一个可能说了也没用的小细节,这个迭代器有个隐藏模式: fastmode和slowmode

当满足: 迭代器当前计数小于 ,start是整数,step是1的时候,使用快速模式,否知就是慢速模式

之所以说没用是因为,一般场景真不太容易用得上这个慢速模式

cycle(iterable)

无限次迭代输入的这个可迭代对象,是指将这个可迭代对象从头到尾,再从头到尾,类似于音乐播放器的列表循环模式

repeat(object, times=None)

重复返回传入的object无限次或times次,嗯单曲循环模式

第二部分: 一些好用的迭代器

这些迭代器,平时可能想不起来用,因为就算自己实现也没什么麻烦的,但是当数据量大起来的时候,迭代器的优势,以及这个模块是直接用C语言编写的速度优势,就很关键了

chain(*iterables)

将传入的多个可迭代对象按传入顺序连接起来,变成一个大迭代器

相当于把n个歌单顺序连在一起,然后从头开始只播放一遍

compress(data, selectors)

根据真值表selectors来filter,决定返回data里的哪些值

这个函数我感觉是用在特殊领域的,因为右边的selectors,真的是要给出一个真值表序列,然后根据序列里各项是否为真,来决定data里对应项的去留。data和selectors里,像zip一样,以短的为准,有一个迭代完了就结束函数,详见代码,不过不看也没事,真有真值表时会想起这个来的

groupby(iterable, key=None)

将第一个参数里,连续且重复的值返回,判定连续的方式可由第二个key函数来说明,key的使用类似sorted的key

可以把这个函数的作用理解成mysql的group by,不过是只对连续重复值有反应的group by。

dropwhile(func, iterable)

第一个参数是个真值函数,迭代第二个参数并对每个值进行真值判断,当第一次为False时,将此值以及之前迭代过的值全部丢掉,对剩余内容进行迭代

执行流程: 扔,扔,扔,扔,扔,诶这个是False扔掉这个大家就可以开始干活啦

talewhile(func, iterable)

与dropwhile对应,当第一次为False时,取这个节点及前面全部节点

上面那个不要我的全都要

islice(iterable, [start,] stop [, step])

slice的迭代器实现,可以对迭代器进行切片,切完之后返回的还是迭代器

上面的无限迭代器,用这个就可以控制迭代次数了,这个函数真的好用

imap()

py2里map的迭代器实现,当然在py3里map就是生成器了,可以无视掉这个函数了

starmap

imap的一种调用方式,imap(func, p,q) 等价于 starmap(func, zip(p, q))

应该是某种我不知道的需求

izip

在python2里,是zip()的迭代器版本

izip_longest()

如果传入的几个iterables长度不同,迭代次数为长度最大的

ifilter(funcorNone, sequence)

就是普通filter的迭代器实现,同样如果func_orNone写None的话,每个判断都认为是True

ifilterfalse(funcorNone, sequence)

与上面那个的区别是,对真值函数的结果取反,注意如果funcnoNone写None的话,每个判断都认为是False

第三部分: 【数学】排列组合里的生成器

忘记了排列组合是什么的,附赠传送门: https://baike.baidu.com/item/%E6%8E%92%E5%88%97%E7%BB%84%E5%90%88/706498

product(*iterables, repeat=1)

求iterables的笛卡尔积元组,repeat表示之前传入的参数重复几遍

permutations(iterable, r=None)

排列,从len(iterable)个元素中任取r or len(iterable)个不同元素(r combinations(iterable, r=None)

组合,从len(iterable)个元素中任取r or len(iterable)个不同元素(r combinationswithreplacement

组合,但允许一组中含有多个相同元素

第四部分: itertools里的唯一一个方法 tee

tee(iterable, n=2)

将一个iterable变成n个iterator,注意如果原始iterable是迭代器,那么调用完此方法后,原iterator和新iterator,只有一个能使用,即如果使用了原,那么新的就会全部为空,如果使用了新(即使只使用了一个),原也会已消耗殆尽

原理看一下实现代码也就明白了,其中 是个双向队列,用于存储可迭代对象。而在我标记的那一行里,gen函数使用了外部变量deques,就是在这里把下一个待迭代对象塞进了所有deque。这段代码建议好好研究下,然后用tee多做几个实验,以充分理解。

说到这里,gen函数为什么可以使用外部的deques变量呢?可能要牵出这么几个概念:

闭包

命名空间及作用域,以及代码里没写但是py3里有用到的

py2没有nonlocal,为什么可以修改并影响外部的deques呢?因为deques是个可变对象

留待以后再补上这几个概念吧,我在

python-可迭代对象、迭代器、生成器、序列

里就说过,tee这个函数真的超厉害的啊~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180803G0BVHP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券