3. 默认参数
3-1-1
def test(x,y=2):
print(x)
print(y)
# 在写形参的时候,提前赋值,等于 2 了
test(1)
--->
1
2
没有赋值给y,因为 y 是默认等于 2
3-1-2 可以赋值吗?
def test(x,y=2):
print(x)
print(y)
test(1,y=3) # 关键字调用
--->
1
3
3-1-3
def test(x,y=2):
print(x)
print(y)
test(1,3) # 位置调用
--->
1
3
# 默认参数特点:调用函数的时候,默认参数非必须传递
# 用途:
# 1. 默认安装值 比如,安装软件,默认一键安装,和自定义安装的区别
# 2. 比如连接数据库端口号
3-1-4
1. 默认安装值
def test(x,soft1=True,soft2=True):
print(x)
2. 比如连接数据库端口号
def conn(host,port=3306):
pass
4. 参数组
def test():
pass
# 前面提到的,位置参数,关键字参数,默认参数;参数定义好后,都有一个特点,调用个数超过形参,就报错,少了也不行
# 默认参数在参数调用时,可有可无
需求:实参数目不固定,形参应该如何定义?
参数组的定义:*args (变量名随意)
方式1
def test(*args):
print(args)
test(1,2,3,4,5,5)
# 形参以 *开头,定义一个变量名
方式2
def test(*args):
print(args)
test(*[1,2,4,5,5])
# *args = *[1,2,3,4,5] 会变成元组 -→ args = tuple([1,2,3,4,5])
# *代表一个功能,是一个功能代号
4-1 将* 和位置参数结合起来
def test1(x,*args):
print(x)
print(args)
test1(1,2,3,4,5,6,7)
--->
1
(2,3,4,5,6,7)
应用:函数在定义时,业务发展一段时间后,参数可能会不够,这样只能改源代码,为了避免不多传一个参数就改源代码就会用到了,以后会经常用到
元组就是 只读列表
4-2 可以传字典吗?
def test2(**kwargs):
print(kwargs)
test2(name='gabriel',age=8,sex = '?')
# name相当于 key gabriel 相当于 value;可以无限向下传
# 会将 三个 关键字参数传给 kwargs
--->
{'name': 'gabriel', 'age': 8, 'sex': '?'}
# 这就是把关键字转换成字典的方式 存放起来
# **kwargs: 把关键字参数,转换成字典的方式
4-2-1 可以跟位置参数吗?
def test2(**kwargs):
print(kwargs)
print(kwargs['name'])
print(kwargs['age'])
test2(**{'name':'gabriel','age':8})
--->
{'name': 'gabriel', 'age': 8}
gabriel
8
4-2-2 可以跟位置参数吗?
def test3(name,**kwargs):
print(name)
print(kwargs)
test3('gabriel')
--->
gabriel
{}
# name 必须指定一个值,kwargs 需要指定一个吗?
4-2-2-1
def test3(name, **kwargs):
print(name)
print(kwargs)
test3('gabriel','xxx')
# 'xxx' 是位置参数,不是关键字参数,所以会报错,相当于给 name 赋值两个
# 所以,应该用 关键字的方式去写
4-2-2-2
def test3(name,**kwargs):
print(name)
print(kwargs)
test3('gabriel',age=18000,sex='N')
--->
gabriel
{'age': 18000, 'sex': 'N'}
# 这是和位置参数结合
4-2-3 如果和默认参数加一起
参数组有两种方式
*args 接收多个参数,转成元组的形式
**kwargs 把关键字参数,转换成字典的方式
# 可以把默认参数写在后面吗?不可以!!一定要放前面! 参数组一定要往后放!!
def test4(name,age=10000,**kwargs):
print(name)
print(age)
print(kwargs)
test4('celestial',sex='N',hobby='sleep')
--->
celestial
10000
{'sex': 'N', 'hobby': 'sleep'}
4-2-3-1
def test4(name,age=9999,**kwargs):
print(name)
print(age)
print(kwargs)
test4('gabriel',sex='N',hobby='fly',age=99999999)
--->
gabriel
99999999
{'sex': 'N', 'hobby': 'fly'}
# 结果同样可行,给默认参数赋值时,默认参数可以不赋值,可以以位置参数的方式赋值,也可以关键字赋值对应
4-2-3-2
def test4(name,age=0,**kwargs):
print(name)
print(age)
print(kwargs)
test4('gabriel',99999,sex='N',hobby='sleep',age=10000)
--->
Traceback (most recent call last):
File "f:/Visual Studio Code/PyFiles/MML/Management_Project_2/blank_module_name/tobp_2.py", line 5, in <module>
test4('gabriel',99999,sex='N',hobby='sleep',age=10000)
TypeError: test4() got multiple values for argument 'age'
# 多个值给 age了,给默认参数赋值,两种方式,位置参数已经对应了,关键字参数又给对应了一遍,所以报错了
4-3 如果全部放在一起弄呢?
def test4(name,age=0,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs)
test4('gabriel',age=10000,sex='N',hobby='sleep')
--->
gabriel
10000
()
{'sex': 'N', 'hobby': 'sleep'}
# *args 接收的是位置参数,不能接收关键字参数
# *args 接收 N 个位置参数,转换成元组的形式
这里的 *args 无法接收位置参数,所以直接变为 空
sex='N',hobby='sleep' 给 kwargs 了,所以是生成字典
位置参数,不能写关键字参数后面