Python 如果我已经从上一个块中的函数返回,是否应该使用elif? def大小(编号): 如果number

Python 如果我已经从上一个块中的函数返回,是否应该使用elif? def大小(编号): 如果number,python,coding-style,Python,Coding Style,您只能通过基准测试/计时来了解特定情况下的性能(或者如@aix所示,查看翻译后的代码,假设代码段足够小) 话虽如此,我认为第二个示例的语义更加清晰,因为语言结构表明选项是互斥的 一般来说,给定相同的功能,一个if/elif/else子句应该比一系列if-语句更有效,其中多个if语句可以按顺序执行/评估,即使之前的if语句被发现为真。在这个特定的代码示例中,情况并非如此,因为只要执行了if语句的相应主体,就会执行返回 在所有其他方面,没有区别。这两个函数编译为相同的字节码: def size(nu

您只能通过基准测试/计时来了解特定情况下的性能(或者如@aix所示,查看翻译后的代码,假设代码段足够小)

话虽如此,我认为第二个示例的语义更加清晰,因为语言结构表明选项是互斥的


一般来说,给定相同的功能,一个
if/elif/else
子句应该比一系列
if
-语句更有效,其中多个
if
语句可以按顺序执行/评估,即使之前的
if
语句被发现为真。在这个特定的代码示例中,情况并非如此,因为只要执行了
if
语句的相应主体,就会执行
返回

在所有其他方面,没有区别。这两个函数编译为相同的字节码:

def size(number):
    if number<100:
        return Small()

    if number<1000:
        return Medium()

    return Big()

def size1(number):
    if number<100:
        return Small()
    elif number<1000:
        return Medium()
    else:
        return Big()
[3]中的
:dis.dis(大小)
2 0加载速度0(数字)
3负载常数1(100)
6比较运算0(>19加载速度0(数字)
22负载常数2(1000)
25比较操作0(>38负载\u全局2(大)
41调用函数0
44返回值
In[4]:dis.dis(尺寸1)
11 0加载速度0(数字)
3负载常数1(100)
6比较运算0(>19加载速度0(数字)
22负载常数2(1000)
25比较操作0(>38负载\u全局2(大)
41调用函数0
44返回值
45负载常数0(无)
48返回值

(为了100%准确,第二个版本的末尾有一个隐式的
返回None
。但是,由于无法访问此代码,因此不会影响性能。)

第二个示例更具可读性。
In [3]: dis.dis(size)
  2           0 LOAD_FAST                0 (number)
              3 LOAD_CONST               1 (100)
              6 COMPARE_OP               0 (<)
              9 POP_JUMP_IF_FALSE       19

  3          12 LOAD_GLOBAL              0 (Small)
             15 CALL_FUNCTION            0
             18 RETURN_VALUE        

  5     >>   19 LOAD_FAST                0 (number)
             22 LOAD_CONST               2 (1000)
             25 COMPARE_OP               0 (<)
             28 POP_JUMP_IF_FALSE       38

  6          31 LOAD_GLOBAL              1 (Medium)
             34 CALL_FUNCTION            0
             37 RETURN_VALUE        

  8     >>   38 LOAD_GLOBAL              2 (Big)
             41 CALL_FUNCTION            0
             44 RETURN_VALUE        

In [4]: dis.dis(size1)
 11           0 LOAD_FAST                0 (number)
              3 LOAD_CONST               1 (100)
              6 COMPARE_OP               0 (<)
              9 POP_JUMP_IF_FALSE       19

 12          12 LOAD_GLOBAL              0 (Small)
             15 CALL_FUNCTION            0
             18 RETURN_VALUE        

 13     >>   19 LOAD_FAST                0 (number)
             22 LOAD_CONST               2 (1000)
             25 COMPARE_OP               0 (<)
             28 POP_JUMP_IF_FALSE       38

 14          31 LOAD_GLOBAL              1 (Medium)
             34 CALL_FUNCTION            0
             37 RETURN_VALUE        

 16     >>   38 LOAD_GLOBAL              2 (Big)
             41 CALL_FUNCTION            0
             44 RETURN_VALUE        
             45 LOAD_CONST               0 (None)
             48 RETURN_VALUE