1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com
  1. Python 系列(一) 从零开始认识 Python,入门其实没那么难
  2. Python 系列(二) 学 Python 的第一步,把开发环境搭建好
  3. Python 系列(三) 基础语法避坑指南,缩进、大小写、续行与注释
  4. Python 系列(四) Python 输入输出详解,print()、input() 与常见避坑指南
  5. Python 系列(五) 数值类型与运算符详解,整除、浮点精度与进制转换实战
  6. Python 系列(六) 字符串处理实战,查找、替换、切片与日志分析
  7. Python 系列(七) 类型转换详解,int()、float()、str() 与金额计算避坑

Python 基础语法避坑:大小写、缩进、续行与注释全解

Python 入门并不难,但很多错误并不是逻辑复杂,而是因为一个字母的大小写、一个空格,或者一条写错位置的注释。这一篇,我们就从最基础的语法规则入手,搞清楚 Python 是如何识别代码结构的,以及如何避免那些让新手头疼的语法错误。

上一篇我们初步认识了 Python,了解了它是什么、能做什么,以及为什么值得学习。

从这一篇开始,我们正式进入 Python 基础语法。先别急着写复杂程序。就像学习 Linux 需要先掌握基本命令一样,学习 Python 也需要先弄清楚代码应该怎么写。大小写、缩进、续行和注释看起来不起眼,却是编写可靠程序的基础。李晓辉在带团队时发现,80% 的初级报错都出在这一层。

Python 区分大小写

先看一个很小的例子:

1
2
3
4
5
the_Person = "Him"
the_person = "Her"

print(the_Person)
print(the_person)

运行结果:

1
2
Him
Her

注意,the_Person 和 the_person 只相差一个字母的大小写,但在 Python 看来,它们是两个完全不同的变量。

如果不小心写错了会怎样:

1
2
3
server_name = "Linux"

print(Server_Name)

运行时会报错:

1
2
3
4
5
Traceback (most recent call last):
File "<python-input-1>", line 3, in <module>
print(Server_Name)
^^^^^^^^^^^
NameError: name 'Server_Name' is not defined. Did you mean: 'server_name'?

这是因为我们定义的是 server_name,打印时却使用了 Server_Name。Python 不会自动帮我们把大小写转换成一致的形式。

实际开发建议,李晓辉常用做法:

  • 变量名尽量使用有意义的英文单词
  • 普通变量和函数通常使用小写字母,多个单词之间用下划线分隔,例如 server_name、disk_usage
  • 使用变量时,确保名称与定义时完全一致
  • 不要为了区分变量而随意改变大小写,否则代码很容易变得难以维护

对于刚入门的朋友,最简单的做法就是:变量怎么定义,后面就怎么使用。

语句、分号与空白字符

Python 语句一定要以分号结尾吗?

不需要。

Python 通常使用换行来分隔语句。例如:

1
2
3
4
5
6
length = 10
width = 5

area = length * width

print(area)

运行结果:

1
50

这里每行通常是一条语句。代码不需要像某些编程语言那样,在每条语句末尾添加分号。

当然,Python 并不是完全不允许分号。我们也可以把多条简单语句写在同一行:

1
2
length = 10; width = 5; area = length * width
print(area)

代码同样可以运行,结果也是 50。

但是,能运行不代表值得推荐。把多条语句挤在一行,虽然能减少换行,却会降低代码的可读性,也不利于调试和代码审查。

日常编程中,优先采用一行一条语句的写法。

空格是不是越少越好?

不是。

Python 对空白字符的处理有自己的规则。

例如:

1
2
3
4
number = 10
result = number + 5

print(result)

运算符两边的空格主要是为了提高可读性。下面的写法通常也能正常运行:

1
2
3
number=10
result=number+5
print(result)

但是,按照 PEP 8 的代码风格建议,在赋值符号和二元运算符两侧适当添加空格,会让代码更容易阅读。

还有一点需要注意:并不是所有空格都可以随意删除。

例如:

1
2
message = "Hello Python"
print(message)

字符串中的空格属于字符串内容的一部分。如果把它删除,字符串的值也会随之改变。

另外,代码缩进与普通空格不同,它不仅影响排版,还会影响程序结构。下面我们重点讲解。

缩进决定代码结构

如果说大小写决定 Python 如何识别名称,那么缩进就决定了代码属于哪个代码块。

在很多编程语言中,我们会使用 {} 来表示代码块。而 Python 通常使用冒号 : 和缩进来表示代码块的开始及其内部语句。

例如:

1
2
3
4
5
6
7
system = "Linux"

if system == "Linux":
print("当前系统是 Linux")
print("准备执行检查任务")

print("程序执行结束")

运行结果:

1
2
3
当前系统是 Linux
准备执行检查任务
程序执行结束

