在Python中的for循环的else部分引发异常

时间:2015-08-17 07:11:33

标签: python

以下两个代码都给出了相同的结果。但我不确定应该在哪里加上 raise 语句。

def bisection(f, start, stop, eps = 1e-5, max_iteration = 100):
  for __ in range(max_iteration):
    half = start + (stop - start)/2
    if abs(f(half)) < eps or half - start < eps:
      return half 
    if f(half) * f(start) > 0:
      start = half
    else:
      stop = half
  else:
    raise ValueError('Cannot find root in the given range')

或者

def bisection(f, start, stop, eps = 1e-5, max_iteration = 100):
  for __ in range(max_iteration):
    half = start + (stop - start)/2
    if abs(f(half)) < eps or half - start < eps:
      return half 
    if f(half) * f(start) > 0:
      start = half
    else:
      stop = half

  raise ValueError('Cannot find root in the given range')

2 个答案:

答案 0 :(得分:5)

两种方法都相同,因为您的break循环中没有for语句。

for..else构造中,如果在不调用break语句的情况下退出循环,则执行else部分,如果使用break语句退出循环,则不执行else部分,因为你的循环中没有任何break语句,两种方法都类似于else总是会被执行。

考虑到这一点,我认为如果你总是想提出一个ValueError,如果循环没有return任何东西,那么第二种方法看起来更好,因为它更具可读性,并传达了你想要做的事情。需要花费更多精力才能理解如果循环退出,则会引发ValueError,如果使用第一部分(并且使用else则没有意义)

答案 1 :(得分:5)

else循环的for子句只会在循环正常终止后运行(完成,而不是以break终止声明)。由于循环中没有break - 唯一的退出是通过return语句 - 如果超出raise,这两个示例都将执行max_iterations语句。

在您给出的示例中,将raise语句放在else子句中没有什么意义,尽管它不会造成任何伤害。