You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中lambda转def函数:正确写法及原理解析

用普通函数替代lambda实现学生列表按年龄排序的原理解析

先说说你最初的代码为什么报错

你写的这段代码逻辑完全偏离了目标,执行时会直接抛出错误:

students = [("ab", "F", 60),
            ("man", "D", 21),
            ("yo", "A", 22),
            ("pope", "C", 32)]
def age(x):
    return students.index(2)
a = sorted(students, key=age, reverse=True)

for e in a:
    print(e)

问题出在students.index(2):sorted排序时会把列表里的每个学生元组逐个传给age函数的参数x,但你写的students.index(2)是在整个students列表里找值为2的元素——显然列表里根本没有这个元素,所以会直接触发ValueError。而且从逻辑上看,你要的是取每个学生的年龄,不是在列表里找某个孤立的值。

再解释正确代码的工作原理

你写出的正确代码可以简化成更直观的版本:

def age(x):
    return x[2]

它的运行逻辑是这样的:

  1. sorted函数会遍历students列表中的每一个元素,每次把一个完整的学生元组(比如("ab", "F", 60))传给age函数的参数x。
  2. x[2]是取这个元组的第三个元素(Python索引从0开始计数:第一个元素是x[0],第二个是x[1],第三个就是x[2]),也就是学生的年龄数值(比如60、21、22这些数字)。
  3. age函数返回这个年龄值,sorted就会根据这些返回的年龄值,对原列表的学生元组进行排序;reverse=True表示按年龄从大到小排列。

这个普通函数和教程里的lambda x: x[2]功能完全等价——只是lambda是匿名的短函数,用def定义的是有名字的函数,本质都是给sorted提供排序的依据:每个元素对应的键值。

内容的提问来源于stack exchange,提问作者user23546251

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:52:12