目 录CONTENT

文章目录

Python(十六) 中的 lambda 匿名函数

Python(十六) 中的 lambda 匿名函数

一、什么是 lambda 匿名函数

在 Python 中,lambda 用来定义一种简单的匿名函数。

所谓“匿名函数”,就是没有名字的函数。

普通函数通常使用 def 定义,并且有函数名:

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

lambda 函数通常写得更短:

lambda a, b: a + b

它们的作用都可以是计算两个数的和。

通俗地说:

普通函数像一个正式工具,有名字,可以反复使用。
lambda 匿名函数像一个临时小工具,常常用完就走。

二、lambda 的基本语法

基本格式:

lambda 参数列表: 表达式

可以拆开理解:

lambda:定义匿名函数的关键字
参数列表:函数接收的数据
冒号:分隔参数和表达式
表达式:函数要计算并返回的结果

示例:

lambda x: x * 2

这个匿名函数的意思是:

接收一个参数 x,返回 x * 2 的结果。

注意:lambda 函数会自动返回表达式的结果,不需要写 return

三、lambda 和 def 的对比

普通函数写法:

def double(x):
    return x * 2

print(double(5))

输出结果:

10

lambda 写法:

double = lambda x: x * 2

print(double(5))

输出结果:

10

这两个例子效果一样。

区别可以这样理解:

def:适合定义较完整、较复杂、需要反复使用的函数。
lambda:适合定义简单、临时使用的小函数。

教学提醒:

虽然 lambda 可以赋值给变量,但如果函数需要长期使用,通常更推荐用 def。

四、lambda 的调用

lambda 本身是一个函数,可以像普通函数一样调用。

1. 先赋值,再调用

add = lambda a, b: a + b

result = add(3, 5)
print(result)

输出结果:

8

这里:

lambda a, b: a + b 定义了一个匿名函数。
add 保存了这个函数。
add(3, 5) 调用了这个函数。

2. 直接定义并调用

也可以直接调用匿名函数:

result = (lambda a, b: a + b)(3, 5)

print(result)

输出结果:

8

不过这种写法初学阶段不常用,了解即可。

五、lambda 的参数

lambda 可以没有参数,也可以有一个或多个参数。

1. 没有参数

say_hello = lambda: "你好"

print(say_hello())

输出结果:

你好

2. 一个参数

square = lambda x: x * x

print(square(4))

输出结果:

16

3. 多个参数

add = lambda a, b: a + b

print(add(3, 5))

输出结果:

8

4. 默认参数

lambda 也可以使用默认参数。

power = lambda x, n=2: x ** n

print(power(3))
print(power(3, 3))

输出结果:

9
27

解释:

如果没有传 n,就默认计算平方。
如果传了 n,就按照传入的 n 计算。

六、lambda 的返回值

lambda 会自动返回冒号后面表达式的结果。

示例:

get_max = lambda a, b: a if a > b else b

print(get_max(10, 20))

输出结果:

20

这里没有写 return,但它会自动返回:

a if a > b else b

注意:

lambda 中不能直接写 return。

错误写法:

add = lambda a, b: return a + b

正确写法:

add = lambda a, b: a + b

七、lambda 只能写一个表达式

lambda 函数的冒号后面只能写一个表达式,不能写多行复杂语句。

可以写:

square = lambda x: x * x

不可以写:

func = lambda x:
    y = x * 2
    return y

也不适合写很复杂的逻辑。

如果逻辑比较复杂,应该使用 def

def process_score(score):
    if score >= 90:
        return "优秀"
    elif score >= 60:
        return "及格"
    else:
        return "不及格"

教学时可以这样讲:

lambda 适合写一眼能看懂的小功能。
复杂逻辑交给 def。

八、lambda 常见使用场景

lambda 最常见的用法不是单独使用,而是和一些函数搭配使用。

常见搭配包括:

sorted()
map()
filter()

其中 sorted() 在教学中最容易理解,也最常用。

九、lambda 和 sorted()

sorted() 可以对数据进行排序。

当我们想指定排序规则时,经常会用到 lambda

1. 按数字排序

numbers = [5, 2, 9, 1]

result = sorted(numbers)
print(result)

输出结果:

[1, 2, 5, 9]

这是普通排序。

2. 按学生成绩排序

现在有一个学生列表:

students = [
    {"name": "小明", "score": 85},
    {"name": "小红", "score": 92},
    {"name": "小刚", "score": 78}
]

如果想按照成绩排序,可以写:

students = [
    {"name": "小明", "score": 85},
    {"name": "小红", "score": 92},
    {"name": "小刚", "score": 78}
]

result = sorted(students, key=lambda student: student["score"])

print(result)

解释:

key 表示排序依据。
lambda student: student["score"] 表示取出每个学生的 score 作为排序依据。

如果要从高到低排序:

