将函数编写为传递参数或元组/参数列表的最pythonic方法是什么?
例如,函数add
可以接受add(1, 2)
或add((1, 2))
的参数,也可以输出3
。
到目前为止我所拥有的:(它有效,但看起来不太好)
def add(*args):
if len(args) == 1:
return (args[0][0] + args[0][1])
if len(args) == 2:
return args[0] + args[1]
else:
print "error: add takes in one or two arguments"
我不喜欢的是:
args[0][0]
看起来非常难以理解答案 0 :(得分:3)
我不知道这是否是#34; pythonic"方式,但它会做你想要的:
def add(a, b=None):
return a+b if b is not None else sum(a)
答案 1 :(得分:2)
如果你的函数需要特定数量的参数,那么最灵活的方法就是不这样做。相反,如果用户具有带参数的元组,则在调用函数时将它们解包。 E.g。
def add(a, b):
return a + b
然后调用者可以
add(1,2)
或
t = (1,2)
add(*t)
你想要接受一系列参数或单个参数的唯一时间是你可以有任意(非零)数量的参数(例如max
和min
内置函数)在这种情况下,您只需使用*args
答案 2 :(得分:1)
如果你只能采用有限数量的论证,那么特别要求这些论点更有意义。如果你可以接受任意数量的参数,那么*args
范例如果循环遍历就可以正常工作。混合和匹配这两者并不是很优雅。
def add(*args):
total = 0
for i in args:
total += i
return total
>>> add(1, 2, 3)
6
(我知道我们可以在那里使用sum()
,但我试图让它看起来更通用一些)
答案 3 :(得分:1)
本着python duck typing的精神,如果你看到1个参数,假设它的东西扩展为2个参数。如果它是2,则假设它的两个东西加在一起。如果它违反了你的规则,就会引发一个像python那样的函数调用异常。
def add(*args):
if len(args) == 1:
args = args[0]
if len(args) != 2:
raise TypeError("add takes 2 arguments or a tuple of 2 arguments")
return args[0] + args[1]
答案 4 :(得分:0)
装饰师最适合这份工作。
from functools import wraps
def tupled_arguments(f):
@wraps(f) # keeps name, docstring etc. of f
def accepts_tuple(tup, *args):
if not args: # only one argument given
return f(*tup)
return f(tup, *args)
return accepts_tuple
@tupled_arguments
def add(a, b):
return a + b