day3-函数的非固定参数
背景
前面我们介绍了几种固定参数,传入的参数不管形参为默认还是标准都要一一对应,如果数目不固定怎么办?
参数组
- 非固定位置参数传参(*args)
- 非固定关键字传参(**kwargs)
1.非固定位置参数传参(*args)
用法:接收N个位置参数,转换成元组的方式
def test(*args): # *表示传的实际参数是不固定的,args为形参名,最好不要改成别的名字 print(args) test(1,2,3,4,5,7,6) #传入多个位置参数 #输出 (1, 2, 3, 4, 5, 7, 6)
1.1传入列表
def test(*args): print(args) test() test(*[1,2,3,4,5,7,6]) #在传入的列表前加*,输出的结果为元组args = tuple([1,2,3,4,5,7,6]) test([1,2,3,4,5,7,6]) #在传入的列表前不加*,则列表被当做单个位置参数,所以输出的结果是元组中的一个元素 #输出 () #空元组 (1, 2, 3, 4, 5, 7, 6) ([1,2,3,4,5,7,6],)
1.2位置参数和非固定位置参数组合
def test(x,*args): print(x) #位置参数 print(args) #非固定位置参数 test(11,2,3,44,55,6,7,8,9) #输出 11 (2, 3, 44, 55, 6, 7, 8, 9)
1.3关键字参数和非固定位置参数组合
def test(x,*args): print(x) print(args) test(x=11,2,3,4,5,6) #输出 File "/usercode/file3.py", line 6 test(x=11,2,3,4,5,6) ^ SyntaxError: non-keyword arg after keyword arg #提示非关键字参数在关键字参数后面 #更正为 def test(*args,x): print(x) print(args) test(2,3,4,5,6,x=11) #输出 11 (2, 3, 4, 5, 6)
上面的报错是因为x=1是关键字参数,*args是位置参数,而关键字参数不能在位置参数前面的,所以报错,我们更正为(位置参数 关键字参数)过来就没问题了。
2.非固定关键字传参(*args)
用法:把N个关键字参数,转换成字典的方式
def test(**kwargs): # **表示传的实际参数是不固定的关键字参数,kwargs为形参名,最好不要改成别的名字 print(kwargs) print(kwargs["name"]) print(kwargs["age"]) test(name="dick",age=8) #传入多个关键字参数 #输出 {'name': 'dick', 'age': 8} #多个关键字参数转换成字典 dick 8
2.1传入字典
def test(**kwargs): print(kwargs) test(**{'name': 'dick', 'age': 8}) #在传入字典时,一定要在字典前面加**,否则就会报错 #输出 {'name': 'dick', 'age': 8}
2.2位置参数和非固定关键字参数组合
def test(name,**kwargs): #参数组一定放后面,否则报错! print(name) print(kwargs) test("dick") #1个位置参数 print("==============") test("dick",age=18,sex='M') #2个位置参数 #输出 dick {} #如果没有传入关键字参数,kwargs就是一个空字典 ============== dick {'sex': 'M', 'age': 18}
2.3非固定关键字参数和关键字及位置参数组合(参数组一定放后面,否则报错!)
def test(name,age=18,**kwargs): print(name) print(age) print(kwargs) print("第1种方式:") test("dick") #1个位置参数 print("第2种方式:") test("dick",28,sex='M',hobby='swimming') #2个位置参数,2个关键字参数 print("第3种方式:") test("dick",sex='M',hobby='swimming',age=28) #1个位置参数,3个关键字参数, age关键字参数放后面,也可以 #输出 第1种方式: dick 18 {} 第2种方式: dick 28 {'hobby': 'swimming', 'sex': 'M'} 第3种方式: dick 28 {'hobby': 'swimming', 'sex': 'M'}
2.4非固定关键字参数**kwargs和位置参数及*args组合
def test(name,*args,**kwargs): print(name) print(args) #传入非固定位置参数 print(kwargs) #传入字典 test("dick",age=18,sex='M') #输出 dick () {'age': 18, 'sex': 'M'}
小结
- 函数的参数有位置参数、关键字参数、默认参数、非固定位置参数(*args)和非固定关键字参数(**kwargs)
- 位置参数:须以正确的顺序传入参数。调用时的数量必须和声明时的一样
- 关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
- 默认参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
- 非固定位置参数(*args)和非固定关键字参数(**kwargs):本质是位置参数和关键字参数,遵循参数顺序原则:(位置参数 关键字参数)