Python模块详解:从基础使用到标准库应用 1. Python模块基础概念Python模块是包含Python定义和语句的文件其文件名就是模块名加上.py后缀。模块让我们能够有逻辑地组织Python代码将相关代码分配到一个模块中能让代码更好用、更易懂。模块可以包含可执行的语句以及函数定义。这些语句用于初始化模块它们只在模块第一次被导入时执行一次如果文件被作为脚本运行它们也会运行。1.1 模块的创建与使用创建一个模块非常简单只需将相关代码保存为.py文件即可。例如创建一个名为fibo.py的模块# Fibonacci数列模块 def fib(n): # 打印小于n的Fibonacci数列 a, b 0, 1 while a n: print(a, end ) a, b b, ab print() def fib2(n): # 返回小于n的Fibonacci数列列表 result [] a, b 0, 1 while a n: result.append(a) a, b b, ab return result使用这个模块时可以通过import语句导入import fibo然后就可以使用模块中的函数fibo.fib(1000) # 输出小于1000的Fibonacci数列 fibo.fib2(100) # 返回小于100的Fibonacci数列列表1.2 模块的导入方式Python提供了多种导入模块的方式基本导入import module_name导入特定函数from module_name import function_name导入所有内容from module_name import *不推荐给模块起别名import module_name as alias给函数起别名from module_name import function_name as alias注意使用from module import *会导入模块中所有不以下划线开头的名称这可能导致命名冲突通常不建议在生产代码中使用这种方式。2. Python标准库常用模块Python标准库包含了大量实用的模块以下是一些最常用的2.1 操作系统接口 - os模块os模块提供了许多与操作系统交互的函数import os # 获取当前工作目录 current_dir os.getcwd() # 改变当前工作目录 os.chdir(/path/to/directory) # 执行系统命令 os.system(mkdir today) # 获取环境变量 path os.getenv(PATH)2.2 文件通配符 - glob模块glob模块提供了从目录通配符搜索中生成文件列表的函数import glob # 列出当前目录下所有.py文件 py_files glob.glob(*.py) print(py_files)2.3 命令行参数 - sys模块sys模块用于处理命令行参数import sys # 打印所有命令行参数 print(sys.argv) # 退出程序 sys.exit()2.4 数学运算 - math模块math模块提供了数学运算函数import math # 计算平方根 print(math.sqrt(16)) # 4.0 # 计算对数 print(math.log(100, 10)) # 2.0 # 三角函数 print(math.sin(math.pi/2)) # 1.02.5 随机数 - random模块random模块用于生成随机数import random # 生成0-1之间的随机浮点数 print(random.random()) # 从序列中随机选择一个元素 print(random.choice([apple, pear, banana])) # 打乱列表顺序 items [1, 2, 3, 4, 5] random.shuffle(items) print(items)3. 数据处理常用模块3.1 日期和时间 - datetime模块datetime模块提供了日期和时间处理功能from datetime import date, datetime, timedelta # 获取当前日期 today date.today() print(today) # 2023-07-15 # 获取当前日期和时间 now datetime.now() print(now) # 2023-07-15 14:30:00.123456 # 日期运算 one_day timedelta(days1) tomorrow today one_day print(tomorrow) # 2023-07-163.2 正则表达式 - re模块re模块提供了正则表达式功能import re # 匹配字符串 text The quick brown fox jumps over the lazy dog match re.search(rfox, text) if match: print(Found:, match.group()) # Found: fox # 替换字符串 new_text re.sub(rdog, cat, text) print(new_text) # The quick brown fox jumps over the lazy cat3.3 数据压缩 - zlib模块zlib模块提供了数据压缩功能import zlib data bLorem ipsum dolor sit amet, consectetur adipiscing elit. # 压缩数据 compressed zlib.compress(data) print(len(compressed), bytes after compression) # 解压数据 decompressed zlib.decompress(compressed) print(decompressed data) # True4. 网络和互联网常用模块4.1 URL处理 - urllib模块urllib模块用于处理URLfrom urllib.request import urlopen # 读取网页内容 with urlopen(http://example.com) as response: content response.read() print(content[:100]) # 打印前100个字节4.2 JSON处理 - json模块json模块用于JSON数据的编码和解码import json # Python对象转JSON字符串 data { name: John, age: 30, city: New York } json_str json.dumps(data) print(json_str) # {name: John, age: 30, city: New York} # JSON字符串转Python对象 python_obj json.loads(json_str) print(python_obj[name]) # John4.3 电子邮件处理 - smtplib和email模块发送电子邮件import smtplib from email.mime.text import MIMEText msg MIMEText(This is the body of the email) msg[Subject] Test Email msg[From] senderexample.com msg[To] recipientexample.com # 发送邮件 with smtplib.SMTP(smtp.example.com) as server: server.login(username, password) server.send_message(msg)5. 文件和目录处理模块5.1 文件读写 - io模块io模块提供了文件处理功能import io # 写入文件 with io.open(example.txt, w, encodingutf-8) as f: f.write(This is a test file.\n) # 读取文件 with io.open(example.txt, r, encodingutf-8) as f: content f.read() print(content)5.2 路径处理 - pathlib模块pathlib模块提供了面向对象的文件系统路径操作from pathlib import Path # 创建Path对象 p Path(/path/to/file.txt) # 获取文件名 print(p.name) # file.txt # 获取文件后缀 print(p.suffix) # .txt # 检查文件是否存在 print(p.exists()) # True or False # 创建新目录 new_dir Path(/path/to/new_dir) new_dir.mkdir(exist_okTrue)6. 调试和性能分析模块6.1 调试 - pdb模块pdb模块是Python的调试器import pdb def divide(a, b): pdb.set_trace() # 设置断点 return a / b result divide(10, 0)6.2 性能分析 - timeit模块timeit模块用于测量小段代码的执行时间import timeit # 测量代码执行时间 execution_time timeit.timeit(-.join(str(n) for n in range(100)), number10000) print(execution_time) # 打印执行10000次的时间6.3 性能分析 - cProfile模块cProfile模块提供了更详细的性能分析import cProfile def slow_function(): total 0 for i in range(100000): total i return total # 分析函数性能 cProfile.run(slow_function())7. 第三方常用模块虽然Python标准库很强大但第三方模块扩展了Python的功能7.1 数据处理 - pandasimport pandas as pd # 创建DataFrame data {Name: [John, Anna, Peter], Age: [28, 24, 35]} df pd.DataFrame(data) # 显示DataFrame print(df)7.2 科学计算 - numpyimport numpy as np # 创建数组 a np.array([1, 2, 3]) b np.array([4, 5, 6]) # 数组运算 print(a b) # [5 7 9] print(np.dot(a, b)) # 32 (点积)7.3 网络请求 - requestsimport requests # 发送GET请求 response requests.get(https://api.github.com) print(response.status_code) # 200 print(response.json()) # 解析JSON响应8. 模块搜索路径和导入机制8.1 模块搜索路径当导入一个模块时Python解释器会按以下顺序搜索内置模块sys.path列表中的目录查看当前搜索路径import sys print(sys.path)8.2 自定义模块路径可以添加自定义路径import sys sys.path.append(/path/to/your/modules)8.3 重新加载模块默认情况下模块只导入一次。如果需要重新加载import importlib import mymodule # 修改mymodule后重新加载 importlib.reload(mymodule)9. 创建Python包包是一种组织模块的方式使用点式模块名。例如一个名为sound的包可能有如下结构sound/ # 顶层包 __init__.py # 初始化sound包 formats/ # 文件格式转换子包 __init__.py wavread.py wavwrite.py ... effects/ # 音效子包 __init__.py echo.py surround.py ... filters/ # 过滤器子包 __init__.py equalizer.py ...9.1init.py文件init.py文件可以是空文件也可以包含包的初始化代码或定义__all__列表# sound/effects/__init__.py __all__ [echo, surround, reverse]9.2 从包中导入有多种导入方式# 导入单个模块 import sound.effects.echo # 从包中导入模块 from sound.effects import echo # 导入模块中的函数 from sound.effects.echo import echofilter # 相对导入在包内部使用 from . import echo from .. import formats10. 模块使用的最佳实践10.1 模块组织建议保持模块短小精悍每个模块专注于一个功能使用有意义的模块名避免循环导入在模块顶部编写文档字符串使用if __name__ __main__:来包含测试代码10.2 模块文档良好的模块应该包含文档字符串This module provides functions for working with Fibonacci sequences. The module contains two main functions: - fib(n): Prints Fibonacci numbers less than n - fib2(n): Returns a list of Fibonacci numbers less than n def fib(n): Print Fibonacci numbers less than n. # 实现代码... def fib2(n): Return list of Fibonacci numbers less than n. # 实现代码...10.3 模块测试可以在模块底部添加测试代码if __name__ __main__: # 测试代码 print(fib(100)) # 0 1 1 2 3 5 8 13 21 34 55 89 print(fib2(100)) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]这样既可以直接运行模块进行测试又不会在模块被导入时执行测试代码。