首先,我已经看到了许多类似的问题,尽管它们并不完全是我的问题。我已经熟悉了args和kwargs。
问题说明:
我通常在调用函数时使用位置参数。然而,我经常发现自己需要将大量的参数传递到一个函数中,因此使用位置参数变得相当麻烦。我还发现自己需要将不同数量的变量传递给一个函数,如果需要,这个函数可以接受更多或其他变量。
如何将多个参数传递给能够接受多个参数的函数?
我试图创建一个尽可能基本的例子。函数只是对一些变量执行一些算术运算,然后将它们打印出来。
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 = 1、x、y和z必须传递到函数中,可能其中一个函数的值尚未确定(在这种简单的情况下是这样)。我不能使用"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
这很容易实现吗?
你能解释一下为什么def someFunction(**kwargs)不能解决这个问题吗?
我经常发现自己需要将大量的参数传递到一个函数中——这是一种代码味道;我传递了许多不同的参数,这些参数根本不会被使用——那么,为什么要传递它们呢?我认为你应该重新考虑一下你的设计。
@EugenePrimako和def someFunction(**kwargs)的观点,难道所有的论据都不需要是全球性的吗?在这个例子中,在firstFunction中,我创建了新的变量,在这个函数中,我调用了一个额外的函数,如combinedFunction。如果我按照示例中当前的方式传递变量,它将起作用,但是如果我使用kwargs(或args),那么需要全局定义变量,以便它起作用。我当然可能弄错了,但我试过的时候没用。
@mkrieger1,"我传递了很多不同的参数,这些参数根本不会被使用"这句话指的是combinedFunction(d,e,f,h,x,y,z)的用法,如果调用它,那么在"h=1"的情况下,"x、y和z仍然必须传递到函数中"。我是说我不想发生这种事。
从函数内部使用全局变量通常是一种糟糕的方法。您可以使用**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
谢谢您!我不知道kwargs.get()。它仍然有点凌乱,但它做了我想做的。
澄清-kwargs是一个常见的dict,因此您可以使用kwargs.get('a')、kwargs['a']和所有其他dict操作。
您可以使用dict将数据传递给函数,但它确实使编程时的直观性降低了。每个函数都可以根据需要转换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非常相似,所以它可能不是你想要的。
如果我正确理解了你在寻找什么:
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