函数进阶
掌握 lambda 匿名函数、map/filter 高阶函数
函数进阶
掌握了函数基础后,来看看 Python 函数的高阶玩法——让代码更简洁、更 Pythonic。
学完本章你将掌握: lambda、map/filter、列表/字典推导式、装饰器入门。
一、lambda 匿名函数
一行函数,适合简单操作:
python
# 普通函数
def double(x):
return x * 2
# lambda 版本
double2 = lambda x: x * 2
print(double(5), double2(5)) # 10 10
# 常用场景:排序的 key 参数
students = [("小明", 85), ("小红", 92), ("小刚", 78)]
students.sort(key=lambda s: s[1]) # 按分数排序
print(students)
# lambda 可以接受多个参数
add = lambda a, b: a + b
print(add(3, 5)) # 8
💡 lambda vs def:lambda 只能包含一个表达式,不能有语句(if/for/return 等)。复杂逻辑还是用
def。
二、map()——批量转换
python
nums = [1, 2, 3, 4, 5]
# 每个元素翻倍
doubled = list(map(lambda x: x * 2, nums))
print(doubled) # [2, 4, 6, 8, 10]
# 转换类型
strs = list(map(str, nums))
print(strs) # ['1', '2', '3', '4', '5']
# 多个序列
a, b = [1, 2, 3], [10, 20, 30]
sums = list(map(lambda x, y: x + y, a, b))
print(sums) # [11, 22, 33]
三、filter()——过滤数据
python
nums = [1, 8, 3, 10, 5, 12, 7, 6]
# 只保留偶数
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [8, 10, 12, 6]
# 保留大于 5 的
big = list(filter(lambda x: x > 5, nums))
print(big) # [8, 10, 12, 7, 6]
# 过滤空字符串
words = ["hello", "", "world", "", "python"]
nonempty = list(filter(None, words))
print(nonempty) # ['hello', 'world', 'python']
四、列表推导式(更 Pythonic)
python
nums = list(range(1, 11))
# 代替 map
squares = [x**2 for x in nums]
# 代替 filter
evens = [x for x in nums if x % 2 == 0]
# 组合:过滤 + 转换
big_squares = [x**2 for x in nums if x > 5]
# 嵌套 if-else
labels = ["偶" if x % 2 == 0 else "奇" for x in nums]
💡 性能:列表推导式比 map/filter 快约 2 倍,代码也更容易读。在 Python 中优先用推导式。
五、字典和集合推导式
python
# 字典推导式
squares_dict = {x: x**2 for x in range(6)}
print(squares_dict) # {0:0, 1:1, 2:4, 3:9, 4:16, 5:25}
scores = {"小明": 85, "小红": 92, "小刚": 78}
passed = {k: v for k, v in scores.items() if v >= 80}
print(passed) # {'小明': 85, '小红': 92}
# 集合推导式
squares_set = {x**2 for x in range(10)}
六、装饰器入门
装饰器在不修改原函数的情况下增加功能:
python
def log_call(func):
"""记录函数调用信息"""
def wrapper(*args, **kwargs):
print(f"调用 {func.__name__}({args})")
result = func(*args, **kwargs)
print(f"返回 {result}")
return result
return wrapper
@log_call # 等价于 add = log_call(add)
def add(a, b):
return a + b
print(add(3, 5))
# 输出:
# 调用 add((3, 5))
# 返回 8
# 8
小结
lambda一行函数,适合作 sort/map/filter 的参数- 列表推导式比 map/filter 更快更易读
- 字典/集合也有推导式
- 装饰器用
@语法给函数增加功能
小练习
- 用 lambda 把
["1","2","3"]转成[1,2,3] - 用列表推导式生成 1~20 中所有能被 3 整除的数的平方
- 写一个计时装饰器,打印函数的执行时间
💬 下一章:作用域与闭包——变量在哪里生效。