前言最近东西不多。想写一些技术文章分享给大家。同时,我会把自己一段时间内收到的知识碎片化地整理一下。所谓文清才能说清楚,说清楚才能想清楚,就是这个道理。很多人致力于将Python代码写得更Pythonic,这样更合规易读,其次,一般Pythonic代码执行效率更高。今天给大家介绍一下Python的系统库itertools。itertools库迭代器(生成器)是Python中非常常见和有用的数据结构。迭代器与列表(list)相比,最大的优势在于延迟计算,按需使用,从而提升开发体验和运行效率,以至于在Python3中,map、filter等操作不再返回列表,而是迭代器。话虽如此,你平时使用的迭代器可能只是范围,通过iter函数将列表对象转换为迭代器对象有点多余。这时候我们的主角itertools就该出场了。itertoolsitertools中的大多数函数返回各种迭代器对象。我们通常要写很多代码来实现很多功能的功能,但是运行效率较低。毕竟,它们是系统库。itertools.accumulate只是累加。>>>importitertools>>>x=itertools.accumulate(range(10))>>>print(list(x))[0,1,3,6,10,15,21,28,36,45]itertools.chain连接多个列表或迭代器。>>>x=itertools.chain(范围(3),范围(4),[3,2,1])>>>打印(列表(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按道理丢弃function列表和迭代器前面的元素>>>x=itertools.dropwhile(lambdae:e<5,range(10))>>>print(list(x))[5,6,7,8,9]itertools.filterfalse保留真值为False的元素>>>x=itertools.filterfalse(lambdae:e<5,(1,5,3,6,9,4))>>>print(list(x))[5,6,9]itertools.groupby根据分组函数值分组元素>>>x=itertools.groupby(range(10),lambdax:x<5orx>8)>>>forcondition,numbersinx:...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。排列(范围(4),3)>>>打印(列表(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产生多个列表和迭代器(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.starmaplikemap>>>x=itertools.starmap(str.islower,'aBCDefGhI')>>>print(list(x))[True,False,False,False,True,True,False,True,False]itertools.takewhile与dropwhile相反,保留元素直到真值函数值为false>>>x=itertools.takewhile(lambdae:e<5,range(10))>>>print(list(x))[0,1,2,3,4]itertools.tee这个函数我不是很理解,好像是生成指定数量的迭代器>>>x=itertools.tee(range(10),2)>>>forlettersinx:...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),范围(5))>>>y=zip(范围(3),范围(5))>>>打印(列表(x))[(0,0),(1,1),(2,2),(无,3),(无,4)]>>>打印(list(y))[(0,0),(1,1),(2,2)]结论大概总结到这里,但是说实话Python的各种语言特性和库还是要用到的越来越精通,最终达到好用的程度。
