Python 的缩进规则是它区别于 C、Java 等语言最显著的设计:缩进不仅是美观格式,更是语法的一部分。代码块的归属完全由缩进层级决定。这种设计强制代码风格统一,但也让初学者容易踩坑。本文从基本规则、嵌套逻辑、常见错误到 IDE 配置,系统梳理 Python 缩进与代码块规范,并通过实战案例演示修复混乱缩进的方法。
一、缩进基本规则:4 个空格与冒号
PEP 8 官方规范推荐每级缩进使用 4 个空格,并在编辑器中设置 Tab 键自动转换为空格。严禁混用 Tab 和空格,否则会触发 TabError。
以下关键字后需要缩进新代码块:if/elif/else、for/while、def、class、try/except/finally、with、match/case。它们的共同特征是后面紧跟冒号,冒号就是“开始缩进”的信号。
正确示例:- if score >= 60:
- print('及格') # 缩进 4 个空格
- print('判断结束') # 无缩进,不属于 if 块
复制代码
错误示例:- if True:
- print('hello')
- # IndentationError: expected an indented block
复制代码
二、缩进的嵌套与可视化
每嵌套一层逻辑就增加一级缩进。可以用竖线辅助理解层级:同一竖线上的代码属于同一代码块。
多层嵌套示例:- def analyze_score(name, score):
- if score >= 60:
- print(f'{name} 及格了')
- if score >= 90:
- print('成绩优秀')
- if score == 100:
- print('满分')
- else:
- print('仅及格')
- else:
- print('不及格')
- print('分析完毕')
复制代码
三、常见缩进错误类型
① IndentationError: expected an indented block
冒号后缺少缩进导致。
② IndentationError: unexpected indent
不该缩进的地方加了多余缩进,例如同级代码缩进不一致。
③ TabError: inconsistent use of tabs and spaces
同一文件中混用 Tab 和空格造成。
④ 逻辑错误(最隐蔽)
代码不报错,但执行结果与预期不符。例如将本应在循环体内的 print 语句错误放在循环外:- total = 0
- for i in range(1, 11):
- total += i
- print(f'当前累加到{i},总和为{total}') # 此语句实际在循环外,只执行一次
- print('循环结束')
复制代码
四、空代码块与 pass 占位符
Python 不允许代码块为空。若暂时未实现内容,必须用 pass 占位。- def future_function():
- pass
- if some_condition:
- pass
- else:
- process()
复制代码
五、PEP 8 续行缩进与空行规范
续行有两种主流风格:与开括号对齐,或悬挂缩进一级(额外 4 空格)。项目内保持统一。- # 与开括号对齐
- result = function(param_one, param_two,
- param_three, param_four)
- # 悬挂缩进
- result = function(
- param_one, param_two,
- param_three, param_four
- )
复制代码
空行规范:顶层类和函数之间用 2 个空行,类内方法之间用 1 个空行,函数内逻辑段落可用 1 个空行分隔。
六、IDE 缩进助手配置
VS Code 在 [settings.json]( 中添加:- {
- "[python]": {
- "editor.tabSize": 4,
- "editor.insertSpaces": true,
- "editor.detectIndentation": true
- },
- "editor.renderWhitespace": "boundary"
- }
复制代码 PyCharm 在 File → Settings → Editor → Code Style → Python 中设置 Tab size=4,Indent=4,取消勾选“Use tab character”。建议开启显示空白字符(VS Code: Render Whitespace;PyCharm: Show Whitespaces),可视化空格和 Tab 的区别。
七、实战:重构混乱缩进的代码
原始有缩进问题的代码:- def process_students(students):
- passed = []
- failed = []
- for student in students:
- if student['score'] >= 60:
- passed.append(student)
- else:
- failed.append(student)
- return passed, failed
复制代码 该代码会触发 IndentationError。修复后:- def process_students(students):
- """处理学生列表,分离及格与不及格"""
- passed = []
- failed = []
- for student in students:
- if student['score'] >= 60:
- passed.append(student)
- else:
- failed.append(student)
- return passed, failed
- students = [
- {'name': '小明', 'score': 85},
- {'name': '小红', 'score': 42},
- {'name': '小刚', 'score': 96},
- {'name': '小丽', 'score': 58},
- ]
- passed, failed = process_students(students)
- print(f'及格学生:{[s["name"] for s in passed]}')
- print(f'不及格学生:{[s["name"] for s in failed]}')
复制代码 在 PyCharm 中按 Ctrl + Alt + L,在 VS Code 中按 Shift + Alt + F 即可自动格式化修复缩进。
八、总结
Python 缩进的核心要点:每级 4 个空格、冒号后必须缩进、同级缩进一致、避免 Tab 与空格混用、空代码块用 pass。掌握这些规则后,缩进就不再是困扰,而是 Python 代码可读性的制度保障。 |