'''
站在实参的角度上
位置传参
关键字传参
必须先按位置传参,再按关键字传参
不能给同一个变量传多个值
站在形参的角度上
位置参数:必须传,且有几个参数就传几个值
先定义位置参数,再定义默认参数
'''
def my_add(a, b):
res = a + b
return res
ret = my_add(1, b=2)
ret = my_add(b=2, a=1)
print(ret)
def classmate(name, sex='男'): # 默认参数:可以不传参数,如果不传就使用默认值,如果传了,就用传的
print('{}:{}'.format(name, sex))
classmate('alex')
定义顺序:位置参数,*args,默认参数,**kwargs
# 动态参数:可以接收,不能接受关键字传参
def sum(*args):
print(args) # args是一个元组
n = 0
for i in args:
n += i
print(n)
sum(1, 2, 3)
sum(2, 5, 7, 10)
#可接受关键字传参的动态参数
def func(**kwargs):
print(kwargs)
for k, v in kwargs.items():
print(k, v)
func(a=1, b=2, c=3)
def func1(*args, **kwargs):
print(args, kwargs)
#*args: 接受的是按照位置传参的值,组织成元组
#**kwargs:接受的是按照关键字传参的值,组织成字典
#定义顺序:先位置参数,再动态参数,再关键字参数
#定义顺序:*args必须在**kwargs之前
#定义顺序:位置参数,*args,默认参数,**kwargs
def func(*args):
print(args)
l = [1, 2, 3, 4, 5]
func(*l) #传参时,给序列加*,相当于拆包传递的可迭代对象依次传参
def func1(**kwargs):
print(kwargs)
d = {'a':1, 'b':2}
func1(**d) #给序列加**,拆包字典的value
#函数的注释
def func(a, *args, **kwargs):
'''
函数实现了什么功能
:param a:
:param args:
:param kwargs:
:return:
'''
print(a, args, kwargs)
#默认参数的陷阱
def qqxing(l = []):
l.append(1)
print(l)
qqxing() #[1]
qqxing() #[1,1]
qqxing([]) #[1]
qqxing() #[1,1,1]
qqxing() #[1,1,1,1]
#如果默认参数的值是可变数据类型,那么每次调用函数时,如果不传参,就共用这个数据资源