联合迭代器与生成器,这个内置函数真香!

设为“星标”,重磅干货,第一时间送达

花下猫语:Python 中很多内置函数的作用都非常大,比如说 enumerate() 和 zip(),它们使得我们在作迭代操作时极为顺手。这是一篇很多年前的 PEP,提议在 Python 2.3 版本中引入 enumerate(),该文档整合了其它几篇 PEP 的想法(包括当时新引入的迭代器与生成器),提出了更好的实现方案以及函数名。经过这么多年的发展,enumerate() 不可避免地有了一些变化,但不变的是,它跟 19 年前一样,还是很有必要、很好用,用着真香!PEP原文:https://www.python.org/dev/peps/pep-0279PEP标题:The enumerate() built-in functionPEP作者:Raymond Hettinger创建日期:2002-06-30合入版本:2.3译者:豌豆花下猫@Python猫PEP翻译计划:https://github.com/chinesehuazhou/peps-cn摘要本 PEP 引进了一个新的内置函数 enumerate() 来简化常用的循环写法。它为所有的可迭代对象赋能,作用就像字典的 iteritems() 那样——一种紧凑、可读、可靠的索引表示法。基本原理Python 2.2 在 PEP 234[3] 中提出了可迭代对象接口的概念。iter() 工厂函数作为一种通用的调用约定而被提出,深入修改了迭代器的使用方式,作为整个 Python 的统一规范。这种统一的规范就是为映射类型、序列类型和文件对象建立一个通用的可迭代对象接口。PEP 255[1] 中提出的生成器是作为一种更容易创建迭代器的方法引入的,特别是具有复杂的内部执行过程或变量状态的迭代器。有了生成器以后,PEP 212[2] 中关于循环的计数器的想法就有可能改进了。那些想法是提供一种干净的迭代语法,带有索引和值,但不适用于所有的可迭代对象。而且,那种方法没有生成器提供的内存友好的优点(生成器不会一次性计算整个序列)。(Python猫注:关于生成器的 PEP 也有翻译,请点击查看PEP-255PEP-342PEP-380)新的提议是添加一个内置函数 enumerate(),在有了迭代器和生成器以后,它就可以实现。它为所有的可迭代对象赋能,作用就像字典的 iteritems() 那样——一种紧凑、可读、可靠的索引表示法。像 zip() 一样,它有望成为一种常用的循环习语(idiom)。(Python猫注:zip() 函数非常强,推荐阅读《一篇文章掌握 Python 内置 zip() 的全部内容》)这一提议的目的是利用现有的实现,再加一点点的努力来整合。它是向后兼容的,不需要新的关键字。本提案将合入 Python 2.3,不需要从 __future__ 中导入。新内置函数的规范def enumerate(collection):'Generates an indexed series:  (0,coll[0]), (1,coll[1]) ...'i = 0it = iter(collection)while 1:yield (i, it.next())i += 1注A:PEP 212 循环计数器迭代[2]讨论了几个实现索引的提议。有些提议只适用于列表,不像上面的函数适用于任意生成器、xrange、序列或可迭代对象。另外,那些提议是在 Python 2.2 之前提出并评估的,但是 Python 2.2 没有包含生成器。因此,PEP 212 中的非生成器版本有一个缺点,即会用一个巨大的元组列表,导致消耗太多内存。这里提供的生成器版本快速且轻便,适用于所有可迭代对象,并允许用户在不浪费计算量的情况下中途放弃。还有一些涉及相关问题的 PEP:整型迭代器、整型 for 循环,以及一个修改 range 和 xrange 的参数的 PEP。enumerate() 提案并不排斥其它提案,即使那些提案被采纳,它仍然满足一个重要的需求——对任意可迭代对象中的元素进行计数的需求。其它的提案给出了一种产生索引的方法,但没有相应的值。如果给定的序列不支持随机访问,比如文件对象、生成器或用__getitem__定义的序列,这就特别成问题。注B:几乎所有的 PEP 审阅人都欢迎这个函数,但对于“是否应该把它作为内置函数”存在分歧。一方提议使用独立的模块,主要理由是减缓语言膨胀的速度。另一方提议使用内置函数,主要理由是该函数符合 Python 核心编程风格,适用于任何具有可迭代接口的对象。正如 zip() 解决了在多个序列上循环的问题,enumerate() 函数解决了循环计数器的问题。如果只允许加一个内置函数,那么 enumerate() 就是最重要的通用工具,可以解决最广泛的问题,同时提高程序的简洁性、清晰度和可靠性。注C:讨论了多种备选名称:函数名分析iterindexed()五个音节太拗口了index()很好的动词,但是可能会跟 .index () 方法混淆indexed()很受欢迎,但是应该避免形容词indexer()在 for 循环中,名词读起来不太好count()直接而明确,但常用于其它语境itercount()直接、明确,但被不止一个人讨厌iteritems()与字典的 key:value 概念冲突itemize()让人困惑,因为 amap.items() != list(itemize(amap))enum()简练;不及enumerate 清楚;与其它语言中的枚举太相似,但有着不同的含义所有涉及“count”的名称还有一个缺点,即隐含着计数是从 1 开始而不是从 0 开始的意思。所有涉及“index”的名称与数据库语言的用法冲突,数据库的索引表示一种排序操作,但不是线性排序。注D:在最初的提案中,这个函数带有可选的 start 和 stop 参数。GvR 指出,函数enumerate(seqn,4,6) 还有一种看似合理的解释,即返回序列的第 4 和第 5 个元素的切片。为了避免歧义,这两个可选参数被摘掉了,尽管这意味着循环计数器失去了部分的灵活性。在从 1 开始计数的常见用例中,这种可选参数的写法很有用,比如:for linenum, line in enumerate(source,1):  print linenum, line(Python猫注:这篇文档说 enumerate 没有起止参数,然而,在后续版本中(例如我用的 3.9),它支持使用一个可选的 start 参数!我暂未查到这个变更是在何时加入的,如有知情者,烦请告知我,以便修正!)GvR 评论道:filter 和 map 应该 die,被纳入列表推导式,不增加更多的变体。我宁可引进做迭代器运算的内置函数(例如 iterzip,我经常举的例子)。我认可用某种方法并行地遍历序列及其索引的想法。把它作为一个内置函数,没有问题。我不喜欢“indexed”这个名字;形容词不是好的函数名。可以用 iterindexed() ?Ka-Ping Yee 评论道:我对你的提议也很满意……新增的内置函数(倾向于用“indexed”)是我期盼了很久的东西。Neil Schemenauer 评论道:新的内置函数听起来不错。Guido 可能会担心增加太多内置对象。你最好把它们作为某个模块的一部分。如果你用模块的话,那么你可以添加很多有用的函数(Haskell 有很多,我们可以去“偷”)。Magnus Lie Hetland 评论道:我认为 indexed 会是一个有用和自然的内置函数。我肯定会经常使用它。我非常喜欢 indexed();+1。很高兴它淘汰了 PEP-281。为迭代器添加一个单独的模块似乎是个好主意。来自社区的反馈:对于 enumerate() 提案,几乎 100% 赞成。几乎所有人都喜欢这个想法。作者的注释:在这些评论之前,共有四种内置函数被提出来。经过评论之后,xmap、xfilter 和 xzip 被撤销了。剩下的一个对 Python 来说是至关重要的。Indexed() 非常容易实现,并且立马就可以写进文档。更重要的是,它在日常编程中很有用,如果不用它,就需要显式地使用生成器。这个提案最初包含了另一个函数 iterzip()。但之后在 itertools 模块中实现成了一个 izip() 函数。参考材料1、PEP 255 Simple Generators http://www.python.org/dev/peps/pep-02552、(1, 2) PEP 212 Loop Counter Iteration http://www.python.org/dev/peps/pep-02123、PEP 234 Iterators http://www.python.org/dev/peps/pep-0234版权本文档已经进入公共领域。源文档:https://github.com/python/peps/blob/master/pep-0279.txt重磅!程序员遇见GitHub交流群已成立!额外赠送福利资源!邱锡鹏深度学习与神经网络,pytorch官方中文教程,利用Python进行数据分析,机器学习学习笔记,pandas官方文档中文版,effective java(中文版)等20项福利资源

