六、python的函数进阶
6.1 函数的多返回值
问题:如下图,写两个return语句,因为return可以退出当前函数,导致return下方的代码不执行,只能执行第一个return,那如何一个函数要有多个返回值?
解决:按照返回值的顺序,写对应顺序的多个变量接收即可,变量之间用逗号隔开,支持不同类型的数据return。
6.2 函数的传参方式
函数参数种类:位置参数、关键字参数、缺省参数、不定长参数。
6.2.1 位置参数
定义:调用函数时根据函数定义的参数位置来传递参数。
语法:函数名(实参1,实参2......)
注意:传递的实参和定义的形参的顺序及个数必须一致。
6.2.2 关键字参数
定义:函数调用时通过“键=值”形式传递参数。
语法:函数名(实参1, 实参2, 形参3 = 实参3, 形参4 = 实参4......)
,把形参作为字典的key,把实参作为字典的value,以键值对的形式传递参数。
作用:可以让函数更加清晰、容易使用,同时也解除跟位置参数那样的按顺序传递参数的要求。
注意:位置参数和关键字参数混合使用时候,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。
6.2.3 缺省参数
定义:缺省参数也叫默认参数,用于定义函数,为参数提供默认值,如果为缺省参数传值则修改默认参数值,否则使用这个默认值。
语法:def 函数名(形参1, 形参2, 形参3 = 实参3, 形参4 = 默认值......)
作用:当调用函数时没有传递参数,就会使用默认是用缺省参数对应的值。
注意:不管是函数定义和调用,所有默认参数必须写在最后面,否则会报错。
6.2.4 不定长参数
定义:不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。
作用:当调用函数时不确定参数个数时,可以使用不定长参数。
不定长参数的类型:①不定长位置参数;②不定长关键字参数。
语法:def 函数名(*args)
说明:*args作为参数,1个星号表示所接收的参数数量可以是无限的,同时参数的内容只需要单个元素即可,最后根据传进参数的位置合并为一个元组。
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递。
def user_info(*args):
print(f"args参数的类型是:{type(args)},内容是:{args}") # tuple (1, 2, 3, '小明', '男孩')
user_info(1, 2, 3, '小明', '男孩')
语法:def 函数名(**kwargs)
说明:**kwargs作为参数(全称key-word),两个星号表示所接收的参数数量可以是无限的,同时参数内容必须满足键值对,最后会根据“键=值”组成字典。
注意:参数是“键=值”形式的形式的情况下,所有的“键=值”都会被kwargs接受,同时会根据“键=值”组成字典。
def user_info(**kwargs):
print(f"args参数的类型是:{type(kwargs)},内容是:{kwargs}") # dict {name:'小王', age:11, gender:'男孩'}
user_info(name='小王', age=11, gender='男孩')
6.3 匿名函数
6.3.1 函数作为参数传递
前面一直使用接受数据类型的数据作为参数传入:①数字;②容器等。
其实函数本身也可以作为参数传入另一个函数内。
def test_func(compute): # 定义一个函数,接收另一个函数作为传入参数
result = compute(1, 2)
print(f"compute参数的类型是:{type(compute)}") # function
print(f"计算结果:{result}") # 3
def compute(x, y): # 定义一个函数,准备作为参数传入另一个函数
return x + y
test_func(compute) # 调用,并传入函数
代码流程:①由result = compute(1, 2)得知compute是函数,再由def testf_func(compute)得知compute作为参数传入test_func函数中。
②再把compute函数定义出来,就可以在test_func函数中传入compute参数,test_func函数根据传入的compute参数实现compute函数里面的计算逻辑。
③compute函数接收2个数字对其进行计算,compute函数作为参数,实质是把计算的逻辑传递作为参数给test_func函数使用。
所以这是一种计算逻辑的传递,不是非数据的传递。
不仅仅是相加,相减、相乘,任何逻辑都可以自行定义并作为函数传入。
传参方式 | 传入的本质 | 数据 | 函数的执行逻辑 |
---|---|---|---|
数据作为函数参数 | 数据 | 不确定 | 确定 |
函数作为函数参数 | 函数的执行逻辑 | 确定 | 不确定 |
6.3.2 lambda匿名函数
函数的定义方式 | 定义类型 | 注意 | 适用范围 |
---|---|---|---|
def关键字 | 定义带有名称的函数 | 有名称的函数,可以基于名称重复调用 | 重复调用且多行实现逻辑的函数体 |
lambda关键字 | 定义匿名(无名称)函数 | 无名称的匿名函数,只可临时使用一次 | 临时使用一次且只有一行实现逻辑的函数体 |
匿名函数定义语法:lambda 传入参数 : 只有一行代码的函数体
说明:①传入参数:匿名函数的形参,如:x, y 表示接收2个形式参数,形参之间用英文逗号分开。
②函数体:函数的执行逻辑,只能写一行,无法写多行代码。
举例:如果将函数作为参数传递的代码修改为lambda形式。
码字不易,如果大家觉得有用,请高抬贵手给一个赞让文章上推荐让更多的人看到吧,也可以评论提出意见让后面的文章内容越来越生动丰富。