写过 C 语言或 Java 的人,第一反应往往是去找大括号,而 Python 语言不靠花括号圈代码块,而是用缩进层级来表示从属关系。缩进一旦对不齐,解释器就会抛出 IndentationError(缩进错误)。语句如何断行、缩进如何对齐、注释与 docstring 怎么写,这几件事弄清楚之后,后面学循环和函数时这类错误就会少很多。

语句(Statement)

解释器一次执行的那条指令叫语句,赋值、if、for、while 都属于这一类,写法大致如下:

a = 1          # 赋值语句
if a > 0:      # if 语句
    print(a)   # 缩进内的部分属于 if

多数时候一条语句独占一行,换行即表示本句结束,如果非要把几条挤在同一行,可以用分号隔开,只是可读性较差,日常很少这样写:

a = 1; b = 2; c = 3

多行语句

一行写不下时可以把一条语句拆到多行,显式做法是在行尾加反斜杠 \,下一行接着写即可:

total = 1 + 2 + 3 + \
        4 + 5 + 6

更省事的是隐式换行:只要还在圆括号、方括号或花括号内部,直接换行即可,不必再加反斜杠:

total = (1 + 2 + 3 +
         4 + 5 + 6)

colors = ['red',
          'blue',
          'green']

缩进怎么划定代码块

C 语言和 Java 用 {} 圈出代码块,Python 语言则改用缩进:从多缩进一层的地方开始,到缩进回到外层为止,中间都属于同一块:

if True:
    print('Hello')   # 这一行属于 if
    a = 5            # 这一行也属于 if
print('世界')         # 缩进回来了,不属于 if

每个缩进层级用几个空格可以自己定,但同一代码块里必须统一,空格和 Tab 混用、同一层对不齐都会触发 IndentationError。常见约定是一层缩进用 4 个空格,尽量不用 Tab。

注释(Comment)

注释写给读代码的人看,解释器会整段跳过,单行注释以 # 开头,从标记处一直到行尾都算注释内容:

# 这是一个注释
print('Hello')   # 行尾注释

说明稍长时不必另找语法,最直接的办法是连续几行各自加一个 #:

# 这是一个长注释
# 它延伸到了多行

也有人用三引号字符串顶替多行注释。它并不是注释语法本身,只是因为没有赋给变量,运行时会被丢掉,效果上接近一段被忽略的说明:

"""
这也是一个
多行注释
"""

文档字符串(Docstring)

函数、类或模块定义后的第一行如果写成三引号字符串,就叫文档字符串(docstring),之后可以用 .__doc__ 读到它:

def double(num):
    """函数使值翻倍"""
    return 2 * num

print(double.__doc__)   # 输出: 函数使值翻倍

养成写 docstring 的习惯很有用,人读代码时能直接看到意图说明,IDE 和文档工具也能把它提取出来当参考。

写代码时核对这几项

  • 同一代码块缩进是否一致(都用 4 空格)?
  • if / for / while 冒号后面的内容有没有缩进?
  • 长表达式是不是用括号包起来自然换行了?
  • 关键逻辑有没有写注释 / docstring?