2012-05-02 92 views
23

Python 2.6引入了next函数。Python:为什么我应该使用next()而不是obj.next()?

这是为什么这是必要的?人们总是可以输入obj.next()而不是next(obj)

后者更多pythonic

+5

我一直很想知道为什么Monty Python启发的Python语言感觉需要投入术语“pythonic”而不是更自然的“Pythonesque”..... –

+0

也问:http:// stackoverflow。 com/questions/656155/why-did-python-2-6-add-a-global-next-function –

回答

35

PEP 3114描述了这种改变。关于动机的摘录:

这PEP提出,next方法被重命名为__next__, 在Python中的所有其他协议,其中一个方法是 隐式调用的语言水平协议的一部分一致,并且引入 内置函数next来调用__next__方法, 与调用其他协议显式地调用 的方式一致。

请务必阅读本PEP以了解更多有趣的细节。

至于为什么要使用next内置:一个很好的理由是,next方法在Python 3消失,所以便携性,最好开始使用next内置尽快。

+0

+1:这就是我在评论中所说的。 – rubik

+1

我最喜欢这个答案。特别是由于该笔记,Py3000将不再有对象的下一个方法。 –

25

next(iterator[, default])

通过调用其next()(__next__()在python 3)方法检索来自迭代下一个项目。如果给出默认,则在迭代器耗尽时返回,否则返回StopIteration

您得到default选项。

+1

+1,但不能简单地为该方法添加一个可选的'default'参数:'obj 。接下来(默认)'? –

+9

@Tim:那么每个迭代器实现都必须复制逻辑。 –

+5

另外,在Python 3中,next()方法不再存在。它被'__next __()'取代。 'next()'函数允许统一的行为。 – rubik

11

除了显而易见的附加功能外,与发生器表达式一起使用时,它看起来也更好。比较

(x for x in lst if x > 2).next() 

next(x for x in lst if x > 2) 

后者是很多与Python的风格休息,恕我直言更一致。

+0

每次执行语句时,生成器表达式是不是从头开始?看起来像这样只会返回第一个元素。 –

+1

@Mark:是的,这就是这个习惯用法的目的:从满足特定标准的迭代中返回第一个元素(否则就提高'StopIteration')。 –

+0

例如,它就像Ruby中的Enumerable#find'。 –

相关问题