采用迭代器而不是迭代的方法

时间:2016-10-29 21:20:08

标签: python list python-3.x iterator

关于迭代器和迭代器(仅我的观察,如果我错了请纠正我):

  • 大多数构造函数(数组类型)将迭代器作为质量构造函数
  • 显式制作迭代器;或者使用x in x for....
  • 许多方法(主要是itertools)返回迭代器(因为它们的作业要迭代?)
  • 采用迭代的方法采用迭代器。 在所有情况下都是如此吗?
  • 采用迭代器的方法不会采用迭代(反之亦然)
  • 显式使用迭代器的唯一方法似乎是next(..

问题:

  • 是否还有其他采用迭代器的方法?

  • 使用语法制作迭代器的其他方法是什么?例如:x in x for...

  • 为什么python创建者离开next(..成为唯一采用迭代器的方法?他们可以轻松地将它变成一个带有额外参数(条件)的迭代方法吗?

1 个答案:

答案 0 :(得分:1)

迭代器和迭代器周围的语言有点令人困惑。主要的混淆来自术语" iterable",它可能是也可能不是" iterator"的超集,取决于它的使用方式。

以下是我如何对事物进行分类:

iterable 是可以迭代的任何对象。也就是说,它有一个__iter__()方法返回一个迭代器,或者它可以用整数索引(当它们超出范围时引发IndexError异常),这允许Python构建一个迭代器它自动。这是一个非常广泛的类别。

迭代器是遵循迭代器协议的对象。它有一个__next__()方法(Python 2中拼写为next)产生下一个项目,如果没有更多可用值,则引发StopIteration异常。迭代器也必须有一个返回自身的__iter__()方法,因此所有迭代器也是可迭代的(因为它们符合&#34的定义;可迭代"上面给出)。

非迭代器可迭代迭代器的任何可迭代。这通常是人们在使用术语“可迭代”时的意思。与#34; iterator"形成鲜明对比。在许多情况下,一个更好的术语可能是" sequence",但这更具体(一些非序列对象是非迭代器的迭代,就像允许迭代其键的字典)。这类对象的重要特性是你可以多次迭代它们,并且迭代器可以相互独立地工作。

所以试着回答你的具体问题:

对于任何函数来说,很少有理由特别要求使用迭代器。通常可以通过在参数上调用iter()来获取迭代器,或者通过使用在后台创建迭代器的for循环来使函数与任何类型的可迭代参数一起工作。 。

反过来是不同的。如果函数需要非迭代器可迭代,则可能需要多次迭代该参数,因此迭代器将无法正常工作。 Python标准库(和内置函数)中的函数很少有这样的限制。如果他们需要在一个可迭代的参数上多次迭代,如果它不是一个序列,他们通常会在开始时将它转储成序列类型(例如列表)。

许多函数返回迭代器。例如,所有生成器对象都是迭代器(由生成器函数返回的那些和使用生成器表达式创建的那些)。文件对象也是迭代器(虽然它们稍微违反了迭代器协议,因为你可以在它们使用seek()方法耗尽之后重新启动它们)。并且itertools模块中的所有函数和类型都返回迭代器,但是像map()这样的内置函数也是如此(在Python 3中)。

next()函数确实不常见,因为特别需要迭代器。这是因为它被定义为迭代协议本身的一部分。它完全等同于在迭代器上调用__next__()方法,只是更好阅读。它还有一个双参数形式,它抑制了StopIteration异常,否则如果迭代器用完则会引发异常(它会返回default参数)。