我们来拆解一下这段代码:

  • if system == "Linux": 末尾的冒号表示后面将进入一个代码块
  • 两条缩进的 print() 语句属于 if 代码块
  • 最后一条 print() 恢复到外层缩进,因此不属于这个 if 代码块

也就是说,缩进不只是为了让代码看起来整齐,它本身就是 Python 语法的一部分。

缩进错误会导致什么问题?

先故意写错一次:

1
2
3
4
system = "Linux"

if system == "Linux":
print("当前系统是 Linux")

运行时,Python 会报出类似下面的错误:

1
2
3
4
  File "<python-input-12>", line 4
print("当前系统是 Linux")
^^^^^
IndentationError: expected an indented block after 'if' statement on line 3

意思是:if 语句后面需要一个缩进的代码块,但解释器没有找到符合要求的代码。

再看另一种情况:

1
2
print("第一行")
print("第二行")

如果第二行并不属于任何需要缩进的代码块,这样写也会导致 IndentationError。

1
2
3
  File "<python-input-15>", line 2
print("第二行")
IndentationError: unexpected indent

因此,缩进不能随意添加,也不能随意删除。

为什么推荐使用四个空格?

Python 官方风格指南 PEP 8 推荐每一级缩进使用四个空格。

例如:

1
2
3
4
5
if True:
print("第一层代码块")

if True:
print("第二层代码块")

每深入一级代码块,就增加四个空格。

需要注意的是,四个空格是一种推荐的代码风格,而不是说 Python 语法只能使用四个空格。真正重要的是,同一个代码块中的语句必须保持一致的缩进层级。

Tab 和空格混用有什么问题?

这是新手和团队协作中都可能遇到的问题。

有些编辑器按下 Tab 键会插入制表符,有些则会自动转换成空格。如果同一段代码混用了 Tab 和空格,可能会造成缩进不一致,甚至触发 TabError。

例如:

1
2
3
if True:
print("第一行")
print("第二行")

上面第二条 print() 前面使用了 Tab,而第一条使用的是空格。具体是否报错取决于实际缩进和解释器如何判断,但混用缩进字符可能导致错误或难以察觉的结构问题。

1
2
3
4
  File "<python-input-23>", line 3
print("第二行")
^
TabError: inconsistent use of tabs and spaces in indentation

建议在编辑器中开启以下设置:

  • 使用空格代替 Tab
  • 缩进宽度设置为 4 个空格
  • 开启缩进可视化
  • 编辑已有代码时,检查并统一缩进格式

实战建议:统一使用四个空格,不要混用 Tab 和空格。 我老李在代码评审里第一件事就是看缩进统一不统一。

长语句如何续行?

随着程序变得复杂,一条表达式可能会很长。如果全部挤在一行,不仅难以阅读,代码审查时也不方便。

Python 支持显式续行和隐式续行两种方式。

显式续行:使用反斜杠

在一行代码的末尾添加反斜杠 \,可以告诉 Python 当前语句还没有结束。

例如:

1
2
3
4
result = 500 * 2 + \
400 * 3

print(result)

运行结果:

1
2200

这里的反斜杠将两行连接为同一条逻辑语句。

不过,这种写法有一个需要注意的地方:反斜杠后面不能再有其他字符,包括空格和注释,否则可能导致语法错误。

例如:

1
2
result = 500 + \ 
400

如果反斜杠后面确实存在空格,就可能出现 SyntaxError。

1
2
3
4
  File "<python-input-25>", line 1
result = 500 + \
^
SyntaxError: unexpected character after line continuation character

显式续行在某些场景下可以使用,但如果能通过括号完成续行,通常优先选择括号。

隐式续行:使用括号

当表达式位于圆括号 ()、方括号 [] 或花括号 {} 内部时,Python 支持跨行书写,不需要额外添加反斜杠。

例如:

1
2
3
4
5
6
result = (
500 * 2
+ 400 * 3
)

print(result)

运行结果:

1
2200

这种方式更直观,即使表达式较长,也能清晰地展示计算结构。

再看一个列表的例子:

1
2
3
4
5
6
7
servers = [
"web-01",
"web-02",
"db-01",
]

print(servers)

运行结果:

1
['web-01', 'web-02', 'db-01']

列表中的每个元素单独占一行,后续增加或删除元素也更方便。

函数调用同样适用:

1
2
3
4
5
6
print(
"当前系统:",
"Linux",
"版本:",
"10"
)

运行结果:

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
2
3
4
# 定义服务器名称
server_name = "web-01"

print(server_name)

运行结果:

1
web-01

解释器不会执行注释中的内容。

行尾注释

注释也可以写在代码后面:

1
2
port = 8080  # 应用监听端口
timeout = 30 # 请求超时时间,单位为秒

按照 PEP 8 的建议,行尾注释应与代码至少间隔两个空格。

不过,不要给每一行代码都添加注释。如果代码本身已经很清楚,就没有必要重复解释。

