【问题标题】:Why does Python use exceptions to manage iterators, and why don't other languages? [closed]为什么 Python 使用异常来管理迭代器,而其他语言为什么不使用? [关闭]
【发布时间】:2015-11-07 15:42:26
【问题描述】:

在 Java 中,迭代器有一个 hasNext() 方法(如果我没记错的话——我已经很久没有用 Java 编程了,所以细节可能不详)。在单步执行迭代器时,查询hasNext() 以查看是否应该停止。

在 Python 中,没有 hasNext(),当迭代器想要指示您应该停止时,它们会引发 StopIteration 异常。为什么会有差异?

我可以想象,不需要hasNext() 可以减少实现迭代器的工作;那么,为什么Java和其他语言都使用它呢?这是哲学上的差异,还是出于某种原因,Python 中的例外情况更容易/更快?

【问题讨论】:

  • @ajcr:谢谢!以后我会先找程序员来解决这类问题。我觉得这个问题不是它当前标记为重复的内容的重复,但它是您链接中问题的重复(我现在很受启发)。我们可以为后代改变它吗?
  • 我投票结束这个问题,因为它是关于语言设计的,它更适合程序员(和already answered)。

标签: python iterator language-design python-internals


【解决方案1】:

StopIteration 更常用于生成器(关键字yield)而不是迭代器。生成器使用异常向调用者指示序列已用尽。

另外,利用异常是python语言的一个常用习语。一个很好的例子是浮点数字符串的检测。在python中通常是这样写的:

def is_float(in_num):
    try:
        float(in_num)
        return true
    except ValueError:
        return false

【讨论】:

  • 我的印象是每个迭代器在元素用完时都会引发StopIteration。例如,如果你执行it = iter('abc'); next(it); next(it); next(it); next(it),你会得到一个StopIteration。关于请求宽恕的好点,我没有考虑过。
猜你喜欢
  • 1970-01-01
  • 2018-04-29
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多