上一篇,我们简单介绍了 lambda 的特性和语法。这一篇,我们作为 lambda 函数的补充,介绍其能实现的一些复杂计算语句和常见的应用场景。

在介绍 Python 的判断逻辑时,我们介绍过一种特殊的语法 —— 三元表达式,其语法是:
res = a if condition is True else b即当条件 condition 满足时(计算结果为 True),res 的取值为 a,否则 res 的取值为 b。
由于 lambda 不能用多行代码写判断逻辑,因此三元表达式就是一种折中的措施。
设计一个判断数字是奇数还是偶数的 lambda 函数,大家先思考 3 秒再看答案:
is_odd = lambda x: "奇数" if x % 2 != 0 else "偶数"print(is_odd(3))# Output: 奇数print(is_odd(8))# Output: 偶数如果嫌一个判断不够,我们可以把多个三元表达式组合起来。由三元表达式的格式来看,这一操作其实就是把 b 替换为一个新的三元表达。
这里举例设计一个用于判断分数级别的 lambda 函数:
level = lambda s: "A" if s >= 90 else "B" if s >= 60 else "C"print(level(98))# Output: Aprint(level(75))# Output: Bprint(level(34))# Output: C在介绍函数的优雅玩法时,我们提到过,def 函数可以嵌套:Python学习笔记——从入门到报废(十五、函数更优雅(下))
那么,既然普通函数能嵌套,lambda 函数可不可以?
当然可以!
假设我们有这样一个函数:
把 x^2 看作一个整体 y = x^2,我们先用 lambda 解决 3.14 * y:
func1 = lambda y: 3.14 * y然后再解决 y = x^2 部分:
func2 = lambda x: x * x最终合起来计算就是:
func1(func2(x))然后,我们展开为嵌套 lambda:
func = lambda x: (lambda y: 3.14 * y)(x * x)print(func(3))# Output: 28.26例如,设置一个列表,列表里都是二元元组,我们需要让这些元组按下标为 1 的值升序排序:
tl = [("A", 24), ("B", 18), ("C", 12)]tl = sorted(tl, key=lambda x: x[1])print(tl)# Output: [('C', 12), ('B', 18), ('A', 24)]这一场景用法我们在介绍字典按 value 排序时提到过,大家可以回忆一下。
参考上面的元组列表排序,列表里都是字典,我们想按照字典里 key 为某个特定内容的 value 进行排序。
例如,将学生成绩保存为字典,我们想按照学生的成绩排序:
dl = [ {"name": "张三", "score": 78}, {"name": "李四", "score": 89}, {"name": "王五", "score": 65}]dl = sorted(dl, key=lambda x: x["score"])print(dl)# Output: [{'name': '王五', 'score': 65}, {'name': '张三', 'score': 78}, {'name': '李四', 'score': 89}]filter()filter() 函数的功能是用于将一个数据序列中,满足某个条件的内容留下来,其余删除:
filter(function, iterable):
function:一个函数,用于判断序列里的值是否满足某一条件; iterable:一个数据序列,例如列表和元组。
其中,function 参数要求一个函数作为参数,此时我们就可以祭出 lambda 函数。例如我们剔除一个数据序列里的偶数,只保留奇数:
ls = [2, 5, 1, 4, 6, 3, 9, 8]res = list(filter(lambda x: x % 2 == 1, ls))print(res)# Output: [5, 1, 3, 9]💡 注意:filter() 返回的是一个 filter 对象,因此需要对结果进行类型转换。
map()map() 函数的作用是对一个数据序列里的元素统一进行某一操作,避免使用循环,例如将所有数字变为平方。
map(function, iterable)
function:一个函数,用于对元素进行统一的计算; iterable:一个数据序列,例如列表和元组。
例如:
ls = [2, 5, 1, 4, 6, 3, 9, 8]res = list(map(lambda x: x ** 2, ls))print(res)# Output: [4, 25, 1, 16, 36, 9, 81, 64]💡 注意:map() 返回的是一个 map 对象,因此需要对结果进行类型转换。
往期回顾: