day10-函数进阶
一、函数的参数
1、位置参数和关键字参数
实参按照传递方式的不同分为位置参数和关键字参数
(1)位置参数
- 调用函数时让形参和实参一一对应(第一个实参给第一个形参赋值,第二个实参给第二个形参赋值)
- 格式:数据1,数据2,数据3,…
(2)关键字参数
- 让实参和形参通过关键字(形参名)对应
- 格式:形参名1 = 数据1(实参),形参名2 = 数据2,…
(3)关键字参数和位置参数混用
- 混用时位置参数必须在关键字参数前面
def func1(x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
# 关键字参数
func1(10, 20, 30) # x:10, y:20, z:30
func1(10, 30, 20) # x:10, y:30, z:20
# 关键字参数(位置不影响调用结果)顺序是没有关系的
func1(x=100, y=200, z=300) # x:100, y:200, z:300
# 混用
func1(10, z=30, y=20) # x:10, y:20, z:30
# func1(x=20, 40, z=40) # 报错:SyntaxError: positional argument follows keyword argument
# 原因:位置参数必须在关键字参数前面
2.参数默认值
定义函数的时候可以以“形参名 = 数据”的形式给参数赋默认值,调用函数的时候有默认值的参数可以不赋值
- 可以给每个形参都赋个默认值
- 当参数有了默认值之后,可以给他附一个新的值也可以不给他赋值
- 如果有的有默认值,有的没有默认值,有默认值的形参必须放在最后,放在没有默认值的参数后面
- 如果想跳过前面的参数,直接给后面的参数赋值,就可以使用默认值参数和关键字参数
def func2(x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
# 参数默认值
def func3(x, y, z=100): # 可以给z赋值,也可以不给他赋值
print(f'x:{x}, y:{y}, z:{z}')
func3(10, 20, 3) # x:10, y:20, z:3
func3(10, 20) # x:10, y:20, z:100
#
# def func4(x, y= 30, z):
# print(f'x:{x}, y:{y}, z:{z}')
# 报错:SyntaxError: non-default argument follows default argument
def func4(x=10, y=100, z=30):
print(f'x:{x}, y:{y}, z:{z}')
# 如果只想让y的值有变化,a和z的值依旧是10和30
func4(y=200) # x:10, y:200, z:30
3.参数类型说明
- 定义函数时可以对参数类型进行说明
- 赋默认值,默认值是什么类型,参数类型说明就是什么类型
- 形参名:数据类型
# 赋默认值
def func5(x=''):
pass
# 形参名:数据类型
def func6(x: list):
x.append()
4.不定长参数 - 主要用于参数个数不确定时
- 在形参前加*或者加**,就可以让这个参数变成不定长参数,不定长参数的形参可以同时接受多个实参
(1)带*的不定长参数
- 带*的参数会变成一个元组,元组中的元素就是对应的实参
- 注意:a.一个函数可以同时存在带*和不带的参数,如果不带的在带星号的后面,不带的参数必须使用关键字参数;b.在调用不定长参数时,即使用带星号的参数时只能用位置参数传参
- 带**的不定长参数后面必须使用关键字参数
(2)带**的不定长参数
- 带**的不定长参数会变成一个字典,调用的时候用关键字参数传参,每个关键字及时字典的key,关键字后面的数据就是字典的value
- 不带双星号的定长参数必须放在带**不定长参数的前面,否则会报错
- 带*的不定长参数和带**的不定长参数可以同时出现,带一个星号的不定长参数必须在前面
- 两个同时出现可以使函数调用时更加灵活
def