python 代码中的缩进规则(史上最全最详细解释)
本文目录:
零、时光宝盒
一、什么是代码的缩进
二、Python语言的缩进规则
2.1、缩进的实现方式
2.1、Python行的缩进
2.1.1、物理行
2.1.2、逻辑行
2.1.3、物理行逻辑行缩进方法总结
2.2、使用垂直对齐
2.3、使用额外的缩进级别
2.4、使用悬挂缩进
2.5、不推荐的错误缩进写法
2.6、挂行缩进不一定要用4个空格
2.7、if、for等循环语句的缩进
三、参考资料:
零、时光宝盒
我们经常可以看到各种报道:
某外卖小哥送餐,结果自己的电动车被偷走了,或者配送箱子其他外卖被偷,面临赔钱和获差评的处境,堂堂男子汉当众崩溃大哭;
某知名科学或某方面专家人士突然死亡,官方没有公布原因;
某条件优越,别人眼里的成功富足人士突然以某种形式自杀;
某某(有大人也有学生)突然跳楼(跳江);
某某人被周围人认定和判决他疯了;
。。。。。。
在现实面前,我们无数次被生活碾压得支离破碎,生活从未轻饶过任何一个人,哪怕你在别人眼里活得再光鲜亮丽再优秀,也照样要承受来自生活的压力和苦难。当独处时分,人后卸下伪装和防御的你,边舔舐自己伤口边偷偷抹掉过多少次眼泪?
“无论是谁,我们都曾经或正在经历各自的人生至暗时刻,那是一条漫长、黝黑、阴冷、令人绝望的隧道。”——鲁豫《偶遇》
“落在一个人一生中的雪,我们不能全部看见。每个人都在自己的生命中,孤独地过冬。"——刘亮程《一个人的村庄》
我只是和你们一样的凡人,同样会经历各种同样的。。。我个人没有能力独自去改变目前的一些糟糕状况,我只能在这里,以某种形式陪你们共同熬过苦难。别轻易放弃自己。最近有首歌《若月亮没来》,一起听听吧:
若是月亮还没来,路灯也可照窗台,照着白色的山茶花微微开,
若是晨风还没来,晚风也可吹入怀,吹着那一地树影温柔摇摆。
你总以为你不够好,不够苗条和美貌,可是完美谁能达到,做你自己就很好,
烦恼烦恼拥有太少,没有房车没有钞票,可爱你的人永远会,把你当做心尖珍宝,
我也懂大多数的时候,你只想逃离这世界,
我也懂太多的情绪在,一个人失眠的深夜,
你可以是悲伤或者埋怨,但请不要放弃明天,
这一直灰暗的世界,我想看见你的笑脸。
逆境清醒
2024.9.03
一、什么是代码的缩进
大家在学习编程时,是愿意看到下面范例中的A范例代码还是B范例代码呢?
答案应该是一致的,大家肯定都喜欢阅读B范例的代码,因为它看上去更加规整,这是一种最基本的代码编写规范。
A、缩进格式不好的范例public class HelloWorld {
public static void main(String []args) {
System.out.println("Adversity Awake!");
}
}
B、缩进好的范例public class HelloWorld {public static void main(String []args) {System.out.println("Adversity Awake!");}
}
B范例的代码使用了较好的代码缩进规范,层次清楚,可读性强,所以我们会喜欢这种代码编写风格。
我们再来看看其他编程语言的缩进例子:
例如我想输出下面这几行内容:
It has nothing to do with how hard you've been hit,
It's all about whether you can push on after the blow.
这与你受到的打击有多大无关,
这一切都取决于你是否能在打击后继续前进。
---------逆境清醒
用C语言实现:
C语言:
#include <stdio.h>
int main()
{printf("It has nothing to do with how hard you've been hit,\n");printf("It's all about whether you can push on after the blow.\n");printf("这与你受到的打击有多大无关,\n");printf("这一切都取决于你是否能在打击后继续前进。\n");printf("---------逆境清醒\n");return 0;
}
用c#语言实现:
using System;
namespace njqxSayApplication
{class njqx{static void Main(string[] args){Console.WriteLine("It has nothing to do with how hard you've been hit,");Console.WriteLine("It's all about whether you can push on after the blow.");Console.WriteLine("这与你受到的打击有多大无关,");Console.WriteLine("这一切都取决于你是否能在打击后继续前进。");Console.WriteLine("---------逆境清醒"); Console.ReadKey();}}
}
用Java语言实现
public class njqx {public static void main(String []args) {System.out.println("It has nothing to do with how hard you've been hit,");System.out.println("It's all about whether you can push on after the blow.");System.out.println("这与你受到的打击有多大无关,");System.out.println("这一切都取决于你是否能在打击后继续前进。");System.out.println("---------逆境清醒");}
}
由此,我们可以总结出什么是代码的缩进:
代码缩进:
缩进指的是代码行开缩进头处的空格,缩进(indent)是用来表示逻辑上的从属关系的,它有助于读者更好地理解文章、代码。在有些编程语言中,使用缩进仅仅是为了提高可读性。
我们可以通过缩进,表示逻辑上的从属关系;还可以通过保持统一的缩进风格,避免写出歪歪扭扭的垃圾代码,提高代码的整洁性和可读性。
public class Njqxexam {public static void main(String[] args) {boolean condition = true;System.out.println("逆境清醒希望你们无论条件真假都能做到:");if (condition) {System.out.println("眼里有光,可以照亮自己,也能温暖他人;");} else {System.out.println("心中有爱,可以温柔岁月,也可不负相遇。");}}
}
常用的统一进方法是:
- 如果语句B从属于语句A, 那么语句B的开头,就跟语句A的开头保持某个固定距离L(如1个TAB距离或4个空格的距离或某个规定好的距离);
- 如果语句C从属于语句B, 那么语句C的开头,就跟语句B的开头保持某个固定距离L(如1个TAB距离或4个空格的距离或某个规定好的距离);那么语句C就跟A的开头就会保持距离2 * L(即2*1个TAB或者2*4=8个空格的距离或2*某个规定好的距离);
二、Python语言的缩进规则
Python不像其他程序设计语言采用大括号“{}”分隔代码块,而是采用代码缩进和冒号“:”区分代码之间的层次。
Python对代码的缩进要求非常严格,同一个python程序文件中,同一个级别的代码块的缩进量必须相同。如果不采用合理的代码缩进,系统编译时将抛出SyntaxError异常。例,代码中有的缩进量是4个空格,有的缩进量是3个空格,系统就会出现SyntaxError错误。
python 中这个缩进却是非常重要的,它决定了你的语法是否正确。缩进量不同导致的SyntaxError错误。
2.1、缩进的实现方式
遵循一定的代码编写规则和命名规范可以使代码更加规范化,对代码的理解与维护起到至关重要的作用。
Python 在语法上使用缩进来确定代码块的开始和结束,对于每一级缩进,都应该是 4个空格。在 Pycharm等python编辑工具中,我们可以设置使用 tab 键来进行缩进。
Python语言的缩进的实现方式:
♦ 缩进可以使用空格或者Tab键实现。
♦ 缩进本身是强制性的,但是空格数量实际上语法并没有做限制。只不过同级代码缩进空格一致即可。
♦ 一般我们都是以 4个空格(即一个tab键) 来进行使用。
♦ Python 3中不允许混合使用Tab和空格缩进。
空格和tab符通常都以空白形式显示。如果混用,代码容易意混淆,增加维护及调试的困难、降低代码易读性,因此 Python PEP8 编码规范,指导使用4个空格作为缩进。
在Python中,对于类定义、函数定义、流程控制语句,以及异常处理语句等,行尾的冒号和下一行的缩进表示一个代码块的开始,而缩进结束,则表示一个代码块的结束。
逻辑行开头的空白符(空格符和制表符)用于计算该行的缩进层级,决定语句组块。
制表符(从左至右)被替换为一至八个空格,缩进空格的总数是八的倍数(与 Unix 的规则保持一致)。
首个非空字符前的空格数决定了该行的缩进层次。
缩进不能用反斜杠进行多行拼接;
首个反斜杠之前的空白符决定了缩进的层次。
源文件混用制表符和空格符缩进时,因空格数量与制表符相关,由此产生的不一致将导致不能正常识别缩 进层次,从而触发 TabError。
跨平台兼容性说明: 鉴于非 UNIX 平台文本编辑器本身的特性,请勿在源文件中混用制表符和空格符。另外也请注意,不同平台有可能会显式限制最大缩进层级。
2.1、Python行的缩进
Python行的缩进是针对逻辑行的。
所以,判断缩进是否正确,首先要区分物理行和逻辑行。
2.1.1、物理行
物理行:代码编辑器中显示的代码,每一行内容是一个物理行。包括空行。
以下代码代码一共有7行,即有7个物理行。
#!/usr/bin/python
njstr1="人的一生会遇到两个人,"
njstr2="一个惊艳了时光,"
njstr3="一个温柔了岁月。"print(njstr1,njstr2,njstr3)
代码运行后输出结果:
人的一生会遇到两个人, 一个惊艳了时光, 一个温柔了岁月。
2.1.2、逻辑行
代码:
jiang={"njstr1":"人的一生会遇到两个人","njstr2":"一个惊艳了时光","njstr3":"一个温柔了岁月"}
print(jiang)
无论是写成怎样的缩进格式,例如下图:
逻辑行:这个语句,虽然书写为多行,但解释器进行解释时,只当成一个语句处理,即一个逻辑行。所以,无论分开的其他行怎么缩进,都不会影响程序运行结果。
最后代码运行后输出的结果都是同样的:
{'njstr1': '人的一生会遇到两个人', 'njstr2': '一个惊艳了时光', 'njstr3': '一个温柔了岁月'}
2.1.3、物理行逻辑行缩进方法总结
python代码中
1、可以使用";"号将两个或多个逻辑行合并成一个物理行。
2、两个物理行可以通过使用"\"号连接。
3、字典、列表等变量赋值语句,是可以直接书写为多个物理行的。
4、导入模块的逻辑行的“首行”需要顶格书写,即无任何缩进
5、相同逻辑层应该保持相同的缩进
6、":"标记代表一个新的逻辑层, 这时增加缩进的:代表进入下一个级别的代码层,减少缩进:代表返回上一个级别的代码层7、多行结构上的右大括号/方括号/括号可以在列表最后一行的第一个非空白字符下对齐,或者它可能排在开始 Multiline 结构的行的第一个字符下
The closing brace/bracket/parenthesis on multiline constructs may either line up under the first non-whitespace character of the last line of list, as in:
多行结构上的右大括号/方括号/括号可以在列表最后一行的第一个非空白字符下对齐,如下所示
my_list = [1, 2, 3,4, 5, 6,]
result = some_function_that_takes_arguments('a', 'b', 'c','d', 'e', 'f',)or it may be lined up under the first character of the line that starts the multiline construct, as in:
或者它可能排在开始 Multiline 结构的行的第一个字符下,如下所示:
my_list = [1, 2, 3,4, 5, 6,
]
result = some_function_that_takes_arguments('a', 'b', 'c','d', 'e', 'f',
)
行首含换页符时,缩进计算将忽略该换页符。
换页符在行首空白符内其他位置的效果未定义(例如,可能导致空格计数重置为零)。
连续行的缩进层级以堆栈形式生成 INDENT 和 DEDENT 形符,说明如下:
读取文件第一行前,先向栈推入一个零值,该零值不会被移除。
推入栈的层级值从底至顶持续增加。
每个逻辑行开头的行缩进层级将与栈顶行比较。如果相等,则不做处理。如果新行层级较高,则会被推入栈顶,并生成一个 INDENT 形符。如果新行层级较低,则 应当 是栈中的层级数值之一;栈中高于该层级的所有数值都将被移除,每移除一级数值生成一个 DEDENT 形符。文件末尾,栈中剩余的每个大于零的数值生成一个 DEDENT 形符。
python使用缩进来表示代码块 。缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。
当语句的条件部分足够长,需要跨多行书写时,值得注意的是,两个字符的关键字(即 )加上一个空格和一个左括号的组合会为多行条件语句的后续行创建一个自然的 4 个空格缩进。这可能会与嵌套在语句内的缩进代码套件产生视觉冲突,该代码也会自然缩进到 4 个空格。此 PEP 对于如何(或是否)进一步在视觉上将此类条件行与语句内的嵌套套件区分开来,没有明确立场。在这种情况下,可接受的选项包括但不限于:ifififif
2.2、使用垂直对齐
使用垂直对齐缩进的正确使用方法:
# “垂直对齐”
# Aligned with opening delimiter.
# 和开头的分隔符对齐。
# 与左括号对齐
foo = long_function_name(var_one, var_two,var_three, var_four)
2.3、使用额外的缩进级别
使用额外的缩进级别形式,
方法:添加 4 个空格(额外的缩进级别)以区分参数和其他参数。
# Add 4 spaces (an extra level of indentation) to distinguish arguments from the rest.
# 添加 4 个空格(额外的缩进级别)以区分参数和其他参数。
def long_function_name(var_one, var_two, var_three,var_four):print(var_one)
2.4、使用悬挂缩进
每个缩进级别使用 4 个空格。
连续行应使用 Python 的括号、方括号和大括号内的隐式行连接垂直对齐包装的元素,或使用悬挂缩进。
使用悬挂缩进时,应考虑以下因素:
- 第一行不应有参数,
- 并且应使用进一步的缩进以清楚地区分自己作为连续行:
# Hanging indents should add a level.
# 悬挂缩进应增加一个级别。
foo = long_function_name(var_one, var_two,var_three, var_four)
2.5、不推荐的错误缩进写法
# Wrong:
# 不好的写法:
# Arguments on first line forbidden when not using vertical alignment.
# 如果不用垂直对齐(上面推荐的写法的第一种),就不要在第一行放参数。
foo = long_function_name(var_one, var_two,var_three, var_four)# Wrong:
# 不好的写法:
# Further indentation required as indentation is not distinguishable.
# 缩进不够就不容易清晰地看出来函数名和参数的区别。
def long_function_name(var_one, var_two, var_three,var_four):print(var_one)
2.6、挂行缩进不一定要用4个空格
四空格的规则对于续行是可选的。
可选:
# 挂行缩进不一定要用4个空格
foo = long_function_name(var_one, var_two,var_three, var_four)
2.7、if、for等循环语句的缩进
#正确的使用方式:
if True:print ("今天天晴很好,阳光明媚!")
else:print ("今天阴天。。。")
下面的例子缩进不一致,会导致运行错误:
#代码最后一行语句缩进数的空格数不一致,会导致运行错误:
if True:print ("今天天晴很好,阳光明媚!")
else:print ("今天阴天。。。") # 缩进不一致,会导致运行错误
下面的 Python 代码缩进示例虽然正确,但含混不清:
#下面的 Python 代码缩进示例虽然正确,但含混不清:
def perm(l):# Compute the list of all permutations of lif len(l) <= 1:return [l]r = []for i in range(len(l)):s = l[:i] + l[i+1:]p = perm(s)for x in p:r.append(l[i:i+1] + x)return r
下例展示了多种缩进错误:
#下例展示了多种缩进错误:def perm(l): # error: first line indented
for i in range(len(l)): # error: not indenteds = l[:i] + l[i+1:]p = perm(l[:i] + l[i+1:]) # error: unexpected indentfor x in p:r.append(l[i:i+1] + x)return r # error: inconsistent dedent
当if语句的条件部分长到需要换行写的时候,注意可以在两个字符关键字的连接处(比如if),增加一个空格,再增加一个左括号来创造一个4空格缩进的多行条件。这会与if语句内同样使用4空格缩进的代码产生视觉冲突。PEP没有明确指明要如何区分i发的条件代码和内嵌代码。可使用的选项包括但不限于下面几种情况:
#下例展示了if语句缩进使用方法:# No extra indentation.
# 没有额外的缩进
if (this_is_one_thing andthat_is_another_thing):do_something()# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
# 增加一个注释,在能提供语法高亮的编辑器中可以有一些区分
if (this_is_one_thing andthat_is_another_thing):# Since both conditions are true, we can frobnicate.do_something()# Add some extra indentation on the conditional continuation line.
# 在条件判断的语句添加额外的缩进
if (this_is_one_thingand that_is_another_thing):do_something()
三、参考资料:
https://peps.python.org/pep-0008/
推荐阅读:
从0开始学python,教程总目录(更新中ing。。。)https://blog.csdn.net/weixin_69553582/article/details/141649919
自言自语的独角戏小丑“讲”的“演讲”,看吗?https://blog.csdn.net/weixin_69553582/article/details/141300893
2023年上半年信息系统项目管理师真题与答案解释https://blog.csdn.net/weixin_69553582/article/details/137467224
[你找到牵手一辈子的人了吗?] 七夕情人节特辑https://blog.csdn.net/weixin_69553582/article/details/132425595
深度学习框架TensorFlowhttps://blog.csdn.net/weixin_69553582/category_12360543.html
| | |
给照片换底色(python+opencv) | 猫十二分类 | 基于大模型的虚拟数字人__虚拟主播实例 |
| | |
计算机视觉__基本图像操作(显示、读取、保存) | 直方图(颜色直方图、灰度直方图) | 直方图均衡化(调节图像亮度、对比度) |
| | |
语音识别实战(python代码)(一) | 人工智能基础篇 | 计算机视觉基础__图像特征 |
| ||
matplotlib 自带绘图样式效果展示速查(28种,全) | ||
| ||
Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一) | ||
| | |
立体多层玫瑰绘图源码__玫瑰花python 绘图源码集锦 | Python 3D可视化(一) | 让你的作品更出色——词云Word Cloud的制作方法(基于python,WordCloud,stylecloud) |
| | |
python Format()函数的用法___实例详解(一)(全,例多)___各种格式化替换,format对齐打印 | 用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心) | python爱心源代码集锦(18款) |
| | |
Python中Print()函数的用法___实例详解(全,例多) | Python函数方法实例详解全集(更新中...) | 《 Python List 列表全实例详解系列(一)》__系列总目录、列表概念 |
| | |
用代码过中秋,python海龟月饼你要不要尝一口? | python练习题目录 | |
| | |
草莓熊python turtle绘图(风车版)附源代码 | 草莓熊python turtle绘图代码(玫瑰花版)附源代码 | 草莓熊python绘图(春节版,圣诞倒数雪花版)附源代码 |
| | |
巴斯光年python turtle绘图__附源代码 | 皮卡丘python turtle海龟绘图(电力球版)附源代码 | |
| | |
Node.js (v19.1.0npm 8.19.3) vue.js安装配置教程(超详细) | 色彩颜色对照表(一)(16进制、RGB、CMYK、HSV、中英文名) | 2024年6月多家权威机构____编程语言排行榜__薪酬状况 |
| | |
手机屏幕坏了____怎么把里面的资料导出(18种方法) | 【CSDN云IDE】个人使用体验和建议(含超详细操作教程)(python、webGL方向) | 查看jdk安装路径,在windows上实现多个java jdk的共存解决办法,安装java19后终端乱码的解决 |
| ||
vue3 项目搭建教程(基于create-vue,vite,Vite + Vue) | ||
| | |
2023年春节祝福第二弹——送你一只守护兔,让它温暖每一个你【html5 css3】画会动的小兔子,炫酷充电,字体特 | 别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(4套) | SVG实例详解系列(一)(svg概述、位图和矢量图区别(图解)、SVG应用实例) |
| | |
【程序人生】卡塔尔世界杯元素python海龟绘图(附源代码),世界杯主题前端特效5个(附源码) | HTML+CSS+svg绘制精美彩色闪灯圣诞树,HTML+CSS+Js实时新年时间倒数倒计时(附源代码) | 2023春节祝福系列第一弹(上)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载) |
| | |
tomcat11、tomcat10 安装配置(Windows环境)(详细图文) | Tomcat端口配置(详细) | Tomcat 启动闪退问题解决集(八大类详细) |