Python函数的核心原理是“函数即对象”,使其可赋值、传参、嵌套、返回及动态生成;结合闭包与装饰器实现高阶功能,支持函数式编程重构。

Python函数的核心原理,关键不在语法多复杂,而在于理解“函数即对象”这一底层逻辑。它决定了函数能被赋值、传参、嵌套、返回,甚至动态生成——所有高级用法都从这里长出来。
函数是一等公民:不只是调用,还能被操作
在Python中,函数和字符串、列表一样,是实实在在的对象。你可以把它赋给变量、放进列表、作为参数传给另一个函数,也能作为返回值。
-
赋值:
my_print = print,之后my_print("hello")和print("hello")效果一样 -
传参:
def run(func, x): return func(x),调用run(len, "abc")返回3 - 嵌套定义:内部函数可以访问外部函数的局部变量(闭包基础)
作用域与闭包:变量在哪“活”,函数就记到哪
函数执行时,会形成自己的局部作用域;当内部函数引用了外部函数的变量,并被返回出去,就构成了闭包——那个变量会被“打包带走”,不会随外部函数结束而销毁。
- 典型例子:工厂函数
make_adder(n)返回一个加n的函数,每次调用都保留各自的n - 验证闭包:
func.__closure__不为None,且func.__closure__[0].cell_contents可查看捕获的值 - 注意:循环中创建多个闭包时,容易因共享变量出错,需用默认参数固化当前值
装饰器的本质:函数的“包装流水线”
装饰器不是语法糖,而是高阶函数 + 闭包的组合应用。@decorator 等价于 func = decorator(func),核心是“不改原函数代码,却改变其行为”。
立即学习“Python免费学习笔记(深入)”;
- 写一个通用计时装饰器:接收函数 → 定义包装函数 → 执行前后记录时间 → 返回包装函数
- 带参数的装饰器要再嵌一层:@timer(unit='ms') → 三层函数结构(外层收参数,中间收函数,内层收调用参数)
- 别忘了用
@functools.wraps(func)保持原函数的__name__、__doc__等元信息
实战案例:用函数式思维重构一段逻辑
比如处理一批用户数据,需要过滤、转换、聚合。不用for循环堆砌,而是用 map、filter、reduce 或更自然的生成器表达式 + 高阶函数组合。
- 原始写法:遍历列表,if判断,append到新列表,再遍历求和……易读但难复用
- 函数式写法:
sum(map(lambda u: u['score'] * 1.2, filter(lambda u: u['active'], users))) - 进阶:把 lambda 抽成具名函数,再用 partial 固定部分参数,让逻辑更清晰可测










