☰
Python 注释完全指南:掌握 `` 语法、调试技巧与文档化实践(c9-python-getting-started 实战)
2026/10/15 18:09:17 网站建设 项目流程
  • 示例工程
  • 教程

【免费下载链接】c9-python-getting-started

Sample code for Channel 9 Python for Beginners course

项目地址:https://gitcode.com/gh_mirrors/c9/c9-python-getting-started
点击查看免费下载

导读

注释是 Python 代码中最简单却最常被忽视的基础语法。本文以 c9-python-getting-started 仓库中 python-for-beginners/03 - Comments 模块为骨架,系统讲解#号注释的语法规则、执行行为,并结合仓库配套源码演示「为代码写说明」与「用注释做调试」两大核心用途。读完本文,你将能正确书写注释、利用注释定位 bug,并理解注释与字符串、docstring、README 之间的边界关系。


一、注释的语法规则:以#开头,执行时被忽略

原文档给出了两条最核心的定义:

Comments start with a hash character (#) and allow you to document your code. Comments are ignored when code is executed.

翻译成技术要点就是:

  • 注释以井号字符#开头;
  • 注释用于为你的代码书写说明文档;
  • 解释器执行代码时,注释会被完全忽略。

#之后的同一行内容全部属于注释,注释一直延续到该物理行的行尾,换行即结束。这条规则在 Python 官方词法分析(lexical analysis)规范中有明确对应,也正是原文档链接指向的官方文档主题。

运行验证:注释确实不产生任何输出

仓库中的 comments_are_not_executed.py 用一个极简示例直观展示了「注释不被执行」:

# This is a comment in my code it does nothing # print('Hello world') # print("Hello world") # No output will be displayed!

整个文件全是注释,其中甚至包含两行被注释掉的print('Hello world')调用。实际运行该文件:

python3 "python-for-beginners/03 - Comments/comments_are_not_executed.py"

终端不会输出任何内容,程序以状态码 0 正常结束——即使你把整段「打印语句」写进注释里,它们也永远不会被执行。这验证了注释的第一大特性:注释是写给人和工具看的,不是写给解释器看的。

二、注释的两大核心用途:写说明与做调试

原文档强调注释的作用是 "document your code",而仓库配套代码恰好示范了注释在真实开发中的两种典型用法。

2.1 用途一:为代码书写说明文档

enable_pin.py 是一个带完整注释的、可运行的 PIN 功能示例:

#The enable_pin method is not coded yet # I have created a dummy method so the code # will run without an error # Don't panic if you don't understand this part of the code # we cover methods in a separate module def enable_pin(user, pin): print('pin enabled') # Set current_user and pin to test values current_user = 'TEST123' pin = '123456' # Enable PIN check as listed in # security requirements enable_pin(current_user, pin)

这个示例展示了注释的多个重要用法:

  • 解释设计意图:注释先说明enable_pin方法尚未真正实现、当前只是占位(dummy method),避免读者误以为这是最终代码;
  • 安抚读者、指引学习路径:注释明确提示「方法(methods)会在后续模块中讲解」,让初学者不被未知语法吓退;
  • 标注变量用途:# Set current_user and pin to test values说明下面两行是测试数据;
  • 关联需求文档:# Enable PIN check as listed in security requirements把代码与安全需求条目建立对应关系,这是工程实践中「代码可追溯」的起点。

运行该文件会输出pin enabled,说明注释之外的代码正常工作,注释对运行结果零影响。

2.2 用途二:临时禁用代码,辅助调试

调试时最常见的操作就是「注释掉一行代码,看看去掉它之后程序行为是否变化」。仓库中 comments_for_debugging.py 从文件名上看就是为演示这一场景而准备的:

print('Hello world') print('It's a small world after all')

这个文件故意保留了第二个print中的语法问题('It's ...在单引号字符串内嵌套了未转义的单引号)。运行它会得到:

SyntaxError: unterminated string literal (detected at line 2)

把调试思维套进来:如果某一行代码疑似有问题,你可以先用#把它注释掉、运行其余部分,确认问题是否由该行引起——这正是「注释用于调试」的标准流程。同时它也提醒我们:注释可以帮你绕过有问题的代码行,但不会修复真正的语法错误,错误最终还是需要修改代码本身来解决。

对比 comments_are_not_executed.py:把print('Hello world')完整注释掉后文件可以零报错运行;而 comments_for_debugging.py 的问题出在字符串内部,#注释无法触及,所以仍会报错。这恰好说明了「#注释的边界」——下面第四节会展开。

三、注释的编写实践:位置、时机与可读性

3.1 独立行注释与行尾注释

从上面的仓库示例可以看出,Python 中最常见的注释形态是独立成行(整行以#开头)。此外,注释也可以跟在代码行末尾(行尾注释 / trailing comment):

current_user = 'TEST123' # 测试用户 pin = '123456' # 测试 PIN

无论哪种形态,解释器都会在词法分析阶段把#到行尾的内容丢弃,不影响该行代码的执行。

3.2 注释应该解释「为什么」,而不是复述「做什么」

一个常见误区是写「冗余注释」,例如:

x = x + 1 # 把 x 加 1

这样的注释只是把代码翻译成中文,没有额外信息量。更好的注释应该说明动机与约束,例如 enable_pin.py 中# Enable PIN check as listed in security requirements就交代了「为什么必须有这段调用」。

3.3 注释与字符串引号的关系

本模块的 string_in_double_quotes.py 虽然是关于字符串引号选择的示例,但它同样示范了「注释辅助解释决策」的写法:

# Using double quotes for this string because # the string itself contains a single quote print("It's a small world after all")

这里注释解释了「为什么用双引号」——因为字符串内容本身包含单引号。这正是 2.2 节中'It's a small world after all'报错的正确解法:改用双引号包裹即可避免引号冲突。可见,一句到位的好注释,往往能把一个易错点讲清楚,避免后人踩同样的坑。

四、理解注释的边界:#与字符串、shebang 的区别

4.1 字符串里的#不是注释

#只有在不属于字符串字面量的一部分时才表示注释开始。例如:

print("# this is not a comment")

这行代码中的#位于双引号字符串内部,会被当作普通字符打印出来,绝不会触发注释解析。这一点在 Python 官方词法分析规范中有明确表述("A comment starts with a hash character (#) that is not part of a string literal")。

4.2 文件首行的#!(shebang)

如果#出现在脚本第一行且紧跟!,它构成 shebang 行(如#!/usr/bin/env python3),用于告诉操作系统用哪个解释器执行该脚本。shebang 在语法上同样是注释(会被忽略),但语义特殊。在本仓库的 python-for-beginners 课程示例中,所有.py文件均未使用 shebang,直接通过python3 文件名.py运行,可见对初学者而言这并不是必需项。

五、从注释到三层文档化体系:注释、docstring 与 README

原文档指出注释让你能够 "document your code",而一个工程化的 Python 项目通常有三层文档载体,注释只是其中一层:

载体语法位置服务对象仓库示例
行内注释#代码行内/行尾阅读这段代码的人enable_pin.py
docstring"""..."""函数/类/模块定义首行使用该函数/模块的开发者more-python-for-beginners/01 - Formatting and linting/good.py
READMEMarkdown目录/模块根整个模块的读者python-for-beginners/03 - Comments/README.md

以仓库 good.py 为例,它示范了标准 docstring 的写法——用三引号包裹,并结构化描述参数(Parameters)与返回值(Returns):

def print_hello(name: str) -> str: """ Greets the user by name Parameters: name (str): The name of the user Returns: str: The greeting """ print('Hello, ' + name)

docstring 与#注释的区别在于:docstring 是真实存在的字符串表达式,能被help()、IDE 提示和文档生成工具读取;而#注释在词法阶段就被丢弃,纯粹服务于人类阅读。两者分工互补:短小、临时的说明用#,正式、可被工具消费的接口说明用 docstring。

再往上一层,03 - Comments/README.md 本身就是一个 Markdown 注释——用人类可读的文档格式介绍模块主题、并链接到 Python 官方词法分析文档(该链接是原文档中唯一的官方参考资料,建议进阶阅读)。

六、常见误区自查清单

结合本模块源码与运行结果,初学者应特别注意以下几点:

  1. 注释不会执行:被#注释掉的代码不会运行,comments_are_not_executed.py 已验证;
  2. 注释不是语法错误的解药:字符串内部的语法错误(如 comments_for_debugging.py 的SyntaxError: unterminated string literal)无法通过外部加注释解决,必须修正字符串本身的写法;
  3. #在字符串内是普通字符:不要误以为字符串里的#会开启注释;
  4. 注释应解释动机:多写「为什么」,少写「是什么」,参见 string_in_double_quotes.py 的注释写法;
  5. 善用注释做调试:怀疑某行代码有问题时,先注释掉它再运行,快速缩小排查范围(enable_pin.py 中的注释块也展示了如何临时「关掉」尚未实现的代码让程序先跑通)。

七、小结

注释是 Python 语法中最轻量的部分,却承担着代码可读性、可维护性与可调试性的重任。核心规则只有两条:以#开头、执行时被忽略,但把它用好的关键在于:为代码补充说明、为调试提供开关、为后人解释动机。本模块的四个配套示例(comments_are_not_executed.py、comments_for_debugging.py、enable_pin.py、string_in_double_quotes.py)都值得逐一运行验证。掌握注释之后,你就可以放心进入下一个主题——字符串变量,那里你将看到注释与字符串引号规则的更多配合场景。

  • 示例工程
  • 教程

【免费下载链接】c9-python-getting-started

Sample code for Channel 9 Python for Beginners course

项目地址:https://gitcode.com/gh_mirrors/c9/c9-python-getting-started
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询