Python案例怎么注释代码内容?——从新手到高手的注释全攻略
目录导读
- 为什么注释如此重要? – 解释注释的三大核心价值
- 注释的基本原则 – 写好注释前必须知道的规则
- Python注释的3种官方写法 – 单行、多行、文档字符串全解析
- 实战案例:一个爬虫项目的注释剖析 – 拆解完整案例注释逻辑
- 常见注释误区与最佳实践 – 避免注释坏习惯,提升代码可读性
- 问答环节 – 解决你关于注释的5个高频疑惑
为什么注释如此重要?
在Stack Overflow的一项开发者调查中,代码可读性被列为团队协作中最头疼的问题之一,注释正是解决这一痛点的核心工具,它的价值体现在三个层面:

- 为“未来的自己”减负:3个月后回看代码,没有注释的
df['col'] = df['col'].apply(lambda x: x.strip() if x else '')会让你怀疑人生。 - 降低团队沟通成本:同事无需逐行猜测逻辑,直接通过文档字符串理解函数意图。
- 提升代码维护效率:根据GitHub统计,有良好注释的Python项目,Bug修复速度平均快34%。
注释不是写给机器看的,是写给人看的。
注释的基本原则
在开始写注释前,先掌握这4条黄金法则:
- 解释“为什么”,而非“是什么”:
# 将字符串转换为整数是废话,# 防止用户输入空字符串导致的类型错误才是有价值的注释。 - 保持与代码同步:最可怕的不是没注释,而是过期的注释,修改代码后务必更新对应注释。
- 避免“画蛇添足”:如果代码本身足够清晰(如
age = 25),不需要写# 设置年龄为25。 - 使用英文还是中文?:国内团队建议用中文,但混用英文关键字(如
TODO、FIXME)是通用规范。
Python注释的3种官方写法
1 单行注释()
用于简短说明,通常放在代码上方或同行末尾。
# 按文件名排序,忽略大小写 files.sort(key=lambda f: f.lower())
2 多行注释( 或 )
虽然Python不内置多行注释符号,但官方通常用三个双引号实现,注意这不等于文档字符串。
""" 这个循环用于: 1. 过滤掉空行 2. 将每行首尾空格去掉 3. 统计有效行数 """
3 文档字符串(Docstring)—— 最重要的注释
用于模块、类、函数的头部,可通过help()或__doc__调用,PEP 257规定了标准格式。
def calculate_bmi(weight: float, height: float) -> float:
"""
计算身体质量指数(BMI)
Args:
weight (float): 体重,单位千克
height (float): 身高,单位米
Returns:
float: BMI指数,保留两位小数
Examples:
>>> calculate_bmi(70, 1.75)
22.86
"""
return round(weight / (height ** 2), 2)
实战案例:一个爬虫项目的注释剖析
假设我们有一个爬取电商商品信息的脚本,下面展示“差注释”与“优注释”的对比。
差注释示例(不要学):
def get_data(url):
# 发送请求
r = requests.get(url)
# 解析
soup = BeautifulSoup(r.text, 'html.parser')
# 提取标题= soup.find('h1').text
# 返回
return title
优注释示例(应该这样写):
import requests
from bs4 import BeautifulSoup
def extract_product_title(url: str) -> str:
"""
从商品详情页提取产品标题
目标网站:jd.com(京东)
注意:该页面使用动态渲染的 <h1 class="item-title"> 标签,
若遇到反爬,需要切换到 Selenium 方案。
Args:
url (str): 商品详情页链接
Returns:
str: 商品标题,若提取失败返回空字符串
Raises:
requests.exceptions.RequestException: 当网络请求超时或连接失败时抛出
"""
try:
# 设置请求头模拟浏览器,防止被屏蔽
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
# 设置10秒超时,避免无限等待
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 检查HTTP状态码
# 使用BeautifulSoup解析HTML,注意京东的标题标签是 h1
soup = BeautifulSoup(response.text, 'html.parser')
title_tag = soup.find('h1', class_='item-title')
# 若标签存在则提取文本,否则返回空字符串
if title_tag:
return title_tag.get_text(strip=True)
return ""
except requests.exceptions.Timeout:
# 记录超时错误到日志,便于排查
print(f"[ERROR] 请求超时: {url}")
return ""
except requests.exceptions.RequestException as e:
print(f"[ERROR] 网络错误: {e}")
return ""
关键在于:优注释不仅描述了做了什么,还说明了为什么这样做(如超时设置、反爬策略)、潜在风险(动态渲染)和错误处理(日志记录)。
常见注释误区与最佳实践
1 三个致命误区
- “彩虹屁注释”:像
# 牛逼的算法实现这样无实际信息的内容,直接删除。 - “毫无意义的翻译”:
# 设置变量i的值为0,不如不写。 - “长篇大论的故事”:一行代码配300字解释,建议把说明移到函数文档。
2 6个最佳实践建议
- 使用TODO注释标记待办:
# TODO: 优化这里的排序算法,当前时间复杂度O(n^2) - FIXME标记潜在缺陷:
# FIXME: 当用户名为空时会触发IndexError - 为复杂的正则表达式写注释:
# 匹配中国大陆手机号:以1开头,第二位3-9,后跟9位数字 - 版本修改注释:
# v2.1 新增:增加对Unicode字符的支持 - 自动生成文档:用Sphinx工具从Docstring直接生成API手册
- 代码审查中检查注释:在GitHub Pull Request中要求注释质量达标
问答环节
问:注释应该占整体代码的多少比例?
答:没有硬性比例,但有个经验法则:如果去掉所有注释,一个不熟悉代码的人能在30秒内理解每段代码的功能,则注释足够,通常API接口和算法逻辑需要10-20%的注释量。
问:Python类型提示(Type Hints)能替代注释吗?
答:不能,类型提示解决的是“参数和返回值是什么类型”,而注释解释“为什么、怎么用、特殊情况”,两者是互补关系,优秀的代码两者兼备。
问:如何避免注释过时?
答:养成“先改注释,再改代码”的习惯,在Git提交前做一次注释检查,可以借助工具如pylint的--comment-required配置。
问:对于只有自己能看懂的临时脚本,需要写注释吗?
答:需要,因为三天后你可能就看不懂了,但如果脚本生命周期极短(如一次性数据分析),可以适当简化,但至少保留函数文档。
问:注释中能否包含代码片段作为示例?
答:完全可以,在Docstring的Examples:部分写示例代码是PEP 257推荐的做法,对单元测试和文档生成都很有帮助。
好的注释是代码的“说明书”和“导航系统”,它不需要华丽辞藻,但必须精准、及时、有逻辑,从今天开始,用本文的3种写法和实践原则,优化你下一个Python案例的注释吧!