文章目录
- 【5.1】函数多返回值、函数多种传参方式、匿名函数
- 一、函数多返回值
- 二、函数多种传参方式
- (一)位置参数
- (二)关键字参数
- (三)缺省参数
- (四)不定长参数
- ※、总结
- 三、匿名函数
- (一)函数作为参数传递
- (二)lambda匿名函数
【5.1】函数多返回值、函数多种传参方式、匿名函数
一、函数多返回值
如果一个函数要有多个返回值,该如何书写代码?
def test_return():return 1, "hello", Truex, y, z = test_return()print(x) # 1
print(y) # hello
print(z) # True
说明:按照返回值的顺序,写对应顺序的多个变量即可进行接收。
注意:
1.变量之间用逗号隔开;
2.支持不同类型的数据一并return。
二、函数多种传参方式
根据使用方式上的不同,函数有四种常见的参数使用方式:
- 位置参数;
- 关键字参数;
- 缺省参数;
- 不定长参数。
(一)位置参数
调用函数时根据函数定义的参数位置来传递参数。
def user_info(name, age, gender):print(f"您的名字是{name},年龄是{age},性别是{gender}")# 位置传参
user_info("Tom", 20, "男")
注意:传递的参数和定义的参数的顺序及个数必须一致。
(二)关键字参数
函数调用时通过“键=值”形式传递参数。
作用:可以让函数更加清晰、容易使用,同时也消除了参数的顺序要求。
def user_info(name, age, gender):print(f"您的名字是{name},年龄是{age},性别是{gender}")# 关键字传参
user_info(name="小明", age=20, gender="男")# 可以不按固定顺序
user_info(age=20, gender="男", name="小明")# 可以和位置参数混用,但是位置参数必须在前,且位置参数要对应参数顺序
user_info("小明", age=20, gender="男")
(三)缺省参数
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可以不传该默认参数的值。(注意:所有位置参数都必须出现在默认参数前,无论是函数定义还是调用时)
作用:当调用函数时没有传递参数,就会默认使用缺省参数对应的值。
def user_info(name, age, gender="男"):print(f"您的名字是{name},年龄是{age},性别是{gender}")user_info("Tom", 20)
user_info("Rose", 18, "女")
注意:函数调用时,如果给缺省参数传值,就用传入的值,否则默认使用缺省参数的默认值。
(四)不定长参数
不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参,即传参0个也可以)的场景。
作用:当调用函数时不能确定参数个数,可以使用不定长参数。
不定长参数的类型:
1.位置传递;
2.关键字传递。
位置传递的不定长参数
def user_info(*args):print(args)user_info("Tom") # ('Tom',)user_info("Tom", 18) # ('Tom', 18)
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递。
关键字传递的不定长参数
def user_info(**kwargs):print(kwargs)user_info(name="Tom", age=18, id=110) # {'name': 'Tom', 'age': 18, 'id': 110}
注意:参数是**“键=值”形式的情况下,所有的“键=值”都会被kwargs接受,同时会根据“键=值”组成字典**。
※、总结
位置参数
根据参数位置来传递参数。
关键字参数
1.通过“键=值”
形式传递参数,可以不限制传参顺序;
2.可以和位置参数混用,但需要把位置参数排在前。
缺省参数
1.不给缺省参数传参,则使用默认值;
2.缺省参数的传参必须在所有参数的最后。
不定长参数
1.位置传递的不定长参数以*
号标记形式参数,以元组的形式接受若干个参数。形式参数一般命名为args
(不强制,只是约定俗成的规范)。
2.关键字传递的不定长参数以**
号标记形式参数,以字典的形式接受若干个参数,形式参数一般命名为kwargs
。
三、匿名函数
(一)函数作为参数传递
在前面的函数学习中,我们一直使用的函数,都是接收数据作为参数传入,例如数字、字符串、字典、列表、元组等。
但是实际上,我们学习的函数,它自身也可以作为参数传入另一个函数内。
如下代码:
def test_func(compute):result = compute(1, 2)print(result)def compute(x, y):return x + ytest_func(compute) # 3
函数compute
作为参数,传入了test_func
函数中使用。
1.test_func
需要一个函数作为参数传入,这个函数需要接收两个数字进行计算,具体怎么计算是由这个传入的函数所决定的;
2.compute
函数接收两个数字对其进行计算,且compute
函数作为参数传递给了test_func
函数去使用;
3.最终,在test_func
函数内部,由传入的compute
函数,完成了对数字的计算操作。
所以,这是一种**“计算逻辑”的传递**,而非数据的传递。
上述代码是“两数相加”这种计算逻辑的传递。但事实上,不仅是加减乘除,任何逻辑都可以自行定义成函数并作为参数传入其他函数内。
重新审视并对比一下“函数作为参数传递”与“数据作为参数传递”,如下:
def test_func(compute):result = compute(1, 2)print(result)def compute(x, y):return x + y
可见,对于
test_func
而言,它是“要处理的数据”已经提供了,但“以怎样的逻辑对数据进行处理”并未提供。所以它实际上是不缺少数据的,缺少的是数据的执行逻辑。def add(x, y):return x + yresult = add(1, 2)
可见,对于
add
而言,它是提供了“处理逻辑”,即两个数作加法并返回,但是具体的数据并未提供。所以它实际上是不缺少数据的处理逻辑的,缺少的是具体数据。而缺什么就要将什么以参数的形式传参进来。所以前者是将函数(即封装好的逻辑体)传进来,后者是将若干具体数据传进来。
(二)lambda匿名函数
函数的定义中,
1.def
关键字,可以定义带有名称的函数;
2.lambda
关键字,可以定义匿名函数(即无名称的函数)。
有名称的函数,可以基于名称重复使用。
无名称的匿名函数,只可以临时使用一次。
语法如下:
# 匿名函数定义语法
lambda 传入参数: 函数体# (注:函数体只能是一行代码)
说明:
1.lambda
是关键字,表示定义匿名函数;
2.传入参数
表示匿名函数的形参,如:x, y
表示接受两个形参;
3.函数体
就是函数的执行逻辑,注意只能写一行代码,不能写多行代码。
如下代码:
def test_func(compute):result = compute(1, 2)print(result)def compute(x, y):return x + y
我们如果使用lambda
匿名函数的方式进行一番改写,则如下所示:
def test_func(compute):result = compute(1, 2)print(result)test_func(lambda x, y: x + y) # 3
使用def和lambda定义的函数功能完全一致,只不过lambda关键字定义的函数是匿名的,无法二次使用。
注意事项:
1.匿名函数用于临时构建一个函数、只用一次的场景。
2.匿名函数的定义中,函数体只能写一行代码,如果函数体要写多行代码,则不可用lambda匿名函数,应使用def定义带名函数。