核心要点

  • 理解 def、参数传递、返回值与作用域(LEGB)

  • 能解释默认参数陷阱(可变默认值)

  • 知道函数是一等公民、可作为参数/返回值

简要回答

函数用 def 定义,调用时实参绑定到形参,按对象引用传递;查找名字遵循 LEGB;函数本身是可调用对象,支持闭包与高阶函数。

标准回答

一、定义与调用

def name(params): ... return x。调用时创建栈帧,形参获得实参引用的绑定(传对象引用,非 C 式传值/传址)。

二、作用域 LEGB

Local → Enclosing → Global → Built-in。内层可读外层,赋值则创建局部变量除非 nonlocal/global 声明。

三、默认参数

定义时求值一次——def f(a, lst=[])lst 是共享可变对象,应写 lst=None 再在函数内 lst = lst or []

四、一等公民

函数可赋值、作参数、作返回值,支撑装饰器、回调、函数式风格。ML 训练中 loss_fnoptimizer.step 皆依赖此机制。

回答思路

  • 【定义】用一句话说清「Python 函数是如何工作的」

  • 【原理】讲清关键机制或步骤(2~3 点)

  • 【例子】举一个真实项目、论文或产品中的例子

  • 【对比】与易混淆概念或替代方案比较(如有)

  • 【收尾】总结适用场景 + 一个局限或风险

延伸学习

结合侧栏延伸学习中的知识库与术语;行业背景见 AI 资讯(永久保留)。相关:资讯

常见误区

⚠️ 常见踩坑

误区一:容易答偏的地方:把「传引用」说成「传指针」;默认参数用可变对象 []/{};混淆 returnprint

追问

追问 1Python 是传值还是传引用?

准确说法是 call by object reference(传对象引用):形参与实参指向同一对象;重新绑定形参(如 x = x + 1 对不可变类型)不影响外部变量,但对可变对象原地修改(如 lst.append)会影响调用方。

追问 2闭包是什么?常见用途?

内层函数引用外层函数的变量,外层返回后内层仍持有该变量——形成闭包。用途:工厂函数、装饰器、携带状态的回调。注意循环中 lambda 捕获变量的经典坑。

追问 3*args 和 **kwargs 在函数签名里如何配合普通参数?

顺序必须是:位置参数 → 默认参数 → *args → keyword-only 参数 → **kwargs。keyword-only 参数出现在 **args 之后,强制调用方按名传参。

🔗 相似问题

同一考点的不同问法,换着练更稳

延伸学习

按主题分类的相关资源,便于系统复习