Python(二) 基础语法:缩进和代码块
一、为什么要学习缩进和代码块
学习 Python 时,缩进和代码块是非常重要的基础内容。
在很多编程语言中,代码块通常用大括号 {} 表示。例如有些语言会这样写:
if 条件 {
条件成立时执行的代码
}
但是 Python 不使用大括号来表示代码块,而是使用缩进。
也就是说,在 Python 中,缩进不只是为了让代码看起来整齐,它本身就是语法的一部分。
如果缩进写错,程序可能会直接报错;即使没有报错,也可能导致程序执行结果和预期不一样。
所以,学习 Python 一定要重视缩进和代码块。
二、缩进的定义
缩进指的是一行代码开头处空出来的距离。
在 Python 中,缩进用来表示代码之间的层级关系。
例如:
if True:
print("条件成立")
第二行 print("条件成立") 前面有一段空白,这段空白就是缩进。
它表示:
print("条件成立") 这一行属于 if 语句内部。
如果没有缩进:
if True:
print("条件成立")
Python 就不知道 if True: 后面到底要执行哪一行代码,因此会报错。
三、代码块的定义
代码块指的是一组在逻辑上属于同一层级、共同完成某个任务的代码。
在 Python 中,代码块通常出现在冒号 : 后面,并且通过缩进来表示。
常见会产生代码块的语句包括:
if条件判断elif和elsefor循环while循环def函数定义class类定义try、except、finally异常处理with上下文管理
例子:
age = 18
if age >= 18:
print("已成年")
print("可以参加活动")
这里:
print("已成年")
print("可以参加活动")
这两行都缩进了,所以它们共同组成 if age >= 18: 的代码块。
四、缩进和代码块的关系
在 Python 中,可以这样理解:
缩进决定代码属于哪个代码块。
也就是说:
- 缩进相同的代码,通常属于同一个代码块。
- 缩进更多的代码,通常表示进入了更里面的一层代码块。
- 缩进减少的代码,通常表示退出了当前代码块。
例子:
age = 20
if age >= 18:
print("已成年")
print("可以办理成人业务")
print("程序结束")
这段代码中:
print("已成年")
print("可以办理成人业务")
有相同的缩进,所以都属于 if 代码块。
而:
print("程序结束")
没有缩进,所以它不属于 if 代码块。无论 if 条件是否成立,这一行都会执行。
五、缩进的基本使用方法
1. 冒号后面通常要缩进
在 Python 中,很多语句后面会有冒号 :。冒号表示“下面要开始一个代码块了”。
例如:
if score >= 60:
print("及格")
冒号后面的下一行,一般要缩进。
再看几个例子:
for i in range(3):
print(i)
def hello():
print("你好")
while True:
print("循环中")
break
这些冒号后面的代码都需要缩进。
2. 同一个代码块中的缩进要保持一致
同一个代码块里的代码,缩进必须保持一致。
正确:
if True:
print("第一行")
print("第二行")
错误:
if True:
print("第一行")
print("第二行")
第二个例子中,两行 print 的缩进不一致,Python 可能会报缩进错误。
课堂上可以提醒学生:
同一组代码要站在同一条“起跑线”上。
3. 推荐使用 4 个空格作为一级缩进
Python 官方推荐每一级缩进使用 4 个空格。
例如:
if age >= 18:
print("已成年")
这里 print("已成年") 前面有 4 个空格。
虽然有些编辑器也支持按 Tab 键缩进,但在教学和实际开发中,建议统一使用 4 个空格。
很多代码编辑器中,按一次 Tab 键会自动转换成 4 个空格。这样既方便输入,又符合规范。
4. 嵌套代码块需要继续增加缩进
如果一个代码块里面还有另一个代码块,就需要继续增加缩进。
例如:
score = 85
if score >= 60:
print("成绩及格")
if score >= 90:
print("成绩优秀")
else:
print("成绩普通")
else:
print("成绩不及格")
这段代码中有两层判断:
- 第一层判断:是否及格。
- 第二层判断:在及格的前提下,是否优秀。
缩进层级可以这样看:
第 0 层:score = 85
第 0 层:if score >= 60:
第 1 层: print("成绩及格")
第 1 层: if score >= 90:
第 2 层: print("成绩优秀")
第 1 层: else:
第 2 层: print("成绩普通")
第 0 层:else:
第 1 层: print("成绩不及格")
每进入一层代码块,就多缩进一级。
六、常见语句中的代码块
1. if 条件判断代码块
if 用来根据条件决定是否执行某段代码。
temperature = 35
if temperature >= 30:
print("天气很热")
print("记得多喝水")
当条件成立时,缩进在 if 下面的代码块会执行。
如果条件不成立,这个代码块会被跳过。
2. if...else 代码块
else 表示“否则”。
age = 16
if age >= 18:
print("已成年")
else:
print("未成年")
这里有两个代码块:
if age >= 18:
print("已成年")
和:
else:
print("未成年")
注意:
if 和 else 要对齐,表示它们属于同一组判断结构。
3. if...elif...else 代码块
elif 表示“否则如果”,用于多个条件判断。
score = 76
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")
这里要注意:
if、elif、else要对齐。- 每个冒号后面的执行语句要缩进。
- 哪个条件成立,就执行哪个代码块。
4. for 循环代码块
for 循环用来重复执行某段代码。
for i in range(3):
print("当前数字是:", i)
缩进在 for 下面的代码就是循环体。
这段代码会输出 3 次。
如果有多行缩进代码,它们都会被重复执行:
for i in range(3):
print("开始第", i, "次循环")
print("循环处理中")
print("循环结束")
这里前两行 print 属于循环代码块,会重复执行。
最后一行 print("循环结束") 没有缩进,不属于循环代码块,只会在循环结束后执行一次。
5. while 循环代码块
while 循环会在条件成立时反复执行代码块。
count = 1
while count <= 3:
print("第", count, "次执行")
count = count + 1
print("循环结束")
这里:
print("第", count, "次执行")
count = count + 1
属于 while 代码块,会重复执行。
print("循环结束") 不属于循环,只会执行一次。
6. 函数代码块
使用 def 定义函数时,函数体必须缩进。
def greet(name):
print("你好," + name)
print("欢迎学习 Python")
函数体就是函数被调用时要执行的代码块。
调用函数:
greet("小明")
执行结果:
你好,小明
欢迎学习 Python
如果函数体没有缩进:
def greet(name):
print("你好," + name)
程序会报错,因为 Python 不知道函数里面到底有哪些代码。
7. 类代码块
使用 class 定义类时,类里面的内容也必须缩进。
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def show_info(self):
print(self.name, self.score)
这里有多个缩进层级:
class Student:后面缩进的是类的内容。def __init__和def show_info是类里面的方法。- 方法里面的代码还要再缩进一级。
七、代码块从哪里开始,到哪里结束
这是教学中很关键的一点。
在 Python 中:
代码块通常从冒号 : 后面的下一行缩进开始。
代码块结束于缩进减少的位置。
例子:
age = 20
if age >= 18:
print("已成年")
print("可以进入")
print("检查结束")
这里的 if 代码块是:
print("已成年")
print("可以进入")
因为这两行都比 if 多缩进一级。
当代码回到没有缩进的位置:
print("检查结束")
就表示 if 代码块已经结束了。
八、缩进错误的常见类型
1. 该缩进时没有缩进
错误代码:
if True:
print("Hello")
问题:
if True: 后面需要一个缩进代码块,但 print("Hello") 没有缩进。
正确写法:
if True:
print("Hello")
2. 不该缩进时多缩进
错误代码:
name = "小明"
print(name)
问题:
print(name) 前面突然多了缩进,但它前面没有 if、for、def 等需要代码块的语句。
正确写法:
name = "小明"
print(name)
3. 同一个代码块缩进不一致
错误代码:
if True:
print("第一行")
print("第二行")
问题:
两行 print 看起来都属于 if,但缩进空格数不一样。
正确写法:
if True:
print("第一行")
print("第二行")
4. 混用 Tab 和空格
错误示例:
if True:
print("这一行可能用了 Tab")
print("这一行用了空格")
肉眼看起来两行可能差不多,但 Python 可能认为它们的缩进不一致。
建议:
- 统一使用 4 个空格。
- 在编辑器中开启“显示空白字符”。
- 设置 Tab 键自动转换成空格。
5. else、elif 没有和 if 对齐
错误代码:
score = 80
if score >= 60:
print("及格")
else:
print("不及格")
问题:
else 是和 if 配套的,应该和 if 对齐,而不是缩进到 if 代码块里面。
正确写法:
score = 80
if score >= 60:
print("及格")
else:
print("不及格")
九、缩进影响程序逻辑
缩进不只是影响程序是否报错,还会影响程序的执行逻辑。
看下面两个例子。
例子 1
score = 50
if score >= 60:
print("及格")
print("恭喜你")
因为两个 print 都在 if 代码块里面,所以只有当 score >= 60 成立时,它们才会执行。
score = 50 时,什么都不会输出。
例子 2
score = 50
if score >= 60:
print("及格")
print("恭喜你")
这一次,只有 print("及格") 属于 if 代码块。
print("恭喜你") 没有缩进,所以它不受 if 控制,始终会执行。
score = 50 时,输出:
恭喜你
这说明:
缩进不同,程序逻辑就可能完全不同。
十、空代码块和 pass
有时候我们暂时还没有想好代码块里面要写什么,但语法上又必须有内容。
这时可以使用 pass。
pass 表示“什么也不做”,它是一个占位语句。
例如:
if True:
pass
再比如,先写函数结构,函数内容以后再补:
def login():
pass
如果不写 pass:
def login():
程序会报错,因为函数后面必须有一个代码块。
课堂上可以这样讲:
pass 就像一个临时占位符,告诉 Python:“这里我知道需要写内容,只是现在先空着。”
十一、缩进和代码风格建议
1. 每一级缩进使用 4 个空格
推荐:
if is_student:
print("学生")
不推荐一会儿 2 个空格,一会儿 4 个空格。
统一风格能减少错误,也方便别人阅读。
2. 不要写太多层嵌套
嵌套层级太多时,代码会变得难读。
不太推荐:
if user_is_login:
if user_has_permission:
if data_is_valid:
print("可以提交")
可以尝试改得更清楚:
if not user_is_login:
print("请先登录")
elif not user_has_permission:
print("没有权限")
elif not data_is_valid:
print("数据无效")
else:
print("可以提交")
第二种写法层级更少,更容易看懂。
3. 使用空行分隔不同逻辑
空行不会产生代码块,但可以让代码结构更清晰。
name = input("请输入姓名:")
score = int(input("请输入成绩:"))
if score >= 60:
print(name, "及格")
else:
print(name, "不及格")
print("成绩判断完成")
这里空行用于分隔输入、判断和结束输出三个部分。
注意:
空行只是为了阅读方便,不表示代码块。
真正决定代码块的是缩进。
4. 使用编辑器自动格式化
教学或开发时,建议使用支持 Python 的编辑器,例如:
- PyCharm
- VS Code
- IDLE
- Jupyter Notebook
这些工具通常能自动缩进,也能提示缩进错误。
不过学生仍然要理解缩进规则,不能只依赖工具。
十二、教学中容易出现的误区
误区 1:缩进只是为了好看
这是错误的。
在 Python 中,缩进是语法的一部分。
下面两段代码的逻辑不同:
if True:
print("A")
print("B")
和:
if True:
print("A")
print("B")
第一段中,A 和 B 都属于 if。
第二段中,只有 A 属于 if,B 不属于 if。
误区 2:冒号后面可以不写缩进代码
这是错误的。
下面代码会报错:
if age >= 18:
print("已成年")
冒号表示代码块开始,下一行通常必须缩进。
误区 3:Tab 和空格可以随便混用
不建议这样做。
因为 Tab 和空格虽然显示效果可能相似,但它们不是同一个字符。
混用后,程序可能出现缩进错误。
建议统一使用 4 个空格。
误区 4:空行可以结束代码块
空行本身不会决定代码块结束。
代码块是否结束,要看下一行的缩进有没有减少。
例子:
if True:
print("第一行")
print("第二行")
虽然中间有空行,但两行 print 都是同一级缩进,所以它们都属于 if 代码块。
十三、课堂讲解示例
下面是一段适合课堂演示的完整代码:
score = int(input("请输入成绩:"))
if score >= 90:
print("优秀")
print("继续保持")
elif score >= 60:
print("及格")
print("还可以继续提高")
else:
print("不及格")
print("需要加油")
print("程序结束")
可以这样带学生分析:
if score >= 90:后面有冒号,表示下面开始一个代码块。print("优秀")和print("继续保持")缩进相同,所以属于同一个代码块。elif score >= 60:和if对齐,说明它和if是同一组条件判断。else:和if、elif对齐,表示前面条件都不成立时执行。print("程序结束")没有缩进,所以不属于任何一个条件分支,总是会执行。
十四、课堂练习
练习 1:判断代码是否正确
下面代码是否正确?如果不正确,请改正。
age = 18
if age >= 18:
print("已成年")
参考答案:
不正确。if 后面的代码块需要缩进。
age = 18
if age >= 18:
print("已成年")
练习 2:判断输出结果
阅读下面代码,判断输出结果。
score = 50
if score >= 60:
print("及格")
print("考试结束")
参考答案:
考试结束
原因:
print("考试结束") 没有缩进,不属于 if 代码块,所以无论成绩是否及格都会执行。
练习 3:找出缩进问题
下面代码有什么问题?
score = 85
if score >= 60:
print("及格")
print("继续努力")
参考答案:
第二个 print 的缩进和第一个 print 不一致。
正确写法:
score = 85
if score >= 60:
print("及格")
print("继续努力")
练习 4:补全代码块
请使用 pass 补全下面代码,让它暂时不报错。
def register_user():
参考答案:
def register_user():
pass
练习 5:分析代码块范围
阅读下面代码,指出哪些代码属于 for 循环。
for i in range(3):
print("循环开始")
print(i)
print("循环结束")
参考答案:
属于 for 循环的代码是:
print("循环开始")
print(i)
print("循环结束") 没有缩进,不属于循环,只会在循环结束后执行一次。
十五、总结
缩进和代码块是 Python 中非常核心的基础语法。
缩进是代码行开头的空白,用来表示代码层级。代码块是一组属于同一个结构的代码,例如条件判断中的执行语句、循环中的循环体、函数中的函数体。
在 Python 中,代码块通常由冒号 : 引出,并通过缩进表示范围。
教学时可以让学生记住以下几句话:
- Python 用缩进表示代码块。
- 冒号后面通常要写缩进代码。
- 同一个代码块里的缩进必须一致。
- 推荐每一级缩进使用 4 个空格。
- 缩进改变,程序逻辑也可能改变。
- 如果暂时没有代码,可以用
pass占位。
把缩进规则掌握好,后面学习条件判断、循环、函数、类都会轻松很多。