python关于*args所能接收的参数、关于**kwargs所接收的参数详解

发布时间 2023-04-12 16:55:16作者: i5ba
 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 # python-day32-20170110:
 4 
 5 
 6 # 关于*args所能接收的参数
 7 
 8 # 这种接收的是位置参数,可变长
 9 def func1(*args):
10     print(args,type(args))
11 
12 # 传入位置参数可以被args所接收,以元组的形式来保存
13 func1(1,2,3,4)  # (1, 2, 3, 4) <class 'tuple'>
14 
15 # 传入的位置参数也可以是元组,所传入的元组也是新生成的元组中的一个元素
16 func1((1,2,3,5),'a','b')  # ((1, 2, 3, 5), 'a', 'b') <class 'tuple'>
17 
18 # 传的元组前面加*后,遍历该元素中的每个元素添加到新元组
19 func1(*(1,2,3,5),'a','b')  # (1, 2, 3, 5, 'a', 'b') <class 'tuple'>
20 
21 # 注意 *args不能接收关键字参数
22 # func1(x=3)  # 报错
23 
24 
25 # 传入字典,字典也做为args元组中的一个元素而已
26 func1({"k1":"v1","k2":"v2"})  # ({'k1': 'v1', 'k2': 'v2'},) <class 'tuple'>
27 
28 # 所传入的字典前面加*后,则会把字典中的每个键做为元组的元素
29 func1(*{"k1":"v1","k2":"v2"})  # ('k1', 'k2') <class 'tuple'>
30 
31 # 字典前面加双** ,相当于关键字参数,而*args则接收不了关键字参数。
32 # func1(**{"k1":"v1","k2":"v2"})  # 报错。
33 
34 
35 print("-----------------------------------------------------")
36 
37 # 关于**kwargs所接收的参数
38 
39 def func2(**kwargs):
40     print(kwargs,type(kwargs))
41 
42 
43 #  **kwargs 无关接收位置参数
44 # func2(1,2,3)  # 报错
45 
46 # **kwargs可接收关键字参数,则是以字典的形式来进行保存
47 func2(x=1,y=2)  # {'x': 1, 'y': 2} <class 'dict'>
48 
49 # **kwargs 无法接收元组作为参数
50 # func2((1,2,3,4)) # 报错
51 
52 # 元组前面加**也会报错
53 # func2(**(1,2,3,4))  # 报错TypeError: __main__.func2() argument after ** must be a mapping, not tuple
54 
55 # **kwargs 无法拉直接接收字典作为参数
56 # func2({'x': 1, 'y': 2})
57 
58 # 字典前面加**后可以被kwargs所接收
59 func2(**{'x': 1, 'y': 2})  # {'x': 1, 'y': 2} <class 'dict'>
60 
61 # 综上我们可知**kwargs所能接收到的是字典前面加**或者是关键字参数
62 func2(**{'x': 1, 'y': 2},z = 88)  # {'x': 1, 'y': 2, 'z': 88} <class 'dict'>