Python函数本质是运行时一等对象,其行为由code、globals、closure三属性共同决定;def是语句,立即创建函数对象并绑定名称,lambda是表达式,延迟求值;闭包自由变量存于__closure__中,del无法删除;装饰器需正确使用@wraps(func)确保元信息准确。

这个标题没有实际技术信息,无法对应到具体可操作的问题或知识点。
Python 函数学习的关键不在编号或“教程”字样,而在于你当前卡在哪一步:是 def 和 lambda 的语义差异没理清?还是闭包中 nonlocal 的作用域行为让你调试失败?又或者你在用 functools.wraps 写装饰器时发现 help() 显示的函数签名不对?
真正影响实战的是这些细节:
为什么 def 定义的函数在模块导入时就执行,而 lambda 不会?
本质区别在于函数对象的创建时机和绑定方式:def 是语句,执行到它时立即生成函数对象并绑定名称;lambda 是表达式,只在被调用或赋值时求值。
常见误用:在循环里用 lambda 捕获变量,结果所有函数都引用同一个后期值(如 i 最终值)。解决方法是用默认参数固化当前值:lambda x, i=i: x + i。
立即学习“Python免费学习笔记(深入)”;
闭包里的自由变量怎么查?为什么 del 不能删掉它?
自由变量存储在函数对象的 __closure__ 属性里,每个元素是 cell 对象,其 cell_contents 才是真实值。
注意:del 只能删局部变量名,删不掉闭包引用——只要外层函数返回了内层函数,cell 就仍被持有。
验证方式:
def make_adder(x):
return lambda y: x + y
f = make_adder(10)
print(f.__closure__[0].cell_contents) # 输出 10
装饰器加了 @functools.wraps 后,__name__ 和 __doc__ 还不对?
可能原因有三个:
• 没真正调用 @functools.wraps(func)(漏写了括号)
• 把 @wraps 放在了错误位置(必须紧贴内层函数定义前)
• 装饰器本身嵌套过深,中间某层没转发 __name__
正确写法示例:
from functools import wraps
def my_dec(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
函数不是语法糖,是运行时的一等对象。它的行为由 code、globals、closure 共同决定——看懂这三个属性,比刷几百道“函数题”更能避开线上 bug。










