python代码中的缩进规则详细解释(史上最全)

 更新时间:2025年01月03日 09:15:59   投稿:daisy  
这篇文章主要介绍了代码缩进的重要性以及在Python语言中的具体规则,代码缩进有助于提高代码的可读性和整洁性,并且是Python语言中一个强制性的语法要求,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、什么是代码的缩进

大家在学习编程时,是愿意看到下面范例中的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 l
    if 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 indented
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # error: unexpected indent
        for 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 and
    that_is_another_thing):
    do_something()


# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
# 增加一个注释,在能提供语法高亮的编辑器中可以有一些区分
if (this_is_one_thing and
    that_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_thing
        and that_is_another_thing):
    do_something()

三、参考资料:

https://peps.python.org/pep-0008/

总结

到此这篇关于python代码中的缩进规则详细解释的文章就介绍到这了,更多相关python代码缩进规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 将python包发布到PyPI和制作whl文件方式

    将python包发布到PyPI和制作whl文件方式

    今天小编就为大家分享一篇将python包发布到PyPI和制作whl文件方式,具有很的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • django在开发中取消外键约束的实现

    django在开发中取消外键约束的实现

    这篇文章主要介绍了django在开发中取消外键约束的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 关于Qt6中QtMultimedia多媒体模块的重大改变分析

    关于Qt6中QtMultimedia多媒体模块的重大改变分析

    如果您一直在 Qt 5 中使用 Qt Multimedia,则需要对您的实现进行更改。这篇博文将尝试引导您完成最大的变化,同时查看 API 和内部结构
    2021-09-09
  • 用python爬取历史天气数据的方法示例

    用python爬取历史天气数据的方法示例

    这篇文章主要介绍了用python爬取历史天气数据的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Centos下实现安装Python3.6和Python2共存

    Centos下实现安装Python3.6和Python2共存

    这篇文章主要介绍了Centos下实现安装Python3.6和Python2共存,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Python根据字符串调用函数过程解析

    Python根据字符串调用函数过程解析

    这篇文章主要介绍了Python根据字符串调用函数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 使用Python实现生成对角矩阵和对角块矩阵

    使用Python实现生成对角矩阵和对角块矩阵

    这篇文章主要为大家详细介绍了如何使用Python实现生成对角矩阵和对角块矩阵,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Python调用百度AI实现图片上表格识别功能

    Python调用百度AI实现图片上表格识别功能

    这篇文章主要给大家介绍了关于Python调用百度AI实现图片上表格识别功能的相关资料,在Python环境下,利用百度AI开放平台文字识别技术,对表格类图片进行识别,需要的朋友可以参考下
    2021-09-09
  • OpenCV半小时掌握基本操作之直方图

    OpenCV半小时掌握基本操作之直方图

    这篇文章主要介绍了OpenCV基本操作之直方图,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 简单了解django索引的相关知识

    简单了解django索引的相关知识

    这篇文章主要介绍了简单了解django索引的相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论