高级: 函数多返回值
思考:如果一个函数中如果同时提供两个return会发生什么效果
def test():
return 1
return 2
num = test()
print(num)
执行代码可以发现只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执行
编程中遇到需要在函数中同时返回多个值该如何操作呢?
def test():
# 在返回多个数据时 可以使用【return 数据1,数据2,...】的方式进行多个数据返回,同时还支持不同类型数据
return 1,"2"
# 在接收函数返回多个数据时,提供的存储数据变量需要按照返回值顺序,写对应顺序的多个变量接收即可,变量与变量之间使用【逗号】分隔
x,y = test()
print(x)
print(y)
总结:
- 一个函数中可以有多个return语句,但是只要有一个return语句被执行到,那么这个函数就会结束了,因此后面的return没有什么用处
- return后面可以是元组,列表、字典等,只要是能够存储多个数据的类型,就可以一次性返回多个数据
- 如果return后面有多个数据,那么默认是元组【其实可以使用一个变量接收return返回多个数据值,但是一个变量接收的结果默认是元组】即
y = test() print(y) -------------输出结果------------- (1, '2')
高级: 函数参数种类
函数参数使用方式上的不同可以得到不同参数参数种类,函数有4种常见参数使用方式位置参数、关键字参数、缺省参数、不定长参数
位置参数
位置参数:调用函数时根据函数定义的参数位置来传递参数即定义函数时设置的形参,没有特殊的标记的称为位置参数(也就是在定义函数时提供的参数)
注意:
- 传递的参数和定义的参数的顺序及个数必须一致
def show1(x):
print(x)
show1("位置参数")
关键字参数
关键字参数:函数调用时通过“键=值”形式传递参数。即使赋值的顺序与定义顺序不一致,也会根据变量名定位到对应的形参,给形参赋值即可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求
注意:
- 函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序
def show3(x,y,z):
print(f"{x}、{y}、{z}")
# 关键字参数指的是在对位置参数赋值的时候进行操作
# 正常赋值
show3(1,2,3)
#关键字参数赋值(不用满足按照顺序赋值的方式,但是参数名一定要提供并使用,`变量名=值`)
show3(z=1,x=4,y=20)
#混合赋值(关键字参数必须在位置参数传值之后)
show3(10,z=30,y=40)
缺省参数
缺省参数:缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)
注意:
- 函数调用时,如果为缺省参数传值则修改默认参数值, 否则使用这个默认值
#比如:系统中的print函数 --》 def print(self, *args, sep=' ', end='\n', file=None) --》 end就是默认参数
def show2(x,y=10):
res = x+y
print(f"{x}+{y}的和是:{res}")
# 默认参数不赋值会使用定义时的默认值
show2(1)
# 也可以对默认参数进行赋值操作
show2(1,2)
不定长参数
不定长参数:不定长参数也叫可变参数. 用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。当调用函数时不确定参数个数时, 可以使用不定长参数。
不定长参数的类型:位置传递、关键字传递
位置传递
传进的所有参数除了1之外都会被y变量收集,它会根据传进参数的位置合并为一个元组(tuple),y是元组类型,这就是位置传递
# 【*变量名】的方式就是可变参数
def show7(x,*y):
# y是可变参数(元组)可以在使用for循环来完成
print(f"{x},{y}")
# 这里除了1之外 都是赋值给可变参数y的值
show7(1,2,3,4,5,6,7)
关键字传递
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kwargs检查。
注意:
- 参数是“键=值”形式的形式的情况下, 所有的“键=值”都会被kwargs接受, 同时会根据“键=值”组成字典
# 希望检查是否有city和job的参数
def show4(name,age,**kwargs):
if "city" in kwargs: #检查kwargs是否是需要的关键字参数
print(f"{name}、{age}、{kwargs}")
return
if "job" in kwargs:
print(f"{name}、{age}、{kwargs}")
return
print(f"{name}、{age}、{ktwargs}")
show4("zhangsan","19",city="北京")
show4("zhangsan","19",job="数仓工程师")
#可以传入不受限制的关键字参数
show4("zhangsan","19",city="北京", addr='昌平', phoneNumber=123456)
命名关键字参数:如果要限制关键字参数的名字,就可以用命名关键字参数,和关键字参数**kwargs不同
命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
# 只接收city和job作为关键字参数
def show5(name, age, *, city, job):
print(name,age,city,job)
show5("李四","20",city="北京",job="BI工程师")
# PS:命名参数在定义时可以通过设置默认值从而简化调用
def show6(name, age, *, city="杭州", job):
print(name,age,city,job)
#因为city有默认是所以调用的时候可以不传
show6("李四","20",job="数据清洗工程师")
需要注意:如果存在关键字参数必须在可变参数的后面
def show8(x,*y,**z):
# y是可变参数可以在使用for循环来完成
print(f"{x},{y},{z}")
show8(1,2,3,4,5,6,j=1,i=2)
需要注意:命名关键字参数不能和可变参数共存
def show9(x,*y,*,z,a):