一、 不定长位置参数
# 在定义函数参数时,可以在形参的前面加*,该形参将获取所有的位置实参
# 它会将所有的实参保存在一个元组中
def fn(*args):
print("args=", args)
print("args type:", type(args))
# 带*形参和其他参数配合使用
def fn1(a, b, *args):
print(a)
print(b)
print(args)
# 下面这两种写法可以,但是在传实参的时候要注意
def fn2(*args, a, b):
print(a)
print(b)
print(args)
def fn3(a, *args, b):
print(a)
print(args)
print(b)
if __name__ == "__main__":
# 接收所有的位置参数
fn(1, 2, 3, 4, 5)
fn1(11, 12, 13, 14)
# fn2(21, 22, 23, 24) #这么传会报错
fn2(21, 22, a=23, b=24)
# fn3(21, 22, 23, 24) #这么传会报错
fn3(21, 22, 23, b=24)
fn运行 结果
fn1运行结果
fn2运行结果
fn3运行结果
总结:
- 带*的形参只能有一个,有多个会报错,不能识别
- 带*的形参可以和其他参数配合使用,比如和不带星的
- 带*的形参不一定要放在最后面,可以放在最前面,中间,最后。但是注意,带星的参数后的所有参数,必须以关键字参数的形式传递,否则会保错。
二、不定长关键字参数
# 带*的形参只能接收位置参数,关键字参数接收不能接收
# 如下会报错,fn传如下值是会报错的
def fn(*args):
print("args=", args)
print("args type:", type(args))
if __name__ == "__main__":
# 这样传会保存,args不能接收关键字参数
fn(1, 2, 3, 4, a=10)
运行如下:
# **形参能接收关键字参数
# 它将接收的所有关键字参数统一保存在一个字典中
def fn4(**kwargs):
print("kwargs = ", kwargs)
print(type(kwargs))
if __name__ == "__main__":
fn4(a=1, b=2, c=3)
运行结果:
总结:
- **形参只能有一个,并且必须写在所有参数的最后。
- 字典的key就是参数的名字,字典的value就是参数的值