例如:

1
count = count + 1  # count 加 1

这种注释通常没有提供额外信息。

更有价值的注释应该解释代码为什么这样写,或者说明特殊的业务约束。

多行说明与文档字符串

很多新手会把三引号字符串当成多行注释,例如:

1
2
3
4
"""
这是一个多行说明
用于介绍程序的功能
"""

严格来说,三引号创建的是多行字符串,而不是 Python 专门定义的多行注释语法。

如果这类字符串出现在模块、类或函数定义的开头,它可以成为文档字符串,也就是 docstring。

例如:

1
2
3
4
5
def check_disk_usage():
"""检查磁盘使用率并返回检查结果。"""
return "检查完成"

print(check_disk_usage())

运行结果:

1
检查完成

文档字符串可以通过 help() 或对象的 __doc__ 属性查看。

因此,写函数、类和模块说明时,推荐使用符合规范的文档字符串。

如果只是想临时屏蔽一段代码,通常直接使用 # 注释每一行更合适:

1
2
# print("临时屏蔽这条输出")
# print("调试完成后可以删除")

不建议长期保留大量已经失效的注释代码。真正需要保留的历史记录,可以交给 Git 等版本控制工具管理。

字符串中的 # 不是注释

看下面这段代码:

1
2
3
message = "This # is not a comment"

print(message)

运行结果:

1
This # is not a comment

因为 # 位于字符串内部,所以它只是普通字符,不会开始一段注释。

这是一个很基础、但很重要的区别:Python 会根据语法上下文判断字符的含义,而不是简单地把每一个 # 都当作注释标记。

注释规范速查表

类型示例作用
单行注释# 检查服务状态解释代码或补充说明
行尾注释port = 8080 # 服务端口补充当前语句的信息
文档字符串"""检查磁盘使用率。"""说明模块、类或函数的用途

综合实战:修复一段有问题的代码

前面分别学习了大小写、缩进、续行和注释。现在把这些知识点放在一起,看看能不能找出下面代码的问题。

1
2
3
4
5
6
7
Server_Name = "Linux"

if Server_Name == "Linux":
print("系统匹配成功")

server_name = "Python"
print(Server_Name)

这段代码至少存在一个会阻止程序正常运行的问题。

你可以先思考:

  1. if 下面的 print() 为什么有问题?
  2. Server_Name 和 server_name 是同一个变量吗?
  3. 如何修改代码,让程序能够正常运行?

修复后的代码:

1
2
3
4
5
6
7
Server_Name = "Linux"

if Server_Name == "Linux":
print("系统匹配成功")

server_name = "Python"
print(Server_Name)

运行结果:

1
2
系统匹配成功
Linux

这里,我们修复了 if 代码块的缩进问题。虽然 Server_Name 和 server_name 仍然是两个不同的变量,但代码并没有错误地使用它们,所以程序可以正常运行。

如果希望代码风格更加统一,也可以将变量统一改为小写加下划线的形式:

1
2
3
4
5
6
server_name = "Linux"

if server_name == "Linux":
print("系统匹配成功")

print(server_name)

运行结果:

1
2
系统匹配成功
Linux

通过这个小练习,你应该已经发现:有些问题会直接导致程序报错,有些问题则可能让程序执行出意料之外的结果。编写代码时,不仅要关注能不能运行,还要关注代码是否清晰、统一、容易维护。老李在实战复盘时经常提醒团队:先让语法对,再谈逻辑优。

生产环境中的几个避坑建议

学习语法不仅是为了通过练习,更是为了在真实项目中减少低级错误。

日常编写 Python 脚本时,可以重点关注以下几点:

  • 变量命名统一: 避免大小写不一致造成 NameError
  • 缩进风格统一: 使用四个空格,避免 Tab 与空格混用
  • 长表达式优先使用括号续行: 减少显式反斜杠带来的维护风险
  • 注释要有实际价值: 解释必要的背景、原因和约束,不要重复代码本身表达的意思
  • 及时运行代码: 发现错误时,先看报错类型和对应行号,再逐步排查

如果希望进一步提高代码质量,还可以使用代码格式化工具,例如 Black,以及代码检查工具 Ruff。它们可以帮助统一代码风格,并发现部分常见问题。

需要注意的是,格式化工具和代码检查工具不能代替对程序逻辑的理解,但它们可以减少很多重复、机械的检查工作。

写在最后

这一篇,我们学习了 Python 最基础的几项语法规则:

  • 大小写决定名称是否相同
  • 分号不是每条语句都必须使用的结束符
  • 缩进决定代码块的结构
  • 长语句可以通过显式或隐式方式续行
  • 注释用于帮助人理解代码,文档字符串则用于记录模块、类和函数的说明

这些知识看起来简单,却是后续学习变量、数据类型、条件判断、循环和函数的基础。