Python 系列(三) 基础语法避坑指南,缩进、大小写、续行与注释
1 | 作者:李晓辉 |
- Python 系列(一) 从零开始认识 Python,入门其实没那么难
- Python 系列(二) 学 Python 的第一步,把开发环境搭建好
- Python 系列(三) 基础语法避坑指南,缩进、大小写、续行与注释
- Python 系列(四) Python 输入输出详解,print()、input() 与常见避坑指南
- Python 系列(五) 数值类型与运算符详解,整除、浮点精度与进制转换实战
- Python 系列(六) 字符串处理实战,查找、替换、切片与日志分析
- Python 系列(七) 类型转换详解,int()、float()、str() 与金额计算避坑
- Python 系列(八) Python 流程控制入门,掌握 if、elif 和 else
- Python 系列(九) Python 逻辑运算符详解,and、or、not 一篇搞懂
- Python 系列(十) while、for 循环实战,彻底搞懂 range、break 与 continue
Python 基础语法避坑:大小写、缩进、续行与注释全解
Python 入门并不难,但很多错误并不是逻辑复杂,而是因为一个字母的大小写、一个空格,或者一条写错位置的注释。这一篇,我们就从最基础的语法规则入手,搞清楚 Python 是如何识别代码结构的,以及如何避免那些让新手头疼的语法错误。
上一篇我们初步认识了 Python,了解了它是什么、能做什么,以及为什么值得学习。
从这一篇开始,我们正式进入 Python 基础语法。先别急着写复杂程序。就像学习 Linux 需要先掌握基本命令一样,学习 Python 也需要先弄清楚代码应该怎么写。大小写、缩进、续行和注释看起来不起眼,却是编写可靠程序的基础。李晓辉在带团队时发现,80% 的初级报错都出在这一层。
Python 区分大小写
先看一个很小的例子:
1 | the_Person = "Him" |
运行结果:
1 | Him |
注意,the_Person 和 the_person 只相差一个字母的大小写,但在 Python 看来,它们是两个完全不同的变量。
如果不小心写错了会怎样:
1 | server_name = "Linux" |
运行时会报错:
1 | Traceback (most recent call last): |
这是因为我们定义的是 server_name,打印时却使用了 Server_Name。Python 不会自动帮我们把大小写转换成一致的形式。
实际开发建议,李晓辉常用做法:
- 变量名尽量使用有意义的英文单词
- 普通变量和函数通常使用小写字母,多个单词之间用下划线分隔,例如
server_name、disk_usage - 使用变量时,确保名称与定义时完全一致
- 不要为了区分变量而随意改变大小写,否则代码很容易变得难以维护
对于刚入门的朋友,最简单的做法就是:变量怎么定义,后面就怎么使用。
语句、分号与空白字符
Python 语句一定要以分号结尾吗?
不需要。
Python 通常使用换行来分隔语句。例如:
1 | length = 10 |
运行结果:
1 | 50 |
这里每行通常是一条语句。代码不需要像某些编程语言那样,在每条语句末尾添加分号。
当然,Python 并不是完全不允许分号。我们也可以把多条简单语句写在同一行:
1 | length = 10; width = 5; area = length * width |
代码同样可以运行,结果也是 50。
但是,能运行不代表值得推荐。把多条语句挤在一行,虽然能减少换行,却会降低代码的可读性,也不利于调试和代码审查。
日常编程中,优先采用一行一条语句的写法。
空格是不是越少越好?
不是。
Python 对空白字符的处理有自己的规则。
例如:
1 | number = 10 |
运算符两边的空格主要是为了提高可读性。下面的写法通常也能正常运行:
1 | number=10 |
但是,按照 PEP 8 的代码风格建议,在赋值符号和二元运算符两侧适当添加空格,会让代码更容易阅读。
还有一点需要注意:并不是所有空格都可以随意删除。
例如:
1 | message = "Hello Python" |
字符串中的空格属于字符串内容的一部分。如果把它删除,字符串的值也会随之改变。
另外,代码缩进与普通空格不同,它不仅影响排版,还会影响程序结构。下面我们重点讲解。
缩进决定代码结构
如果说大小写决定 Python 如何识别名称,那么缩进就决定了代码属于哪个代码块。
在很多编程语言中,我们会使用 {} 来表示代码块。而 Python 通常使用冒号 : 和缩进来表示代码块的开始及其内部语句。
例如:
1 | system = "Linux" |
运行结果:
1 | 当前系统是 Linux |
我们来拆解一下这段代码:
if system == "Linux":末尾的冒号表示后面将进入一个代码块- 两条缩进的
print()语句属于if代码块 - 最后一条
print()恢复到外层缩进,因此不属于这个if代码块
也就是说,缩进不只是为了让代码看起来整齐,它本身就是 Python 语法的一部分。
缩进错误会导致什么问题?
先故意写错一次:
1 | system = "Linux" |
运行时,Python 会报出类似下面的错误:
1 | File "<python-input-12>", line 4 |
意思是:if 语句后面需要一个缩进的代码块,但解释器没有找到符合要求的代码。
再看另一种情况:
1 | print("第一行") |
如果第二行并不属于任何需要缩进的代码块,这样写也会导致 IndentationError。
1 | File "<python-input-15>", line 2 |
因此,缩进不能随意添加,也不能随意删除。
为什么推荐使用四个空格?
Python 官方风格指南 PEP 8 推荐每一级缩进使用四个空格。
例如:
1 | if True: |
每深入一级代码块,就增加四个空格。
需要注意的是,四个空格是一种推荐的代码风格,而不是说 Python 语法只能使用四个空格。真正重要的是,同一个代码块中的语句必须保持一致的缩进层级。
Tab 和空格混用有什么问题?
这是新手和团队协作中都可能遇到的问题。
有些编辑器按下 Tab 键会插入制表符,有些则会自动转换成空格。如果同一段代码混用了 Tab 和空格,可能会造成缩进不一致,甚至触发 TabError。
例如:
1 | if True: |
上面第二条 print() 前面使用了 Tab,而第一条使用的是空格。具体是否报错取决于实际缩进和解释器如何判断,但混用缩进字符可能导致错误或难以察觉的结构问题。
1 | File "<python-input-23>", line 3 |
建议在编辑器中开启以下设置:
- 使用空格代替 Tab
- 缩进宽度设置为 4 个空格
- 开启缩进可视化
- 编辑已有代码时,检查并统一缩进格式
实战建议:统一使用四个空格,不要混用 Tab 和空格。 我老李在代码评审里第一件事就是看缩进统一不统一。
长语句如何续行?
随着程序变得复杂,一条表达式可能会很长。如果全部挤在一行,不仅难以阅读,代码审查时也不方便。
Python 支持显式续行和隐式续行两种方式。
显式续行:使用反斜杠
在一行代码的末尾添加反斜杠 \,可以告诉 Python 当前语句还没有结束。
例如:
1 | result = 500 * 2 + \ |
运行结果:
1 | 2200 |
这里的反斜杠将两行连接为同一条逻辑语句。
不过,这种写法有一个需要注意的地方:反斜杠后面不能再有其他字符,包括空格和注释,否则可能导致语法错误。
例如:
1 | result = 500 + \ |
如果反斜杠后面确实存在空格,就可能出现 SyntaxError。
1 | File "<python-input-25>", line 1 |
显式续行在某些场景下可以使用,但如果能通过括号完成续行,通常优先选择括号。
隐式续行:使用括号
当表达式位于圆括号 ()、方括号 [] 或花括号 {} 内部时,Python 支持跨行书写,不需要额外添加反斜杠。
例如:
1 | result = ( |
运行结果:
1 | 2200 |
这种方式更直观,即使表达式较长,也能清晰地展示计算结构。
再看一个列表的例子:
1 | servers = [ |
运行结果:
1 | ['web-01', 'web-02', 'db-01'] |
列表中的每个元素单独占一行,后续增加或删除元素也更方便。
函数调用同样适用:
1 | print( |
运行结果:
1 | 当前系统: Linux 版本: 10 |
print() 默认使用空格分隔多个参数,因此输出中会出现空格。
注意,这不是 Python 自动删除了参数之间的空格,而是 print() 的默认参数 sep=" " 起了作用。
两种续行方式怎么选?
可以记住下面这条简单的经验:
- 一般情况下,优先使用括号进行隐式续行
- 显式续行适用于确实需要反斜杠连接语句的场景
- 长表达式尽量合理换行,避免一整行塞入过多内容
flowchart TD
A[代码行太长] --> B{能否放入括号?}
B -->|可以| C["使用 () [] {}"]
B -->|不方便| D[考虑反斜杠续行]
C --> E[检查缩进与可读性]
D --> F[确认反斜杠后没有空格]
F --> E
E --> G[运行程序验证]Python 允许在左括号和右括号之间使用任意数量的空格字符,这些空格不需要遵守缩进规则,但不推荐这样使用。
注释怎么写才专业?
代码是写给计算机执行的,注释则主要是写给人看的。
合理的注释可以帮助我们理解代码的目的,但如果注释写得过多、过时,反而会增加维护成本。
单行注释
Python 使用 # 表示注释。从 # 开始直到当前物理行结束的内容,都会被当作注释,字符串内部的 # 除外。
例如:
1 | # 定义服务器名称 |
运行结果:
1 | web-01 |
解释器不会执行注释中的内容。
行尾注释
注释也可以写在代码后面:
1 | port = 8080 # 应用监听端口 |
按照 PEP 8 的建议,行尾注释应与代码至少间隔两个空格。
不过,不要给每一行代码都添加注释。如果代码本身已经很清楚,就没有必要重复解释。
例如:
1 | count = count + 1 # count 加 1 |
这种注释通常没有提供额外信息。
更有价值的注释应该解释代码为什么这样写,或者说明特殊的业务约束。
多行说明与文档字符串
很多新手会把三引号字符串当成多行注释,例如:
1 | """ |
严格来说,三引号创建的是多行字符串,而不是 Python 专门定义的多行注释语法。
如果这类字符串出现在模块、类或函数定义的开头,它可以成为文档字符串,也就是 docstring。
例如:
1 | def check_disk_usage(): |
运行结果:
1 | 检查完成 |
文档字符串可以通过 help() 或对象的 __doc__ 属性查看。
因此,写函数、类和模块说明时,推荐使用符合规范的文档字符串。
如果只是想临时屏蔽一段代码,通常直接使用 # 注释每一行更合适:
1 | # print("临时屏蔽这条输出") |
不建议长期保留大量已经失效的注释代码。真正需要保留的历史记录,可以交给 Git 等版本控制工具管理。
字符串中的 # 不是注释
看下面这段代码:
1 | message = "This # is not a comment" |
运行结果:
1 | This # is not a comment |
因为 # 位于字符串内部,所以它只是普通字符,不会开始一段注释。
这是一个很基础、但很重要的区别:Python 会根据语法上下文判断字符的含义,而不是简单地把每一个 # 都当作注释标记。
注释规范速查表
| 类型 | 示例 | 作用 |
|---|---|---|
| 单行注释 | # 检查服务状态 | 解释代码或补充说明 |
| 行尾注释 | port = 8080 # 服务端口 | 补充当前语句的信息 |
| 文档字符串 | """检查磁盘使用率。""" | 说明模块、类或函数的用途 |
综合实战:修复一段有问题的代码
前面分别学习了大小写、缩进、续行和注释。现在把这些知识点放在一起,看看能不能找出下面代码的问题。
1 | Server_Name = "Linux" |
这段代码至少存在一个会阻止程序正常运行的问题。
你可以先思考:
if下面的print()为什么有问题?Server_Name和server_name是同一个变量吗?- 如何修改代码,让程序能够正常运行?
修复后的代码:
1 | Server_Name = "Linux" |
运行结果:
1 | 系统匹配成功 |
这里,我们修复了 if 代码块的缩进问题。虽然 Server_Name 和 server_name 仍然是两个不同的变量,但代码并没有错误地使用它们,所以程序可以正常运行。
如果希望代码风格更加统一,也可以将变量统一改为小写加下划线的形式:
1 | server_name = "Linux" |
运行结果:
1 | 系统匹配成功 |
通过这个小练习,你应该已经发现:有些问题会直接导致程序报错,有些问题则可能让程序执行出意料之外的结果。编写代码时,不仅要关注能不能运行,还要关注代码是否清晰、统一、容易维护。老李在实战复盘时经常提醒团队:先让语法对,再谈逻辑优。
生产环境中的几个避坑建议
学习语法不仅是为了通过练习,更是为了在真实项目中减少低级错误。
日常编写 Python 脚本时,可以重点关注以下几点:
- 变量命名统一: 避免大小写不一致造成
NameError - 缩进风格统一: 使用四个空格,避免 Tab 与空格混用
- 长表达式优先使用括号续行: 减少显式反斜杠带来的维护风险
- 注释要有实际价值: 解释必要的背景、原因和约束,不要重复代码本身表达的意思
- 及时运行代码: 发现错误时,先看报错类型和对应行号,再逐步排查
如果希望进一步提高代码质量,还可以使用代码格式化工具,例如 Black,以及代码检查工具 Ruff。它们可以帮助统一代码风格,并发现部分常见问题。
需要注意的是,格式化工具和代码检查工具不能代替对程序逻辑的理解,但它们可以减少很多重复、机械的检查工作。
写在最后
这一篇,我们学习了 Python 最基础的几项语法规则:
- 大小写决定名称是否相同
- 分号不是每条语句都必须使用的结束符
- 缩进决定代码块的结构
- 长语句可以通过显式或隐式方式续行
- 注释用于帮助人理解代码,文档字符串则用于记录模块、类和函数的说明
这些知识看起来简单,却是后续学习变量、数据类型、条件判断、循环和函数的基础。
