以下两个代码都给出了相同的结果。但我不确定应该在哪里加上 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')
答案 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
子句中没有什么意义,尽管它不会造成任何伤害。