如果您完成了一点点的python编程工作,那么您会在python函数中看到“ ** args”和“ ** kwargs”两个词。但是它们到底是什么?
*和**运算符执行不同的操作,这取决于我们在何处使用,它们彼此互补。
因此,当我们在方法定义中使用它们时,例如-
def __init__(self, *args, **kwargs): pass
上面的操作称为“打包”,因为它将所有参数打包到一个单个变量中,此方法调用将其接收到一个称为args的元组中。我们可以使用除args之外的其他名称,但是args是最常用的pythonic方式。要了解为什么要放置一个变量,请请看以下示例:
假设我们有一个带有三个参数的函数,并且我们有一个大小为3的列表,其中包含该函数的所有参数。现在,如果我们只是简单地尝试将列表传递给该函数,则该调用将不起作用,并且会出现错误。
#function which takes three argument def func(a,b,c): print("{} {} {}".format(a, b, c)) #list of arguments lst = ['python', 'java', 'csharp'] #passing the list func(lst)
TypeError: func() missing 2 required positional arguments: 'b' and 'c'
一旦我们“选择”了变量,那么您就可以完成普通元组无法完成的工作。Args [0],args [1]和args [2]将分别给我们第一个,第二个和第三个参数。如果将args元组转换为列表,则可以执行修改,删除和更改其中的项目的操作。
要将这些打包参数传递给另一个方法,我们需要进行打包-
def __init__(self, *args, **kwargs): #some code here car(VehicleClass, self).__init__(self, *args, **kwargs) #some code below
同样,我们有*运算符,但是这次是在方法调用的上下文中。现在要做的是爆炸args数组,并调用该方法,就好像每个变量都是独立的一样。以下是另一个可以清楚理解的示例-
def func1(x, y, z): print(x) print(y) print(z) def func2(*args): #Convert args tuple to a list so we can do modification. args = list(args) args[0] = 'HTML' args[1] = 'CSS' args[2] = 'JavaScript' func1(*args) func2('Python', 'Java', 'CSharp')
HTML CSS JavaScript
从上面的输出中,我们可以更改所有三个参数,然后再将它们传递给func1。
同样,我们可以解决example1中发现的TypeError消息。
#function which takes three argument def func(a,b,c): print("{} {} {}".format(a, b, c)) #list of arguments lst = ['python', 'java', 'csharp'] #passing the list func(*lst)
python java csharp
因此,如果我们不知道需要将多少个参数传递给python函数,则可以使用packing将所有参数打包到一个元组中。
#Below function uses packing to sum unknown number of arguments def Sum(*args): sum = 0 for i in range(0, len(args)): sum = sum + args[i] return sum #Driver code print("Function with 2 arguments & Sum is: \n",Sum(9, 12)) print("Function with 5 arguments & Sum is: \n",Sum(2, 3, 4, 5, 6)) print("Function with 6 arguments & Sum is: \n",Sum(20, 30, 40, 12, 40, 54))
Function with 2 arguments & Sum is: 21 Function with 5 arguments & Sum is: 20 Function with 6 arguments & Sum is: 196
下面是另一个程序,用于演示打包和拆包两者的用法:
#function with three arguments def func1(x,y,z): print("Argument One: ",x) print("\nArgument Two: ",y) print("\nArgument Three: ",z) #Packing- All arguments passed to func2 are packed into tuple *args def func2(*args): #To do some modification, we need to convert args tuple to list args = list(args) #Modifying args[0] & args[1] args[0] = 'Hello' args[1] = 'nhooo' #Unpacking args and calling func1() func1(*args) #Driver code func2("I", "Love", "Coding")
Argument One: Hello Argument Two: nhooo Argument Three: Coding
# Program to demonstrate unpacking of dictionary items using ** def func(x,y,z): print("Dicionary first item: ",x) print("\nDictionary second item: ",y) print("\nDictionary third item: ",z) d = {'x': 27, 'y': 54, 'z': 81} func(**d)
Dicionary first item: 27 Dictionary second item: 54 Dictionary third item: 81
在套接字编程中使用,我们需要向服务器发送未知(无限)个请求。
在django之类的Web框架中使用,以发送变量参数以查看函数。
用于要求我们传递变量参数的包装函数。