1. 目的
本文讲解Python特有的、与代码组织相关的缩进规则,并以结构化条件语句进行示例。
因为对于初次接触Python的人员来讲,在阅读Python代码的时候,存在一个问题,即代码应该怎么看、一个Class的定义是到哪里结束的、一个函数到哪里结束的。如果这个问题不解答,就不能很好地在doing-by-learning中掌握Python。基于这个困惑,我们提前讲解Python的缩紧语法。
为了说明缩紧,本文结合讲解Python的条件语句。为了保持连贯性,接下来的几篇文章就把结构化或称模块化编程相关的语法快速过一边。之后,我们再详细介绍Python中大量使用的几种数据结构:字符串、列表、集合、字典等。
2. 语句块
通常大家学习的第一种编程语言就是C语言,接下来可能是C++或Java。在这几种语言中,已经了解了语句块的概念。举个例子:
#include <stdio.h>
unsigned int Fibonacci(unsigned int n)
{
if (n == 0)
return 0;
if (n == 1) return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
int main()
{
printf("Fibonacci(10) = %d\n", Fibonacci(10));
return 0;
}
上面代码中return 0;是当n取值0时的执行语句,其他值则不执行该语句;其他几个return语句也是如此。对于这种满足某种条件时要执行的一条或多条语句,我们就称为语句块。所有结构化的代码中均涉及这种语法。
因为上面的语句块是一条语句,如果是多条语句,则需要用一对花括号括起来。
那么在Python中,表示方法比较特殊,是用相同缩进的一条或多条语句来表示的。
3. if语句
3.1 布尔表达式
在 Python入门教程-02 变量 一文简单提到了布尔类型的变量。那么在Python,到底哪些值表示“布尔假”呢?这包括:
- 布尔逻辑假)False
- None
- (数字)0
- (空字符串)""
- (空集合)()
- (空列表)[]
- (空字典){}
除此之外都表示“布尔真”。这里就不再具体一一说明,在接下来的诸多例子中会大量涉及条件判断,大家逐步也就清楚Python的布尔逻辑了。
注1:关于以上取值,请参考Python官网的说明,地址:https://docs.python.org/3/reference/expressions.html#boolean-operations。摘录如下:
In the context of Boolean operations, and also when expressions are used by
control flow statements, the following values are interpreted as false:
False, None, numeric zero of all types, and empty strings and containers
(including strings, tuples, lists, dictionaries, sets and frozensets).
All other values are interpreted as true. User-defined objects can
customize their truth value by providing a __bool__() method.
注2:False 与 None
以上的解读,并不意味着False=None。只是说明Python取"布尔假"的情况包括False, None等几种取值。在Python中,布尔取值为false,并不意味着该值就是False。进一步地,可以分析出现代码:
>>> type(False)
<type 'bool'>
>>> type(None)
<type 'NoneType'>
>>>
3.2 函数
因为前面的示例C代码中,用到了函数Fibonacci,为了对比,我们现在也开始介绍Python的这个功能,而且函数的定义正要用到Python的缩紧语法。——但更详细的函数语法放在下一篇文章中。
Python中,函数是以def作为关键字,后面跟函数的名称,接下来是一对圆括号;括号中是传递的各个参数;接下来是冒号。示例:
#!/usr/bin/env python
def Fibonacci(n):
if n == 0:
return 0
if n == 1:
return 1
return Fibonacci(n - 1) + Fibonacci(n - 2)
print "Fibonacci(10) = %d\n", Fibonacci(10)
运行结果:
flying-bird@flyingbird:~/examples/python$ ./fibonacci.py
Fibonacci(10) = %d
55
flying-bird@flyingbird:~/examples/python$
说明几点:
- 在Python中,不需要为变量指定数据类型,因此函数Fibonacci中的参数直接写变量n即可;
- 在Python中没有函数声明与定义分离的语法,如同这里,直接给出了函数的定义;
- def一行包括了函数名称、参数名称,最后以冒号:结束;
- 接下来就是函数体部分,这时就用到缩进语法了。缩进对应其他编程语言中的一对花括号;
- 缩紧并没有规定具体的缩紧量,即1个空格、2个空格,或者4个空格。Python并不要求具体的值,只需要在代码中保持一直即可;
- 用tab键进行缩紧也是可以的,但确实不推荐的。因为不同的文本编辑器下面tab占用的空格数不一定相同,有些编辑器自动把tab转换成空格,由此导致缩紧的值不受控制;
- 作为习惯,都是用空格进行缩紧;
- 通常使用2个空格或4个空格进行缩紧;——注意,仅仅是一种习惯;具体要和已有代码、当前团队的风格保持一致。
缩紧的几种情况:
- 函数的函数体部分需要缩进;
- if、elif、else,以及后面会提到的各种结构化控制(do-while, while-do, for等)需要缩进;
- class的各个成员函数;
3.3 if语句
在上面这个例子中,已经用到了if语句,对照示例也清楚了if的语法。简单来讲,
- if是关键字;
- 后面是条件表达式;——条件表达式有很多种,一一列举显然很枯燥;
- 接下来是冒号;
- 然后另起一行缩紧
除了if关键字,还有:
- elif:是else if的简写,但Python中不能用else if的写法;
- else
为了演示这几种用法,我们对上面的代码进行重构:
#!/usr/bin/env python
def Fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return Fibonacci(n - 1) + Fibonacci(n - 2)
print "Fibonacci(10) = %d\n", Fibonacci(10)
4. 小结
- 在Python中,通过缩紧来表示语句块;
- 习惯上,使用2个或4个空格进行缩进。