Python 编程实战:函数与模块化编程及内置模块探索

一、前言

你想要通过实战案例掌握 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.pyb.py又导入a.py,会导致报错。
相关推荐
new_zhou2 小时前
vs2019+qt工程中生成dump文件及调试
开发语言·qt·visual studio·dump调试
十铭忘2 小时前
windows系统python开源项目环境配置1
人工智能·python
Generalzy2 小时前
langchain deepagent框架
人工智能·python·langchain
栈与堆2 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦2 小时前
03-01:MQ常见问题梳理
java·开发语言
txinyu的博客2 小时前
结合游戏场景理解,互斥锁,读写锁,自旋锁,CAS / 原子变量,分段锁
开发语言·c++·游戏
阿里嘎多学长2 小时前
2026-01-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管
yuanyikangkang2 小时前
STM32 lin控制盒
开发语言