result = sorted(students, key=lambda student: student["score"], reverse=True)

3. 按字符串长度排序

words = ["python", "java", "c", "javascript"]

result = sorted(words, key=lambda word: len(word))

print(result)

输出结果:

['c', 'java', 'python', 'javascript']

解释:

lambda word: len(word)
表示用每个单词的长度作为排序依据。

十、lambda 和 map()

map() 可以把同一个操作应用到一组数据中的每一个元素。

通俗地说:

把列表中的每个数据都处理一遍。

示例:把每个数字变成它的 2 倍。

numbers = [1, 2, 3, 4]

result = map(lambda x: x * 2, numbers)

print(list(result))

输出结果:

[2, 4, 6, 8]

解释:

lambda x: x * 2 表示把每个元素乘以 2。
map 会把这个操作应用到 numbers 的每一个元素上。

也可以用 for 循环写:

numbers = [1, 2, 3, 4]
result = []

for x in numbers:
    result.append(x * 2)

print(result)

初学阶段可以先理解 for 循环,再理解 map()

十一、lambda 和 filter()

filter() 可以从一组数据中筛选出符合条件的元素。

通俗地说:

把不符合条件的数据过滤掉。

示例:筛选偶数。

numbers = [1, 2, 3, 4, 5, 6]

result = filter(lambda x: x % 2 == 0, numbers)

print(list(result))

输出结果:

[2, 4, 6]

解释:

lambda x: x % 2 == 0 表示判断 x 是否是偶数。
filter 会保留判断结果为 True 的元素。

也可以用 for 循环写:

numbers = [1, 2, 3, 4, 5, 6]
result = []

for x in numbers:
    if x % 2 == 0:
        result.append(x)

print(result)

教学建议:

初学者先掌握 for 循环写法,再学习 lambda + filter,会更容易理解。

十二、lambda 和列表推导式的对比

很多 map()filter() 搭配 lambda 的写法,也可以用列表推导式完成。

示例:把每个数乘以 2。

lambda + map 写法:

numbers = [1, 2, 3, 4]
result = list(map(lambda x: x * 2, numbers))

列表推导式写法:

numbers = [1, 2, 3, 4]
result = [x * 2 for x in numbers]

示例:筛选偶数。

lambda + filter 写法:

numbers = [1, 2, 3, 4, 5, 6]
result = list(filter(lambda x: x % 2 == 0, numbers))

列表推导式写法:

numbers = [1, 2, 3, 4, 5, 6]
result = [x for x in numbers if x % 2 == 0]

教学时可以这样讲:

lambda 很适合和 sorted 的 key 参数搭配。
map 和 filter 也能用 lambda,但很多时候列表推导式更直观。

十三、lambda 的优点

lambda 的优点主要有:

1. 写法简洁
2. 适合临时使用的小函数
3. 常用于 sorted、map、filter 等函数的参数
4. 可以让简单逻辑写得更紧凑

示例:

students = [
    {"name": "小明", "score": 85},
    {"name": "小红", "score": 92}
]

students = sorted(students, key=lambda student: student["score"])

如果不用 lambda,就要单独定义函数:

def get_score(student):
    return student["score"]

students = sorted(students, key=get_score)

两种写法都可以。

如果取值逻辑很简单,使用 lambda 会比较方便。

十四、lambda 的缺点

lambda 也有缺点:

1. 只能写一个表达式
2. 不适合复杂逻辑
3. 写得太长会降低可读性
4. 初学者容易把它写得很难懂

不推荐写法:

result = sorted(students, key=lambda s: (s["class"], -s["score"], len(s["name"])))

这种写法虽然可以运行,但对初学者来说不太容易看懂。

更清楚的写法:

def sort_rule(student):
    return student["class"], -student["score"], len(student["name"])

result = sorted(students, key=sort_rule)

教学提醒:

代码不是越短越好。
容易看懂,比少写几行更重要。

十五、常见注意事项

1. lambda 后面要写参数和冒号

正确写法:

square = lambda x: x * x

错误写法:

square = lambda x x * x

2. lambda 中不能写 return

错误写法:

add = lambda a, b: return a + b

正确写法:

add = lambda a, b: a + b

3. lambda 只能写一个表达式

适合:

lambda x: x * 2

不适合:

多行判断
循环
复杂计算过程
需要写很多中间变量的逻辑

复杂逻辑应该使用 def

4. 不要为了使用 lambda 而使用 lambda

如果普通函数更清楚,就使用普通函数。

不太推荐:

check_score = lambda score: "优秀" if score >= 90 else "及格" if score >= 60 else "不及格"

更清楚:

def check_score(score):
    if score >= 90:
        return "优秀"
    elif score >= 60:
        return "及格"
    else:
        return "不及格"

5. lambda 常用于函数参数中

最常见写法:

sorted(students, key=lambda student: student["score"])

