一、前言
你想要通过实战案例掌握 Python 函数、模块化编程的核心用法,同时探索常用内置模块的实际应用 ------ 这是 Python 从 "入门写脚本" 到 "进阶做项目" 的关键跨越。函数让代码复用、逻辑解耦,模块化让项目结构清晰易维护,内置模块则能直接利用 Python 官方的成熟工具(无需重复造轮子)。本文会以 "实战" 为核心,从基础到进阶,手把手带你掌握这些核心知识点。
二、函数编程实战
函数是 Python 代码的 "最小复用单元",掌握函数的定义、参数、进阶用法(闭包、装饰器)是实战的基础。
1. 函数基础:定义、参数与返回值
核心语法
python
def 函数名(参数1, 参数2=默认值, *args, **kwargs) -> 返回值类型:
"""函数文档字符串(说明功能)"""
函数逻辑
return 返回值
关键参数说明
- 默认参数 :
reverse=False,调用时可省略,提升函数易用性; - 可变参数 :
*args(接收任意位置参数)、**kwargs(接收任意关键字参数),适合参数数量不确定的场景; - 类型标注 :明确参数 / 返回值类型,提升代码可读性(如
data: list、-> list)。
2. 函数进阶:闭包与装饰器(实战高频)
(1)闭包:封装私有变量
场景:创建 "带状态的函数",比如计数器:
python
def create_counter():
"""闭包:创建计数器,封装私有变量count"""
count = 0 # 私有变量,外部无法直接访问
def counter():
nonlocal count # 声明使用外层函数的变量
count += 1
return count
return counter
# 实战调用
counter1 = create_counter()
print(counter1()) # 输出1
print(counter1()) # 输出2
counter2 = create_counter()
print(counter2()) # 输出1(独立计数器,互不影响)
(2)装饰器:增强函数功能(无侵入式)
场景:给函数添加 "日志记录""耗时统计" 功能,无需修改原函数:
python
import time
from typing import Callable
def timer_decorator(func: Callable) -> Callable:
"""装饰器:统计函数执行耗时"""
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs) # 执行原函数
end_time = time.time()
print(f"函数{func.__name__}执行耗时:{end_time - start_time:.4f}秒")
return result
return wrapper
# 应用装饰器
@timer_decorator
def heavy_calculation(n: int) -> int:
"""模拟耗时计算:求1到n的和"""
total = 0
for i in range(n + 1):
total += i
return total
# 测试调用
print(heavy_calculation(1000000))
# 输出:
# 函数heavy_calculation执行耗时:0.0452秒
# 500000500000
三、模块化编程实战
当代码量超过 100 行时,"模块化" 是必选项 ------ 将功能拆分到不同文件 / 包中,让代码结构清晰、易维护。
1. 模块基础:定义与导入
(1)创建模块文件
新建文件utils.py(工具模块),写入以下代码:
python
# utils.py - 工具模块
import datetime
def format_time(timestamp: float) -> str:
"""将时间戳转为格式化字符串"""
return datetime.datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S")
def calculate_average(numbers: list) -> float:
"""计算列表平均值(处理空列表异常)"""
if not numbers:
raise ValueError("列表不能为空")
return sum(numbers) / len(numbers)
(2)导入模块的 4 种方式
新建文件main.py,调用utils.py中的函数:
python
# main.py - 主程序
# 方式1:导入整个模块(推荐,避免命名冲突)
import utils
# 方式2:导入模块并指定别名
import utils as ut
# 方式3:导入模块中的指定函数
from utils import format_time
# 方式4:导入模块中的所有函数(不推荐,易冲突)
# from utils import *
# 调用函数
if __name__ == "__main__":
print(utils.format_time(1736540000)) # 输出格式化时间
print(ut.calculate_average([1,2,3,4])) # 输出2.5
print(format_time(1736540000)) # 输出格式化时间
2. 包的创建:多模块组织(实战项目必备)
当模块数量较多时,需要创建 "包(Package)" 来组织模块。
(1)创建包结构
python
my_project/ # 项目根目录
├── main.py # 主程序
└── data_tools/ # 自定义包
├── __init__.py # 包标识文件(不能为空,可空文件)
├── file_ops.py # 文件操作模块
└── data_ops.py # 数据处理模块
(2)编写包内模块
data_tools/file_ops.py(文件操作模块):
python
import os
def read_file(file_path: str) -> str:
"""读取文件内容(处理编码/不存在异常)"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"文件{file_path}不存在")
with open(file_path, "r", encoding="utf-8") as f:
return f.read()
def write_file(file_path: str, content: str) -> None:
"""写入文件(自动创建目录)"""
dir_name = os.path.dirname(file_path)
if dir_name and not os.path.exists(dir_name):
os.makedirs(dir_name)
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)
3. 模块导入注意事项
__name__ == "__main__":模块直接运行时执行的代码,被导入时不执行;__init__.py:Python 3.3+ 可省略,但为了兼容性和包初始化(如批量导出函数),建议保留;- 避免循环导入:如
a.py导入b.py,b.py又导入a.py,会导致报错。