Lambda表达式是现代编程语言争相引入的一种语法。如果说函数是一个有命名且易于复用的代码块,那么lambda表达式就是一个功能更灵活的代码块,可以在程序中传递和使用。转移。
回顾局部函数
get_math_func() 函数将返回三个局部函数之一。函数代码如下:
def get_math_func(type) :
# 定义三个局部函数
...
# 返回局部函数
if type == "square" :
return square
if type == "cube" :
return cube
else:
return factorial
由于局部函数的作用域默认仅停留在其封闭函数之内,因此这三个局部函数的函数名的作用太有限了,即仅仅是在程序的 if 语句中作为返回值使用。一旦离开了 get_math_func() 函数体,这三个局部函数的函数名就失去了意义。
既然局部函数的函数名没有太大的意义,那么就考虑使用 lambda 表达式来简化局部函数的写法。
使用 lambda 表达式代替局部函数
如果使用 lambda 表达式来简化 get_math_func() 函数,则可以按如下方式重写程序:
def get_math_func(type) :
result=1
# 该函数返回的是Lambda表达式
if type == 'square':
return lambda n: n * n # ①
elif type == 'cube':
return lambda n: n * n * n # ②
else:
return lambda n: (1 + n) * n / 2 # ③
# 调用get_math_func(),程序返回一个嵌套函数
math_func = get_math_func("cube")
print(math_func(5)) # 输出125
math_func = get_math_func("square")
print(math_func(5)) # 输出25
math_func = get_math_func("other")
print(math_func(5)) # 输出15.0
在上面的代码中,lambda 表达式是在return 之后的部分使用lambda 关键字定义的。 Python 要求 lambda 表达式只能是单行表达式。
注意:由于 lambda 表达式只能是单行表达式,不允许使用更复杂的函数形式,因此上面 ③ 号代码处改为计算 1+2+3+…+n 的总和。
lambda 表达式的语法格式如下:
lambda [parameter_list] : 表达式
从上面的语法格式可以看出lambda表达式的几个关键点:
lambda 表达式必须使用 lambda 关键字定义。
在lambda关键字之后,冒号左边是参数列表,可以没有参数也可以有多个参数。如果有多个参数,需要用逗号分隔,冒号右边是lambda表达式的返回值。
事实上,lambda 表达式的核心是匿名的、单体函数。因此,lambda 表达式可以写成函数。例如,对于这样的 lambda 表达式:
lambda x , y:x + y
可改写为如下函数形式:
def add(x, y): return x+ y上面定义函数时使用了简化语法:当函数体只有一行代码时,可以直接把函数体的代码放在与函数头同一行。
总的来说,函数比lambda表达式的适应性更强,lambda表达式只能创建简单的函数对象(只适用于函数体为单行的情况)。但是 lambda 表达式仍然有以下两种用途:
对于单行函数,使用lambda表达式可以省去定义函数的过程,让代码更加简洁。
对于不需要多次复用的函数,使用lambda表达式可以在使用后立即释放,提高了性能。
以下代码演示了通过 lambda 表达式调用 Python 内置的 map() 函数:
# 传入计算平方的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*x if x % 2 == 0 else 0, range(8))
print([e for e in y]) # [0, 0, 4, 0, 16, 0, 36, 0]
从上面的代码可以看出,内置的map()函数的第一个参数需要传入函数,这里传入函数的简化形式:lambda表达式,这样程序就是更简洁,性能更好。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 用python可以做哪些有趣的事情12/23
- ♥ python变量如何格式化输出11/15
- ♥ python copy()和直接赋值的区别12/22
- ♥ 如何下载python2.7并安装12/10
- ♥ python如何读取yaml文件12/12
- ♥ Python 是动态强类型的吗?12/06
内容反馈