
3.1 选择结构

在Python中,选择结构的实现是通过if语句,if语句的常见语法是:


这表示的是,如果条件1成立就执行代码块1;如果条件1不成立而条件2成立就执行代码块2;如果条件1到条件n-1都不满足,那么就执行代码块n。
另外,其中的elif和else以及相应的代码块是可以省略的,也就是说最简单的if语句格式是:

要注意的是,这里所有代码块前应该是4个空格,原因稍后会提到,这里先看一段具体的if语句。

很容易得到结果:

这段代码表示的含义就是,如果a小于5则输出' a is smaller than 5.',如果a不小于5而小于6则输出' a is smaller than 6.',否则就输出' a is larger than 5.'。这里值得注意的是,虽然a同时满足a<5和a<6两个条件,但是由于a<5在前面,所以最终输出为' a is smaller than 5.'。
if语句的语义非常直观易懂,但是这里还有一个问题没有解决,那就是为什么我们要在代码块之前空4格?
依旧是先看一个例子:

运行这段代码可以得到:

但是如果稍加改动,在print('done')前也加4个空格:

再运行的话什么也不会输出。
它们的区别是什么呢?对于第一段代码,print(' done')和if语句是在同一个代码块中的,也就是说无论if语句的结果如何,print(' done ')一定会被执行。而在第二段代码中,print('done')和print('Impossible!')是在同一个代码块中的,也就是说如果if语句中的条件不成立,那么print('Impossible!')和print('done')都不会被执行。
我们称第二个例子中这种拥有相同缩进的代码为一个代码块。虽然Python解释器支持使用任意多但是数量相同的空格或者制表符来对齐代码块,但是一般约定用4个空格作为对齐的基本单位。
另外值得注意的是,在代码块中是可以再嵌套另一个代码块的,以if语句的嵌套为例:

首先最外层的代码块是所有的代码,它的缩进是0,接着它根据if语句分成了三个代码块,分别是第5~10行,第12~18行,第20~27行,它们的缩进是4,接着在这三个代码块内又根据if语句分成了三个代码块,其中每个print语句是一个代码块,它们的缩进是8。
从这个例子中可以看到代码块是有层级的,是嵌套的,所以即使这个例子中所有的print语句拥有相同的空格缩进,仍然不是同一个代码块。
但是单有顺序结构和选择结构是不够的,有时候某些逻辑执行的次数本身就是不确定的或者说逻辑本身具有重复性,那么这时候就需要循环结构了。