给定如下代码:
if f(a) == 1:
# do sth A
elif f(a) == 2:
# do sth B
elif f(a) == 3:
# do sth C
else:
# do sth D
表达式f(a)
是否只执行/求值一次?还是对if
或elif
的每一种情况都执行/求值?此外,复合语句有什么不同吗:例如
if f(a) == 1:
# do sth A
elif f(a) == 2 and a > 0:
# do sth B
elif f(a) == 3 and a < 0:
# do sth C
else:
# do sth D
在这种情况下,如何评估f(a)
?一劳永逸还是一劳永逸?
发布于 2013-04-27 09:05:37
测试一下:
In [7]: %paste
def f(a):
print(a)
a = 4
if f(a) == 1:
pass
elif f(a) == 2:
pass
elif f(a) == 3:
pass
else:
pass
## -- End pasted text --
4
4
4
f(a)
将继续被评估,因为不能保证f(a)
每次都返回相同的结果,所以Python不会假设它会返回相同的结果。您可以使用result = f(a)
缓存它,并使用result
代替f(a)
。
如果这些if
块中的任何一个碰巧是True
,那么它后面的块将不会被测试。
发布于 2013-04-27 09:20:09
理解包含多个if
语句的elif
语句可以表示为一组嵌套的if
和else
块,这一点很重要。也就是说,elif
只是else: if
的“语法糖”(但它节省了一定程度的缩进,所以非常方便!)。下面的代码块相当于代码的第一个if
和elif
:
if f(a) == 1:
pass
else:
if f(a) == 2:
pass
考虑到这一点,表达式的求值次数取决于它的结果,因为只有在前面的测试失败的情况下才会进入else
部分。如果对f(a)
的第一个调用返回1
,则不会进行任何其他调用。然而,如果所有的测试都失败了(也许最后一个除外),那么它们都需要进行评估。
类似地,在使用and
和or
的逻辑表达式中,Python将缩短并不计算确定最终值所不需要的表达式的任何部分。
if f(a) == 1: # f(a) always gets evaluated here
pass
elif f(a) == 2: # f(a) gets called a second time here if the "if" was failed
pass
elif a<1 and f(a): # f(a) runs again only if both previous tests failed and a<1
pass
因此,总而言之,除非提前知道函数f(a)
的结果,否则无法判断它会运行多少次。如果f(a)
不是幂等的(也就是说,如果它有副作用),那么您可能不希望以这种方式构造代码!
发布于 2013-04-27 08:58:16
我非常确定它每次被调用时都会被执行。(我使用的是python 2.7,我不认为它在3.x中发生了变化)
您可以将一条print语句放入其中进行验证。
这就是为什么只调用它一次并获取条件的返回值会更好的原因
你可以cache函数返回值吗?但是可以更直接地调用函数1x:
f_value = f(a)
if f_value == 1:
# do sth A
elif f_value == 2:
# do sth B
elif f_value == 3:
# do sth C
else:
# do sth D
https://stackoverflow.com/questions/16247212
复制相似问题