一、默认参数
先看下下面的代码:
1 def stu_register(name,age,country,course): 2 print("----注册学生信息------") 3 print("姓名:",name) 4 print("age:",age) 5 print("国籍:",country) 6 print("课程:",course) 7 8 stu_register("王山炮",22,"CN","python_devops") 9 stu_register("张叫春",21,"CN","linux") 10 stu_register("刘老根",25,"CN","linux")
发现 country 这个参数 基本都 是"CN", 就像我们在网站上注册用户,像国籍这种信息,你不填写,默认就会是 中国, 这就是通过默认参数实现的,把country变成默认参数非常简单。
1 def stu_register(name,age,course,country="CN"):
这样,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值。这里的country就是个默认参数。
二、参数组
之前我们传参数,都是传一个固定参数,不能多也不能少,但是如果说我们需要非固定参数怎么办呢?好吧,于是就衍生出了,以下两种传参方式:
- 非固定位置参数传参(*args)
- 非固定关键字传参(**kwargs)
下面我们就来说说这两种方式传参:
1、非固定位置参数传参
1)功能:接收N个位置参数,转换成元组的形式。
2)定义,代码如下:
1 def test(*args): #形参必须以*开头,args参数名随便定义,但是最好按规范来,定义成args 2 print(args) 3 4 test(1,2,3,4,5) #输入多个位置参数 5 6 #输出 7 (1, 2, 3, 4, 5) #多个参数转换成元组
3)传入列表
1 def test(*args): 2 print(args) 3 4 print("-------data1-----") 5 test() #如果什么都不传入的话,则输出空元组 6 print("-------data2-----") 7 test(*[1,2,3,4,5]) #如果在传入的列表的前面加*,输出的args = tuple([1,2,3,4,5]) 8 print("-------data3-----") 9 test([1,2,3,4,5]) #如果再传入的列表前不加*,则列表被当做单个位置参数,所以输出的结果是元组中的一个元素 10 11 #输出 12 -------data1----- 13 () 14 -------data2----- 15 (1, 2, 3, 4, 5) 16 -------data3----- 17 ([1, 2, 3, 4, 5],)
4)位置参数和非固定位置参数
1 def test(x,*args): 2 print(x) #位置参数 3 print(args) #非固定参数 4 5 test(1,2,3,4,5,6) 6 7 #输出 8 1 9 (2, 3, 4, 5, 6)
第1个参数x,被当做位置参数,剩下的被当做非固定位置参数
5)关键字和非固定位置参数
1 def test(x,*args): 2 print(x) 3 print(args) 4 5 test(x=1,2,3,4,5,6) 6 7 #输出 8 File "D:/PycharmProjects/pyhomework/day3/非固定参数/非关键字参数.py", line 21 9 test(x=1,2,3,4,5,6) 10 ^ 11 SyntaxError: positional argument follows keyword argument #位置参数在关键字参数后面
因为x=1是关键字参数,*args是位置参数,而关键字参数不能再位置参数前面的。
2、非固定关键字传参(**kwargs)
1)功能:把N个关键字参数,转换成字典形式
2)定义:
1 def test(**kwargs): #形参必须以**开头,kwargs参数名随便定义,但是 最好按规范来,定义成kwargs 2 print(kwargs) 3 4 test(name="maqing",age=27) #传入多个关键字参数 5 6 #输出 7 {'name': 'maqing', 'age': 27} #多个关键字参数转换成字典
3)传入字典:
1 def test(**kwargs): #形参必须以**开头,kwargs参数名随便定义,但是最好按规范来,定义成kwargs 2 print(kwargs) 3 4 test(**{"name":"maqing","age":27}) #传入多个关键字参数 5 6 #输出 7 {'name': 'maqing', 'age': 27} #多个关键字参数转换成字典
要传入字典,在传入关键字参数的前面要加上**
4)配合位置参数:
1 def test(name,**kwargs): 2 print(name) 3 print(kwargs) 4 5 print("------data1-----") 6 test("maqing") #1个位置参数 7 print("------data2------") 8 test("maqing",age=27,sex="M") #1个位置参数,两个关键字参数 9 print("------data3------") 10 test(name="maqing",age=27,sex="M") #3个关键字参数 11 12 #输出 13 ------data1----- 14 maqing #输出1个位置参数 15 {} #没有输入关键字参数,所以输出空字典 16 ------data2------ 17 maqing #第1个位置参数 18 {'age': 27, 'sex': 'M'} #剩下关键字参数,转换成1个字典 19 ------data3------ 20 maqing #第1个关键字参数 21 {'age': 27, 'sex': 'M'} #剩下的关键字参数,转换成1个字典
5)位置参数、关键字和非固定关键字参数
1 def test(name,age=27,**kwargs): 2 print(name) 3 print(age) 4 print(kwargs) 5 6 print("----------data1--------") 7 test("maqing",sex='M',hobby='tesl') 8 print("----------data2--------") 9 test("maqing",27,sex='M',hobby='tesl') 10 print("----------data3--------") 11 test("maqing",sex='M',hobby='tesl',age=27) #age关键字参数放到最后,也可以的 12 13 #输出 14 ----------data1-------- 15 maqing 16 27 #不传,显示默认参数 17 {'sex': 'M', 'hobby': 'tesl'} 18 ----------data2-------- 19 maqing 20 27 #传位置参数 21 {'sex': 'M', 'hobby': 'tesl'} 22 ----------data3-------- 23 maqing 24 27 #关键字参数,放在前后并没有影响 25 {'sex': 'M', 'hobby': 'tesl'}
6)位置参数、关键字参数、非固定位置参数和非固定关键字参数
1 def test(name,age=27,*args,**kwargs): 2 print(name) 3 print(age) 4 print(args) 5 print(kwargs) 6 7 print("-------第1种传参--------") 8 test("maqing",20,1,2,3,4,sex="m",hobby="tesla") 9 print("-------第2种传参--------") 10 test("maqing",20,*[1,2,3,4],**{'sex':"m",'hobby':"tesla"}) 11 12 #输出 13 -------第1种传参-------- 14 maqing #传name位置参数 15 20 #给age传位置参数 16 (1, 2, 3, 4) #非固定位置参数,以转换成元组 17 {'sex': 'm', 'hobby': 'tesla'} # 非固定关键字参数,转换成字典 18 -------第2种传参--------- 19 maqing 20 20 21 (1, 2, 3, 4) #以列表的形式传入,在列表前加* 22 {'sex': 'm', 'hobby': 'tesla'} #以字典的形式传入,在字典前加**