Files

4.1 KiB

doc_type, full_text
doc_type full_text
short sources/02_Anonymous_function.md

02_Anonymous_function 总结

本文讲解 Python 中的匿名函数 lambda,重点说明它如何作为 sort() 的 key 回调函数,用于按自定义字段对列表元素排序。

核心内容

列表原地排序

Python 列表可以使用 sort() 方法进行原地排序:

s = [10, 1, 7, 3]
s.sort()
# [1, 3, 7, 10]

也可以通过 reverse=True 进行降序排序:

s.sort(reverse=True)
# [10, 7, 3, 1]

这类简单数值列表排序很直接,但当列表元素是字典或对象时,需要指定排序依据。

使用 key 函数排序

对于字典列表,例如股票组合数据:

{'name': 'IBM', 'price': 91.1, 'shares': 50}

如果要按股票名称排序,需要提供一个 key 函数:

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

sort() 会对每个列表元素调用 stock_name(),并使用返回值作为排序依据。

这体现了 concepts/回调函数 的典型用法:调用者把一个函数传给另一个函数,由后者在合适时机调用它。

回调函数

文中指出,key 函数就是一种回调函数。sort() 方法会“回调”用户传入的函数,以获得每个元素的排序关键值。

这类函数通常有以下特点:

  • 很短;
  • 常常只包含一行逻辑;
  • 往往只服务于一次操作;
  • 不一定值得单独命名定义。

因此,Python 提供了 lambda 作为更简洁的写法。

lambda:匿名函数

lambda 可以创建一个未命名函数,用于计算单个表达式。例如:

portfolio.sort(key=lambda s: s['name'])

它等价于:

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

但 lambda 更短,尤其适合这种只在当前调用中使用的小函数。

相关主题可整理为 lambda匿名函数、concepts/函数作为对象 和 高阶函数。

lambda 的限制

lambda 在 Python 中受到较强限制:

  • 只能包含单个表达式;
  • 不能包含语句;
  • 不能写普通的 if、while 等语句结构;
  • 最常见用途是作为 sort()、sorted() 等函数的 key 参数。

因此,lambda 适合简单转换或字段提取,不适合复杂逻辑。复杂逻辑仍应使用普通 def 函数。

练习要点

Exercise 7.5:按字段排序

读取股票组合数据后,先定义普通函数:

def stock_name(s):
    return s.name

再按股票名称排序:

portfolio.sort(key=stock_name)

该练习强调:sort() 不是直接比较整个对象,而是使用 key 函数返回的字段值进行比较。

Exercise 7.6:使用 lambda 按字段排序

可以使用 lambda 按持股数量排序:

portfolio.sort(key=lambda s: s.shares)

也可以按股票价格排序:

portfolio.sort(key=lambda s: s.price)

这些例子说明,lambda 可以把一次性的字段提取逻辑直接写在函数调用中,避免额外定义命名函数。

关键概念

  • lambda匿名函数:用 lambda 创建只包含单个表达式的匿名函数。
  • concepts/回调函数:把函数传入另一个函数,由后者在执行过程中调用。
  • 排序key函数:通过 key 参数指定排序依据。
  • 高阶函数:接收函数作为参数的函数,例如 sort(key=...)。
  • concepts/函数作为对象:Python 中函数可以赋值、传参和作为返回值使用。

总结

本文的核心思想是:当需要对复杂数据结构排序时,可以通过 key 函数指定排序依据;如果这个函数逻辑很简单且只使用一次,就可以用 lambda 写成匿名函数,使代码更简洁。