今天在尝试看函数源代码的时候发现有这两个东西……以前也见过,查了几次没弄懂,最后放弃了,但是最近发现这玩意好像还用的挺频繁,我就自己查了查资料,看了看视频,搞一下,这是我看了好多资料之后自己的一些总结,还有一些尝试
环境:
windows7
PyCharm 2019.3.3 (Professional Edition)
python3.7
实验过程
*args
*args传递任意数量的非键值对参数
# *args传递任意数量的非键值对参数
def wz(arg,*args):
print("first normal arg",arg)
print(type(args))
for a in args:
print("another arg",a)
wz('a','b','c','d')
first normal arg a
<class ‘tuple’>
another arg b
another arg c
another arg d
**kwargs
def wz(*args,**kwargs):
print("args的类型是{}".format(type(args)))
print("kwargs的类型是{}".format(type(kwargs)))
for arg in args:
print("args:",arg)
for kwarg in kwargs:
print("kwargs:",kwarg)
wz(1,1,2,3,a=10,b=20)
args的类型是<class ‘tuple’>
kwargs的类型是<class ‘dict’>
args: 1
args: 1
args: 2
args: 3
kwargs: a
kwargs: b
传参数的时候也可以使用这种形式
def sample(arg1,arg2,arg3,arg4):
print("arg1:",arg1)
print("arg2:",arg2)
print("arg3:",arg3)
print("arg4:",arg4)
args = ("a",2,4,3)#这里使用列表也是可以的,亲测可行
sample(*args)
kwargs={'arg1':'a','arg2':'b','arg3':'c','arg4':'d'}
sample(**kwargs)
arg1: a
arg2: 2
arg3: 4
arg4: 3
arg1: a
arg2: b
arg3: c
arg4: d
python函数中四种参数类型位置实验:
- 位置参数,*args,默认参数,**kwargs
def wz(a,*args,b=10,**kwargs):
print("a的值是:",a)
print("b的值是:",b)
print("args的类型是{}".format(type(args)))
print("kwargs的类型是{}".format(type(kwargs)))
for arg in args:
print("args:",arg)
for key,value in kwargs.items():
print("kwargs:",key,value)
wz(1,2,3,4,{'a':10,'b':20},{'c':1,'d':2},e=10,f=20)
运行结果:
a的值是: 1
b的值是: 10
args的类型是<class ‘tuple’>
kwargs的类型是<class ‘dict’>
args: 2
args: 3
args: 4
args: {‘a’: 10, ‘b’: 20}
args: {‘c’: 1, ‘d’: 2}
kwargs: e 10
kwargs: f 20
可以看出来这里面位置参数之后的所有非键值对参数都传给了*args,默认参数b的值并未被改变
- 位置参数,收集参数,*args,**kwargs
def wz(a,b=10,*args,**kwargs):
print("a的值是:",a)
print("b的值是:",b)
print("args的类型是{}".format(type(args)))
print("kwargs的类型是{}".format(type(kwargs)))
for arg in args:
print("args:",arg)
for key,value in kwargs.items():
print("kwargs:",key,value)
wz(1,2,3,4,{'a':10,'b':20},{'c':1,'d':2},e=10,f=20)
运行结果:
a的值是: 1
b的值是: 2
args的类型是<class ‘tuple’>
kwargs的类型是<class ‘dict’>
args: 3
args: 4
args: {‘a’: 10, ‘b’: 20}
args: {‘c’: 1, ‘d’: 2}
kwargs: e 10
kwargs: f 20
- *args,位置参数,默认参数,**kwargs
def wz(*args,b=10,a,**kwargs):
print("a的值是:",a)
print("b的值是:",b)
print("args的类型是{}".format(type(args)))
print("kwargs的类型是{}".format(type(kwargs)))
for arg in args:
print("args:",arg)
for key,value in kwargs.items():
print("kwargs:",key,value)
wz(1,2,3,4,{'a':10,'b':20},{'c':1,'d':2},e=10,f=20)
运行结果
Traceback (most recent call last):
File “E:/python_project/python_basic/function/魔法变量.py”, line 42, in
wz(1,2,3,4,{‘a’:10,‘b’:20},{‘c’:1,‘d’:2},e=10,f=20)
TypeError: wz() missing 1 required keyword-only argument: ‘a’
- *args,默认参数
def wz(*args,b=10):
print("a的值是:",b)
print("args的类型是{}".format(type(args)))
for arg in args:
print("args:",arg)
wz(1,1,2,3,b=1)
运行结果
a的值是: 1
args的类型是<class ‘tuple’>
args: 1
args: 1
args: 2
args: 3
这里可以看出,*args不会收集带关键字的参数
- 如果把*args或者默认参数,位置参数放在**kwargs之后的话,直接就会提示错误
wz(1,2,3,4,e=10,{'a':10,'b':20},{'c':1,'d':2})
然后我尝试这样传参,直接报错:Positional argument after keyword argument
意思是位置参数在关键字参数之后
赋值形式
def a(**kwargs):
print(kwargs)
content={
'name':'wz',
'age':'22',
'sex':'男'
}
a(**content)
a(kwargs=content)
a(content=content)
{‘name’: ‘wz’, ‘age’: ‘22’, ‘sex’: ‘男’}
{‘kwargs’: {‘name’: ‘wz’, ‘age’: ‘22’, ‘sex’: ‘男’}}
{‘content’: {‘name’: ‘wz’, ‘age’: ‘22’, ‘sex’: ‘男’}}
def a(**kwargs):
print(kwargs)
print(kwargs['c'])
a(**{'c':10})
a(c=10)
{‘c’: 10}
10
{‘c’: 10}
10
总结
一般写函数的时候参数排列顺序为:位置参数/默认参数,*args,**kwargs。我觉得默认参数的位置可能稍微灵活一些,可以根据具体情况自己调整,但是关键字参数一定要在最后。
如果文章中有什么影响到您的地方,可以联系我删除。如果有什么错误的地方可以跟我说或者评论在下方。