1. lambda 表达式基本用法在Python中,lambda表达式用来创建匿名函数,使用后得到一个函数对象( function object )。其基本使用形式是:
lambda x : op(x)
即,lambda标识符后跟出由冒号分割开的函数体,冒号左侧是函数的变量,冒号右侧是函数的具体功能。lambda表达式返回对应变量的函数值。如:
>>> func = lambda x, y : x + y
定义了一个两变量之和的函数。而使用该函数只需要根据冒号左侧的参数要求传入参数即可:
>>> func(1,2)
>>> 3
lambda表达式可以用在 Python 语言中任意需要用到函数的地方。
可以看到 lambda 表达式可以快速定义一些简单函数。相比于 def 定义,lambda更轻便。一般地,用 lambda 表达式定义一些功能简答,且不会重复使用的函数;用 def 定义功能复杂且重用性强的函数。
2. lambda 表达式常见搭配使用由于 lambda 定义形式简洁,常常和一些需要使用函数对象的功能函数搭配使用。如 reduce / filter / map / sorted。这些函数具有大致相同的调用格式:
reduce(function, iterable)
filter(function, iterable)
map(function, iterable)
sorted(iterable, cmp[key])
下面将详细介绍这些函数的基本使用以及在函数中使用 lambda 表达式。
reduce(function, iterable)
reduce函数在Python 3中已经被移出了全局函数,可以从functools模块中导入。
reduce 会对数据集合(iterable)中的元素累积用function进行处理。注意function的参数必须为2个。
>>> from functools import reduce
>>> def mul(x, y):
return x*y
>>> reduce(mul, [1, 2, 3, 4]) # 1*2*3*4
>>> 24
如果使用lambda表达式,则可以省略对mul函数的定义,直接写作:
>>> reduce(lambda x,y : x*y , [1,2,3,4])
>>>24
filter(function, iterable)
filter 函数对数据集合中的元素逐个进行判断:将元素作为参数传入function。若function返回值为True,则保留该元素;反之,则不保留。
>>> def is_odd(x):
return x % 2 == 1
>>> res = filter(is_odd, [1,2,3,4,5]) # 保留列表中的奇数元素
>>> print(list(res)) # 在Python 3中filter函数默认返回的是一个iterator对象,需要转化才能打印。
>>> [1,3,5]
# 使用 lambda 表达式
>>> filter(lambda x : x%2==1 , [1,2,3,4,5])
>>> print(list(res))
>>> [1,3,5]
map(function, iterable)
map函数会为数据集合中的元素逐个调用function,并将函数返回值按顺序组合成新的数据集合。根据function的参数个数,数据集合可以有多个。
# 函数参数只有1个
>>> def square(x):
return x**2
>>> res = map(square, [1,2,3,4])
>>> print(list(res))
>>> [1,4,9,16]
# 使用lambda表达式
>>> res = map(lambda x:x**2, [1,2,3,4])
>>> print(list(res))
>>> [1,4,9,16]
# 函数参数有多个
>>> res = map(lambda x,y : x+y, [1,2,3,4], [5,6,7,8])
>>> print(list(res))
>>> [6,8,10,12]
sorted(iterable, key, reverse)
sorted 函数是一个排序函数,能够根据key指定的关键字对复杂的数据元素进行排序,如对一个以元组为元素的列表进行排序。sorted默认返回升序排列,reverse=True时返回降序排列。
# 简单的列表排序
>>> l = [1,7,5,6,2]
>>> L = sorted(l)
>>> print(L)
>>> [1,2,5,6,7]
#复杂情形,指定排序依据
>>> insts = [('Judy', 15),('Bob', 17),('Cate',16)]
>>> Insts = sorted(insts, key = lambda x:x[1]) # 按每个元素的第2个子元素排序
>>> print(Insts)
>>> [('Judy', 15),('Cate',16),('Bob', 17)]
3. 总结本文中介绍了Python 中lambda表达式定义匿名函数的方法,以及reduce / filter / map / sorted 四个函数的基本用法,可以看到,如果能够熟练合理地将lambda表达式和这些函数结合应用,可以大大提高编程效率和代码整洁度。