在python中传递多个不同的函数参数

Passing mulitple and varied function arguments in Python

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

问题说明:

我通常在调用函数时使用位置参数。然而,我经常发现自己需要将大量的参数传递到一个函数中,因此使用位置参数变得相当麻烦。我还发现自己需要将不同数量的变量传递给一个函数,如果需要,这个函数可以接受更多或其他变量。

如何将多个参数传递给能够接受多个参数的函数?

我试图创建一个尽可能基本的例子。函数只是对一些变量执行一些算术运算,然后将它们打印出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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的结果分别为:

1
2
3
4
5
6
7
20
10
32

10
0
22

现在假设我想把第二个和第三个函数组合在一起,所以我只需要调用一个函数而不是两个。在这种情况下,函数是:

1
2
3
4
5
6
7
8
9
10
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:

基本上我想要以下内容:

1
2
3
4
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

此函数的调用方式为:

1
2
3
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

这很容易实现吗?


从函数内部使用全局变量通常是一种糟糕的方法。您可以使用**kwargs代替它,方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
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非常相似,所以它可能不是你想要的。


如果我正确理解了你在寻找什么:

1
2
3
4
5
6
7
8
9
def something(*args):
    for i in args:
        print(i)

some_args = range(10)

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

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0
1
2
3
4
5
6
7
8
9
-----------
9
8
7
6
5
4
3
2
1
0