Python函数核心在于定义、调用、返回、作用域与闭包五环节;函数是一等对象,支持赋值、传参、返回;参数传递为传对象引用;无return默认返None;闭包通过__closure__保存外部变量。
Python函数的核心原理,其实就藏在“定义—调用—返回—作用域—闭包”这五个关键环节里。掌握它们,比死记语法更能帮你写出稳定、可复用的代码。
函数不是“动作”,而是“对象”
Python中函数是一等公民,可以赋值、传参、返回、存入容器。理解这点,才能自然过渡到高阶函数和装饰器。
- 用
id(func)验证函数对象的唯一性 - 把函数名赋给变量(如
my_print = print),再调用它,效果完全一样 - 把函数放进列表:
[len, str, int],然后循环调用,体会“行为即数据”
参数传递:不是“传值”也不是“传引用”,而是“传对象引用”
所有参数都是对象的引用,但是否修改原对象,取决于对象是否可变。
- 不可变对象(int/str/tuple):函数内重新赋值不影响外部;原地方法(如
str.replace())返回新对象,也不影响原变量 - 可变对象(list/dict):用
.append()或dict[key] = val会改变原对象;但若在函数内重新赋值(如lst = [1,2]),则断开引用,不影响外部 - 技巧:想避免意外修改,函数开头加一句
data = data.copy()(list/dict)或data = data[:](切片)
return不是必须的,但None很关键
没写return的函数,默认返回None。这个隐式返回常是bug源头——比如误把list.sort()结果赋给变量,结果得到None。
- 检查函数返回值类型:
print(type(my_func())),尤其调用第三方库函数时 - 明确区分“过程函数”(只做事,返回None)和“计算函数”(返回有效结果),命名上可体现差异,如
save_to_db()vsformat_name() - 早返回优于嵌套if:遇到异常条件直接
return False或raise ValueError,别层层缩进
作用域与闭包:内部函数为何能记住外部变量?
局部变量在函数返回后通常被销毁,但闭包通过__closure__属性保留对外部自由变量的引用。
- 用
def make_adder(n): return lambda x: x + n快速生成加法器,每个返回的lambda都“记住”了自己的n - 查看闭包内容:
adder5 = make_adder(5); adder5.__closure__[0].cell_contents→ 输出5 - 常见陷阱:循环中创建多个闭包,却共用同一个变量(如for i in range(3): funcs.a
ppend(lambda: i))。解决方法是在lambda中绑定默认参数:lambda x=i: x

ppend(lambda: i))。解决方法是在lambda中绑定默认参数:






