Python的一般函数是构建程序逻辑的核心工具,其设计融合了灵活性、简洁性与功能性。作为动态语言,Python函数支持多种参数传递方式(位置参数、关键字参数、可变参数),并天然具备高阶特性,允许函数作为对象传递。其作用域规则采用LEGB分层模型,闭包机制使得函数可以携带执行环境,形成持久的数据封装。同时,Python通过lambda表达式、内置函数(如map/filter/sorted)及装饰器语法,进一步扩展了函数的能力边界。在性能层面,函数对象本身的开销较低,但嵌套层级过深或频繁调用可能影响执行效率,需结合生成器、缓存机制优化。
一、函数定义与基础结构
Python函数通过def
关键字定义,支持默认参数值和可变参数类型。函数体缩进严格,返回值通过return
语句控制,未显式返回时默认返回None
。
特性 | 语法示例 | 说明 |
---|---|---|
默认参数 | def func(a, b=0): | 参数b的默认值为0 |
可变位置参数 | def func(*args): | 接收任意数量位置参数 |
关键字参数 | def func(**kwargs): | 接收任意数量关键字参数 |
二、参数传递机制
Python采用“对象引用传递”模式,实参的本质是赋值给形参变量。不可变对象(如整数、字符串)在函数内修改不会影响外部,而可变对象(如列表、字典)的修改会直接反映到原始对象。
参数类型 | 传递方式 | 函数内修改影响 |
---|---|---|
不可变对象(int, str) | 值传递(引用传递) | 不影响外部变量 |
可变对象(list, dict) | 引用传递 | 直接影响外部变量 |
函数对象 | 引用传递 | 可被重新绑定 |
三、作用域与闭包
Python采用LEGB(Local→Enclosed→Global→Built-in)作用域规则,闭包通过嵌套函数实现。非全局变量在函数内部修改需使用nonlocal
声明,全局变量需用global
声明。
作用域类型 | 访问限制 | 修改声明 |
---|---|---|
局部作用域 | 仅函数内部可见 | 无特殊声明 |
嵌套作用域 | 外层函数可见 | nonlocal |
全局作用域 | 模块内可见 | global |
四、返回值与多值返回
Python函数可通过元组实现多值返回,本质仍是单一返回值。匿名函数(lambda)受限于单表达式,适合简单计算场景。
- 单返回值:直接
return value
- 多返回值:
return a, b, c
等价于返回元组(a, b, c)
- lambda特性:仅支持单行表达式,如
lambda x: x+1
五、高阶函数与函数式编程
高阶函数指接受函数作为参数或返回函数的函数,典型应用包括map()
、filter()
、sorted()
。自定义高阶函数可实现回调机制或策略模式。
高阶函数 | 功能描述 | 典型用法 |
---|---|---|
map(func, iter) | 对迭代对象每个元素应用函数 | list(map(str.upper, ['a','b'])) |
filter(func, iter) | 筛选满足条件的元素 | list(filter(lambda x:x%2, [1,2,3])) |
sorted(iter, key=func) | 按自定义键排序 | sorted([3,1,2], key=lambda x: -x) |
六、内置函数与标准库函数
Python提供丰富的内置函数(如len()
、sorted()
),可直接调用无需导入模块。标准库函数(如os.path.join()
)需通过import
引入,部分模块需单独加载。
函数类型 | 示例函数 | 使用条件 |
---|---|---|
内置函数 | abs() 、pow() | 直接调用,无需导入 |
标准库函数 | datetime.now() | 需import datetime |
第三方库函数 | requests.get() | 需pip install requests |
七、装饰器与函数增强
装饰器通过@decorator
语法修改函数行为,本质是函数嵌套。带参数装饰器需三层嵌套(外层接收参数,中层定义封装逻辑,内层应用装饰)。
- 无参数装饰器:直接包装原函数
- 带参数装饰器:如
@repeat(3)
需定义def repeat(n):
嵌套装饰函数 - 类装饰器:通过
__call__
方法实现,支持更复杂状态管理
函数调用存在轻微性能开销,高频调用场景建议使用轻量级函数或预计算。生成器函数通过yield
实现惰性计算,可减少内存占用。
优化方向 | 技术手段 | 适用场景 |
---|---|---|
减少函数调用 | 内联简单逻辑 | 高频微调用场景 |
发表评论