Python缩进规则精讲

在写作文的时候,老师会告诉我们每段要空两格,这两个空格标志着一个新的段落开始了。在编写程序的时候,我们也要采用类似的方式,通过缩进来表示代码块的开始和结束。

认识缩进

在之前学过的的例子中,我们所编写的都是简单的表达式语句,没有缩进。但是,要创建复合语句,就需要用到缩进这个重要的概念。

我们可以把许多代码行组织到一个代码块中,其中的每一行代码的开始,都保持相同的空格数,通过查看代码行前面的空格数,就可以判断代码块的起始和结束,而这个空格数就是缩进

Python 根据缩进来判断当前代码行和前面代码行的关系。缩进的好处是让代码看上去更加清晰易读,如果代码段比较长,通过缩进,我们可以快速了解程序的组织结构,而且也不容易出错。

下面,我们来看一个有很多行代码的例子。因为程序的代码段比较长,如果没有缩进,我们会很难分清代码的组织结构。这段代码只是想说明缩进的重要性,具体含义大家可以不必关心,代码如下。
letter = input("please input:")
if letter == 'S':
    print ('please input second letter:')
    letter = input("please input:")
    if letter == 'a':
        print ('Saturday')
    elif letter  == 'u':
        print ('Sunday')
    else:
        print ('data error')
elif letter == 'F':
    print ('Friday')
elif letter == 'M':
    print ('Monday')
elif letter == 'T':
    print ('please input second letter')
    letter = input("please input:")
    if letter  == 'u':
        print ('Tuesday')
    elif letter  == 'h':
        print ('Thursday')
else:
        print ('data error')
elif letter == 'W':
    print ('Wednesday')
else:
    print ('data error')

提示:很少有哪种语言能像 Python 这样重视缩进。对于其他语言而言,缩进对于代码的编写来说是“有了更好”,而并不是“没有不行”,因为缩进只是代码书写风格的问题。

但是,对于 Python 语言而言,缩进则是一种语法,它可以告诉我们 Python 代码从哪里开始,到哪里结束。Python 中的复合语句是通过缩进来表示的。这样做的好处就是减少了程序员的自由度,有利于统一风格,使得人们在阅读代码时会更加轻松。

但是,在编写 Python 程序的时候,我们也要记住,如果缩进不正确,程序可能无法运行或者会出错。

Python 缩进的长度

将代码块缩进多长并不重要,只要保证整个代码块的缩进程度是一样的就可以了。为此,IDLE 提供了自动缩进功能,它能将光标定位到下一行的指定位置。

当我们键入类似于 if 这样与控制结构对应的关键字之后,按下回车键,IDLE 就会启动自动缩进功能,代码如下。
if 3>2 :
    print("Three is greater than two")

一般情况下,IDLE 将代码缩进一级是 4 个空格。如果想改变这个默认的缩进量的话,可以从“Format”菜单选择“New Indent Width”命令,如图 1 所示。

改变默认缩进
图 1

在弹出的窗口中,默认是 4 个空格,我们也可以按照自己的需要,修改这个值,如图 2 所示。

修改默认缩进
图 2

对初学者来说,需要注意的是:尽管自动缩进功能非常方便,但是我们不能完全依赖它,因为有时候自动缩进未必完全符合我们的要求,所以,写完程序,还需要仔细检查一下。

Python 常见的缩进问题

遗漏缩进

我们前面介绍过,在 if 句后面且属于条件组成部分的代码行,是需要缩进的。如果像下面的代码一样(代码如下),忘记了缩进:
if 3>2 :
print("Three is greater than two")
那么,编译的时候,Python 会告诉我们这里有语法错误,需要一个缩进,错误信息如图 3 所示。


图 3

通常,对紧跟在 if 语句之后的代码行增加缩进后,就个错误就会消失。

增加没有必要的缩进

如果在不需要缩进的地方,不小心增加了缩进,会出现什么样的情况呢?我们来看一段代码,它在不需要缩进的地方增加了缩进,代码如下。
print ("This is an apple")
    print("This is a banana")
编译的时候,Python 会给出错误提示,告知这里有不该出现的缩进,如图 4 所示。

提示错误
图 4

缩进导致程序的逻辑错误

前面介绍的遗漏缩进和增加冗余的缩进这两种情况,都是语法错误,由我们自己根据运行程序所得到的结果是否和预期的结果相同来做出判断。

我们来看一个示例。假设有这样一个程序,它让用户输入一个数字,然后根据这个数字给出用户提示。当输入的数字大于 10 时,会提示数字大于 10 并且将其重新设置为 0,如果用户输入的数字不大于 10,那么直接显示该数字,代码如下。
number=input("Please input a number: ")
if (int(number)>10):
    print("Your number is greater than ten and reset it zero")
    number="0"
print("Your number is: "+number)
当我们输入 1 的时候,因为 1 不大于 10,所以会直接显示 "Your number is:1"。如果输入 18的时候,因为 18 大于 10,所以 number 会被重置为 0,显示内容就成为 "Your number is:0",如图 5 所示。

显示内容
图 5

接下来,我们修改一下代码的缩进,代码如下。
number=input("Please input a number: ")
if (int(number)>10):
    print("Your number is greater than ten and reset it zero")
number="0"
print("Your number is: "+number)
可以看到,number="0" 这条语句现在没有了缩进,这意味着无论输入的数字是否大于 0,都会将 number 重新设置为“0”,如图 6 所示。

显示内容
图 6

尽管我们输入的数字还是 1 和 18,但是得到的结果却都是 "Your number is 0"。可以看到,缩进有时会影响到整个程序的逻辑。