Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


匿名函数lambda

在Python中有个匿名函数特性非常的便捷和有用,用关键字lambda就可以声明一个匿名函数,所以很多时候直接称呼为lambda函数。

每次介绍新特性的时候,我们都要反问什么是lambda函数呢?因为又叫匿名函数,所以是指没有声明函数名称的函数,它和平时我们定义普通函数使用def关键字不同,

lamda函数的声明语法如下:

lambda argument_list: expression  

其中,lambda是Python预留的关键字,argumentlist和expression由用户自定义,中间用冒号 '':'' 间隔。这里面argumentlist是参数列表,它的结构与Python中定义普通函数时的参数列表是一样的。而这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。

看下实际使用例子:

argumentlist可以有非常多的形式,如下的4个例子都是可以的,方法1例子中使用了a, b变量参数,方法2例子中用a=1, b=2设置默认值参数,方法3例子中用*args*位置参数,方法4例子中用**kwargs关键字参数来作为lambda函数的参数传递方式都是可以的。expression表达式里我们分别对应argumentlist里接收的参数做了各自的表达式处理。

func1 = lambda a, b: a + b  
print(f'func1: {func1(1, 2)}')

func2 = lambda a=1, b=2: a * 2  
print(f'func2: {func2()}')

func3 = lambda *args: [arg * 2 for arg in args]  
print(f'func3: {func3(3, 2)}')

func4 = lambda **kwargs: [kwargs[key] * 2 for key in kwargs]  
print(f'func4: {func4(a=3, b=2)}')

# 输出如下:
# func1: 3
# func2: 2
# func3: [6, 4]
# func4: [6, 4]
lambda多种用法

由于lambda的语法是固定的,所以本质上使用的用法也就是固定的,但是在不同的场景中可以扩展,比如有如下几种场景。

  • 最基本的,将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
lambda_func = lambda a, b: a + b  
print(f'lambda_func: {lambda_func(1, 2)}')

# 输出如下:
# lambda_func: 3
  • 将lambda函数作为其他函数的返回值,返回给调用者。

    函数的返回值也可以是函数。例如return lambda y: x+y返回一个加法函数。这时,lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。对应的,将包含嵌套函数的函数称之为外部函数。内部函数能够访问外部函数的局部变量,这个特性是闭包(Closure)编程的基础(这里我们不做详细展开)。

def add_number(x):  
    return (lambda y: x+y)

a = add_number(1)  
print(type(a))  
print(a(3))

# 输出如下:
# <class 'function'>
# 4
  • 将lambda函数作为参数传递给其他函数。

    我们可以把lambda函数作为参数传递给另一个函数,比如Python中的高阶函数,高阶函数我们都知道它们本身是可以支持接收另一个函数作为参数的。此时可以使用lambda函数快速的来做一些列表元素过滤操作。

map_result = map(lambda x:abs(x), [-1,2,-3,4,-5])  
print(f'map_result: {list(map_result)}')

from functools import reduce  
reduce_result = reduce(lambda x,y: x+y, [1,3,5,7,9])  
print(f'reduce_result: {reduce_result}')

# 输出如下:
# map_result: [1, 2, 3, 4, 5]
# reduce_result: 25
  • 将lambda函数配合if - else语句

在lambda中也可以直接使用if - else语句来做表达式判断,这个判断表达式编写的方式其实就相当于其它语言里的三元运算符,但是尽量不要编写过于复杂的判断,毕竟这样增加了代码的阅读难度。

f = lambda x: 1 if x=="a" else "none"  
print(f("a"))

# 输出如下:
# 1
  • lambda函数配合字典取值

可以直接将lambda函数传入的变量参数x,以字典取值的方式取出对应的值。

str_dict = {'a':1, 'b':2, 'c':3}  
f = lambda x: str_dict[x]  
print(f("b"))

# 输出如下:
# 2
最近的文章

路径处理库pathlib使用详解

在编程中处理文件的读写操作时免不了要和文件路径打交道,甚至有时候为了完成某些场景功能会变的有些繁琐,以前在Python中操作文件路径,我们更多的时候是使用os模块。 而到了Python3时代后,Pyt…

Python, 技术博文详细阅读
更早的文章

python之datetime模块

Python的时间管理模块中除了time模块外还有非常好用的datetime模块,但不得不说的是有一点非常令人困扰,因为在datetime模块中有一个time对象,而time模块本身还有一个函数叫ti…

Python, 技术博文详细阅读
comments powered by Disqus