如何在Python中创建一个“空if语句”

53

C语言中很常见的一种操作是“黑掉”空if语句,就像这样:

if(mostlyhappencondition)
    ;#empty statement
else{
    dosomething;
}

这个在Python中能够运行吗?我的意思是,我们可以通过使用Python来提高应用程序的性能吗?我还想知道原因。


3
这在C语言中很常见吗?对我来说看起来像是一种误导性的优化尝试。 - phant0m
3
我正在寻找类似的编码策略。原因不是为了优化,而是为了使代码更易读。例如,与其使用if not some_thing and not some_thing_else: do_something,不如阅读代码 if something or something_else: pass else: do_something。这里的答案有所帮助!谢谢。 - Sourabh Bhat
4
在您只想放置一个空的 # TODO 块时,这将变得更加有用。 - SOFe
我可以想象一种更好的可读性情况,当在if-elif[-...]-else块中测试(验证)多个事物时,就像在if some-long-condition: pass elif one-more-long-condition: pass [elif ...] else: return (exit function with) something-like-abrupt-error-message中所示,与@SourabhBhat-分享的有些相似。这比否定条件并在每个if或elif中返回类似突然错误消息的方式要方便得多。 - Alexander Ites
我认为上述情况类似于其他语言中的switch-case结构,其中包含空的break case(带有break的case)和一个通用的默认替代项。 - Alexander Ites
4个回答

57
如果在“if”语句中没有“else”分支,性能会有所提升,因为字节码不会进入“if”分支的执行路径。
以下是一些函数及其dis.dis(foo)输出结果:
下面是一个示例应用程序:
def foo(x):
    if x:
        pass
    else:
        return x+2

分解为:

5           0 LOAD_FAST                0 (x)
            3 POP_JUMP_IF_FALSE        9

6           6 JUMP_FORWARD             8 (to 17)

8     >>    9 LOAD_FAST                0 (x)
           12 LOAD_CONST               1 (2)
           15 BINARY_ADD          
           16 RETURN_VALUE        
      >>   17 LOAD_CONST               0 (None)
           20 RETURN_VALUE        

以下
def foo(x):
    if not x:
        return x+2

分解为:

11           0 LOAD_FAST                0 (x)
             3 POP_JUMP_IF_TRUE        14

12           6 LOAD_FAST                0 (x)
             9 LOAD_CONST               1 (2)
            12 BINARY_ADD          
            13 RETURN_VALUE        
       >>   14 LOAD_CONST               0 (None)

如果一个编译器不能识别 if/else 没有代码只是用来注释代码的话,那它就是一个相当愚蠢的编译器。我希望 Python 已经解决了这个 bug。 - Tom

31
我猜您正在寻找 pass 语句,有时需要创建一个空代码块以防止语法错误。
if mostlyhappencondition:
    pass
else:
    do_something()

通常更常见的做法是直接这样做,这在逻辑上是等价的:

if not mostlyhappencondition:
    do_something()

这里没有显著的性能提升。

2
当使用特定的if/elif/else或try/except时,可以获得可读性上的提升。 - aramis

4
if True:中没有任何内容的情况下,您可以做...
if not mostlyhappenedcondition:
   do something()

如果将来在“if”语句中不需要放任何东西,则该代码中的“if”是多余的。

3

不会的,这并不能提高性能。事实上,在C中也不行。你从哪里听来的?

not/! 读起来更好,并且速度应该差不多。


实际上,使用 gcc -O4 进行了测试:

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0; i < 1000000000; i++) {
        if(!(i < 900000000)) {
            putchar('.');
        }
    }
}

对比。

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0; i < 1000000000; i++) {
        if(i < 900000000);
        else {
            putchar('.');
        }
    }
}

在我的电脑上,#1花费了6.62秒,#2花费了6.64秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接