跳转到主要内容
模块 5 · 第 4 课(共 4)课程中的20/36~10 min
模块课程(4/4)

Lambda 和高阶函数

lambda 是一个匿名函数,在一行上定义。句法:

Python
lambda parametri: espressione

相当于 def,但更简洁,非常适合“一次性” 传递给其他函数的函数。

Python
quadrato = lambda x: x ** 2
quadrato(5)    # 25

# equivalent to:
def quadrato(x):
    return x ** 2

与 def 的差异

方面deflambda
名称必填匿名
身体多个声明单个表达式
返回明确隐式(表达式)
文档字符串是的没有

lambda 内没有 return:表达式的值就是结果。

何时使用 lambda

几乎总是:作为排序或选择函数的 key 参数。

Python
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']

key=len 告诉 sorted:“要比较两个元素,请使用它们的长度”。对于 自定义标准,使用 lambda:

Python
utenti = [
    {"nome": "Ada", "eta": 36},
    {"nome": "Linus", "eta": 54},
    {"nome": "Grace", "eta": 85},
]
per_eta = sorted(utenti, key=lambda u: u["eta"])
# sorted by ascending age

其他典型用途:min(...)、max(...)、filter(...)、map(...)。

Python
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n))   # -5 (maximum by absolute value)

高阶函数

如果一个函数接受一个函数作为参数,那么它就是高阶 返回一。 sorted、max、filter、map 是高阶的。拉姆达 存在正是为了使高阶调用更容易。

何时避免使用 lambda 函数

Lambda 函数对于简短的一次性操作(例如快速排序)非常有用。但是,如果您发现自己将 lambda 分配给变量(例如 double = lambda x: x * 2),出于可读性和调试目的,通常首选使用标准 def 块(因为使用 def 定义的函数在错误回溯中保留其真实名称)。

尝试一下

锻炼#python.m5.l4.e1
尝试:0加载中...

给定列表 `words = ['banana', 'kiwi', 'mela', 'fragola']`,按升序长度将其排序为 `by_length`。评估“by_length”。

正在加载编辑器...
显示提示

key=len(或 lambda p: len(p))。

3 次尝试后可用的解决方案

复习练习

锻炼#python.m5.l4.e2
尝试:0加载中...

给定元组列表 `points = [(1, 5), (3, 2), (2, 4)]`,按第二个元素升序对它们进行排序,并分配给 `by_y`。评估“by_y”。

正在加载编辑器...
显示提示

拉姆达 p: p[1]

3 次尝试后可用的解决方案

额外的挑战

锻炼#python.m5.l4.e3
尝试:0加载中...

Define an anonymous `lambda` function that takes a number `x` and returns `True` if the number is even, and `False` otherwise. Assign the lambda to the variable `is_even` and test it with `is_even(8)` as the last line.

正在加载编辑器...
显示提示

编写 is_even = lambda x: x % 2 == 0,然后调用 is_even(8)。

3 次尝试后可用的解决方案