参数规则:参数列表一般顺序是,普通参数、缺省参数、可变位置参数、keyword-only参数、可变关键字参数
位置参数
- 按照参数定义传入实参
- def f(x,y,z)调用时使用f(1,2,3)
- 按照参数的定义来传入实参
- 当传入实参数量比形参数量多时,报错
关键字参数
- 使用形参的名字来传入实参,传参顺序可与定义顺序不同
- def f(x,y,z)调用时使用f(x=1,y=2,z=3)
位置参数必须在关键字参数前传入
def f(x,y,z):
print('a')
f(1,2,3)
f(x=1,y=2,z=3)
f(1,y=2,z=3)
f(x=1,2,3)#该方式报错,位置参数应在关键字参数之前
函数参数默认值
- 定义时在形参后跟一个默认值
- 参数的默认值可在未传入足够实参时,对未给定的参数赋予默认值
def add(a=4,b=5):
m = a+b
print('m:',m)
return m
add(2)
'''#输出
7
'''
可变参数
位置参数的可变参数
- 形参前使用*表示,表示可以接收多个实参
- 收集多个实参为一个tuple
def sum(*nums):
sum = 0
for i in nums:
sum += i
print(sum)
return sum
'''#输出
24
'''
关键字参数的可变参数
- 形参前使用**表示,表示可以接收多个关键字参数
- 收集的实参名称和值组成一个字典
def showconfig(**kwargs):
for k,v in kwargs.items():
print('{}:{}'.format(k,v))
#调用
showconfig(host='127.0.0.1',port='8080',user='admin')
'''#输出
host:127.0.0.1
port:8080
user:admin
'''
可变参数的混合使用
- 可变参数要放在参数列表最后
- 普通参数要放到参数列表前面
- 位置可变参数需要在关键字可变参数之前
'''
实例一:仅包含位置参数和关键字可变参数,调用时位置参数需一一对应,且不可多或少
'''
def showconfig(username,password,**kwargs):
for k,v in kwargs.items():
print('{}:{}'.format(k,v))
#调用
showconfig('admin','aa')#调用时,位置可变参数可不传
showconfig('admin','aa',host='127.0.0.1')
showconfig('admin',host='127.0.0.1')#缺少一个位置参数,运行报错
'''
实例二:位置参数、位置可变参数、关键字可变参数,进行传参时,位置参数必须对应,关键字可变参数、位置可变参数可不穿
'''
def showconfig(username,*args,**kwargs):
for k,v in kwargs.items():
print('{}:{}'.format(k,v))
#调用
showconfig('admin',host='127.0.0.1')#args为空
showconfig('admin','aa','bb',host='127.0.0.1')
showconfig(username='admin',host='127.0.0.1')
showconfig(username='admin')#args、kwargs均为空
showconfig(host='127.0.0.1')#报错,位置参数必传
'''
位置可变参数在关键字可变参数后不支持,报错
'''
def showconfig(username,password,**kwargs,*args):
for k,v in kwargs.items():
print('{}:{}'.format(k,v))
keyword-only参数
- 在一个星号参数或在一个位置可变参数后出现的普通参数
- keyword-only参数在进行传参时,必须带关键字
- 不支持在位置可变方式后def fn(**kwargs,x)
def fn(*args,x):
print(x)
print(args)
#调用
fn(3,5,x=7)
fn(3,5)#未指定关键字,报错
fn(3,5,7)#未指定关键字,报错
参数解构
- 给函数提供实参时,可以在集合类型前使用*或 ** ,把集合类型的元素解开,提取出所有元素作为参数的实参
- 非字典类型使用*解构成位置参数
- 字典类型使用**解构成关键字参数
- 提取出来的元素数目要和参数要求匹配,参数类型也要匹配
- 可解构的数据解构有list、tuple、set、dict、可迭代对象
#函数定义
def add(x,y):
return x+y
#函数调用
add(*[1,5])
add(*(1,5))
add(*{1,5})
add(**{'x':1,'y':2})
add(**{'a':1,'b':2})#报错,解构出的关键字不对应