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 |
它的名字是:
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 |
这很容易实现吗?
从函数内部使用全局变量通常是一种糟糕的方法。您可以使用
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 |