首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >if elif语句中的表达式求值

if elif语句中的表达式求值
EN

Stack Overflow用户
提问于 2013-04-27 08:54:36
回答 3查看 1.6K关注 0票数 1

给定如下代码:

代码语言:javascript
运行
复制
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)是否只执行/求值一次?还是对ifelif的每一种情况都执行/求值?此外,复合语句有什么不同吗:例如

代码语言:javascript
运行
复制
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)?一劳永逸还是一劳永逸?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-27 09:05:37

测试一下:

代码语言:javascript
运行
复制
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,那么它后面的块将不会被测试。

票数 5
EN

Stack Overflow用户

发布于 2013-04-27 09:20:09

理解包含多个if语句的elif语句可以表示为一组嵌套的ifelse块,这一点很重要。也就是说,elif只是else: if的“语法糖”(但它节省了一定程度的缩进,所以非常方便!)。下面的代码块相当于代码的第一个ifelif

代码语言:javascript
运行
复制
if f(a) == 1:
    pass
else:
    if f(a) == 2:
        pass

考虑到这一点,表达式的求值次数取决于它的结果,因为只有在前面的测试失败的情况下才会进入else部分。如果对f(a)的第一个调用返回1,则不会进行任何其他调用。然而,如果所有的测试都失败了(也许最后一个除外),那么它们都需要进行评估。

类似地,在使用andor的逻辑表达式中,Python将缩短并不计算确定最终值所不需要的表达式的任何部分。

代码语言:javascript
运行
复制
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)不是幂等的(也就是说,如果它有副作用),那么您可能不希望以这种方式构造代码!

票数 2
EN

Stack Overflow用户

发布于 2013-04-27 08:58:16

我非常确定它每次被调用时都会被执行。(我使用的是python 2.7,我不认为它在3.x中发生了变化)

您可以将一条print语句放入其中进行验证。

这就是为什么只调用它一次并获取条件的返回值会更好的原因

你可以cache函数返回值吗?但是可以更直接地调用函数1x:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16247212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档