1、默认参数:
代码如下:
def information_register(name, age, country, sex): print("---注册信息---") print("姓名:", name) print("age:", age) print("国籍:", country) print("性别:", sex) information_register("山炮", 22, "CN", "男") information_register("二狗", 21, "CN", "男") information_register("三傻", 25, "CN", "女")
以上country 这个参数 基本都 是"CN", 就像我们在网站上注册用户,像国籍这种信息,你不填写,默认就会是 中国, 这就是通过默认参数实现的,把country变成默认参数非常简单:
def information_register(name,age,sex,country="CN"): print("---注册信息---") print("姓名:", name) print("age:", age) print("国籍:", country) print("性别:", sex) information_register("山炮",22,"男") information_register("二狗",21,"男") information_register("三傻",25,"女")
只需要把创建country这个形参的时候给它传一个实参就可以:country="CN"。这样就成了默认参数,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值。另外要注意的一点就是 :我把country变成默认参数后,把他的位置放到了最后,这个是因为关键字参数不能放在位置参数前面。
2、非固定位置参数:*args
作用:接收N个位置参数,转换成元组的形式
def test(*args): # 形参必须以*开头,args参数名随便定义,但是最好按规范来,定义成args print(args) test(1, 2, 3, 4, 5) # 输入多个位置参数 # 输出结果 (1, 2, 3, 4, 5) # 多个参数转换成元组
2.1、不传值,传入列表
def test(*args): print(args) print("------data1------") test() # 如果什么都不传入的话,则输出空元组 print("------data2------") test(*[1, 2, 3, 4, 5]) # 如果在传入的列表的前面加*,输出的args = tuple([1,2,3,4,5]) print("------data3------") test([1, 2, 3, 4, 5]) # 如果再传入的列表前不加*,则列表被当做单个位置参数,所以输出的结果是元组中的一个元素 #输出结果 ------data1------ () ------data2------ (1, 2, 3, 4, 5) ------data3------ ([1, 2, 3, 4, 5],)
2.2、位置参数和非固定位置参数*args
def test(x,*args): print(x) #位置参数 print(args) #非固定参数 test(1,2,3,4,5,6) #输出结果 1 (2, 3, 4, 5, 6)
第一个实参是形参X 的值,后面的值就变成了非固定位置参数的*args的实参了
2.3、关键字参数和非固定位置参数*args
def test(x,*args): print(x) print(args) test(x=1,2,3,4,5,6) #输出结果 test(x=1, 2, 3, 4, 5, 6) ^ SyntaxError: positional argument follows keyword argument #位置参数在关键字参数后面 显然报错了,因为x=1是关键字参数,*args是位置参数,而关键字参数不能再位置参数前面的,所以报错,只要把关键字参数放在位置后面就可以了,代码如下: def test(*args,x): print(x) print(args) test(2, 3, 4, 5, 6,x=1) #输出结果 1 (2, 3, 4, 5, 6)
3、非固定关键字传参:**kwargs
作用:把N个关键字参数,转换成字典形式
def test(**kwargs): # 形参必须以**开头,kwargs参数名随便定义,但是最好按规范来,定义成kwargs print(kwargs) test(name="zhangsan", age=18) # 传入多个关键字参数 #输出结果 {'name': 'zhangsan', 'age': 18}
3.1、传入字典
def test(**kwargs): print(kwargs) test(**{"name": "zhangsan", "age": 18}) # 传入字典时,一定要在字典前面加**,否则就会报错 #输出结果 {'name': 'zhangsan', 'age': 18}
传入字典时,一定要在字典前面加**,否则就会报错验证,代码如下:
def test(**kwargs): print(kwargs) test({"name": "zhangsan", "age": 18}) #输出结果 Traceback (most recent call last): test({"name": "zhangsan", "age": 18}) TypeError: test() takes 0 positional arguments but 1 was given #报类型错误,传入的是位置参数