在Python中传递多种多样的函数参数

时间:2018-06-20 10:15:05

标签: python

首先,我已经看到了许多相似问题,尽管它们不是我的问题完全。我已经对* args和** kwargs熟悉了。

问题说明:

我通常在调用函数时使用位置参数。但是,我经常发现自己需要将大量的参数传递给函数,因此使用位置参数已变得相当繁重。我还发现自己需要将各种数量的变量传递给可以接受更多或其他变量的函数。

如何将许多参数传递到一个能够接受 variable 个参数的函数中?

我试图创建一个尽可能基本的示例。这些函数仅对某些变量执行一些算术运算,然后将其打印出来。

a = 10
b = 20
c = 30

def firstFunction(*args):
    d = a *2
    e = b /2
    f = c +2

    x = d -10
    y = e -10
    z = f -10

    h = 1 #or 2

    secondFunction(d,e,f,h)
    thirdFunction(x,y,z,h)

def secondFunction(d,e,f,h):
    if h == 1:
        print d
        print e
        print f

def thirdFunction(x,y,z,h):
    if h == 2:
        print x
        print y 
        print z

firstFunction(b,c,a)

预期的h = 1和h = 2分别为:​​

20
10
32

10
0
22

现在可以说我想将第二个和第三个功能结合在一起,所以我只需要调用一个功能而不是两个即可。在这种情况下,功能为:

def combinedFunction(d,e,f,h,x,y,z):
     if h == 1:
        print d
        print e
        print f

     if h == 2:
        print x
        print y 
        print z

,将由combinedFunction(d,e,f,h,x,y,z)调用。您可以想象,对于更复杂的功能,这可能会非常烦人。另外,我传递了许多根本不使用的不同参数,每个参数都必须首先声明。例如,在该示例中,如果仍然必须将h = 1xyz传递到函数中,并且其中一个的值可能没有还没有确定(在这种简单情况下是)。我不能使用'combinedFunction(* args)',因为并非每个参数都是全局定义的。

TLDR:

基本上我想要以下内容:

def someFunction(accepts any number of arguments **and** in any order):
   # does some stuff using those arguments it received at the time it was called
# it can accept many more parameters if needed
# it won't need to do stuff to a variable that hasn't been passed through

此函数的调用者:

someFunction(sends any number of arguments **and** in any order)
# can call the function again using different arguments and a
# different number of arguments if needed

这可以轻松实现吗?

3 个答案:

答案 0 :(得分:2)

在函数内部使用全局变量通常是一种不好的方法。代替它,您可以这样使用**kwargs

def firstFunction(**kwargs):
    d = kwargs.get('a') * 2

    secondFunction(d=d, **kwargs)
    thirdFunction(e=1, **kwargs)

def secondFunction(d, **kwargs):
    print d
    print kwargs.get('a')

def thirdFunction(**kwargs):
    print kwargs.get('e')

firstFunction(a=1, b=3, q=42)  # q will not be used

答案 1 :(得分:1)

您可以使用字典将数据传递给函数,但是这样做确实会使编程时的直观性降低。 每个函数都可以根据需要转换dict参数。

def func_a(input_dict):
    a = input_dict["a"]
    b = input_dict["b"]
    print(a+b)

def func_b(input_dict):
    c = input_dict["c"]
    d = input_dict["d"]
    print(c+d)

def combined_func(input_dict):
    func_a(input_dict)
    func_b(input_dict)

这与kwargs非常相似,因此它可能不是您想要的。

答案 2 :(得分:0)

如果我正确理解了您要寻找的内容:

def something(*args):
    for i in args:
        print(i)

some_args = range(10)

something(*some_args)
print('-----------')
something(*some_args[::-1]) # reverse order

输出:

0
1
2
3
4
5
6
7
8
9
-----------
9
8
7
6
5
4
3
2
1
0