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, a+b print() def fib2(n): # 返回小于n的Fibonacci数列列表 result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b 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(days=1) 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(r'fox', text) if match: print("Found:", match.group()) # Found: fox # 替换字符串 new_text = re.sub(r'dog', 'cat', text) print(new_text) # The quick brown fox jumps over the lazy cat3.3 数据压缩 - zlib模块
zlib模块提供了数据压缩功能:
import zlib data = b"Lorem 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模块用于处理URL:
from 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'] = 'sender@example.com' msg['To'] = 'recipient@example.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', encoding='utf-8') as f: f.write("This is a test file.\n") # 读取文件 with io.open('example.txt', 'r', encoding='utf-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_ok=True)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))', number=10000) 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 数据处理 - pandas
import pandas as pd # 创建DataFrame data = {'Name': ['John', 'Anna', 'Peter'], 'Age': [28, 24, 35]} df = pd.DataFrame(data) # 显示DataFrame print(df)7.2 科学计算 - numpy
import 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 网络请求 - requests
import 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]这样既可以直接运行模块进行测试,又不会在模块被导入时执行测试代码。