gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:08:52 25 4
gpt4 key购买 nike

我正试图找到一种干净的方法来处理不同的、互斥的函数输入。我的想法是我有一个返回 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 指定输入变量是什么,并返回所有值。用户不可能输入多个不同的输入值(这将是多余的,因为所有未知数都可以从一个输入值中确定)。

是否有更干净和 pythonic 的方法来做到这一点?用字符串指定输入变量目前感觉真的很脏。

提前致谢!

最佳答案

避免许多 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 并简单地执行以下操作:

values = {'a': v, 'b': v-1, 'c': v * 2, 'd': v**2}
a = values[vtype]

如果您不喜欢在函数签名中使用 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=...)

关于python - 处理不同的、互斥的函数输入的最 Pythonic 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17465110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com