【问题标题】:sequences of condition checking条件检查序列
【发布时间】:2012-07-23 15:49:51
【问题描述】:

我是论坛的新人,所以希望这个问题不是太初级或者以前有人问过。在 python 中编写一些代码时,我发现返回 true 或 false 的单个函数(这里称为 function1、function2 和 function3)将具有相同的输出写入屏幕,因此我想像这样将它们链接在一起;

if function1 or function2 or function3: 
    print "something"

我知道 function3 会花费更多时间来运行,所以我想避免它。由于现在编写了条件,在我看来,如果 Python 首先将 function1 评估为 false,然后停止对其他条件的评估,因为它知道 if 条件已经被破坏,这对我来说会很棒。另一种可能性是在评估组合表达式的真值之前分别找到所有三个函数的返回值。有人知道 if 条件评估中的动作顺序吗?

【问题讨论】:

    标签: python if-statement


    【解决方案1】:

    Python 已经使用称为"short-circuit" evaluation 的机制为您完成了这项工作。

    如果在评估期间的任何阶段发现布尔表达式为 False(对于 and)或 True(对于 or),则不会评估表达式的其余部分,因为最终结果已经在那一点上确定的。

    所以顺序你把东西放到你的布尔表达式中真的很重要。

    这真的很有用,因为你可以这样做:

    if i != 0 and 2332.0 / i:
       ...
    

    使用简单的and 表达式避免被零除(即,如果i 为零,则永远不会发生除法)。

    另外,请注意:您确实需要 () 才能使您的函数调用正常工作。

    最后,这种短路求值并不是 Python 独有的,很多语言都这样做。

    【讨论】:

    • 您应该提到,在编写当前代码时,实际上 没有 个函数被调用过。
    • 换句话说,如果or 表达式的第一项为真,则不计算第二项;如果and 表达式的第一项为假,则不计算第二项。
    • @SvenMarnach 你的意思是因为它缺少 ()
    • @SvenMarnach 知道了,我添加了一个注释。(我最初只是把它当作伪代码) - 谢谢。
    【解决方案2】:

    你说的叫“短路”,python确实做到了。

    但是,我认为如果你想让它正常工作,你想使用and 运算符,而不是or,因为False or True 返回TrueFalse and True 返回False(无需查看第二个值)。为了完整起见,True or False 返回True(从未查看过False)。

    另外,在您的示例中,您实际上并没有调用函数...在 python 中调用函数,您需要括号:

    function1(args)  #for example
    

    【讨论】:

    • or 也会短路,如果第一项计算结果为真,它将停止计算,因为不需要计算第二项。
    • @cdhowie -- 是的,这是真的。但它并没有像 OP 描述的那样做。
    • 当然可以,但这与or 是否短路无关。我怀疑它会做他想做的事,他只是在描述他的问题时得到了一个不正确的细节。具体来说,a or b 将评估为与 not (not a and not b) 相同的值,并且两者都将以完全相同的方式短路 - 如果 or 表达式不会评估 band 表达式也不会。
    • @cdhowie -- 我不知道 OP 是什么意思......无论如何,我更新了。现在更加明确了。
    • 对不起,我在这里的逻辑运算符有点快。我应该写的是与运算符,而不是或。 “短路”是我想知道的 - 很大的帮助,而且非常快。也许不需要修改我的代码,因为我对 python 如何解决我的问题而不是实际语法感兴趣。但是,我发现用 python 编写工作代码和没有工作的伪代码一样容易,所以如果这对论坛最好的话,我可以尽量不要草率地编写代码。
    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2021-11-01
    • 2021-05-07
    • 1970-01-01
    • 2022-11-18
    • 2022-01-02
    • 2018-07-27
    相关资源
    最近更新 更多