python lambda表达式以及与内置函数的配套使用 fluent python 读书笔记3

lambda表达式又叫匿名函数,通常使用在想要临时利用某个简单功能,却又不想重新定义函数的时候。

    一:lambda表达式的用法:

>>>lambda x, y : x+y
<function <lambda> at 0x102bc1c80>

可见lambda表达式是python支持的一种语法,这个表达式的意思就是,传入x,y返回x+y。lambda后面紧跟输入的变量,冒号后面定义返回值。很多时候lambda表达式会与三元运算符连用,来实现一些简单的判断,例如:

>>>f = lambda x: 1 if x>5 else 4
>>>print(f(6))
1
>>>print(f(2))
4

    二:map,reduce,filter与lambda的配套使用:

(1)

map(function, iterable, ...)

这个函数,传入一个函数作为参数,并对所有可迭代对象中的元素使用,如下图所示:


我们就可以利用lambda表达式来执行这样的操作,例如我们想将列表中所有的元素+1

ls = [1, 2, 3, 4, 5]
print(ls)#输出为[1, 2, 3, 4, 5]
print(list(map(lambda x: x+1, ls)))#输出为[2, 3, 4, 5, 6]

(2)

filter(function, iterable)

这个函数,传入一个函数作为参数,并对所有可迭代对象中的元素使用,用来过滤,如下图所示:

例如我们想将一个列表中小于0的元素全部过滤:

ls = [1, 2, -3, 4, -5]
print(ls)#输出为[1, 2, 3, 4, 5]
print(list(filter(lambda x: x>0, ls)))#输出为[1, 2, 4]

(3)

reduce(function, iterable[, initializer])
这个函数,传入一个函数作为参数,并对所有可迭代对象中的元素进 行累计操作,如下图所示:



假如我们想用reduce来对数组进行累加操作:

from functools import reduce
ls = [1, 2, 3, 4, 5]
print(ls)#输出是[1, 2, 3, 4, 5]
result = reduce(lambda arg1, arg2: arg1 + arg2, ls)
print(result)#输出是15

    三:一些其他用法:

我在读取文件列表时,由于文件名读取后是字符串,往往排序会有一些问题,例如s_1,s_11,s_12这样的文件名会排在一起,b_2,b_21,b_24会排在一起,而我期望的是列表可以按照s_1,s_2,s_3...s_12....b_1,b_2,...b_11这样的顺序排列,即先用字母排序,再用“_”后面的数字排序,这时lambda表达式就可以排上用场了,看下面代码:

ls = ["a_1", "a_2", "a_21", "a_11", "b_1", "b_2", "b_13", "b_11", "b_21"]
sorted(ls)
输出:
['a_1', 'a_11', 'a_2', 'a_21', 'b_1', 'b_11', 'b_13', 'b_2', 'b_21']

我们期望的结果是:

['a_1', 'a_2', 'a_11', 'a_21', 'b_1', 'b_2', 'b_11', 'b_13', 'b_21']

然后利用lambda表达式:

sorted(ls, key = lambda x: (x.split("_")[0], int(x.split("_")[1])))

结果是:

['a_1', 'a_2', 'a_11', 'a_21', 'b_1', 'b_2', 'b_11', 'b_13', 'b_21']
成功!!



猜你喜欢

转载自blog.csdn.net/shaft_/article/details/79734700