今天接到了需求,要我讲一下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这个函数真的超厉害的啊~
领取专属 10元无门槛券
私享最新 技术干货