一、"*“和”**"应用在函数参数中时:
def fun(*args,**kvargs):
if args:
print("传入的第一部分参数为:",end = " ")
print(args)
print("它的数据类型为",end = " ")
print(type(args))
else:
print("您没有输入属于第一部分的参数")
if kvargs:
print("传入的第二部分参数为:",end = " ")
print(kvargs)
print("它的数据类型为",end = " ")
print(type(kvargs))
else:
print("您没有输入属于第二部分的参数")
print('*'*55)
if args:
print("迭代第一部分参数得到:")
for temp in args:
print(temp)
else:
print("并没有输入属于第一部分参数 ")
if kvargs:
print("迭代第二部分参数得到:")
for k,v in kvargs.items():
print(k,v)
else:
print("并没有输入属于第二部分参数 ")
其中*args表示它可以接收一串不定数量的非字典dict实参,并将它们包装为元组tuple
**kvargs表示它可以一串不定数量的字典dict实参,并将它们包装为字典
1.比如我们先输入三个实参:
fun(1,'a',None)
得到的输出为:
传入的第一部分参数为: (1, 'a', None)
它的数据类型为 <class 'tuple'>
您没有输入属于第二部分的参数
*******************************************************
迭代第一部分参数得到:
1
a
None
并没有输入属于第二部分参数
2.当我们传入一个元组tuple,列表list甚至字典dict时,它们也同样被认为是属于*args的参数:
fun(("a",1,None),[4,"None","rookie"],{"name":"xiaoming","sex":"male","age":12})
输出为:
传入的第一部分参数为: (('a', 1, None), [4, 'None', 'rookie'], {'name': 'xiaoming', 'sex': 'male', 'age': 12})
它的数据类型为 <class 'tuple'>
您没有输入属于第二部分的参数
*******************************************************
迭代第一部分参数得到:
('a', 1, None)
[4, 'None', 'rookie']
{'name': 'xiaoming', 'sex': 'male', 'age': 12}
并没有输入属于第二部分参数
3.只有当我们输入字典dict实参时,才会被**kvargs接收
比如:
fun(name = "xiaoming",age = 12,sex = "male")
输出为:
您没有输入属于第一部分的参数
传入的第二部分参数为: {'name': 'xiaoming', 'age': 12, 'sex': 'male'}
它的数据类型为 <class 'dict'>
*******************************************************
并没有输入属于第一部分参数
迭代第二部分参数得到:
name xiaoming
age 12
sex male
4.下面说一些关于与*args和kvargs有关的形参规则:
第一条规则:*args和kvargs前面均不能有有指定参数名的实参,比如:
def fun(a,*args,**kvargs)
print(a)
print(args)
print(kvargs)
fun(a=(1,2,3),3,4,5,name = "xiaoming",age = 12,sex = "male")
fun(a=(1,2,3),3,4,5)
这两个的输出都会报错,分别为:
File "D:\Program\Notepad++\workspace\new 2.py", line 5
fun(a=(1,2,3),3,4,5,name = "xiaoming",age = 12,sex = "male")
^
SyntaxError: positional argument follows keyword argument
File "D:\Program\Notepad++\workspace\new 2.py", line 6
fun(a=(1,2,3),3,4,5)
^
SyntaxError: positional argument follows keyword argument
第二条规则:args后面的形参由对应的实参传入时必须指定参数名,否则会被归到args中(如果此时形参还没设定默认值,就会报错)。
def fun(*args,b =1):
print(args)
# print(kvargs)
print(b)
print("*"*50)
fun(1,2,3,4,b = 1)
fun(1,2,3,4,1)
输出为:
(1, 2, 3, 4)
1
**************************************************
(1, 2, 3, 4, 1)
1
**************************************************
二*和**在装包解包中的应用
在我的理解里
*(容器)就相当于迭代容器中的数据
*迭代字典dict时得到的一串key的值
**迭代字典得到的只能用format输出
下面举例
a=(1,2,3,4)
b=["sex","age",6]
c="abdjlad"
d={"name":"xiaoming","age":12}
print(*a)
print(*b)
print(*c)
print(*d)
print("name:{name},age:{age}".format(**d))
输出:
1 2 3 4
sex age 6
a b d j l a d
name age
name:xiaoming,age:12.