1. Python基础语法核心要点解析
作为一门简洁高效的编程语言,Python的基础语法是每位开发者必须掌握的基石。本部分将深入剖析Python语法体系中最为关键的几个组成部分,这些内容构成了Python编程的基础框架。
提示:建议读者在阅读时同步打开Python交互环境(IDLE或IPython)进行实操练习,输入每个示例代码并观察输出结果,这种"手脑并用"的学习方式效果最佳。
1.1 变量与数据类型
Python作为动态类型语言,其变量声明方式极为简洁。但简洁背后蕴含着重要的原理:
# 基本变量声明 counter = 100 # 整型 miles = 1000.0 # 浮点 name = "John" # 字符串 # 类型查看 print(type(counter)) # <class 'int'> print(type(miles)) # <class 'float'> print(type(name)) # <class 'str'>Python的变量本质上是对象的引用,这个特性带来了几个重要影响:
- 变量不需要预先声明类型
- 同一个变量可以被重新赋值为不同类型的值
- 变量赋值实际上是建立对象引用关系
常见误区警示:
- 不要将Python的变量理解为"存储数据的盒子",而应视为"贴在对象上的标签"
- 多个变量引用同一个对象时,修改可变对象会影响所有引用该对象的变量
- 使用
is判断对象同一性,==判断值相等性
1.2 运算符详解
Python运算符系统丰富而强大,除常规算术运算符外,有几个特殊运算符需要特别注意:
# 成员运算符 fruits = ['apple', 'banana', 'cherry'] print('banana' in fruits) # True print('pear' not in fruits) # True # 身份运算符 x = [1,2,3] y = x z = [1,2,3] print(x is y) # True print(x is z) # False print(x == z) # True # 海象运算符(Python 3.8+) if (n := len(fruits)) > 2: print(f"列表包含{n}个元素") # 列表包含3个元素运算符优先级备忘表:
| 优先级 | 运算符 | 描述 |
|---|---|---|
| 1 | ** | 指数 |
| 2 | ~ + - | 按位取反,正负号 |
| 3 | * / % // | 乘除模整除 |
| 4 | + - | 加减 |
| 5 | >> << | 位移 |
| 6 | & | 按位与 |
| 7 | ^ | | 按位异或/或 |
| 8 | <= < > >= | 比较 |
| 9 | == != | 等于 |
| 10 | = %= /= //= -= += *= **= | 赋值 |
1.3 控制流结构
Python通过缩进来定义代码块,这种设计强制形成了良好的代码风格。控制流结构主要包括:
条件语句的完整形式:
score = 85 if score >= 90: grade = 'A' elif score >= 80: # 注意是elif不是else if grade = 'B' elif score >= 70: grade = 'C' else: grade = 'D' print(f"成绩等级: {grade}")循环结构的几种变体:
# 经典for循环 for i in range(5): # 0到4 print(i, end=' ') # 0 1 2 3 4 # 带步长的range for i in range(0, 10, 2): # 0 2 4 6 8 print(i, end=' ') # while-else结构 count = 0 while count < 3: print(count, "小于3") count += 1 else: print(count, "等于3")循环控制技巧:
- 使用
enumerate()同时获取索引和值 zip()可并行迭代多个序列- 列表推导式通常比显式循环更高效
- 避免在循环中修改正在迭代的序列
2. 函数定义与使用规范
函数是Python代码组织和复用的基本单元,其定义和使用有几个关键要点需要掌握。
2.1 函数定义基础
标准函数定义语法:
def greet(name, greeting="Hello"): """返回问候语 Args: name: 被问候者姓名 greeting: 问候语,默认为'Hello' Returns: 拼接后的问候字符串 """ return f"{greeting}, {name}!" print(greet("Alice")) # Hello, Alice! print(greet("Bob", "Hi")) # Hi, Bob!文档字符串规范:
- 使用三重引号包裹
- 第一行简要描述函数功能
- 接着空一行
- 然后是详细描述,包括参数说明和返回值
- 遵循PEP 257规范
2.2 参数传递机制
Python的参数传递是"对象引用传递",理解这一点对避免常见错误至关重要:
def modify_list(lst): lst.append(4) # 修改会影响原始对象 lst = [7,8,9] # 重新赋值不会影响原始对象 my_list = [1,2,3] modify_list(my_list) print(my_list) # [1,2,3,4]参数类型对比表:
| 参数类型 | 语法 | 特点 | 示例 |
|---|---|---|---|
| 位置参数 | 普通参数 | 必须按顺序传递 | func(a,b) |
| 关键字参数 | name=value | 可不按顺序 | func(b=2,a=1) |
| 默认参数 | param=default | 调用时可省略 | def func(a=1) |
| 可变位置 | *args | 收集多余位置参数为元组 | def func(*args) |
| 可变关键字 | **kwargs | 收集多余关键字参数为字典 | def func(**kwargs) |
2.3 Lambda表达式
匿名函数的典型应用场景:
# 简单数学运算 square = lambda x: x**2 print(square(5)) # 25 # 作为高阶函数的参数 numbers = [1, 2, 3, 4] squared = list(map(lambda x: x**2, numbers)) print(squared) # [1, 4, 9, 16] # 排序辅助 pairs = [(1, 'one'), (2, 'two'), (3, 'three')] pairs.sort(key=lambda pair: pair[1]) print(pairs) # [(3, 'three'), (1, 'one'), (2, 'two')]Lambda使用原则:
- 只适合简单操作
- 如果逻辑复杂,应该定义正式函数
- 避免嵌套多层lambda
- 不要为了使用lambda而使用lambda
3. 数据结构深度解析
Python内置的数据结构高效而灵活,理解它们的特性和适用场景是写出优质代码的关键。
3.1 列表(List)高级用法
列表作为最常用的序列类型,有许多高效操作方法:
# 列表创建 nums = list(range(5)) # [0,1,2,3,4] squares = [x**2 for x in nums] # 列表推导式 # 切片操作 print(nums[1:3]) # [1,2] print(nums[::2]) # [0,2,4] print(nums[::-1]) # [4,3,2,1,0] # 常用方法 nums.append(5) # 追加元素 nums.insert(0, -1) # 插入元素 nums.extend([6,7]) # 扩展列表 nums.remove(3) # 删除首个匹配项 popped = nums.pop() # 移除并返回末尾元素列表操作时间复杂度参考:
| 操作 | 时间复杂度 | 说明 |
|---|---|---|
| 索引 | O(1) | 随机访问快 |
| 追加 | O(1) | append操作快 |
| 插入 | O(n) | insert操作慢 |
| 删除 | O(n) | remove/pop(i)慢 |
| 切片 | O(k) | k是切片长度 |
| 排序 | O(n log n) | Timsort算法 |
3.2 字典(Dict)最佳实践
字典是Python中极为重要的数据结构,掌握其高级用法可以大幅提升代码质量:
# 字典创建 person = {'name': 'Alice', 'age': 25} person = dict(name='Alice', age=25) # 另一种方式 # 字典视图 print(person.keys()) # dict_keys(['name', 'age']) print(person.values()) # dict_values(['Alice', 25]) print(person.items()) # dict_items([('name', 'Alice'), ('age', 25)]) # 安全访问 print(person.get('gender', 'unknown')) # unknown print(person.setdefault('gender', 'female')) # 设置默认值 # 字典合并(Python 3.9+) extra_info = {'city': 'Beijing', 'age': 26} combined = person | extra_info # {'name': 'Alice', 'age': 26, 'city': 'Beijing'}字典使用技巧:
- 使用
collections.defaultdict处理缺失键 - 使用
collections.OrderedDict保持插入顺序(Python 3.7+普通dict已有序) - 字典推导式可以高效创建字典
- 使用
dict.fromkeys()快速创建具有相同默认值的字典
3.3 集合(Set)操作
集合提供了高效的成员检测和集合运算能力:
# 集合创建 primes = {2, 3, 5, 7} evens = set(range(0, 10, 2)) # 集合运算 print(primes & evens) # 交集: {2} print(primes | evens) # 并集: {0,2,3,4,5,6,7,8} print(primes - evens) # 差集: {3,5,7} print(primes ^ evens) # 对称差集: {0,3,4,5,6,7,8} # 集合推导式 square_set = {x**2 for x in range(-3, 4)} print(square_set) # {0,1,4,9}集合典型应用场景:
- 快速去重:
unique_items = list(set(duplicate_items)) - 关系测试:检测两组数据的交集、并集等
- 过滤数据:快速筛选出满足条件的元素
- 状态跟踪:使用集合存储已处理项
4. 文件操作与异常处理
Python提供了简洁而强大的文件操作和异常处理机制,这是实际项目开发中必不可少的技能。
4.1 文件读写模式详解
文件操作的基本模式:
# 安全文件读取 try: with open('example.txt', 'r', encoding='utf-8') as f: content = f.read() # 读取全部内容 # 或者逐行读取: for line in f: except FileNotFoundError: print("文件不存在") except UnicodeDecodeError: print("编码错误") # 文件写入 with open('output.txt', 'w') as f: f.write("第一行\n") f.writelines(["第二行\n", "第三行\n"]) # 追加模式 with open('log.txt', 'a') as f: f.write("新的日志条目\n")文件模式对照表:
| 模式 | 描述 | 文件存在 | 文件不存在 |
|---|---|---|---|
| 'r' | 只读 | 打开 | 报错 |
| 'w' | 只写 | 清空后打开 | 创建 |
| 'a' | 追加 | 打开到末尾 | 创建 |
| 'x' | 排他创建 | 报错 | 创建 |
| 'b' | 二进制模式 | - | - |
| 't' | 文本模式(默认) | - | - |
| '+' | 读写模式 | - | - |
4.2 异常处理最佳实践
Python使用try-except结构处理异常,良好的异常处理应该:
def divide(a, b): try: result = a / b except ZeroDivisionError: print("除数不能为零") return None except TypeError as e: print(f"类型错误: {e}") return None else: print("除法成功完成") return result finally: print("这是无论是否异常都会执行的代码") # 使用示例 print(divide(10, 2)) # 正常情况 print(divide(10, 0)) # 除零错误 print(divide("10", 2)) # 类型错误异常处理原则:
- 只捕获你知道如何处理的异常
- 避免空的except子句
- 使用具体的异常类型而不是通用的Exception
- 合理使用else和finally子句
- 自定义异常应该继承自Exception类
4.3 上下文管理器
with语句背后的上下文管理器协议是Python的特色功能:
# 自定义上下文管理器 class DatabaseConnection: def __enter__(self): print("建立数据库连接") return self def __exit__(self, exc_type, exc_val, exc_tb): print("关闭数据库连接") if exc_type is not None: print(f"发生异常: {exc_val}") return False # 不抑制异常 # 使用示例 with DatabaseConnection() as db: print("执行数据库操作") # raise ValueError("模拟错误") # 取消注释测试异常情况上下文管理器应用场景:
- 资源管理(文件、网络连接等)
- 锁的获取和释放
- 临时环境设置和恢复
- 事务管理
- 计时和性能分析
5. 模块与包管理
Python的模块系统是其可扩展性的基础,良好的模块化设计能显著提升代码质量。
5.1 模块导入机制
Python提供了灵活的模块导入方式:
# 基本导入 import math print(math.sqrt(16)) # 4.0 # 别名导入 import numpy as np # 从模块导入特定内容 from os import path, listdir # 相对导入(在包内部) # from . import submodule # from .. import parent_module # 动态导入 module_name = "json" json = __import__(module_name)导入搜索路径顺序:
- 当前目录
- PYTHONPATH环境变量指定的目录
- Python安装目录
- 标准库目录
- 第三方库目录(site-packages)
5.2 包结构设计规范
良好的包结构应该遵循这些原则:
my_package/ ├── __init__.py # 包初始化文件 ├── core.py # 核心功能 ├── utils/ # 工具子包 │ ├── __init__.py │ ├── helper.py │ └── validator.py └── tests/ # 测试代码 ├── __init__.py └── test_core.pyinit.py文件的作用:
- 标识目录为Python包
- 可以包含包级别的初始化代码
- 控制
from package import *的行为 - 定义
__all__列表指定公开接口
5.3 第三方包管理
pip是Python事实上的包管理标准工具:
# 安装包 pip install requests # 指定版本 pip install numpy==1.21.0 # 从requirements.txt安装 pip install -r requirements.txt # 开发模式安装(可编辑模式) pip install -e . # 创建虚拟环境 python -m venv myenv source myenv/bin/activate # Linux/Mac myenv\Scripts\activate # Windows包管理最佳实践:
- 总是使用虚拟环境隔离项目依赖
- 使用
pip freeze > requirements.txt记录精确依赖 - 考虑使用pipenv或poetry等更高级的工具
- 定期更新依赖包以获取安全修复
- 检查包的许可证是否符合项目要求
6. 面向对象编程精要
Python全面支持面向对象编程范式,但其实现方式与其他语言有所不同。
6.1 类与对象基础
Python类的定义和使用示例:
class Person: """人类示例""" # 类属性 species = "Homo sapiens" def __init__(self, name, age): """初始化方法""" self.name = name # 实例属性 self.age = age def greet(self): """实例方法""" return f"Hello, I'm {self.name}, {self.age} years old." @classmethod def from_birth_year(cls, name, birth_year): """类方法""" age = 2023 - birth_year return cls(name, age) @staticmethod def is_adult(age): """静态方法""" return age >= 18 # 使用示例 p1 = Person("Alice", 25) print(p1.greet()) # Hello, I'm Alice, 25 years old. p2 = Person.from_birth_year("Bob", 1990) print(p2.greet()) # Hello, I'm Bob, 33 years old. print(Person.is_adult(20)) # True方法类型对比:
| 方法类型 | 装饰器 | 第一个参数 | 访问权限 |
|---|---|---|---|
| 实例方法 | 无 | self | 可访问实例和类属性 |
| 类方法 | @classmethod | cls | 只能访问类属性 |
| 静态方法 | @staticmethod | 无 | 不能访问实例或类属性 |
6.2 继承与多态
Python支持多重继承,其方法解析顺序(MRO)采用C3算法:
class Animal: def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("子类必须实现此方法") class Dog(Animal): def speak(self): return f"{self.name} says Woof!" class Cat(Animal): def speak(self): return f"{self.name} says Meow!" # 多态示例 animals = [Dog("Buddy"), Cat("Whiskers")] for animal in animals: print(animal.speak()) # 查看方法解析顺序 print(Cat.__mro__)继承使用建议:
- 优先使用组合而非继承
- 避免多重继承带来的复杂性
- 使用抽象基类(abc模块)定义接口
- 了解super()函数的工作原理
- 合理使用混入(Mixin)类
6.3 特殊方法与运算符重载
通过实现特殊方法可以自定义类的行为:
class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): """向量加法""" return Vector(self.x + other.x, self.y + other.y) def __mul__(self, scalar): """向量数乘""" return Vector(self.x * scalar, self.y * scalar) def __repr__(self): """官方字符串表示""" return f"Vector({self.x}, {self.y})" def __len__(self): """向量模(这里简化返回2)""" return 2 def __bool__(self): """零向量判断""" return self.x != 0 or self.y != 0 # 使用示例 v1 = Vector(2, 4) v2 = Vector(1, -1) print(v1 + v2) # Vector(3, 3) print(v1 * 3) # Vector(6, 12) print(bool(v1)) # True常用特殊方法分类:
| 类别 | 方法 | 描述 |
|---|---|---|
| 初始化 | __init__ | 构造函数 |
| 字符串表示 | __str__,__repr__ | 字符串转换 |
| 容器操作 | __len__,__getitem__ | 容器行为模拟 |
| 数值运算 | __add__,__mul__ | 运算符重载 |
| 上下文管理 | __enter__,__exit__ | with语句支持 |
| 属性访问 | __getattr__,__setattr__ | 属性控制 |
7. 高级特性与应用技巧
掌握Python的一些高级特性可以让你写出更优雅、高效的代码。
7.1 生成器与迭代器
生成器是Python中实现惰性计算的重要工具:
# 生成器函数 def fibonacci(limit): a, b = 0, 1 while a < limit: yield a a, b = b, a + b # 使用生成器 fib = fibonacci(100) print(list(fib)) # [0,1,1,2,3,5,8,13,21,34,55,89] # 生成器表达式 squares = (x**2 for x in range(10)) print(sum(squares)) # 285 # 迭代器协议示例 class CountDown: def __init__(self, start): self.current = start def __iter__(self): return self def __next__(self): if self.current <= 0: raise StopIteration num = self.current self.current -= 1 return num # 使用迭代器 for num in CountDown(5): print(num, end=' ') # 5 4 3 2 1生成器优势:
- 内存高效:不需要一次性生成所有元素
- 可以表示无限序列
- 支持管道式数据处理
- 保持代码简洁
7.2 装饰器深入解析
装饰器是Python中强大的元编程工具:
# 简单装饰器 def log_time(func): import time def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__}执行时间: {end-start:.4f}秒") return result return wrapper # 使用装饰器 @log_time def slow_function(): import time time.sleep(1) slow_function() # 输出执行时间 # 带参数的装饰器 def repeat(times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(3) def say_hello(): print("Hello!") say_hello() # 打印3次Hello装饰器常见用途:
- 日志记录
- 性能测试
- 权限验证
- 输入验证
- 缓存
- 事务处理
7.3 并发编程基础
Python提供了多种并发编程方式:
# 多线程示例 import threading def worker(num): print(f"Worker {num}开始执行") import time time.sleep(1) print(f"Worker {num}执行结束") threads = [] for i in range(5): t = threading.Thread(target=worker, args=(i,)) threads.append(t) t.start() for t in threads: t.join() # 多进程示例 from multiprocessing import Process def cpu_bound_task(n): return sum(i*i for i in range(n)) if __name__ == '__main__': p = Process(target=cpu_bound_task, args=(10000000,)) p.start() p.join() # 异步IO示例 import asyncio async def fetch_data(): print("开始获取数据") await asyncio.sleep(2) # 模拟IO操作 print("数据获取完成") return {"data": 123} async def main(): task = asyncio.create_task(fetch_data()) print("其他操作可以继续") result = await task print(f"获取结果: {result}") asyncio.run(main())并发方案选择指南:
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 多线程 | IO密集型 | 轻量级,共享内存 | GIL限制 |
| 多进程 | CPU密集型 | 绕过GIL | 开销大 |
| 异步IO | IO密集型 | 高效,单线程 | 需要协程支持 |
| 协程 | IO密集型 | 语法简洁 | Python 3.5+ |
8. 代码质量与调试技巧
写出可维护的高质量代码是专业开发者的必备技能。
8.1 代码风格规范
遵循PEP 8风格指南可以让代码更易读:
# 好的风格示例 def calculate_average(numbers): """计算数字列表的平均值""" if not numbers: return 0 return sum(numbers) / len(numbers) # 不好的风格示例 def calcAvg(nums): if nums==[]:return 0.0 else:return sum(nums)/len(nums)PEP 8关键要点:
- 缩进:4个空格
- 行长度:不超过79字符
- 导入:分组且按标准库、第三方库、本地库排序
- 命名:
- 变量/函数:小写下划线(snake_case)
- 类名:驼峰式(CamelCase)
- 常量:大写加下划线(UPPER_CASE)
- 空格使用:运算符周围、逗号后适当空格
8.2 单元测试实践
使用unittest模块编写测试:
import unittest def add(a, b): return a + b class TestMathFunctions(unittest.TestCase): def test_add_positive(self): self.assertEqual(add(2, 3), 5) def test_add_negative(self): self.assertEqual(add(-1, -1), -2) def test_add_zero(self): self.assertEqual(add(0, 0), 0) if __name__ == '__main__': unittest.main()测试编写原则:
- 测试应该独立、可重复
- 测试应该验证正确行为和错误处理
- 测试名称应该描述测试内容
- 遵循AAA模式:Arrange(准备)、Act(执行)、Assert(断言)
- 测试覆盖率不是唯一目标,关键逻辑必须覆盖
8.3 调试技巧大全
Python提供了多种调试工具:
# 使用print调试(最简单) def buggy_function(): x = 1 print(f"x初始值: {x}") # 调试输出 x += "2" # 类型错误 print(f"x处理后: {x}") # 不会执行 # 使用pdb调试器 import pdb def divide(a, b): pdb.set_trace() # 设置断点 return a / b # 使用logging记录 import logging logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) def process_data(data): logger.debug(f"开始处理数据: {data}") try: result = data * 2 logger.info(f"处理成功: {result}") return result except Exception as e: logger.error(f"处理失败: {e}") raise调试策略:
- 小步前进:每次只做一个小修改
- 二分查找:逐步缩小问题范围
- 橡皮鸭调试:向他人解释你的代码
- 查看调用栈:了解错误发生路径
- 检查中间状态:验证假设是否成立
9. 性能优化指南
Python代码性能优化需要有针对性的策略。
9.1 性能分析工具
使用cProfile进行性能分析:
import cProfile def slow_function(): total = 0 for i in range(100000): total += i**2 return total # 性能分析 profiler = cProfile.Profile() profiler.enable() slow_function() profiler.disable() profiler.print_stats(sort='time')性能分析指标:
- ncalls:调用次数
- tottime:函数内部耗时(不包括子函数)
- cumtime:函数总耗时(包括子函数)
- percall:每次调用平均耗时
- filename:lineno(function):位置信息
9.2 常见优化技巧
Python性能优化的有效方法:
# 字符串连接优化 # 不好 result = "" for s in strings: result += s # 好 result = "".join(strings) # 循环优化 # 不好 for i in range(len(items)): process(items[i]) # 好 for item in items: process(item) # 列表推导式通常更快 squares = [x**2 for x in range(1000)] # 使用内置函数 total = sum(numbers) # 比手动循环快 # 局部变量访问更快 def fast_function(): local_len = len # 缓存内置函数 return local_len("example")优化原则:
- 先确保正确性,再优化
- 基于性能分析数据优化热点
- 算法优化通常比微观优化更有效
- 有时用C扩展或Cython能大幅提升性能
- 考虑使用PyPy等替代实现
9.3 内存管理理解
Python使用引用计数和垃圾回收管理内存:
import sys import gc # 查看对象引用计数 x = [] print(sys.getrefcount(x)) # 2 (x + getrefcount参数) # 循环引用示例 class Node: def __init__(self): self.parent = None self.children = [] # 创建循环引用 parent = Node() child = Node() parent.children.append(child) child.parent = parent # 手动触发垃圾回收 gc.collect() # 内存分析工具 import tracemalloc tracemalloc.start() data = [1] * 1000000 snapshot = tracemalloc.take_snapshot() for stat in snapshot.statistics('lineno')[:5]: print(stat)内存优化建议:
- 避免不必要的对象创建
- 使用生成器处理大数据集
- 及时释放不再需要的大对象
- 注意循环引用问题
- 考虑使用
__slots__减少内存占用
10. 项目结构与工程化
良好的项目结构是团队协作和长期维护的基础。
10.1 标准项目布局
典型的Python项目结构:
project_name/ ├── docs/ # 文档 ├── project_name/ # 主包 │ ├── __init__.py │ ├── core.py │ └── utils/ ├── tests/ # 测试 │ ├── __init__.py │ ├── test_core.py │ └── test_utils/ ├── scripts/ # 脚本 ├── setup.py # 安装脚本 ├── requirements.txt # 依赖列表 ├── README.md # 项目说明 └── .gitignore # Git忽略规则关键文件说明:
setup.py:定义包元数据和依赖requirements.txt:记录精确依赖版本README.md:项目概述和使用说明.gitignore:指定不需要版本控制的文件
10.2 文档编写规范
良好的文档应该包含:
"""示例模块 这个模块演示了如何编写符合规范的Python文档。 """ def calculate(a, b, operator='+'): """执行基本算术运算 Args: a: 第一个操作数 b: 第二个操作数 operator: 运算符,支持'+', '-', '*', '/' Returns: 运算结果 Raises: ValueError: 当运算符不支持时 ZeroDivisionError: 当除数为零时 Examples: >>> calculate(2, 3, '+') 5 >>> calculate(10, 2, '/') 5.0 """ if operator == '+': return a + b elif operator == '-': return a - b elif operator == '*': return a * b elif operator == '/': return a / b else: raise ValueError(f"不支持的运算符: {operator}")文档编写要点:
- 模块级文档字符串说明整体功能
- 函数文档字符串包含:
- 功能描述
- 参数说明
- 返回值说明
- 可能抛出的异常
- 使用示例
- 类文档字符串还应包含属性说明
- 使用Sphinx生成HTML文档
10.3 持续集成配置
典型的CI配置(.github/workflows/test.yml):
name: Python CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.8", "3.9", "3.10"] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pytest - name: Run tests run: | pytestCI/CD最佳实践:
- 每次提交都运行测试
- 测试多Python版本兼容性
- 检查代码风格和质量
- 自动生成文档
- 自动化部署
11. 常见问题与解决方案
在实际开发中,开发者常会遇到一些典型问题。
11.1 编码问题处理
Python 3虽然默认使用UTF-8,但编码问题仍可能出现:
# 处理不同编码的文件 try: with open('data.txt', 'r', encoding='gbk') as f: content = f.read() except UnicodeDecodeError: try: with open('data.txt', 'r', encoding='utf-8') as f: content = f.read() except UnicodeDecodeError: with open('data.txt', 'rb') as f: content = f.read().decode('utf-8', errors='replace') # 处理命令行参数编码 import sys print(sys.getdefaultencoding()) # 查看默认编码 print(sys.getfilesystemencoding()) # 文件系统编码 # 处理URL编码 from urllib.parse import quote, unquote url = "https://example.com/测试" encoded = quote(url, safe='/:') # 编码 decoded = un