关于迭代器和迭代器(仅我的观察,如果我错了请纠正我):
x in x for....
itertools
)返回迭代器(因为它们的作业要迭代?)next(..
问题:
是否还有其他采用迭代器的方法?
使用语法制作迭代器的其他方法是什么?例如:x in x for...
为什么python创建者离开next(..
成为唯一采用迭代器的方法?他们可以轻松地将它变成一个带有额外参数(条件)的迭代方法吗?
答案 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
参数)。