python学习
args 与 kwargs的理解
1 *args和kwargs 是python中经常使用的函数参数,代表着函数的参数数目是可变的。并且args使用时必须要在kwargs的前面,当和在函数外的时候是解包操作符,当*和在函数定义时出现时组包,*和属于PEP448规范,而PEP448,在python3中对PEP448进行了拓展新增了列表陈列式,字典陈列式, 集合陈列式,元祖陈列式而且字典陈列式可以帮助我们来实现两个字典的合并并且去掉重复的键值对
2 在定义函数中,*args与kwargs接受参数不同,*args接受 元组类型,将不定长的参数打包成元组,kwargs是接受字典类型
3 *与在函数外的区别
*在函数外属于解包操作符
a=[1,2,3]
print(*a)
1 2 3
可以实现解包
**有不同之处
a={1:2,2:3,3:4}
print(**a)
print(**a)
TypeError: keywords must be strings
为何出现这种原因,首先是能解包出来的
c={'name':'zhang','age':2}
print('name:{name},Age:{age}'.format(**c))
name:zhang,Age:2
为何formart可以解包出来
原来 **c解包出来的格式 **c=name=‘zhang’,age=2
而print无法输出的原因
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
"""
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
print函数接受的变量是*arg类型
**只能解mapping类型,就是映射数据
4 字典陈列式可以帮助我们来实现两个字典的合并并且去掉重复的键值对
a={1:2,2:3,3:4}
b={1:2,5:6,9:0}
c={**a,**b}
print(c)
{1: 2, 2: 3, 3: 4, 5: 6, 9: 0}
可以发现解包组合后的字典实现了去重
5 函数内参数问题
在函数参数中 关键字参数必须在*args后
def fun(a,*b):
print(a)
print(b)
fun(a=1,2,3,4)
SyntaxError: positional argument follows keyword argument
显示语法错误
正确的方式
def fun(a,*args,b,**kwargs):
print(a)
print(args)
print(b)
print(kwargs)
fun(1,2,3,4,w=4,d=6,b=2,c=3)
1
(2, 3, 4)
2
{‘w’: 4, ‘d’: 6, ‘c’: 3}