Python - 'elif: return()' 语句太多?

标签 python performance if-statement

我有一个传递了两个参数的函数:

def function(a, b):
    if   a == 'd' : return(4*b)
    elif a == '!' : return(5)
    elif a == 'k' : return(1-2*k+k**2)
    elif a == 'Z' : return(1/k)
    (...)

a 正在检查它是否等于单个字符,而 b 始终是一个数字;该函数也总是返回一个数字。有时它并不总是简单的返回。

def function(a, b):
    (...)
    elif a == '2':
        temp_b = foo(b)
        if b == 2 : temp_b += 2
        return(temp_b)

我有一个非常长的 elif 语句列表,有更好的方法吗?

最佳答案

其实是的。首先,Python 没有标志性的 switch 语句,该语句在语句变得足够长时提供二进制搜索,这比线性搜索快得多。

在 Python 中,您可以使用具有精确值或自定义函数的字典:

def other_case(x):
    '''We can store non-lambdas too'''

    return 8

functions = {
    'd': lambda x: 4*x,
    '!': lambda x: 5,
    'k': lambda x: (1-2*x+x**2),
    'Z': lambda x: (1/x),
    '*': other_case,
}

调用它,只需要一个简短的包装器:

def call(a, x):
    return functions[a](x)

这有 O(1) 的时间,或者说复杂度不变,所以除了可读性更高之外,它也会更快。

编辑

如果您有特定范围内的数字,可以遍及整个范围,您还可以使用列表和转换。假设我想以 100 Da 的间隔处理质量从 2000 Da 到 5000 Da 的东西(我是一名生物学家)。对 500 项的列表进行编码是没有意义的,但我可以使用 30 项的列表来考虑整个范围。

from __future__ import division         # for //, floor division

def mass2000(x):
    '''Do something for mass of 2000'''

    return 1/x

def mass2100(x):
    '''Do something for mass of 2100'''

    return x

def mass2200(x):
    '''Do something for mass of 2200'''

    return x**2


lookup = [
    mass2000,
    mass2100,
    mass2200,
    # ....
]


def call(mass, x):
    if (mass < 2000 or mass > 5000):
        raise ValueError("Mass out of range")

    return lookup[(mass - 2000) // 100](x)

关于Python - 'elif: return()' 语句太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44816062/

相关文章:

python 2.7类型错误: bad operand type for unary +: 'str'

python - 谁能给出一个简单的 python 来解释 "Hollywood principle"/控制反转

python - djangorest框架-外键字段是只读的

html - 通过在屏幕外渲染来隐藏 DIV 时的性能影响

java - 我应该如何分析间歇性滞后/减速以在 Java 中进行优化? (见里面的例子)

c++ - 减少 if/if 代码量 (C++)

javascript - else if 语句在 jquery 中不起作用

Python,记录 : use custom handler with dictionary configuration?

ios - SceneKit - 向场景添加新的 SCNNode 会导致严重滞后

Java:在二维数组中搜索多个值