3.1 语句和语法

Python语句中有一些基本规则和特殊字符:

  • 井号(#)表示之后的字符为Python注释;

  • 换行(\n)是标准的行分隔符(通常一个语句一行);

  • 反斜线(\)继续上一行;

  • 分号(;)将两个语句连接在一行中;

  • 冒号(:)将代码块的头和体分开;

  • 语句(代码块)用缩进块的方式体现;

  • 不同的缩进深度分隔不同的代码块;

  • Python文件以模块的形式组织。

3.1.1 注释(#)

首要说明的事情是:尽管Python是可读性最好的语言之一,这并不意味着程序员在代码中就可以不写注释。和很多Unix脚本类似,Python注释语句从#字符开始,注释可以在一行的任何地方开始,解释器会忽略掉该行#之后的所有内容。要正确地使用注释。

3.1.2 继续(\)

Python语句,一般使用换行分隔,也就是说一行一个语句。一行过长的语句可以使用反斜杠(\)分解成几行,如下例。

3.1 语句和语法 - 图1

有两种例外情况一个语句不使用反斜线也可以跨行。在使用闭合操作符时,单一语句可以跨多行,例如:在含有小括号、中括号、花括号时可以多行书写。另外就是三引号包括下的字符串也可以跨行书写,如下例。

显示一个三引号字符串

3.1 语句和语法 - 图2

给一些变量赋值

3.1 语句和语法 - 图3

如果要在使用反斜线换行和使用括号元素换行两者之间作一个选择,我们推荐使用括号,这样可读性会更好。

3.1.3 多个语句构成代码组(:)

缩进相同的一组语句构成一个代码块,我们称之为代码组。像if、while、def和class这样的复合语句,首行以关键字开始,以冒号(:)结束,该行之后的一行或多行代码构成代码组。我们将首行及后面的代码组称为一个子句(clause)。

3.1.4 代码组由不同的缩进分隔

我们在2.10一节中曾提到,Python使用缩进来分隔代码组。代码的层次关系是通过同样深度的空格或制表符缩进体现的。同一代码组的代码行必须严格左对齐(左边有同样多的空格或同样多的制表符),如果不严格遵守这个规则,同一组的代码就可能被当成另一个组,甚至会导致语法错误。

3.1 语句和语法 - 图4核心风格:缩进4个空格宽度,避免使用制表符

对一个初次使用空白字符作为代码块分界的人来说,遇到的第一个问题是,缩进多大宽度才合适?2个太少,6~8个又太多,因此我们推荐使用4个空格宽度。需要说明一点,不同的文本编辑器中制表符代表的空白宽度不一,如果你的代码要跨平台应用,或者会被不同的编辑器读写,建议你不要使用制表符。使用空格或制表符这两种风格都得到了 Python创始人的支持,并被收录到Python代码风格指南文档。在3.4节中你会看到同样的建议。

随着缩进深度的增加,代码块的层次也在加深,没有缩进的代码块是最高层次的,被称做脚本的“主体”(main)部分。

使用缩进对齐这种方式组织代码,不但代码风格优雅,而且也大大提高了代码的可读性。而且它有效避免了 “悬挂else”(dangling-else)问题,和未写大括号的单一子句问题。(如果C语言中if语句没写大括号,而后面却跟着两个缩进的语句,这会造成不论条件表达式是否成立,第二个语句总会执行。这种问题很难调试,不知道困惑了多少程序员。)

最后一点,由于Python只使用缩进方式表达代码块逻辑,因此“神圣的大括号战争”永远不会发生在Python身上。 C、C++和Java语言中,开始大括号可以在第1行的尾部,也可以在第2行的头部,也可以在第2行空几格后开始,这就造成不同的人选择不同的风格,于是你就会看到大括号战争的场景了。

3.1.5 同一行书写多个语句(;)

分号(;)允许你将多个语句写在同一行上,语句之间用分号隔开,而这些语句也不能在这行开始一个新的代码块。这里有一个例子:

3.1 语句和语法 - 图5

必须指出一点,同一行上书写多个语句会大大降低代码的可读性,Python虽然允许但不提倡你这么做。

3.1.6 模块

每一个Python脚本文件都可以被当成是一个模块。模块以磁盘文件的形式存在。当一个模块变得过大,并且驱动了太多功能的话,就应该考虑拆一些代码出来另外建一个模块。模块里的代码可以是一段直接执行的脚本,也可以是一堆类似库函数的代码,从而可以被别的模块导入(import)调用。