Python入门:Python缩进规则与代码块规范
Python入门Python缩进规则与代码块规范一、开篇Python最独特的设计如果你问我Python和其他编程语言最明显的区别是什么我会毫不犹豫地说缩进。在C、Java、JavaScript等大多数语言中缩进只是看起来好看的可选格式实际的代码块靠花括号{}来划分。这些语言中你把代码全写在一行也是合法的只是没人这么写。但在Python中缩进就是语法本身。代码块的划分、语句的归属关系全靠缩进来决定。这个设计非常大胆问世之初争议很大但事实证明它是Python成功的关键原因之一。 缩进强制代码看起来整洁。你在任何地方看到的Python代码都有着高度一致的视觉风格。这是一种代码可读性的制度性保障。二、缩进的基本规则2.1 用空格还是Tab这是Python社区最经典的圣战话题之一。答案是✅PEP 8Python官方代码风格指南推荐使用4个空格# 推荐4个空格ifTrue:print(缩进了4个空格)# 不推荐TabifTrue:print(缩进了1个Tab)⚠️ 关键规则不要混用空格和Tab在一个文件中要么全用空格要么全用Tab。混用会导致TabError: inconsistent use of tabs and spaces in indentation。所有现代Python IDEPyCharm、VS Code在你按Tab键时默认插入4个空格而不是Tab字符。这个设置一般在IDE的缩进选项中可以看到。2.2 缩进层级同一个代码块中的所有语句必须使用相同数量的缩进# ✅ 正确同一代码块使用相同的缩进4个空格ifTrue:print(第一条语句)print(第二条语句)print(第三条语句)# ❌ 错误同一个代码块缩进不一致ifTrue:print(第一条语句)print(第二条语句)# 缩进多了2个空格报错print(第三条语句)2.3 什么情况下需要缩进以下Python语句后面需要缩进因为它们都会引入一个新的代码块关键字场景示例if/elif/else条件判断if x 0:for/while循环for i in range(10):def函数定义def my_function():class类定义class MyClass:try/except/finally异常处理try:with上下文管理器with open(file):match/case模式匹配match value:这些关键字后面都有一个冒号:冒号就是接下来要缩进的信号。# 冒号后面必须缩进ifscore60:# 冒号print(及格)# 缩进4个空格属于if代码块print(判断结束)# 没有缩进不属于if代码块三、缩进的嵌套3.1 多层缩进当代码逻辑嵌套时每嵌套一层就增加一级缩进defanalyze_score(name,score):分析学生成绩ifscore60:# 0级缩进函数内第1层print(f{name}及格了)# 1级缩进if内ifscore90:# 1级缩进if内另一个ifprint(太棒了成绩优秀)# 2级缩进内层if内ifscore100:# 2级缩进内层if内print(满分你是传奇)# 3级缩进elifscore80:# 1级缩进print(成绩良好继续加油)# 2级缩进else:# 1级缩进print(成绩及格还有提升空间)# 2级缩进else:# 0级缩进print(f{name}不及格需要努力)# 1级缩进ifscore30:# 1级缩进print(成绩太低建议找老师辅导)# 2级缩进# 0级缩进——回到函数体层级print(f{name}的成绩分析完毕)# 1级缩进# 调用函数analyze_score(小明,95) 缩进就像俄罗斯套娃。外层套内层内层再套内层。缩进级别告诉你当前代码属于哪一层。3.2 缩进的可视化理解把上面的代码用方括号标注一下代码块的边界def analyze_score(name, score): │ 如果 score 60: │ │ print(及格) │ │ 如果 score 90: │ │ │ print(优秀) │ │ │ 如果 score 100: │ │ │ │ print(满分) │ │ 否则如果 score 80: │ │ │ print(良好) │ │ 否则: │ │ │ print(及格) │ 否则: │ │ print(不及格) │ │ 如果 score 30: │ │ │ print(太低) │ print(分析完毕)每个│代表一级缩进。同一竖线上的代码属于同一代码块。四、常见的缩进错误4.1 IndentationError: expected an indented block这个错误发生在写了冒号但下一行没有缩进。ifTrue:print(hello)# IndentationError: expected an indented block✅ 解决方法在冒号后面按回车然后加上缩进ifTrue:print(hello)4.2 IndentationError: unexpected indent这个错误发生在不该缩进的地方缩进了。print(hello)print(world)# IndentationError: unexpected indent通常出现在缩进层级搞混的时候# ❌ 错误第二个print不应该缩进defgreet():print(hello)print(world)# 这一行多缩进了# ✅ 正确同级代码使用相同的缩进defgreet():print(hello)print(world)4.3 TabError: inconsistent use of tabs and spaces混用了Tab和空格# ❌ 第2行用了Tab第3行用了空格——混用了ifTrue:print(用Tab缩进)# Tabprint(用空格缩进)# 4个空格✅ 现代的IDE通常会自动统一缩进方式。如果你手动用文本编辑器写代码建议设置编辑器将Tab转换为空格。4.4 缩进导致的逻辑错误这是最隐蔽的一类错误——代码能正常运行但逻辑和你想的不一样# 你能看出这个程序的bug吗total0foriinrange(1,11):totaliprint(f当前累加到{i}总和为{total})print(循环体内的最后一行)print(f最终结果{total})上面这段是正确的。但看下面这个# 这个程序的输出和你想的一样吗total0foriinrange(1,11):totaliprint(f当前累加到{i}总和为{total})# 注意这行在循环外面print(循环结束)第二个程序中print语句没有缩进在循环内部所以它只会在循环完全结束之后执行一次而不是每次循环都执行。但代码不会报错——这是个逻辑bug。五、代码块Python的组织单元5.1 什么是一个代码块代码块是一组逻辑相关的语句它们有相同的缩进级别。每当Python遇到一个冒号它就期待下面出现一个缩进的代码块。# if语句引入的代码块ifcondition:statement1# 这两行有相同的缩进statement2# 它们属于同一个代码块# for循环引入的代码块foriteminsequence:process(item)# 循环体代码块log(item)# 函数定义引入的代码块defmy_function():setup()# 函数体代码块resultcalculate()returnresult5.2 代码块可以嵌套defouter_function():外层函数print(进入外层函数)definner_function():内层函数——嵌套在外层函数内部print(进入内层函数)foriinrange(3):print(f内层循环{i})print(离开内层函数)print(调用内层函数之前)inner_function()print(离开外层函数)outer_function()输出进入外层函数 调用内层函数之前 进入内层函数 内层循环0 内层循环1 内层循环2 离开内层函数 离开外层函数 这个例子展示了几层嵌套外层函数体内有内层函数定义内层函数体内有for循环for循环体内有print语句。每一层都对应一级缩进。5.3 空代码块pass语句有时你需要一个代码块占位函数还没想好怎么写但不能让它空着。这时用pass# ❌ 错误代码块为空deffunction_not_ready_yet():# 这里什么也没有——报错# ✅ 正确用pass占位deffunction_not_ready_yet():pass# 占位符表示这里以后会写代码# pass的其他使用场景ifcondition_not_met_yet:pass# 暂时不知道条件满足时该做什么classFutureClass:pass# 类的骨架以后再填充foriteminlarge_list:ifitemisNone:pass# 跳过None值不做任何处理else:process(item)六、PEP 8缩进规范详解PEP 8是Python的官方代码风格指南它关于缩进有以下规定6.1 基本规则每个缩进级别使用4个空格不要使用Tab或者在IDE中设置Tab自动转4个空格同一文件中保持缩进方式一致6.2 续行缩进当一行代码太长需要换行时续行有两种缩进方式方式一与开括号对齐# 续行与第一个括号后面的内容对齐resultsome_function(param_one,param_two,param_three,param_four)方式二悬挂缩进# 续行额外缩进一级4个空格resultsome_function(param_one,param_two,param_three,param_four)两者都可以但在同一个项目中要保持一致。6.3 长if语句的换行# 当if条件太长时if(student_score60andstudent_attendance0.8andnotstudent_is_suspendedandcourse_is_available):print(该学生可以参加期末考试)用括号把条件包裹起来然后在合适的位置换行。注意续行要额外缩进以示区分。6.4 空行的使用PEP 8不仅定义了缩进还定义了空行的使用importosimportsys# 两个空行classMyClass:类的文档字符串# 一个空行def__init__(self):self.data[]# 一个空行defadd_data(self,item):添加数据self.data.append(item)# 一个空行defget_data(self):获取数据returnself.data# 两个空行defstandalone_function():独立的函数pass规则总结顶层函数和类之间两个空行类中的方法之间一个空行函数/方法内部逻辑段落之间一个空行七、不同语言缩进对比了解其他语言的做法能帮助你更好地理解Python为什么选择缩进作为语法C语言——花括号缩进可选if(x0){printf(positive\n);printf(this is inside if\n);}printf(this is outside if\n);Java语言——花括号缩进可选if(x0){System.out.println(positive);}Python——缩进就是语法ifx0:print(positive)在C/Java中下面的两种写法都是合法的虽然第二种很难看// 写法一正常if(x0){printf(yes);}// 写法二合法但不推荐if(x0){printf(yes);}但在Python中你不能省略缩进来压缩代码——缩进是语法的一部分不是可选的格式。⌨️ 这种设计带来的好处是你看到的代码结构和代码的实际结构永远是一致的。不存在缩进看起来在循环里但代码实际在循环外的情况。在C/Java中这种缩进和实际结构不一致的问题是很多bug的来源。八、IDE中的缩进助手8.1 VS Code中的缩进设置在VS Code中打开设置搜索缩进{[python]:{editor.tabSize:4,editor.insertSpaces:true,editor.detectIndentation:true},editor.renderWhitespace:boundary}tabSize: 4Tab键插入/删除4个空格insertSpaces: true按Tab键插入空格而非Tab字符detectIndentation: true自动检测文件的缩进风格8.2 PyCharm中的缩进设置文件 → 设置 → 编辑器 → 代码风格 → PythonTab大小4 缩进4 续行缩进8 使用Tab字符[取消勾选]8.3 可视化空格建议在编辑器中开启显示空白字符的功能这样你就能看到每个空格和TabVS CodeView → Render WhitespacePyCharmView → Active Editor → Show Whitespaces开启后空格显示为灰色小点·Tab显示为灰色箭头→。九、实战重构混乱缩进的代码9.1 原始混乱代码defprocess_students(students):passed[]failed[]forstudentinstudents:ifstudent[score]60:passed.append(student)else:failed.append(student)returnpassed,failed这段代码缩进混乱运行会报IndentationError。9.2 修复后的代码defprocess_students(students):处理学生列表分开及格和不及格的学生passed[]failed[]forstudentinstudents:ifstudent[score]60:passed.append(student)else:failed.append(student)returnpassed,failed# 测试students[{name:小明,score:85},{name:小红,score:42},{name:小刚,score:96},{name:小丽,score:58},]passed,failedprocess_students(students)print(f及格的学生{[s[name]forsinpassed]})print(f不及格的学生{[s[name]forsinfailed]})9.3 使用IDE自动格式化选中所有代码按Ctrl Alt LPyCharm或Shift Alt FVS CodeIDE会自动修复缩进问题。 养成一个好习惯写完一段代码后按快捷键格式化一下。这能自动修复缩进和其他格式问题。十、本篇小结✅ Python的缩进规则是它最独特的设计也是初学者最容易踩坑的地方。核心要点4个空格 1级缩进PEP 8标准冒号:后面必须缩进开始一个新的代码块同级代码块必须保持相同缩进不要混用Tab和空格IDE中设置Tab转4空格空代码块用pass占位缩进决定逻辑归属——不恰当的缩进可能导致代码能运行但逻辑不对 缩进规则是Python的第一道门槛一旦掌握了你就会发现它是一个非常有价值的设计——让你的代码天然整洁、统一、可读。