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() 与金额计算避坑
  8. Python 系列(八) Python 流程控制入门,掌握 if、elif 和 else
  9. Python 系列(九) Python 逻辑运算符详解,and、or、not 一篇搞懂
  10. Python 系列(十) while、for 循环实战,彻底搞懂 range、break 与 continue

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 最基础的几项语法规则:

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

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