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

wan*_*nik 5 python

以下两个代码都给出了相同的结果.但我不知道我应该在哪里提出加注声明.

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')
Run Code Online (Sandbox Code Playgroud)

要么

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')
Run Code Online (Sandbox Code Playgroud)

Ana*_*mar 5

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

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

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


hol*_*web 5

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

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