这里的 lambda 不是单独使用,而是作为 key 参数传给 sorted()

6. lambda 也是函数

lambda 创建出来的对象也是函数。

示例:

add = lambda a, b: a + b

print(add(1, 2))
print(type(add))

输出结果中可以看到它是函数类型。

7. 注意变量名要清楚

不太清楚:

sorted(students, key=lambda x: x["score"])

更适合教学:

sorted(students, key=lambda student: student["score"])

虽然两种写法都能运行,但第二种更容易理解。

十六、课堂示例

示例 1:计算平方

square = lambda x: x * x

print(square(5))

输出结果:

25

讲解重点:

lambda x: x * x 表示接收 x,返回 x 的平方。

示例 2:计算两个数的和

add = lambda a, b: a + b

print(add(3, 5))

输出结果:

8

示例 3:求两个数中较大的一个

get_max = lambda a, b: a if a > b else b

print(get_max(10, 20))

输出结果:

20

讲解重点:

lambda 中可以使用简单的条件表达式。

示例 4:按成绩排序

students = [
    {"name": "小明", "score": 85},
    {"name": "小红", "score": 92},
    {"name": "小刚", "score": 78}
]

result = sorted(students, key=lambda student: student["score"], reverse=True)

print(result)

讲解重点:

key 指定排序依据。
lambda student: student["score"] 表示按 score 排序。
reverse=True 表示从高到低。

示例 5:筛选偶数

numbers = [1, 2, 3, 4, 5, 6]

result = list(filter(lambda x: x % 2 == 0, numbers))

print(result)

输出结果:

[2, 4, 6]

示例 6:每个数字乘以 10

numbers = [1, 2, 3, 4]

result = list(map(lambda x: x * 10, numbers))

print(result)

输出结果:

[10, 20, 30, 40]

十七、课堂练习

练习 1:写一个 lambda 求平方

要求:定义一个 lambda 函数,传入一个数字,返回它的平方。

参考代码:

square = lambda x: x * x

print(square(6))

练习 2:写一个 lambda 判断偶数

要求:传入一个数字,如果是偶数返回 True,否则返回 False。

参考代码:

is_even = lambda x: x % 2 == 0

print(is_even(8))
print(is_even(9))

练习 3:按年龄排序

要求:按照年龄从小到大排序。

参考代码:

students = [
    {"name": "小明", "age": 18},
    {"name": "小红", "age": 16},
    {"name": "小刚", "age": 17}
]

result = sorted(students, key=lambda student: student["age"])

print(result)

练习 4:筛选大于 60 的成绩

要求:从成绩列表中筛选出及格成绩。

参考代码:

scores = [45, 70, 88, 59, 100]

result = list(filter(lambda score: score >= 60, scores))

print(result)

练习 5:把名字转换成长度

要求:把姓名列表转换成对应的长度列表。

参考代码:

names = ["小明", "小红红", "张三"]

result = list(map(lambda name: len(name), names))

print(result)

十八、教学建议

讲解 lambda 匿名函数时,可以按照下面顺序:

1. 先复习 def 普通函数
2. 说明 lambda 是一种更简短的函数写法
3. 讲 lambda 的基本语法
4. 对比 lambda 和 def
5. 讲 lambda 会自动返回表达式结果
6. 重点讲 sorted(key=lambda ...)
7. 再补充 map 和 filter
8. 最后强调 lambda 不适合复杂逻辑

可以用下面的问题引导学生:

如果一个函数只用一次,还需要专门起名字吗?
如果排序时只想临时指定一个规则,能不能直接写一个小函数?
lambda 中为什么不用写 return?
为什么复杂逻辑不建议写成 lambda?

教学重点建议放在:

lambda 的基本格式
lambda 和 def 的区别
自动返回表达式结果
sorted 的 key 参数
lambda 的使用边界

map()filter() 可以作为拓展内容,学生掌握 for 循环后再讲会更顺。

十九、总结

lambda 是 Python 中用来定义匿名函数的关键字。

基本格式:

lambda 参数列表: 表达式

可以这样记:

lambda:定义一个简单函数
参数列表:函数接收的数据
表达式:函数返回的结果

lambda 的特点:

1. 没有函数名,所以叫匿名函数
2. 写法简洁
3. 会自动返回表达式结果
4. 只能写一个表达式
5. 适合临时使用的小功能

lambda 常见使用场景:

sorted() 的 key 参数
map() 批量处理数据
filter() 筛选数据

需要注意:

1. lambda 中不能写 return
2. lambda 不适合复杂逻辑
3. 代码可读性比代码短更重要
4. 长期复用或复杂函数更推荐使用 def

一句话总结:

lambda 匿名函数适合写简单、临时的小功能,尤其适合配合 sorted、map、filter 等函数使用。
0
博主关闭了当前页面的评论