Python程序员必须掌握的8个迭代技巧

for循环是解决重复任务的常用方法,其基本形式是:

在这里插入图片描述

从理论上讲,我们可以利用基本形式来满足所有与迭代相关的需求,但是在许多情况下,如果我们利用Python的内置函数和三方库,可以创建更灵活的迭代方式。在本文中我总结了8种高效的迭代技巧。

1. 使用enumerate实现跟踪迭代

假设我们需要跟踪迭代的计数。换句话说,我们想知道我们迭代了多少个循环。在这种情况下,我们应该考虑enumerate函数。

在这里插入图片描述

  • 要获取序列项的索引,基本方法包括创建一个范围对象,因为典型方法(即for item in iterable)没有与索引相关的信息。尽管我们可以使用index()带有列表的方法找到索引,但是默认情况下,它返回找到的第一个元素的索引。因此,当有重复的项目时,它将给出意想不到的信息。
  • enumerate()函数创建一个枚举对象作为迭代器。它可以采用可选参数start,该参数指定计数器的开始。默认情况下,它从0开始计数。在本例中,我们从1开始对第一个渲染元素进行计数。您可以看到,该enumerate()函数直接为我们提供了计数器和元素。

2. 用zip配对可迭代对象

当我们有几个可迭代对象开始并且需要在相同位置从每个可迭代对象中检索项目时,我们应该考虑该zip()函数,如本示例所示。

在这里插入图片描述

  • 为了使元素具有相同的索引,我们可以使用range()函数创建索引,如上一节所述。使用索引从每个可迭代对象中检索元素有点繁琐。
  • zip()函数可以连接多个可迭代对象,并在每个循环中生成一个元组对象,其中包含来自每个可迭代对象的相同索引。我们可以拆开元组对象以非常方便地检索元素。该代码看起来更简洁,不是吗?
  • 要注意的另一件事是,该zip()函数将压缩与其中最短的可迭代对象匹配的可迭代对象。如果您希望最长匹配的zip匹配,则应该使用itertools库中的zip_longest()function。

3. 使用reversed实现反向迭代

当需要以相反的顺序迭代序列时,最好使用该reversed()函数。假设学生到达教室的时间略有不同,您想使用相反的顺序检查作业-第一个到达的学生最后检查一次。

在这里插入图片描述

  • 如果坚持使用该range()功能,则将使用序列的反向索引。换句话说,我们使用-1来引用列表的最后一项,依此类推。
  • 或者,我们可以使用反向列表[::-1],然后迭代新创建的列表对象。
  • 最好的方法就是简单地使用reversed()函数。这是一个非常灵活的功能,因为它可以获取其他序列数据,例如元组和字符串。

4. 先使用filter筛选

您不必总是使用迭代器中的所有项目。在这些情况下,我们通常可以在应用所需的操作之前检查项目是否满足特定条件。这样的条件评估和所需迭代器的创建可以轻松地集成到一个函数调用中 filter()。让我们比较一下它与典型方式的工作方式。

在这里插入图片描述

  • 典型的方法涉及评估每个元素。
  • filter()函数将评估元素并将元素同时呈现为迭代器。换句话说,该函数返回一个迭代器,以便可以在for循环中使用它。
  • 根据您的需要,您可以考虑其他过滤器功能,例如filterfalse()在itertools库中,它执行相反的操作(即保留那些求值的函数False)。

5. 用chain连接可迭代对象

在上一节中,我们讨论了如何使用zip()函数配对多个可迭代对象,为此,您可以想到我们在垂直方向上将可迭代对象串联在一起。如果要从头到尾串联可迭代对象,则应使用itertools库中的chain()函数。具体来说,假设您有多个可迭代对象,那么您要顺序地对其进行迭代,这是该chain()函数的最佳用例。

在这里插入图片描述

  • 典型的方法包括手动串联可迭代对象,例如使用中间列表。如果您使用其他可迭代变量,例如字典和集合,则需要知道如何将它们串联在一起。
  • chain()函数可以链接任意数量的可迭代对象,并使另一个迭代器从每个可迭代对象中依次生成元素。您无需管理包含这些元素的另一个临时对象。

6. 迭代字典

字典是一种非常常见的数据类型,以键值对的形式存储数据。由于使用散列实现,因此从字典中查找和检索项目非常快,因此它们是许多开发人员最喜欢的数据结构。键值对的存储为我们提供了迭代字典的不同选择。

在这里插入图片描述

  • 要迭代键,我们先调用字典对象的keys()方法。或者,我们可以将字典对象本身用作可迭代对象,这只是该keys()方法创建的视图对象的语法糖。
  • 要迭代值,我们先调用字典对象values()方法。
  • 要迭代键值对,我们先调用items()方法。值得注意的是,这些方法创建的对象是字典视图对象,这与SQL视图非常相似。换句话说,当更新dict对象时,这些视图对象将得到更新,下面显示了一个简单的示例。

在这里插入图片描述

7. 列表推导(list comprehensions)

如果迭代的目的是从可迭代对象创建新的列表,字典或集合对象,则应该使用列表推导(list comprehensions),这种方法的效率更高,代码可读性更强。

在这里插入图片描述

  • 列表推导:[expr for item in iterable]
  • 字典推导:{key_expr: value_expr for item in iterable}
  • 集合推导:{expr for item in iterable}

8. for循环中使用else

最后但并非最不重要的一点是要考虑在for循环中使用else子句。应当指出,这并不是最直观的技术,因为许多人甚至不知道for循环中是否存在else子句。下面的情况向您展示了一个简单的示例。

在这里插入图片描述

else子句中的代码将在for循环之后运行。但是,如果执行遇到任何break语句,则else子句中的代码将被跳过。如第一个函数调用所示,else子句未执行。

结论

在本文中,我们总结了8种非常实用的迭代技巧,应用这些技术可使您的代码更简洁,更高效。

文章来源于Medium,作者Yong Cui, Ph.D,原文标题:8 Python Iteration Skills That Data Scientists Shouldn’t Miss Out,翻译校对:蜂鸟数据

如果喜欢我们的文章,记得点赞和收藏哦,我们每天都会为大家带来Python,数据科学和量化交易的精品内容。

【关于我们】

蜂鸟数据:国内领先的金融数据API提供商。

蜂鸟数据团队由业界顶尖的数据工程师,数据科学家和宽客组成,我们正努力构建一个强大的金融数据库,并提供API接口,目标是令金融数据开源化和平民化。

浏览并测试我们接口吧,目前覆盖股票,外汇,商品期货,数字货币和宏观经济领域,包括实时报价(tick)和历史数据(分钟),提供REST API和Websocket两种接入方式,能够满足金融分析师,量化交易和理财app的需求。

需要金融数据?利用蜂鸟API将数据整合到您的应用

如果您准备好了,请登录蜂鸟官网,注册免费获取API密钥,然后开始探索我们的金融数据库吧。