查看全课大纲(第 4 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 51.Counter 如何快速统计元素出现次数?

行与缩进到底有什么用?

约 11 分钟

小象实战讲义 · Python 编程从入门到实践

欢迎来到 Python 编程基础语法的学习。在上一节,我们初步认识了 Python 的代码。这一节,我们将聚焦于 Python 代码的物理结构——行与缩进。这是 Python 区别于许多其他编程语言(如 Java、C)的核心特征之一。理解并正确使用缩进,是写出合法且可读 Python 代码的第一步。本节内容将直接服务于后续所有关于控制流(如 if、for)和函数定义的章节。

💡 核心导读

  • 缩进即语法:Python 使用缩进来标识代码块,而不是大括号 {}。缩进是语法的一部分,而不仅仅是排版。
  • 一致性要求:同一个代码块内的所有语句必须保持相同的缩进级别(空格数)。
  • 行连接:当一行代码过长时,可以使用反斜杠 \ 将其连接至下一行。
  • 空行的作用:空行不影响代码执行,但用于分隔逻辑上不同的代码块,是提升代码可读性的良好习惯。

缩进:Python 的代码块标识符

在 Java 或 C 语言中,代码块通常由大括号 {} 包裹。程序员在括号内进行缩进,主要是为了方便人类阅读,编译器并不关心这些空格或制表符。

# 这是一个 Python 函数定义的示例
def big_num(now):
    if now > 10:
        print("Big Number!")
    else:
        print("Small Number!")

在 Python 中,情况完全不同。缩进本身就是语法的一部分。Python 解释器通过语句前的空格(或制表符)来识别哪些语句属于同一个逻辑块。

  • def big_num(now): 这一行定义了一个函数。紧随其后的、缩进了一级的所有语句(直到缩进恢复)共同构成了这个函数的函数体。
  • 在函数体内,if now > 10: 是一个条件判断。它下面再次缩进一级的 print("Big Number!") 语句,构成了仅在条件为真时才执行的代码块。
  • 同样,else: 下面的 print("Small Number!") 也构成了一个独立的代码块。

如果没有正确的缩进,Python 解释器将无法理解代码的逻辑结构,并会报错。

缩进的一致性规则

缩进使用的空格数量可以是 2 个、4 个或 1 个制表符(Tab),这由个人或团队的编码风格决定。但有一条铁律必须遵守:

同一个代码块内的所有语句,必须使用完全相同数量的空格(或制表符)进行缩进。

让我们看一个需要执行多条语句的代码块例子:

def check_number(num):
    if num % 2 == 0:  # 如果数字是偶数
        print("{} 是偶数".format(num))
        square = num * num  # 计算它的平方
        print("它的平方是 {}".format(square))

check_number(4)
4 是偶数
它的平方是 16

在上面 if 语句的代码块中,两条 print 语句和一条赋值语句都使用了相同的缩进(比如都是 4 个空格),因此它们被识别为同一个代码块,会在条件满足时按顺序全部执行。调用 check_number(4) 时,条件成立,所以两行输出都会出现。

如果缩进不一致,会发生什么呢?

# 错误写法示例:缩进不一致
def check_number_wrong(num):
    if num % 2 == 0:
        print("{} 是偶数".format(num))  # 假设这里缩进4个空格
          square = num * num    # 这里不小心多打了空格(比如6个)
        print("它的平方是 {}".format(square))

运行上面的错误代码,Python 解释器会立即报错:IndentationError: unexpected indent。它明确告诉你,在 square = num * num 这一行发现了意外的、不一致的缩进,程序无法继续执行。

行的连接与分割

多行语句

通常,Python 中一条语句写在一行内。但如果语句过长,为了便于阅读,可以将其分成多行书写。这时,需要在要换行的位置加上一个反斜杠 \。

# 使用反斜杠连接多行,将一条长计算语句分成两行
total = 1 + 2 + \
        3 + 4
print(total)
10

如果不加反斜杠直接换行,Python 会认为第一行是一条不完整的语句,从而引发语法错误。

# 错误写法示例:未使用反斜杠直接换行
total = 1 + 2 +
        3 + 4
# 运行会报错:SyntaxError: invalid syntax

空行

空行(即不包含任何字符,只包含换行符的行)在 Python 中不会影响代码的执行。它的作用是在视觉上分隔逻辑上不同的代码块,从而极大地提高代码的可读性和可维护性。

# 第一部分:读入一个数字
now = 15

# 这里用一个空行分隔,表示下面开始新的逻辑功能

# 第二部分:数字大于 10 时打印提示,并给变量加二
if now > 10:
    print("Big Number!")
    now = now + 2

# 又一个空行

# 第三部分:打印加二之后的结果
print(now)
Big Number!
17

养成在不同功能模块间插入空行的习惯,能让你的代码结构更清晰,无论是自己日后回顾,还是与他人协作,都会更加方便。

📝 动手练一练

  1. 修复缩进错误:下面的代码意图是判断一个数是否为正数,如果是,则打印该数及其相反数。但它的缩进有误,请指出错误并写出正确版本。
    def check_positive(x):
    if x > 0:
    print("{} 是正数".format(x))
        opposite = -x
        print("它的相反数是 {}".format(opposite))
👉 点击查看参考答案

错误分析:函数体(def 下面的所有语句)没有进行缩进。同时,if 代码块内的第一条 print 语句也没有正确缩进。

正确写法:函数体和 if 代码块内的所有语句都需要进行统一且一致的缩进。

def check_positive(x):
    if x > 0:
        print("{} 是正数".format(x))
        opposite = -x
        print("它的相反数是 {}".format(opposite))

# 测试
check_positive(5)
5 是正数
它的相反数是 -5

常见错误

错误写法现象或报错原因正确写法
if x > 0:
print("正数")
print("执行")
IndentationError: expected an indented block after 'if' statement on line 1第二行属于 if 代码块但未缩进,解释器在需要缩进的位置看到了顶格语句。if x > 0:
print("正数")
print("执行")
total = 1 + 2 +
3 + 4
SyntaxError: invalid syntax在第一行末尾直接换行,Python 认为表达式不完整。total = 1 + 2 + \
3 + 4

小结

  1. Python 使用缩进来定义代码块(如函数体、循环体、条件分支),这是其核心语法规则。
  2. 同一代码块内的所有语句必须保持完全一致的缩进量(空格数或制表符数),否则会引发 IndentationError。
  3. 当单行语句过长时,可在换行处使用反斜杠 \ 进行连接。
  4. 空行不影响程序执行,但用于分隔逻辑上独立的代码段,是重要的代码风格规范,能显著提升可读性。

📋 行动清单

  • 在编辑器中输入本节的所有示例代码,并运行验证结果。
  • 故意制造一次 IndentationError(如将同一代码块的两行设为不同缩进),观察解释器的报错信息。
  • 尝试将一段较长的 print 语句用反斜杠 \ 分成两行书写,并成功运行。

—— 小象教研组