Python语言的精华:Itertools库

开发 后端
我们可以使用Itertools模块来丰富我们的应用程序,并在更短的时间内创建一个可靠的工作解决方案。本文将帮助读者理解如何在项目中使用Itertools模块。

你知道Python的Itertools库被认为是Python的瑰宝吗?一些用户甚至认为它是最酷和最令人惊叹的Python库之一。我们可以使用Itertools模块来丰富我们的应用程序,并在更短的时间内创建一个可靠的工作解决方案。

本文将帮助读者理解如何在项目中使用Itertools模块。

文章分为三个部分,每个部分将解释Itertools库的特定功能。具体来说:

  • 无限的迭代器
  • 终止迭代器
  • 组合迭代器
[[342648]]

一、概念简介

1. ​什么是迭代器?

迭代器是由__next__方法组成的对象。它有一个状态。状态用于记住迭代期间的执行。因此,迭代器知道它的当前状态,这使它的内存效率高。这就是为什么在内存高效和快速的应用程序中使用迭代器的原因。

我们可以打开无限的数据流(比如读取文件)并获取下一项(比如文件中的下一行)。然后我们可以对项目执行一个操作,并继续进行下一个项目。这可能意味着我们可以有一个返回无限个元素的迭代器,因为我们只需要知道当前项。

当没有下一个要返回的项时,迭代器会引发StopIteration异常。

2. 什么是可迭代的?

iterable是可以返回迭代器的对象。它有一个__iter__方法返回一个迭代器。iterable也是一个我们可以循环并可以调用iter()的对象。它有一个__getitem__方法,它可以从0开始去连续索引(并在索引不再有效时引发一个IndexError)。

3. 什么是Itertools?

Itertools是Python模块,是Python 3标准库的一部分。它允许我们在迭代器上执行高效的内存和计算任务。它的灵感来自APL、Haskell和SML的构造。

从本质上讲,该模块包含许多快速且内存效率高的方法,这些方法可以帮助我们用纯Python简洁而高效地构建应用程序。

二、无限迭代器

如果我们想构造一个返回无限均匀间隔值的迭代器呢?或者,如果我们必须从迭代器生成一个元素循环呢?或者,也许我们想要重复迭代器的元素?

itertools库提供了一组函数,我们可以使用这些函数来执行所需的所有功能。

本节中列出的三个函数构造并返回可以是无限项流的迭代器。

1. Count

作为实例,我们可以生成一个等距值的无限序列:

  1. start = 10 
  2. stop = 1 
  3. my_counter = it.count(start, stop) 
  4. for i in my_counter: 
  5.     # this loop will run for ever 
  6.     print(i) 

结果:

  1. 10 
  2. 11 
  3. 12 
  4. 13 
  5. 14 
  6. 15 

2. Cycle

我们可以使用cycle方法从输入中生成无限循环的元素。

该方法的输入需要是可迭代的对象,比如列表、字符串或字典等:

  1. my_cycle = it.cycle('Python') 
  2. for i in my_cycle:    print(i) 

结果:

  1. ythonPythonP 

3. Repeat

要重复一个项(例如字符串或集合),可以使用repeat()函数:

  1. to_repeat = 'FM' 
  2. how_many_times = 4 
  3. my_repeater = it.repeat(to_repeat, how_many_times)for i in my_repeater:    print(i)#Prints 
  4. FM 
  5. FM 
  6. FM 
  7. FM 

这将重复字符串“FM”4次。如果我们不提供第二个参数,那么它将无限次重复这个字符串。

[[342649]]

三、终止迭代器

在本节中,我将说明终止迭代的强大特性。这些函数可以用于许多场景,例如:

  • 我们可能有很多迭代,我们想在一个序列中一个一个地对所有迭代的元素执行一个操作。
  • 或者当我们有很多函数想要对iterable的每个元素执行时
  • 或者有时我们就从迭代器中删除元素,然后对其他元素执行操作。

1. Chain

这个方法允许我们创建一个迭代器,它返回序列中所有输入迭代中的元素,直到没有元素剩下为止。因此,它可以将连续序列视为单个序列。

  1. chain = it.chain([1,2,3], ['a','b','c'], ['End']) 
  2. for i in chain:    print(i) 

结果:

  1. 23abcEnd 

2. Drop While

我们可以传递一个iterable和一个条件,这个方法将开始对每个元素计算条件,直到条件对一个元素返回False为止。一旦某个元素的条件值为False,该函数将返回可迭代的其余元素。

例如,假设我们有一个作业列表,并且我们希望遍历元素,并且只有在不满足条件时才返回元素。一旦条件的值为False,我们期望返回迭代器的其余元素。

  1. jobs = ['job1', 'job2', 'job3', 'job10', 'job4', 'job5'] 
  2. dropwhile = it.dropwhile(lambda x : len(x)==4, jobs) 
  3. for i in dropwhile: 
  4.     print(i) 

结果:

  1. job10 
  2. job4job5 

该方法返回了上面的三项,因为元素job10的长度不等于4个字符,因此返回了job10和其他元素。

3. Take While

这个方法与dropwhile()方法相反。本质上,它返回一个iterable的所有元素,直到第一个条件返回False,然后它不返回任何其他元素。

