编写函数的大多数pythonic方法是传递参数或参数元组

时间:2015-11-04 22:55:30

标签: python function parameter-passing

将函数编写为传递参数或元组/参数列表的最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"

我不喜欢的是:

  1. 我必须打印关于传递一个或两个参数的错误
  2. args[0][0]看起来非常难以理解
  3. 这样,很难说出传递的参数代表什么(他们没有名字)

5 个答案:

答案 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)

你想要接受一系列参数或单个参数的唯一时间是你可以有任意(非零)数量的参数(例如maxmin内置函数)在这种情况下,您只需使用*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