Python编程学习语言的精华:Itertools库
前言
你知道Python的Itertools库被认为是Python的瑰宝吗?一些用户甚至认为它是最酷和最令人惊叹的Python库之一。我们可以使用Itertools模块来丰富我们的应用程序,并在更短的时间内创建一个可靠的工作解决方案。
本文将帮助读者理解如何在项目中使用Itertools模块。
文章分为三个部分,每个部分将解释Itertools库的特定功能。具体来说:
无限的迭代器
终止迭代器
组合迭代器
概念简介
什么是迭代器?
迭代器是由__next__方法组成的对象。它有一个状态。状态用于记住迭代期间的执行。因此,迭代器知道它的当前状态,这使它的内存效率高。这就是为什么在内存高效和快速的应用程序中使用迭代器的原因。
我们可以打开无限的数据流(比如读取文件)并获取下一项(比如文件中的下一行)。然后我们可以对项目执行一个操作,并继续进行下一个项目。这可能意味着我们可以有一个返回无限个元素的迭代器,因为我们只需要知道当前项。
当没有下一个要返回的项时,迭代器会引发StopIteration异常。
什么是可迭代的?
iterable是可以返回迭代器的对象。它有一个__iter__方法返回一个迭代器。iterable也是一个我们可以循环并可以调用iter()的对象。它有一个__getitem__方法,它可以从0开始去连续索引(并在索引不再有效时引发一个IndexError)。
什么是Itertools?
Itertools是Python模块,是Python 3标准库的一部分。它允许我们在迭代器上执行高效的内存和计算任务。它的灵感来自APL、Haskell和SML的构造。
从本质上讲,该模块包含许多快速且内存效率高的方法,这些方法可以帮助我们用纯Python简洁而高效地构建应用程序。
无限迭代器
如果我们想构造一个返回无限均匀间隔值的迭代器呢?或者,如果我们必须从迭代器生成一个元素循环呢?或者,也许我们想要重复迭代器的元素?
itertools库提供了一组函数,我们可以使用这些函数来执行所需的所有功能。
本节中列出的三个函数构造并返回可以是无限项流的迭代器。
Count
作为实例,我们可以生成一个等距值的无限序列:
![](https://img.haomeiwen.com/i11512977/ffa742ca02acef0a.png)
结果:
![](https://img.haomeiwen.com/i11512977/eecd046b2c066dae.png)
Cycle
我们可以使用cycle方法从输入中生成无限循环的元素。
该方法的输入需要是可迭代的对象,比如列表、字符串或字典等
![](https://img.haomeiwen.com/i11512977/f0e8df3361c2bf4e.png)
结果:
![](https://img.haomeiwen.com/i11512977/95eea17f816c74ad.png)
Repeat
要重复一个项(例如字符串或集合),可以使用repeat()函数:
![](https://img.haomeiwen.com/i11512977/330c02e4fe780eb4.png)
这将重复字符串“FM”4次。如果我们不提供第二个参数,那么它将无限次重复这个字符串。
![](https://img.haomeiwen.com/i11512977/0287eaae48be1485.png)
Python作为一门不断发展与普及的语言,还在不断更新中。在学习时,建议找一些学习伙伴一起来学习和讨论,效果更佳。如果想学习Python,欢迎加入Python学习交流群(627012464),一起督促,一起学习。里面有开发工具,很多干货和技术资料分享!
终止迭代器
在本节中,我将说明终止迭代的强大特性。这些函数可以用于许多场景,例如:
1.我们可能有很多迭代,我们想在一个序列中一个一个地对所有迭代的元素执行一个操作。
2.或者当我们有很多函数想要对iterable的每个元素执行时
3.或者有时我们就从迭代器中删除元素,然后对其他元素执行操作。
Chain
这个方法允许我们创建一个迭代器,它返回序列中所有输入迭代中的元素,直到没有元素剩下为止。因此,它可以将连续序列视为单个序列。
![](https://img.haomeiwen.com/i11512977/42ed243289a24f8f.png)
结果:
![](https://img.haomeiwen.com/i11512977/f4db0a7de009a810.png)
Drop While
我们可以传递一个iterable和一个条件,这个方法将开始对每个元素计算条件,直到条件对一个元素返回False为止。一旦某个元素的条件值为False,该函数将返回可迭代的其余元素。
例如,假设我们有一个作业列表,并且我们希望遍历元素,并且只有在不满足条件时才返回元素。一旦条件的值为False,我们期望返回迭代器的其余元素。
![](https://img.haomeiwen.com/i11512977/464c095f6c394889.png)
结果:
![](https://img.haomeiwen.com/i11512977/71474c81b5926f89.png)
该方法返回了上面的三项,因为元素job10的长度不等于4个字符,因此返回了job10和其他元素。
Take While
这个方法与dropwhile()方法相反。本质上,它返回一个iterable的所有元素,直到第一个条件返回False,然后它不返回任何其他元素。
例如,假设我们有一个作业列表,并且希望在不满足条件时立即停止返回作业。
![](https://img.haomeiwen.com/i11512977/1c45c4ad079c22ab.png)
结果
![](https://img.haomeiwen.com/i11512977/56ce64c5661fe0d4.png)
GroupBy
这个函数在将可迭代的连续元素分组之后构造一个迭代器。该函数返回一个键、值对的迭代器,其中键是组键,值是按键分组的连续元素的集合。
考虑以下代码片段:
![](https://img.haomeiwen.com/i11512977/7bcfc149abb40da1.png)
注意,group属性是可迭代的,因此我将其具体化为一个列表。
因此,这将打印:
![](https://img.haomeiwen.com/i11512977/02183175973d3411.png)
Tee
该方法可以拆分一个迭代,并从输入中生成新的迭代。输出也是一个迭代器,它返回给定数量的项的可迭代值。为了更好地理解它,请看下面的代码片段:
![](https://img.haomeiwen.com/i11512977/d43475f5686646a4.png)
这个方法返回整个可迭代FM, 5次:
![](https://img.haomeiwen.com/i11512977/912cab5d999ca3fa.png)
![](https://img.haomeiwen.com/i11512977/6410ee92cb2d70b7.png)
组合迭代器
Permutations
通过使用permutation方法,我们可以创建一个迭代器来返回输入iterable中元素的连续排列。
我们可以传入一个参数来指定排列的长度。它默认为可迭代的长度。
这意味着当缺少长度时,该方法将生成所有可能的全长排列。
![](https://img.haomeiwen.com/i11512977/f76a342dcde7cbdd.png)
结果
![](https://img.haomeiwen.com/i11512977/12dd0566de169f12.png)
如果长度为2,则生成:
![](https://img.haomeiwen.com/i11512977/84dd2124c23c2469.png)
Combinations
最后,我想解释一下如何生成iterable的组合。
给定一个可迭代器,我们可以构造一个迭代器来返回给定长度的元素的子序列。
根据它们的位置,元素被视为唯一的,并且只返回不同的元素。
![](https://img.haomeiwen.com/i11512977/79c135dd97ea3b5c.png)
结果
![](https://img.haomeiwen.com/i11512977/72f43ffd874503b9.png)