你知道Python的Itertools库被认为是Python的瑰宝吗?一些用户甚至认为它是最酷、最神奇的Python库之一。我们可以使用Itertools模块来丰富我们的应用程序并在更短的时间内创建可靠的工作解决方案。本文将帮助读者了解如何在他们的项目中使用Itertools模块。文章分为三个部分,每个部分都会讲解Itertools库的一个具体功能。具体为:无限迭代器终止迭代器组合迭代器一、概念介绍1、什么是迭代器?迭代器是由__next__方法组成的对象。它有一个状态。状态用于记住迭代期间的执行情况。因此,迭代器知道它的当前状态,这使得它的内存效率更高。这就是迭代器用于内存高效和快速应用程序的原因。我们可以打开无限数据流(如读取文件)并获取下一项(如文件中的下一行)。然后我们可以对项目执行一个操作并继续进行下一个项目。这可能意味着我们可以有一个返回无限数量元素的迭代器,因为我们只需要知道当前项。当没有要返回的下一项时,迭代器会引发StopIteration异常。2.什么是可迭代对象?可迭代对象是可以返回迭代器的对象。它有一个返回迭代器的__iter__方法。iterable也是一个我们可以循环并调用iter()的对象。它有一个__getitem__方法可以从0开始连续索引(如果索引不再有效则引发IndexError)。3.什么是Itertools?Itertools是一个Python模块,是Python3标准库的一部分。它允许我们在迭代器上高效地执行内存和计算任务。它的灵感来自APL、Haskell和SML的构造。本质上,该模块包含许多快速且内存高效的方法,可帮助我们在纯Python中简洁高效地构建应用程序。二、无限迭代器如果我们想构造一个返回无限均匀间隔值的迭代器怎么办?或者,如果我们必须从迭代器生成元素循环怎么办?或者,也许我们想重复迭代器的元素?itertools库提供了一组函数,我们可以使用它们来执行我们需要的所有功能。本节中列出的三个函数构造并返回可以是无限项流的迭代器。1.以计数为例,我们可以生成一个等距值的无限序列:start=10stop=1my_counter=it.count(start,stop)foriinmy_counter:#thisloopwillrunforeverprint(i)result:1011121314152循环我们可以用循环的方法来从输入开始在中生成元素的无限循环。该方法的输入需要是一个可迭代的对象,例如列表、字符串或字典等:my_cycle=it.cycle('Python')foriinmy_cycle:print(i)结果:PythonPythonP3。Repeat重复一个项目(比如字符串或集合),可以使用repeat()函数:to_repeat='FM'how_many_times=4my_repeater=it.repeat(to_repeat,how_many_times)foriinmy_repeater:print(i)#PrintsFMFMFMFM这将重复字符串“FM”4次。如果我们不提供第二个参数,那么它将无限地重复该字符串。3.终止迭代器在本节中,我将说明终止迭代器的强大属性。这些函数可以用在很多场景中,例如:我们可能有很多次迭代,我们想对所有迭代过的元素按一个序列逐个进行操作。或者当我们有很多函数要在可迭代对象的每个元素上执行时,或者有时我们只是从迭代器中移除元素,然后对其他元素执行操作。1.Chain这个方法允许我们创建一个迭代器,它返回一个序列中所有输入迭代中的元素,直到没有元素被留下。因此,它可以将连续的序列视为单个序列。chain=it.chain([1,2,3],['a','b','c'],['End'])foriinchain:print(i)结果:123abcEnd2。Drop虽然我们可以传递一个可迭代对象和一个条件,但此方法将开始评估每个元素的条件,直到条件为元素返回False。一旦某个元素的条件计算结果为False,该函数将返回iterable的剩余元素。例如,假设我们有一个工作列表,我们想要遍历元素并仅在不满足条件时才返回该元素。一旦条件评估为False,我们期望迭代器的剩余元素被返回。jobs=['job1','job2','job3','job10','job4','job5']dropwhile=it.dropwhile(lambdax:len(x)==4,jobs)foriindropwhile:print(i)result:job10job4job5该方法返回以上三项,因为元素job10的长度不等于4个字符,所以返回job10和其他元素。3.TakeWhile这个方法与dropwhile()方法相反。本质上,它返回可迭代对象的所有元素,直到第一个条件返回False,然后不返回任何其他元素。例如,假设我们有一个工作列表,并且希望在不满足条件时立即停止返回工作。jobs=['job1','job2','job3','job10','job4','job5']takewhile=it.takewhile(lambdax:len(x)==4,jobs)foriintakewhile:print(i)结果:job1job2job34。GroupBy该函数在对可迭代对象的连续元素进行分组后构造一个迭代器。该函数返回键值对的迭代器,其中键是组键,值是按键分组的连续元素的集合。考虑以下代码片段:iterable='FFFAARRHHHAADDMMAAALLIIKKK'my_groupby=it.groupby(iterable)forkey,groupinmy_groupby:print('Key:',key)print('Group:',list(group))注意组属性是iterable,所以我把它具体化为一个列表。所以这将打印:Key:FGroup:['F','F','F']Key:AGroup:['A','A']Key:RGroup:['R','R']Key:HGroup:['H','H','H']Key:AGroup:['A','A']Key:DGroup:['D','D']Key:MGroup:['M','M']Key:AGroup:['A','A','A']Key:LGroup:['L','L']Key:IGroup:['I','I']Key:KGroup:['K','K','K']5。Tee该方法可以拆分一个迭代并从输入中生成一个新的迭代。output也是一个迭代器,它返回给定数量的项目的可迭代值。为了更好地理解它,请参见以下代码片段:iterable='FM'tee=it.tee(iterable,5)foriintee:print(list(i))此方法返回整个可迭代FM,5次:['F','M']['F','M']['F','M']['F','M']['F','M']4.组合迭代器1。排列通过使用排列方法,我们可以创建一个迭代器,它返回输入可迭代元素的连续排列。我们可以传入一个参数来指定数组的长度。它默认为可迭代的长度。这意味着当缺少长度时,该方法将生成所有可能的全长排列。iterable='FM1'length=2permutations=it.permutations(iterable,length)foriinpermutations:print(i)结果:('F','M','1')('F','1','M')('M','F','1')('M','1','F')('1','F','M')('1','M','F')如果长度为2,则生成:('F','M')('F','1')('M','F')('M','1')('1','F')('1','M')('F','M')('F','1')('M','1')2.组合最后,我想解释如何生成可迭代的组合。给定一个可迭代对象,我们可以构造一个迭代器,它返回给定长度的元素的子序列。元素根据它们的位置被认为是唯一的,并且只返回不同的元素。iterable='FM1'combinations=it.combinations(iterable,2)foriincombinations:print(i)结果:('F','M')('F','1')('M','1')英文原文:https://medium.com/fintechexplained/advanced-python-itertools-library-the-gem-of-python-language-99da37dfcca2
