用法
匿名函数是python语法中一种比较有趣的方法,它的用法很简单:
lambda [arg1 [,arg2,.....argn]]:expression
冒号前面传参数,后面写表达式。
- 所谓匿名函数,就是函数是没有名字的,用lambda来定义一个函数。它的优点之一也就在此,不用担心函数名冲突。
- 同时lambda 只是一个表达式,而不是一个代码块,函数体比 def 简单很多。但是也有缺点,仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 匿名函数还有一点就是他比较方便,假如需要调用一个逻辑非常简单的函数,在别的地方写一个函数在调用过来就显得比较麻烦,而用匿名函数可以直接在参数的地方定义一个匿名函数即可,也增加了代码的可读性。
高级用法
其实说是lambda的高级用法,倒不如说是函数中的高级用法,lambda本质上也是为了方便python的函数式编程,所以说它和高阶函数的连用就显得更加方便。
map
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
例如:
def f(a):
return a*a
l=[1,2,3,4,5]
print(list(map(f,l)))
就可以用匿名函数简化为:
l=[1,2,3,4,5]
print(list(map(lambda a:a*a,l)))
reduce
再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
单纯的求和使用sum就可以解决,但是如果要把序列[1, 3, 5, 7, 9]变换成整数13579,reduce就可以派上用场:
from functools import reduce##reduce不能直接调用
def fn(x, y):
return x * 10 + y
reduce(fn, [1, 3, 5, 7, 9])
13579
lambda就简化为
s=reduce(lambda a,b:a*10+b, [1, 3, 5, 7, 9])
filter
Python内建的filter()函数用于过滤序列。
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
例如,在一个list中,删掉偶数,只保留奇数,可以这么写:
list(filter(lambda n:n % 2 == 1, [1, 2, 4, 5, 6, 9, 10, 15]))
结果: [1, 5, 9, 15]
一行代码就可以写完
sorted
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。
sorted()函数是一个高阶函数,它可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:
sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
而这个key也可以用lambda来达到简单写的目的
网友评论