一、函数定义基础
1. 函数结构
def 函数名(参数列表):
"""文档字符串(可选)"""
函数体
return 返回值 # 可选
- def关键字:函数声明的起始标识
- 命名规范:推荐使用下划线命名法(如
calculate_average
) - 文档字符串:通过
函数名.__doc__
可查看说明文档
2. 参数类型详解
- 位置参数:必须按顺序传递
def power(base, exponent):
return base ** exponent
- 关键字参数:明确指定参数名,可打乱顺序
power(exponent=3, base=2) # 输出8
- 默认参数:参数可省略时使用默认值
def greet(name="访客"):
print(f"欢迎, {name}!")
- 可变参数:处理不确定数量参数
def sum_all(*numbers): # 元组形式接收
return sum(numbers)
二、函数高级特性
1. 作用域与命名空间
- LEGB规则:查找顺序为 Local → Enclosed → Global → Built-in
- global关键字:修改全局变量
count = 0
def increment():
global count
count += 1
- nonlocal关键字:修改外层嵌套函数的变量
def outer():
x = 10
def inner():
nonlocal x
x = 20
2. 返回值机制
- 可返回多个值(实质返回元组)
def circle_cal(r):
area = 3.14*r**2
perimeter = 2*3.14*r
return area, perimeter
3. 异常处理结合
def safe_divide(a, b):
try:
return a / b
except ZeroDivisionError:
print("除数不能为零!")
return None
三、模块化编程实践
1. 模块创建规范
- 创建
math_utils.py
文件:
"""数学工具模块(文档字符串)"""
def average(*nums):
return sum(nums)/len(nums)
if __name__ == "__main__": # 模块自测试
print("模块测试:", average(85, 90, 78))
2. 模块导入方式
导入方式 | 示例 | 特点 |
---|---|---|
完整导入 | import math_utils | 需通过模块名调用 |
指定导入 | from math_utils import average | 直接使用函数名 |
别名导入 | import pandas as pd | 解决长模块名问题 |
全量导入(慎用) | from module import * | 易导致命名空间污染 |
3. 包(Package)组织
- 目录结构示例:
mypackage/
├── __init__.py
├── utils.py
└── config.py
__init__.py
文件作用:- 标识Python包目录
- 初始化包级变量
- 控制
import *
的行为
四、综合项目案例
学生管理系统模块化重构
- 数据模块(data.py):
students = [
{"id": 1001, "scores": [85, 92]},
{"id": 1002, "scores": [78, 88]}
]
. **计算模块**(calc.py):
python
def average_score(scores):
return sum(scores)/len(scores)
3. **主程序**(main.py):
python
from data import students
from calc import average_score
for stu in students:
print(f"学号{stu['id']} 均分:{average_score(stu['scores']):.1f}")
```
五、最佳实践建议
函数设计原则:
- 单一职责原则(每个函数只做一件事)
- 参数数量建议不超过5个
- 函数长度控制在50行以内
模块化优势:
- 代码复用率提升40%+(据Python官方统计)
- 调试效率提高(可单独测试模块)
- 团队协作更高效(模块分工明确)