六、函数进阶
1. 函数的多返回值
复杂业务情况,函数可以有多个返回值,类型也不限制。
语法是 return 返回值1,返回值2,...返回值n
def test():
return 1, "python222", True
调用函数返回类型是元组tuple类型,当然我们也可以通过多个变量接收也行;
示例:
def test():
return 1, "python222", True
# 返回元组类型
result = test()
print(f"result={result},type={type(result)}")
# 通过多个变量接收
a, b, c = test()
print(a, b, c)
执行结果:
2. 函数的不定长参数
前面我们学过位置参数,关键字参数,默认值参数。 现在我们再学习一个不定长参数,主要用于不确定调用的时候会传递多少个参数的场景。
不定长参数的类型也分为位置传递 和关键字传递 两种。
不定长参数(位置传递)
我们通过元组tuple类型的 *args
来实现,具体看下实例:
def test(*args):
print(args, type(args))
test(1, "2")
test(True, 1, "2", 3.14)
test()
执行结果:
不定长参数(关键字传递)
我们通过字典dict类型的 **kwargs
来实现,具体看下实例:
def test2(**kwargs):
print(kwargs, type(kwargs))
test2(name="Jack", age=11)
test2()
执行结果:
3. 使用函数变量
Python的函数也是一种值:所有函数都是function对象,这意味着可以把函数本身赋值给变量。
示例:
# 定义计算两个参数相加的函数
def add(x, y):
return x + y
# 将add函数赋值给my_func,则my_func可以被当做add使用
my_func = add
# 调用my_func函数
print(my_func(1, 2))
输出: 3
4. 使用函数作为函数形参
有时候需要定义一个函数,该函数的大部分计算逻辑都能确定,但某些处理逻辑暂时无法确定——这意味着某些程序代码需要动态改变,如果希望调用函数时能动态传入这些代码,那么就需要在函数中定义 函数形参,这样即可在调用该函数时传入不同的函数作为参数,从而动态改变这段代码。
示例:
def test(x, y, fn):
return fn(x, y)
def add(x, y):
return x + y
def sub(x, y):
return x - y
print(test(2, 1, add))
print(test(2, 1, sub))
执行结果:
5. 使用函数作为返回值
Python还支持使用函数作为其他函数的返回值
def test(bol):
if bol:
return add
else:
return sub
def add(x, y):
return x + y
def sub(x, y):
return x - y
b1 = test(True)
print(b1, b1(1, 2))
b2 = test(False)
print(b2, b2(1, 2))
执行结果:
6. lambda匿名函数
前面我们所学的函数定义,都是有函数名的。 我们现在学的lambda函数
是没有名称的,也就是匿名函数 。 我们在只需要一次性使用的函数的时候,就可以用lambda匿名函数,简单方便快捷。
lambda匿名函数语法: lambda 传入参数:函数体
注意: 函数体只能写一行,不支持多行
def test(x, y, fn):
return fn(x, y)
def sub(x, y):
return x - y
print(test(2, 1, lambda x, y: x * y))
print(test(2, 1, sub))
执行结果: