【先说一句:*args是元组,**args是字典。】
一、def myfunc(*args, a=1):合不合法
在Python2里不合法
Python2的参数顺序:必选参数→默认参数→可变参数和关键字参数
所以def myfunc(*args, a=1):不合法,因为a=1被当做了默认参数,而默认参数只能在可变参数之前。
在Python3里合法
Python3的参数顺序:必选参数→默认参数→可变参数→命名关键字参数和关键字参数
所以def myfunc(*args, a=1):合法,因为a=1被当做了命名关键字参数,而命名关键字参数正是在可变参数之后。
def myfunc(*args,a=1):
print('args=',args)
print('a=',a)
if __name__ == '__main__':
myfunc(1,2,3)
#a默认是1,使用位置参数只能传给元组args。
执行结果:
args= (1, 2, 3)
a= 1
def myfunc(*args,a=1):
print('args=',args)
print('a=',a)
if __name__ == '__main__':
myfunc(1,2,a=3)
#使用关键字参数可以传给a
执行结果:
args= (1, 2, 3)
a= 3
二、def myfunc(a=1, **args):合不合法
在Python3里也合法
def myfunc(a=1, **args):
print('a=', a)
print('args=', args)
if __name__ == '__main__':
myfunc(b=2,c=3)
执行结果:
a= 1
args= {'b': 2, 'c': 3}
def myfunc(a=1, **args):
print('a=', a)
print('args=', args)
if __name__ == '__main__':
myfunc(b=2,c=3,a=4,d=5)
执行结果:
a= 4
args= {'b': 2, 'c': 3, 'd': 5}