函数基础
函数是可重复调用的代码块,用来封装特定功能。在 Python 中,它是构建模块化程序的核心单元。
基本语法结构
def 函数名 (参数 1, 参数 2, ...):
"""函数文档字符串(可选,说明函数功能)"""
# 函数体:实现功能的代码
执行语句
return 返回值 # 可选,没有则默认返回 None
关键注意事项
在实际开发中,有几个坑需要特别注意:
- 默认参数陷阱:避免使用列表或字典等可变对象作为默认值。如果必须用,建议初始化为
None,在函数内部再初始化(例如lst = [] if lst is None else lst),防止多次调用共享同一对象。 - 参数顺序:遵循必选参数 → 默认参数 →
*args→**kwargs的顺序,违反会直接报错。 - 可变对象传参:函数内修改传入的可变对象会影响外部变量。若需隔离影响,可传递副本(如
lst.copy())。 - 作用域声明:修改全局变量需加
global,修改嵌套变量需加nonlocal。未声明直接赋值会被识别为局部变量。 - 返回值细节:无
return的函数默认返回None;多返回值本质是元组,解包时数量必须匹配。 - 递归深度:递归必须有明确的终止条件,且深度通常限制在 1000 层左右,否则触发
RecursionError。
参数传递与返回值
参数方式对比
| 参数类型 | 特点 | 适用场景 | 核心限制 |
|---|---|---|---|
| 位置参数 | 固定数量,顺序严格 | 参数明确且少 | 少传或多传都会报错 |
| 默认参数 | 有常用默认值 | 参数有默认选项 | 必须在位置参数后定义,避免可变对象 |
| 关键字参数 | 调用时可打乱顺序 | 参数多,怕记混 | 需在位置参数之后 |
*args | 接收任意数量位置参数 | 不确定参数个数 | 需在默认参数后、**kwargs 前 |


