函数使用进阶
函数使用进阶
高阶函数:函数也能“操作”函数
✅ 什么是一等函数?
在 Python 中,函数是“一等对象”(First-Class Object),这意味着:
- 函数可以赋值给变量;
- 函数可以作为参数传给另一个函数;
- 函数可以作为另一个函数的返回值。
支持这些特性的函数,称为“高阶函数(Higher-Order Function)”。
✅ 应用场景:灵活扩展运算逻辑
我们定义一个通用的 calc
函数,它不只做加法,而是可以接收不同的“运算函数”作为参数,从而支持多种运算。
def calc(init_value, op_func, *args, **kwargs):
items = list(args) + list(kwargs.values())
result = init_value
for item in items:
if type(item) in (int, float):
result = op_func(result, item)
return result
运算函数定义
def add(x, y): return x + y
def mul(x, y): return x * y
使用方式
print(calc(0, add, 1, 2, 3)) # 输出 6(求和)
print(calc(1, mul, 2, 3, 4)) # 输出 24(乘积)
使用 operator
标准库简化
import operator
print(calc(0, operator.add, 1, 2, 3)) # 6
print(calc(1, operator.mul, 2, 3, 4)) # 24
内置高阶函数实践
✅ map()
:映射转换
nums = [1, 2, 3]
squared = list(map(lambda x: x**2, nums))
print(squared) # [1, 4, 9]
✅ filter()
:条件筛选
nums = [1, 2, 3, 4]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]
✅ sorted()
:定制排序逻辑
words = ['apple', 'zoo', 'in', 'waxberry', 'pear']
sorted_words = sorted(words, key=len)
print(sorted_words) # ['in', 'zoo', 'pear', 'apple', 'waxberry']
最佳实践:
sorted
返回新列表(无副作用),优于list.sort()
修改原列表。
Lambda函数:简洁的“一次性”函数
✅ 定义方式
lambda 参数: 表达式
✅ 示例对比
传统写法:
def square(x): return x ** 2
print(square(5)) # 25
lambda 写法:
print((lambda x: x ** 2)(5)) # 25
✅ 配合高阶函数使用
nums = [1, 2, 3, 4]
result = list(map(lambda x: x**2, filter(lambda x: x % 2 == 0, nums)))
print(result) # [4, 16]
✅ 更复杂的例子
import functools, operator
# 一行代码实现阶乘
fac = lambda n: functools.reduce(operator.mul, range(2, n+1), 1)
# 一行代码判断质数
is_prime = lambda x: all(map(lambda d: x % d, range(2, int(x ** 0.5) + 1)))
print(fac(5)) # 120
print(is_prime(29)) # True
偏函数:锁定部分参数生成新函数
✅ 应用场景
你经常调用一个函数,总是传递同一部分参数,比如:
int('1001', base=2)
可以“偏函数化”处理,生成更简洁的接口。
✅ 实现方法
import functools
int2 = functools.partial(int, base=2)
print(int2('1001')) # 输出 9(二进制转十进制)
partial(函数, 固定参数=值)
返回一个新函数,固定部分参数。
高阶函数 vs 普通函数:比较分析
特性/能力 | 普通函数 | 高阶函数 |
---|---|---|
是否可接受函数参数 | 否 | 是 |
是否可返回函数 | 否 | 是 |
灵活性 | 低,功能固定 | 高,可通过传参改变行为 |
是否支持组合函数逻辑 | 否 | 是(如:map(filter(...)) ) |
推荐使用场景 | 简单、固定逻辑函数 | 复杂、灵活、多变的逻辑场景 |
实战:组合使用 map + filter + lambda
data = [15, 28, 33, 60, 72, 99]
# 过滤出能被3整除的数,平方处理
result = list(map(lambda x: x**2, filter(lambda x: x % 3 == 0, data)))
print(result) # [225, 900, 5184, 9801]
✅ 推荐写法:如果逻辑简单,优先使用列表推导式:
result = [x**2 for x in data if x % 3 == 0]
总结
✅ 一等函数的三种核心用法:
用法类型 | 示例 |
---|---|
函数赋值 | f = add ,f(1, 2) 等价于 add(1, 2) |
函数作为参数 | calc(0, operator.add, 1, 2, 3) |
函数作为返回值 | def outer(): return inner |
✅ 函数进阶工具一览:
技术 | 作用 |
---|---|
高阶函数 | 将函数作为参数或返回值,提高函数灵活性 |
lambda函数 | 快速定义一次性函数,适合简单逻辑 |
偏函数 | 固定部分参数生成简洁函数接口 |
map/filter/reduce | 数据批处理常用三件套,效率与可读性兼具 |
教学建议与使用原则
- 掌握高阶函数思想,但避免过度嵌套函数导致可读性下降。
- lambda 应用于简单、局部、无需复用的函数逻辑。
partial
可作为创建预配置函数的利器,常用于数据清洗与接口定制。- 优先使用标准库的函数(如 operator、functools、itertools)而不是重复造轮子。
结语:掌握函数的“高级用法”,迈入 Python 编程的新阶段!
高阶函数不是炫技,而是设计灵活、可组合、可复用代码的自然结果。掌握它,你将:
- 编写更短、更清晰、更可拓展的逻辑;
- 理解 Python 标准库背后的“函数式思维”;
- 为将来掌握函数式编程(如 mapreduce、装饰器、闭包)打下坚实基础。
函数不仅是流程的载体,更是抽象的艺术。会用函数,是入门;善用函数,是进阶!