chore: clean repository history
This commit is contained in:
commit
e1fb2929c0
661 files changed
+167488
No files matched your search
@@ -0,0 +1,154 @@
|
||||
---
|
||||
doc_type: short
|
||||
full_text: sources/02_Anonymous_function.md
|
||||
---
|
||||
|
||||
# 02_Anonymous_function 总结
|
||||
|
||||
本文讲解 Python 中的匿名函数 `lambda`,重点说明它如何作为 `sort()` 的 `key` 回调函数,用于按自定义字段对列表元素排序。
|
||||
|
||||
## 核心内容
|
||||
|
||||
### 列表原地排序
|
||||
|
||||
Python 列表可以使用 `sort()` 方法进行原地排序:
|
||||
|
||||
```python
|
||||
s = [10, 1, 7, 3]
|
||||
s.sort()
|
||||
# [1, 3, 7, 10]
|
||||
```
|
||||
|
||||
也可以通过 `reverse=True` 进行降序排序:
|
||||
|
||||
```python
|
||||
s.sort(reverse=True)
|
||||
# [10, 7, 3, 1]
|
||||
```
|
||||
|
||||
这类简单数值列表排序很直接,但当列表元素是字典或对象时,需要指定排序依据。
|
||||
|
||||
## 使用 key 函数排序
|
||||
|
||||
对于字典列表,例如股票组合数据:
|
||||
|
||||
```python
|
||||
{'name': 'IBM', 'price': 91.1, 'shares': 50}
|
||||
```
|
||||
|
||||
如果要按股票名称排序,需要提供一个 `key` 函数:
|
||||
|
||||
```python
|
||||
def stock_name(s):
|
||||
return s['name']
|
||||
|
||||
portfolio.sort(key=stock_name)
|
||||
```
|
||||
|
||||
`sort()` 会对每个列表元素调用 `stock_name()`,并使用返回值作为排序依据。
|
||||
|
||||
这体现了 [[concepts/回调函数]] 的典型用法:调用者把一个函数传给另一个函数,由后者在合适时机调用它。
|
||||
|
||||
## 回调函数
|
||||
|
||||
文中指出,`key` 函数就是一种回调函数。`sort()` 方法会“回调”用户传入的函数,以获得每个元素的排序关键值。
|
||||
|
||||
这类函数通常有以下特点:
|
||||
|
||||
- 很短;
|
||||
- 常常只包含一行逻辑;
|
||||
- 往往只服务于一次操作;
|
||||
- 不一定值得单独命名定义。
|
||||
|
||||
因此,Python 提供了 `lambda` 作为更简洁的写法。
|
||||
|
||||
## lambda:匿名函数
|
||||
|
||||
`lambda` 可以创建一个未命名函数,用于计算单个表达式。例如:
|
||||
|
||||
```python
|
||||
portfolio.sort(key=lambda s: s['name'])
|
||||
```
|
||||
|
||||
它等价于:
|
||||
|
||||
```python
|
||||
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:按字段排序
|
||||
|
||||
读取股票组合数据后,先定义普通函数:
|
||||
|
||||
```python
|
||||
def stock_name(s):
|
||||
return s.name
|
||||
```
|
||||
|
||||
再按股票名称排序:
|
||||
|
||||
```python
|
||||
portfolio.sort(key=stock_name)
|
||||
```
|
||||
|
||||
该练习强调:`sort()` 不是直接比较整个对象,而是使用 `key` 函数返回的字段值进行比较。
|
||||
|
||||
### Exercise 7.6:使用 lambda 按字段排序
|
||||
|
||||
可以使用 `lambda` 按持股数量排序:
|
||||
|
||||
```python
|
||||
portfolio.sort(key=lambda s: s.shares)
|
||||
```
|
||||
|
||||
也可以按股票价格排序:
|
||||
|
||||
```python
|
||||
portfolio.sort(key=lambda s: s.price)
|
||||
```
|
||||
|
||||
这些例子说明,`lambda` 可以把一次性的字段提取逻辑直接写在函数调用中,避免额外定义命名函数。
|
||||
|
||||
## 关键概念
|
||||
|
||||
- lambda匿名函数:用 `lambda` 创建只包含单个表达式的匿名函数。
|
||||
- [[concepts/回调函数]]:把函数传入另一个函数,由后者在执行过程中调用。
|
||||
- 排序key函数:通过 `key` 参数指定排序依据。
|
||||
- 高阶函数:接收函数作为参数的函数,例如 `sort(key=...)`。
|
||||
- [[concepts/函数作为对象]]:Python 中函数可以赋值、传参和作为返回值使用。
|
||||
|
||||
## 总结
|
||||
|
||||
本文的核心思想是:当需要对复杂数据结构排序时,可以通过 `key` 函数指定排序依据;如果这个函数逻辑很简单且只使用一次,就可以用 `lambda` 写成匿名函数,使代码更简洁。
|
||||
|
||||
## Related Concepts
|
||||
- [[concepts/排序-key-函数]]
|
||||
- [[concepts/函数]]
|
||||
- [[concepts/列表与序列]]
|
||||
- [[concepts/Python-函数参数]]
|
||||
- [[concepts/Python-运算符与表达式]]
|
||||
- [[concepts/字典与数据建模]]
|
||||
- [[concepts/类与对象]]
|
||||
- [[concepts/绑定方法]]
|
||||
- [[concepts/闭包]]
|
||||
- [[concepts/Python-装饰器]]
|
||||
Reference in new issue
Block a user