【问题标题】:Python: Why should I use next() and not obj.next()?Python:为什么我应该使用 next() 而不是 obj.next()?
【发布时间】:2012-05-11 22:54:39
【问题描述】:

Python 2.6 引入了next 函数。

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

后者更pythonic

【问题讨论】:

  • 我一直想知道为什么受 Monty Python 启发的 Python 语言觉得有必要创造术语“pythonic”而不是更自然的“Pythonesque”.....

标签: python next built-in


【解决方案1】:

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

此 PEP 建议将 next 方法重命名为 __next__, 与 Python 中包含方法的所有其他协议一致 作为语言级协议的一部分隐式调用,并且 引入名为next 的内置函数来调用__next__ 方法, 与其他协议明确的方式一致 调用。

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

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

【讨论】:

  • 我最喜欢这个答案。特别是因为注释,Py3000 将不再有对象的 next 方法。
【解决方案2】:

next(iterator[, default])

通过在python 3) 方法中调用next()(__next__()迭代器 中检索下一项。如果给出 default,则在迭代器耗尽时返回,否则将引发 StopIteration

您将获得default 选项。

【讨论】:

  • +1,但不能简单地在方法中添加一个可选的default 参数:obj.next(default)?
  • @Tim:那么每个迭代器实现都必须复制逻辑。
  • 另外,在 Python 3 中,next() 方法不再存在。它被__next__() 取代。 next() 函数允许统一的行为。
【解决方案3】:

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

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

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

后者更符合 Python 的其他风格,恕我直言。

【讨论】:

  • 不是每次执行语句时生成器表达式都从头开始吗?似乎这只会返回第一个元素。
  • @Mark:是的,这就是这个习语的目的:从满足特定条件的迭代中返回第一个元素(否则引发StopIteration)。
  • 例如,就像 Ruby 中的 Enumerable#find
猜你喜欢
  • 2016-05-23
  • 2018-05-10
  • 2014-03-12
  • 2012-12-13
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多