Python 标准库(Standard Library)是 Python 语言自带的一组模块和包,提供了丰富的功能,涵盖了文件操作、网络通信、数据处理、系统交互等常见任务。这些模块和包无需额外安装,可以直接导入使用。
os
、sys
)、数学计算(math
)、日期时间处理(datetime
)等。os
和 shutil
模块管理文件和目录。json
或 csv
模块解析和生成数据文件。urllib
或 http.client
发送 HTTP 请求。threading
或 multiprocessing
实现并发。urllib
在 Python 2 和 3 中的拆分)。xml.etree.ElementTree
)可能不如第三方库(如 lxml
)高效。import os
from datetime import datetime
# 文件操作:列出当前目录内容
print(os.listdir('.'))
# 日期处理:获取当前时间并格式化
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))
输出示例:
['main.py', 'data.txt']
2023-10-20 14:30:00
内置模块是Python解释器自带的模块,无需额外安装即可使用。包是一种特殊的模块,包含多个模块或子包,通常以目录形式存在,并包含__init__.py
文件。
os
、sys
、math
等)。__init__.py
:Python 3.3+中可省略,但显式声明包结构更规范。from . import module
)。import math
print(math.sqrt(16)) # 输出: 4.0
my_package/
__init__.py
module1.py
subpackage/
__init__.py
module2.py
# my_package/module1.py
from .subpackage import module2
Python标准库版本兼容性指的是在不同Python版本中,标准库模块和功能的可用性和行为一致性。随着Python版本更新,部分标准库模块可能被弃用(deprecated)、移除(removed)或修改行为。
pathlib
在Python 3.4+才成为标准库)import sys
# 检查Python版本
if sys.version_info < (3, 7):
# 使用兼容方案
from collections import OrderedDict
my_dict = OrderedDict()
else:
# Python 3.7+ 字典已保持插入顺序
my_dict = {}
# 检查模块可用性
try:
import statistics
avg = statistics.mean([1, 2, 3])
except ImportError:
# 回退方案
avg = sum([1, 2, 3]) / 3
# 检查特定功能是否可用
if hasattr(os, 'scandir'): # Python 3.5+
for entry in os.scandir('.'):
print(entry.name)
else:
for name in os.listdir('.'):
print(name)
os
模块提供了与操作系统交互的函数,用于执行文件和目录操作、进程管理等系统级任务。
\
,Linux用/
),建议使用os.path.join()
处理路径os.path.exists()
)import os
# 获取当前工作目录
current_dir = os.getcwd()
# 创建目录
os.makedirs("new_folder")
# 列出目录内容
files = os.listdir(".")
# 跨平台路径拼接
file_path = os.path.join("folder", "file.txt")
sys
模块提供对Python解释器相关功能的访问,包括命令行参数、标准输入输出、解释器版本等。
sys.argv[0]
是脚本名,实际参数从sys.argv[1]
开始sys.path
会影响模块搜索路径,可能导致导入问题import sys
# 获取命令行参数
script_name = sys.argv[0]
arguments = sys.argv[1:]
# 获取Python版本
version = sys.version
# 修改标准输出
sys.stdout.write("自定义输出\n")
# 退出程序
sys.exit(1) # 非零表示异常退出
os
:主要与操作系统交互(文件、进程等)sys
:主要与Python解释器交互(运行时环境、参数等)Python 提供了 pathlib
和 shutil
模块来处理文件和目录操作:
pathlib
:面向对象的文件系统路径操作库,提供更直观的路径操作方法。shutil
:高级文件操作库,用于复制、移动、删除文件和目录。pathlib
:适用于路径拼接、检查文件/目录是否存在、创建目录等。shutil
:适用于文件/目录的复制、移动、删除等操作。pathlib
会自动处理不同操作系统的路径分隔符(/
或 \
)。shutil
操作文件时需确保有足够的权限。exists()
检查路径是否存在。from pathlib import Path
import shutil
# 使用 pathlib 创建目录和文件
path = Path("example_dir")
path.mkdir(exist_ok=True) # 创建目录(如果不存在)
file_path = path / "test.txt" # 路径拼接
file_path.write_text("Hello, World!") # 写入文件
# 检查文件是否存在
if file_path.exists():
print(f"File size: {file_path.stat().st_size} bytes")
# 使用 shutil 复制文件
shutil.copy(file_path, path / "test_copy.txt")
# 删除目录(包括内容)
shutil.rmtree(path)
Python提供了datetime
和time
模块来处理日期和时间相关的操作。
datetime
模块包含的主要类:
datetime.date
:处理日期(年、月、日)datetime.time
:处理时间(时、分、秒、微秒)datetime.datetime
:处理日期和时间datetime.timedelta
:处理时间间隔from datetime import datetime, date, time, timedelta
# 获取当前日期和时间
now = datetime.now()
print(now) # 2023-03-15 14:30:45.123456
# 创建特定日期
d = date(2023, 3, 15)
print(d) # 2023-03-15
# 创建特定时间
t = time(14, 30, 45)
print(t) # 14:30:45
# 时间运算
tomorrow = now + timedelta(days=1)
print(tomorrow) # 2023-03-16 14:30:45.123456
time
模块提供了时间相关的函数,主要用于时间戳和格式化。
import time
# 获取时间戳
timestamp = time.time()
print(timestamp) # 1678887045.123456
# 格式化时间
local_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) # 2023-03-15 14:30:45
# 暂停执行
time.sleep(2) # 暂停2秒
%Y
是四位年份,%y
是两位年份datetime
和time
模块的功能time.time()
返回的是可读时间(实际是时间戳)from datetime import datetime
# 正确格式化
dt = datetime.now()
print(dt.strftime("%A, %B %d, %Y")) # Wednesday, March 15, 2023
# 错误示例(容易混淆的格式)
# print(dt.strftime("%D")) # 03/15/23 (可能不是预期格式)
Python提供了zipfile
和tarfile
模块来处理常见的压缩和归档文件格式。
zipfile
模块用于处理ZIP格式的压缩文件。
import zipfile
with zipfile.ZipFile('example.zip', 'w') as zipf:
zipf.write('file1.txt') # 添加单个文件
zipf.write('file2.txt')
with zipfile.ZipFile('example.zip', 'r') as zipf:
zipf.extractall('extracted_files') # 解压所有文件
# 或者单独解压某个文件
zipf.extract('file1.txt', 'specific_dir')
compresslevel
参数可以控制压缩级别tarfile
模块用于处理tar归档文件,支持gzip、bz2等压缩格式。
import tarfile
# 创建gzip压缩的tar文件
with tarfile.open('example.tar.gz', 'w:gz') as tar:
tar.add('folder_to_compress') # 添加整个目录
with tarfile.open('example.tar.gz', 'r:gz') as tar:
tar.extractall('extracted_folder') # 解压全部
# 或者获取文件列表
print(tar.getnames())
网络通信是指计算机之间通过网络进行数据交换的过程。在Python中,常用的网络通信模块包括:
socket
:提供低级别的网络通信接口,支持TCP/UDP协议urllib
:提供高级别的HTTP客户端功能,简化了HTTP请求操作socket
适用于:
urllib
适用于:
socket
:
urllib
:
socket
示例(TCP客户端):import socket
# 创建TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('example.com', 80))
# 发送HTTP请求
request = b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
client_socket.sendall(request)
# 接收响应
response = client_socket.recv(4096)
print(response.decode())
client_socket.close()
urllib
示例:from urllib.request import urlopen
# 发起GET请求
with urlopen('https://example.com') as response:
content = response.read().decode('utf-8')
print(content)
并发执行是指在同一时间段内,多个任务交替执行的能力。在Python中,主要通过multiprocessing
(多进程)和threading
(多线程)模块实现。
multiprocessing
,因为可以绕过GIL(全局解释器锁),充分利用多核CPU。threading
,因为线程切换开销小,适合等待I/O操作(如网络请求、文件读写)的场景。Lock
)。import threading
def download(url):
print(f"Downloading {url}...")
# 模拟I/O操作
import time
time.sleep(2)
print(f"Finished {url}")
urls = ["url1", "url2", "url3"]
threads = []
for url in urls:
t = threading.Thread(target=download, args=(url,))
t.start()
threads.append(t)
for t in threads:
t.join()
import multiprocessing
def calculate(n):
return n * n
if __name__ == "__main__":
with multiprocessing.Pool() as pool:
results = pool.map(calculate, [1, 2, 3])
print(results) # 输出: [1, 4, 9]
数据持久化是指将程序运行中的数据保存到存储介质(如硬盘)中,以便程序下次运行时可以重新加载使用。Python中常用的数据持久化工具有pickle
和sqlite3
。
pickle
是Python内置的序列化模块,可以将Python对象转换为字节流(序列化),也可以将字节流还原为Python对象(反序列化)。
import pickle
# 序列化
data = {'name': 'Alice', 'age': 25, 'scores': [88, 92, 95]}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 反序列化
with open('data.pkl', 'rb') as f:
loaded_data = pickle.load(f)
print(loaded_data) # {'name': 'Alice', 'age': 25, 'scores': [88, 92, 95]}
sqlite3
是Python内置的轻量级数据库模块,使用SQLite数据库实现数据持久化。
import sqlite3
# 创建数据库连接
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')
# 插入数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 25))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 30))
# 查询数据
cursor.execute("SELECT * FROM users")
print(cursor.fetchall()) # [(1, 'Alice', 25), (2, 'Bob', 30)]
# 提交并关闭
conn.commit()
conn.close()
pickle
sqlite3
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,采用文本格式存储和传输数据,易于人阅读和编写,也易于机器解析和生成。
import json
# 将Python对象转为JSON字符串
data = {"name": "Alice", "age": 25}
json_str = json.dumps(data)
# 将JSON字符串转为Python对象
python_obj = json.loads(json_str)
# 读写JSON文件
with open('data.json', 'w') as f:
json.dump(data, f)
with open('data.json') as f:
loaded_data = json.load(f)
CSV (Comma-Separated Values) 是以纯文本形式存储表格数据的文件格式,用逗号分隔字段。
import csv
# 写入CSV文件
with open('data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Name', 'Age'])
writer.writerow(['Alice', 25])
writer.writerow(['Bob', 30])
# 读取CSV文件
with open('data.csv') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 字典方式读写
with open('data.csv', 'w', newline='') as f:
fieldnames = ['name', 'age']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'name': 'Alice', 'age': 25})
newline=''
)Python内置了两个主要的测试框架:unittest
和doctest
,用于帮助开发者编写和运行测试用例。
unittest
是一个基于xUnit架构的测试框架,提供了测试用例、测试套件、测试夹具等概念。
unittest.TestCase
test_
开头assertEqual
和assertTrue
的使用场景import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
if __name__ == '__main__':
unittest.main()
doctest
是一个通过解析文档字符串中的示例来验证代码行为的轻量级测试框架。
def factorial(n):
"""计算阶乘
>>> factorial(3)
6
>>> factorial(5)
120
"""
return 1 if n <= 1 else n * factorial(n-1)
if __name__ == "__main__":
import doctest
doctest.testmod()
unittest
当需要:复杂测试逻辑、测试夹具、测试组织doctest
当需要:简单示例验证、文档驱动测试Python提供了内置的调试工具,帮助开发者查找和修复代码中的错误。最常用的调试工具是pdb
模块和trace
模块。
pdb
是Python的标准调试器,允许你设置断点、单步执行代码、检查变量值等。
import pdb
def calculate(x, y):
pdb.set_trace() # 设置断点
result = x + y
return result
calculate(3, 5)
n
(next): 执行下一行s
(step): 进入函数调用c
(continue): 继续执行直到下一个断点l
(list): 显示当前代码p
(print): 打印变量值q
(quit): 退出调试器set_trace()
调用trace
模块用于跟踪程序执行,生成执行报告。
import trace
tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix], trace=0, count=1)
tracer.run('import mymodule') # 跟踪mymodule的执行
count=1
: 统计每行代码的执行次数trace=1
: 显示执行的行ignoredirs
: 忽略特定目录模块导入是指将其他Python文件或内置模块中的代码引入当前程序的过程。良好的导入实践可以提高代码的可读性、可维护性和性能。
import os
import sys
import numpy as np
import pandas as pd
from . import utils
from models import User
from package.subpackage import module
# 不推荐
from module import *
import matplotlib.pyplot as plt
# 标准库
import os
import sys
from datetime import datetime
# 第三方库
import numpy as np
import pandas as pd
from flask import Flask
# 本地模块
from utils.helpers import validate_email
from models.user import User
文档字符串是Python中用于解释函数、类或模块用途的特殊字符串。它位于对象定义的第一个语句处,通常用三重引号("""
或'''
)包裹。
def function_name(arg1, arg2):
"""简要描述
详细描述(可选)
Args:
arg1 (type): 参数说明
arg2 (type): 参数说明
Returns:
type: 返回值说明
Example:
>>> function_name(value1, value2)
expected_output
"""
# 函数体
help()
函数用于查看对象的文档字符串:
help(function_name)
help()
进入帮助模式q
退出帮助模式def calculate_area(radius):
"""计算圆的面积
根据给定的半径计算圆的面积
Args:
radius (float): 圆的半径(单位:米)
Returns:
float: 圆的面积(单位:平方米)
Example:
>>> calculate_area(2.0)
12.566370614359172
"""
import math
return math.pi * radius ** 2
# 查看帮助
help(calculate_area)
交互式解释器(REPL,Read-Eval-Print Loop)是Python提供的即时执行代码的环境,允许用户逐行输入代码并立即查看结果。
...
提示符时)exec()
或导入)help(len) # 查看内置函数帮助
?len # IPython中的简写方式
dir(str) # 查看字符串所有方法
vars(object) # 查看对象属性
_ # 上一个结果
__ # 上上个结果
_2 # 历史记录中第2个输出(IPython专用)
import os
os.path.<Tab> # 在IPython/Jupyter中自动补全
%timeit [x**2 for x in range(1000)] # IPython专用
%quickref # 查看快速参考
%history # 查看命令历史
%run script.py # 运行外部脚本
性能优化是指通过改进代码结构、算法选择或系统配置等手段,提高程序的执行效率、减少资源消耗的过程。
# 不优化的版本
result = []
for i in range(10000):
result.append(i*2)
# 优化后的版本(列表推导式)
result = [i*2 for i in range(10000)]
# 更进一步的优化(生成器表达式)
result = (i*2 for i in range(10000))
Python 中函数的默认参数在函数定义时就被计算并保存,而不是每次调用时重新计算。这会导致使用可变对象(如列表、字典)作为默认参数时出现意外行为。
def add_item(item, items=[]):
items.append(item)
return items
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] 而不是预期的 [2]
解决方案:使用 None 作为默认值,在函数内部初始化可变对象。
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
在循环中直接修改正在迭代的对象会导致意外行为。
numbers = [1, 2, 3, 4]
for num in numbers:
if num % 2 == 0:
numbers.remove(num)
# 结果是 [1, 3] 而不是预期的 [1, 3]
解决方案:迭代对象的副本或使用列表推导式。
numbers = [1, 2, 3, 4]
numbers = [num for num in numbers if num % 2 != 0]
在函数内部对变量赋值会创建一个新的局部变量,而不是修改外部变量。
x = 10
def func():
x = 20 # 创建新的局部变量
func()
print(x) # 仍然是 10
解决方案:使用 global 关键字声明全局变量。
x = 10
def func():
global x
x = 20
func()
print(x) # 现在是 20
由于二进制浮点数的表示方式,某些十进制小数无法精确表示。
0.1 + 0.2 == 0.3 # 返回 False
解决方案:使用 math.isclose() 或 decimal 模块进行精确比较。
import math
math.isclose(0.1 + 0.2, 0.3) # 返回 True
is 比较对象标识(内存地址),== 比较值。
a = [1, 2, 3]
b = [1, 2, 3]
a == b # True
a is b # False
解决方案:明确比较目的,值比较用 ==,对象标识比较用 is。