什么是处理不同的互斥函数输入的最python方式?

2024-06-01 01:19:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一个干净的方法来处理不同的,互斥的函数输入。我的想法是,我有一个函数,它返回4个值(这些值通过数学方程链接),当你输入4个值中的一个时,它将返回所有值。在

目前该函数的工作方式如下:

#example relations are simply: b=1+a, c=0.5*a, d=sqrt(a)
def relations(v, vtype="a"):
    if vtype=="a":
        a = v
    elif vtype=="b":
        a = v - 1
    elif vtype=="c":
        a = 2 * v
    elif vtype=="d":
        a = v ** 2

    b = 1 + a
    c = 0.5 * a
    d = a ** 0.5

    return a,b,c,d

用户通过字符串vtype指定输入变量是什么,并返回所有值。用户不可能输入多个不同的输入值(这是多余的,因为所有未知量都可以从一个输入值中确定)。在

有没有更干净更像Python的方法来做这件事?用一个字符串指定输入变量目前感觉很不好。在

提前谢谢!在


Tags: 方法函数字符串用户链接example方式数学
3条回答

可以使用可变关键字参数:

def relations(**kwargs):
    if 'a' in kwargs:
        a = kwargs['a']
    elif 'b' in kwargs:
        a = kwargs['b'] - 1
    elif 'c' in kwargs:
        a = kwargs['c'] * 2
    elif 'd' in kwargs:
        a = kwargs['d'] ** 2
    else:
        raise TypeError('missing an argument')

    b = 1 + a
    c = 0.5 * a
    d = a ** 0.5

    return a, b, c, d

然后与命名参数一起使用:

^{pr2}$

避免许多if-elif的常用方法是构建函数字典:

def relations(v, vtype='a'):
    functions = {
        'a': lambda x: x, 'b': lambda x: x-1,
        'c': lambda x: x * 2, 'd': lambda x: x**2
    }

    a = functions[vtype](v)
    b = 1 + a
    c = 0.5 * a
    d = a ** 0.5
    return a,b,c,d

如果此函数不是瓶颈,则可以避免使用lambda,只需执行以下操作:

^{pr2}$

如果您不喜欢在函数签名中使用vtype的想法,可以使用一个**kwargs参数:

def relations(**kwargs):
    if len(kwargs) != 1 or not set('abcd').intersection(kwargs):
        raise ValueError('Invalid parameters')
    vtype, v = kwargs.popitem()
    functions = {
        'a': lambda x: x, 'b': lambda x: x-1,
        'c': lambda x: x * 2, 'd': lambda x: x**2
    }

    a = functions[vtype](v)
    b = 1 + a
    c = 0.5 * a
    d = a ** 0.5
    return a,b,c,d

那就叫它:

relations(a=...)
relations(b=...)

您可以将vType定义为函数,并将函数作为参数传递

def a(v):
    return v

def b(v):
    return v-1

def c(v):
    return 2*v

def d(v):
    return v**2

def relations(v, vtype=a):
    value_a = vtype(v)
    value_b = 1 + value_a
    value_c = 0.5 * value_a
    value_d = value_a ** 0.5
    return value_a,value_b,value_c,value_d

这样你就可以摆脱if/elif。在

相关问题 更多 >