例如,假设我们有一个作业列表,并且希望在不满足条件时立即停止返回作业。

  1. jobs = ['job1', 'job2', 'job3', 'job10', 'job4', 'job5'] 
  2. takewhile = it.takewhile(lambda x : len(x)==4, jobs) 
  3. for i in takewhile: 
  4.     print(i) 

结果:

  1. job1 
  2. job2job3 

4. GroupBy

这个函数在将可迭代的连续元素分组之后构造一个迭代器。该函数返回一个键、值对的迭代器,其中键是组键,值是按键分组的连续元素的集合。

考虑以下代码片段:

  1. iterable = 'FFFAARRHHHAADDMMAAALLIIKKK' 
  2. my_groupby = it.groupby(iterable)for key, group in my_groupby: 
  3.     print('Key:', key) 
  4.     print('Group:', list(group)) 

注意,group属性是可迭代的,因此我将其具体化为一个列表。

因此,这将打印:

  1. Key: F 
  2. Group: [‘F’, ‘F’, ‘F’] 
  3. Key: A 
  4. Group: [‘A’, ‘A’] 
  5. Key: R 
  6. Group: [‘R’, ‘R’] 
  7. Key: H 
  8. Group: [‘H’, ‘H’, ‘H’] 
  9. Key: A 
  10. Group: [‘A’, ‘A’] 
  11. Key: D 
  12. Group: [‘D’, ‘D’] 
  13. Key: M 
  14. Group: [‘M’, ‘M’] 
  15. Key: A 
  16. Group: [‘A’, ‘A’, ‘A’] 
  17. Key: L 
  18. Group: [‘L’, ‘L’] 
  19. Key: I 
  20. Group: [‘I’, ‘I’] 
  21. Key: K 
  22. Group: [‘K’, ‘K’, ‘K’] 

5. Tee

该方法可以拆分一个迭代,并从输入中生成新的迭代。输出也是一个迭代器,它返回给定数量的项的可迭代值。为了更好地理解它,请看下面的代码片段:

  1. iterable = 'FM' 
  2. tee = it.tee(iterable, 5) 
  3. for i in tee:    print(list(i)) 

这个方法返回整个可迭代FM, 5次:

  1. [‘F’, ‘M’] 
  2. [‘F’, ‘M’][‘F’, ‘M’][‘F’, ‘M’][‘F’, ‘M’] 

四、组合迭代器

1. Permutations

通过使用permutation方法,我们可以创建一个迭代器来返回输入iterable中元素的连续排列。

我们可以传入一个参数来指定排列的长度。它默认为可迭代的长度。

这意味着当缺少长度时,该方法将生成所有可能的全长排列。

  1. iterable = 'FM1' 
  2. length = 2 
  3. permutations = it.permutations(iterable, length) 
  4. for i in permutations: 
  5.     print(i) 

结果:

  1. (‘F’, ‘M’, ‘1’) 
  2. (‘F’, ‘1’, ‘M’)(‘M’, ‘F’, ‘1’)(‘M’, ‘1’, ‘F’)(‘1’, ‘F’, ‘M’)(‘1’, ‘M’, ‘F’) 

如果长度为2,则生成:

  1. (‘F’, ‘M’) 
  2. (‘F’, ‘1’)(‘M’, ‘F’)(‘M’, ‘1’)(‘1’, ‘F’)(‘1’, ‘M’)(‘F’, ‘M’)(‘F’, ‘1’)(‘M’, ‘1’) 

2. Combinations

最后,我想解释一下如何生成iterable的组合。

给定一个可迭代器,我们可以构造一个迭代器来返回给定长度的元素的子序列。

根据它们的位置,元素被视为唯一的,并且只返回不同的元素。

  1. iterable = 'FM1' 
  2. combinations = it.combinations(iterable, 2) 
  3. for i in combinations:    print(i) 

结果:

  1. (‘F’, ‘M’) 
  2. (‘F’, ‘1’)(‘M’, ‘1’) 

英文原文:

https://medium.com/fintechexplained/advanced-python-itertools-library-the-gem-of-python-language-99da37dfcca2

 

责任编辑:赵宁宁 来源: Python学会
相关推荐

2021-09-28 14:40:03

Python内置库itertools

2020-11-06 13:42:59

itertools

2023-11-28 11:22:51

Pythonitertools库工具

2023-05-24 10:24:56

代码Python

2017-06-27 09:43:43

Python机器学习

2024-03-25 08:57:49

模块迭代对象迭代器

2010-12-14 09:42:19

2010-03-12 13:10:02

Python编程语言

2023-11-16 18:17:13

Python编程内置模块

2017-03-02 08:28:09

科技新闻早报

2018-06-06 09:10:34

编程语言Python库

2020-10-27 07:56:35

Python

2023-09-27 12:11:08

Python水印Pillow

2021-11-11 15:12:21

C语言线程代码

2010-03-01 17:47:53

Python语言

2020-10-27 07:37:07

Python

2009-11-24 14:55:00

OSPF

2014-06-10 14:19:52

iOSUIApplicati总结

2019-05-09 09:35:17

Spring Boot技术开发

2009-07-09 17:47:40

使用JDBC
点赞
收藏

51CTO技术栈公众号