推理基础设施 · Python1.5 lambda 表达式
01
函数与代码组织 · 5 / 6

1.5 lambda 表达式

💡 推理服务里很多"一次性小函数"——按长度截断、按规则过滤、给 key 排序

1.5 lambda 表达式

lambda = 一行函数的语法糖

add = lambda a, b: a + b
print(add(2, 3))     # 5

等价于:

def add(a, b):
    return a + b

为什么推理代码里常用

很多场景要传一个“小函数”作为参数(回调、key 函数、过滤器)。比如按 token 数排序推理请求:

requests.sort(key=lambda r: r["token_count"])

这里的 key= 必须是一个函数,lambda 写一行就够。

注意事项

  • 只能写一个表达式,不能写 if / for / return 这些语句(除非用三元)
  • 适合简单逻辑,复杂逻辑请用 def

示范

# 1. 按 token 数排序
batches = [{"id": "a", "n": 128}, {"id": "b", "n": 32}, {"id": "c", "n": 64}]
batches.sort(key=lambda x: x["n"])
print(batches)   # 按 n 从小到大

# 2. 过滤掉空 prompt
prompts = ["hi", "", "hello", "  "]
non_empty = list(filter(lambda p: p.strip() != "", prompts))
print(non_empty)

# 3. 三元表达式(lambda 里也能用)
label = lambda n: "long" if n > 100 else "short"
print(label(50), label(200))

✍️ 练习

有一个请求列表:

reqs = [
    {"id": 1, "prompt": "hi"},
    {"id": 2, "prompt": "Tell me a long story about dragons and knights"},
    {"id": 3, "prompt": "1+1=?"},
    {"id": 4, "prompt": "Explain quantum computing"},
]

sorted + lambda,按 prompt 长度从大到小排序,把排序后的列表打印出来。

💡 思路提示

点开看提示
  1. sorted(..., key=...) 里的 key 是一个函数,输入每个元素,输出用来比较的“键”
  2. 要按长度从大到小,可以 key=lambda r: len(r["prompt"]),再传 reverse=True
  3. 或者 key=lambda r: -len(r["prompt"])(取负号实现倒序)

✅ 参考解法

写不出来再打开
reqs = [
    {"id": 1, "prompt": "hi"},
    {"id": 2, "prompt": "Tell me a long story about dragons and knights"},
    {"id": 3, "prompt": "1+1=?"},
    {"id": 4, "prompt": "Explain quantum computing"},
]

ordered = sorted(reqs, key=lambda r: len(r["prompt"]), reverse=True)
print(ordered)

🔍 进阶思考

sortedlist.sort 的区别:

  • sorted 返回新列表
  • list.sort 在原列表上原地改,不返回值

框架代码里 list.sort()sorted(list) 更省内存——但当原列表不能动时只能用 sorted