获取方式:进入群后点开群公告即可领取下载链接

(0)

相关推荐

  • Python学习之迭代器和生成器有什么不同?

    迭代器和生成器区别是什么?相信很多人在初学Python的时候对它们都很好奇,接下来我们一起来看看它们的区别吧. 迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己的本身 ...

  • python 生成器 & 迭代器

    在聊生成器之前,我们先看看什么是生成式? a = [i*2 for i in range(10) ]    类似于这样的就是生成式 而把列表 " [ ] " 符号换成 " ...

  • Python生成器和迭代器有什么用?

    当我们学习Python的时候,会遇到很多专业的术语及工具,而对于这些很多人并不是很了解,比如说生成器和迭代器,Python的生成器和迭代器有什么区别?这是很多人都比较疑惑的问题,我们来看看吧. 迭代器 ...

  • Python常用的8个高级函数

    lambda 它们在其他语言中也被称为匿名函数.如果你不想在程序中对一个函数使用两次,你也许会想用lambda表达式,它们和普通的函数完全一样. lambda argument: manipulate ...

  • Python 内置函数最全汇总,现看现用

    今天,好好看看这些Python内置函数,也许你明天就能用到Python 内置函数最全汇总:1 abs()绝对值或复数的模In [1]: abs(-6)Out[1]: 62 all() 接受一个迭代器, ...

  • Python学习教程:Python 内置函数最全汇总(上篇)

    Python学习教程:Python 内置函数最全汇总(一) 1 abs() 绝对值或复数的模 In [1]: abs(-6)Out[1]: 6 2 all() 接受一个迭代器,如果迭代器的所有元素都为 ...

  • Python学习教程:Python内置函数大总结(下篇)

    这里接着上次的Python学习教程,给大家总结了Python 剩下的33个内置函数. 31 hash() 返回对象的哈希值 In [112]: hash(xiaoming)Out[112]: 6139 ...

  • python中的内置函数

    前言 本人只在csdn写博客 内置函数 介绍 一. 数学运算 abs()求绝对值函数 round() 近似取值 pow()求指数 divmod()求商和余数 max()求最大值和min()求最小值 s ...

  • Python内置函数包含哪些?五大类!

    所谓的内置函数,就是Python给你提供的,直接可以拿来使用的函数,比如说print.input等.那么Python内置函数有哪些?小编为你整理了几个比较重要的函数,一起来看看吧. 在学习Python ...

  • 面试题-python3 内置函数map reduce filter 如何使用?

    前言 面试时候经常会考到 map reduce filter 这三个内置函数的使用 map() 函数 map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个 ...

  • 285个通达信内置函数

    (2020-03-29 17:51:34) 原文地址:285个通达信内置函数作者:股市沙盘 函数名称说明函数分类 !=  不等于操作函数    #  变周期符号操作函数    $  引用特定数据操作函 ...

  • 福利来了!68个Python内置函数最全总结,建议收藏!

    小编是个资深Python爱好者,今天帮大家从10个方面总结了Python3.9版本下的68个内置函数,让大家一网打尽Python内置函数,一起来看看吧. 01.运算函数 abs(x) abs函数用来返 ...

  • 12个python数据处理常用内置函数

    简说Python 以下文章来源于python数据分析之禅 ,作者小dull鸟  简说Python推荐  来源|python数据分析之禅 作者|小dull鸟 在python数据分析中,经常需要对字符串进 ...