Python编程思想(22):Lambda表达式

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。

《Python编程思想》总目录

《Python编程思想》专栏

现在几乎所有的现代编程语言都支持lambda表达式,如果说函数是命名的、方便复用的代码块,那么 lambda表达式则是功能更灵活的代码块,它可以在程序中被传递和调用。

1. 先来回顾一下局部函数

在前面的文章已经介绍过了局部函数,现在让我们再回顾一下:

# 定义函数,该函数会返回局部函数的计算结果
def multi_math_func(type) :
    # 定义一个计算平方的局部函数
    def square(n) :
        return n * n
    # 定义一个计算立方的局部函数
    def cube(n) :
        return n * n * n
    # 定义一个计算阶乘的局部函数
    def factorial(n) :
        result = 1
        for index in range(2, n + 1) :
            result *= index
        return result
    # 调用局部函数
    if type == "square" :
        return square       # 返回square函数
    elif type == "cube":
        return cube         # 返回cube函数 
    else:
        return factorial    # 返回factorial函数  
# 调用get_math_func(),程序返回一个嵌套函数
math_func = multi_math_func("cube") # 得到cube函数
print(math_func(7)) # 输出343
math_func = multi_math_func("square") # 得到square函数
print(math_func(3)) # 输出9
math_func = multi_math_func("other") # 得到factorial函数
print(math_func(6)) # 输出720

由于局部函数的作用域默认仅停留在其封闭函数之内,因此这3个局部函数的函数名的作用太有限了,仅仅是在程序的if语句中作为返回值使用。一旦离开了multi_math_func函数体,这3个局部函数的函数名就失去了意义。既然局部函数的函数名没有太大的意义,那么就可以考虑使用 lambda表达式来简化局部函数的写法

2. 使用lambda表达式代替局部函数

如果使用 lambda表达式来简化上面的函数,则可以将程序改写成如下形式。

示例代码:lambda_test. py

# 定义函数,该函数会返回局部函数的计算结果
def multi_math_func(type) :
    # 调用局部函数
    if type == "square" :
        return lambda n:n * n
    elif type == "cube":
        return lambda n:n * n * n
    else:
        return lambda n:n**2
# 调用get_math_func(),程序返回一个嵌套函数
math_func = multi_math_func("cube") # 得到cube函数
print(math_func(7)) # 输出343
math_func = multi_math_func("square") # 得到square函数
print(math_func(3)) # 输出9
math_func = multi_math_func("other") # 得到factorial函数
print(math_func(6)) # 输出36

从这段代码可以看出,return后面的部分使用 lambda关键字定义的就是 lambda表达式,Python要求 lambda表达式只能是单行表达式。

由于 lambda表达式只能是单行表达式,所以不允许使用更复杂的函数形式,因此无法计算斐波那契数列,所以else子句中该成了计算平方的函数。

lambda表达式的语法格式如下:

lambda [parameter1ist]:表达式

从上面的语法格式可以看出 lambda表达式的几个要点。

  • lambda表达式必须使用 lambda关键字定义;

  • 在 lambda关键字之后、冒号左边的是参数列表,可以没有参数,也可以有多个参数。如果有多个参数,则需要用逗号隔开,冒号右边是该 lambda表达式的返回值;

实际上, lambda表达式的本质就是匿名函数、而且这个匿名函数必须是单行的。因此, lambda表达式可以写成函数的形式。例如,对于如下lambda表达式。

lambda x, y: x+y

可改写为如下函数形式。

def add(x, y): return x+y

上面定义函数时使用了简化语法,当函数体只有一行代码时,可以直接把函数体的代码放在与函数头同一行。

总体来说,函数比 lambda表达式的适应性更强, lambda表达式只能创建简单的函数对象。但 lambda表达式依然有如下2个用途:

  • 对于单行函数,使用 lambda表达式可以省去定义函数的过程,让代码更加简洁;

  • 对于不需要多次复用的函数,使用 lambda表达式可以在用完之后立即释放,,提高了性能;

下面的代码演示了通过 lambda表达式来调用 Python内置的map()函数的过程

示例代码: lambda_map_test.py

# 传入计算平方的lambda表达式作为参数
x = map(lambda x: x*x , range(8))
print([e for e in x]) # [0, 1, 4, 9, 16, 25, 36, 49]
# 传入计算立方的lambda表达式作为参数
y = map(lambda x: x**3 if x % 2 == 1 else 0, range(8))
print([e for e in y]) # [0, 1, 0, 27, 0, 125, 0, 343]

正如从上面代码所看到的,内置的map函数的第一个参数需要传入函数,此处传入了函数的简化形式: lambda表达式,这样程序更加简洁,而且性能更好。

-----------------支持作者请转发本文,也可以加李宁老师微信:unitymarvel,或扫描下面二维码加微信--------

欢迎关注  极客起源  微信公众号,更多精彩视频和文章等着你哦!

猜你喜欢

转载自blog.csdn.net/nokiaguy/article/details/106936186
今日推荐