1.3.4 Python 语言的基本成分

在自然语言中,我们用字词、句子、段落来写文章表达思想。类似地,编程语言也提供

各种语言成分用于构造程序表达计算。例如 HelloWorld 程序中的 print 是 Python 语言中用 于显示输出的一个保留词,而"Hello, World!"则是被显示的数据,这两个成分组合在一 起,就构成了一条完整的语句。本节简单介绍 Python 语言的基本成分,使读者对 Python 编 程有个概括的了解,更多细节将在本书后面的章节中介绍。

数据和表达式

程序是处理数据的,编程语言首先要有表达数据的语言成分,例如"Hello, World!" 就是被处理的数据。数据分为不同的类型,"Hello, World!"是字符串类型的数据。除了 字符串,Python 语言还能表达和处理数值型的数据,例如:

>>> print 3.14
3.14

Python 不但能表达"Hello,World!"和 3.14 这样的基本数据,还能表达数据运算。将 运算符施加到数据上所得到的语言构造称为表达式。例如下面的 print 语句显示一个表达 式的计算结果,该表达式中使用了加法(+)和乘法(*)运算符:

>>> print 2 + 3 * 4
14

变量与标识符

像"Hello, World!"和 3.14 这样的数据称为常量,其数据值由字面决定,并且不可 改变。Python 语言中还可以定义变量,用于表示可变的数据。变量具有名字,不同变量是通 过名字相互区分的,因此变量名具有标识作用,故称为标识符①。

Python 语言中,标识符的构成必须符合规则:以字母或下划线开头,后面跟随 0 个或多 个字母、数字、下划线。例如:

x xYz x1y2 xy_123 _ (连续两个下划线) _123

等都是合法的标识符,而

3q x-123 first name(中间用了空格)

等则是非法的。

① Python 程序中还有函数、类、模块等需要命名的构件,这些名字同样都属于标识符。

作为良好的编程风格,标识符的命名是有讲究的。首先,要尽量使用有意义的名字,例 如如果要用一个变量来表示工资,可以命名为 salary、gongzi 之类,而 s 或 gz 就不是好的名字。其次,如果用两个以上单词组成一个名字,最好能让人看出单词之间的分界,具 体做法有后续单词首字母大写①或者用下划线分隔等形式,例如表示出生年份的变量可以命 名为 birthYear 或 birth_year,而 birthyear 就不算是好的风格。第三,每个人应当 前后一致地使用某种命名风格,例如总是用后续单词首字母大写或总是用下划线分隔单词。 本书的示例程序中,一般以小写字母开头的一个或多个英文单词作为变量名,其中后续 单词的首字母都大写,例如 firstName、dateOfBirth。这也是很多人惯用的命名风格。 当然,在很多简单的示例程序中,我们也会使用很多无意义的单字母的变量名,毕竟这些程序不是正式的应用程序。

语句

语句是编程语言提供的基本命令,是程序的基本组成单元和执行单元。Python 语言提供

了多种语句,分别完成不同的功能,例如我们多次见到的 print 语句。每条语句都有规定 的语法形式和精确的语义,本书将采用“模板”的方式来介绍 Python 语句的语法。例如 print 语句的用法“模板”包括:

print <表达式>
print <表达式 1>, <表达式 2>, ..., <表达式 n>

在语句模板中我们用“<表达式>”之类的符号表示相应位置上所期待的合法语言成分。

第一个模板表示可以在 print 后面出现一个表达式,其含义是计算表达式的值并在屏幕上 显示计算结果。第二个模板表示 print 后面可以出现用逗号分隔的多个表达式,其含义是 计算每个表达式的值,并在屏幕的同一行上显示用空格分隔的各表达式的计算结果。例如:

>>> print "2 + 3 =", 2 + 3
2 + 3 = 5

最常用的一种语句是赋值语句,用于为变量赋值。最简单的赋值语句的形式是:

<变量> = <表达式>

其语义是先计算<表达式>的值,再将该值存储到<变量>中。例如:

>>> x = 2 + 3

执行结果是将 5 存储于变量 x 中,此后在表达式中使用 x 就相当于使用 5。例如:

>>> print x
5
>>> print x + 1
6

顾名思义,变量的值随时可以改变,例如下面的赋值语句将 x 的值从 5 改成了"Hello":

>>> x = "Hello"
>>> print x
Hello

用 Python 语言编程时,通常是使每一条语句独占一行,而不将两条以上的语句写在同一 行上。如果一条语句很长,写在一行上读起来不方便,Python 也提供了“续行符”用于换行 继续输入:只要在一行的末尾输入字符“\”再按回车键,就表示本行语句未完,换到下一 行继续。例如:

>>> print "This is a very very looooooooooooooooooooooooooong \ 
sentence."

This is a very very looooooooooooooooooooooooooong sentence.

① 顺便提一下,首单词的首字母也大写习惯用于“类名”,而所有字母都大写习惯用于“常量名”。

函数

我们经常将一个语句序列定义成一个“函数”,从而将这个语句序列视为一个整体并命名。 今后在程序的任何地方,只要写下“函数名”,就相当于写下了构成该函数的语句序列,这称 为“调用”该函数。例如,我们将程序 1.2 中的三条语句定义成一个函数:

>>> def greet():
        print "Hello, Lucy." 
        print "How are you?" 
        print "Goodbye, Lucy."
>>>

第一行的 def 告诉 Python 我们要定义一个函数,其后的 greet 是新定义的函数的名字, greet 后面的一对括号用于表示函数的参数。虽然本例中 greet 函数没有参数,但括号仍 然不可缺少。接下来三行是构成函数的语句序列,称为函数体。Python 语言要求:函数体中 的语句与 def 行相比,左边必须留一点空白(称为“缩进”),表示它们是函数的一部分。具 体缩进多少不重要,重要的是函数体的各语句左边要对齐。最后,交互方式下需要用一个空 行(在一行的开始处按回车键)来结束函数定义,使解释器回到提示符状态。

在此我们说明一下 Python 语言的缩进问题。一般来说,Python 程序中所有语句应该左对 齐。但在某些情况下,下一行语句要比上一行语句左边多缩进一些空白,这是为了表达一种 隶属关系:左缩进的语句是上面未缩进语句的下属部分。同层次的语句总是左对齐的,因此 当下属部分结束后,后面的语句又要恢复到未缩进的状态。对于接触过其他编程语言的人来 说,一开始也许会不习惯 Python 的代码缩进,但是以后会发现强制缩进的好处,例如程序在 形式上更整齐、更容易排错等。

上面的函数定义只是告诉 Python 将来看到 greet 时应该做什么,现在并不执行函数体 中的语句序列。将来任何时候如果想执行函数的语句,只需输入函数名来“调用”函数,例 如:

>>> greet() 
Hello, Lucy. 
How are you? 
Goodbye, Lucy.

注意函数名 greet 后面的一对括号,这是必须有的,表明这是一个函数调用。

作为惯例,一个 Python 程序中通常会定义一个名叫 main 的函数。对于简单程序,可以

将程序的所有语句放在 main 函数中;对于由很多函数组成的复杂程序,可以让 main 作为程 序的执行入口。拿程序 1.2 来说,更常见的是以如下代码来编写:

def main():
    print "Hello, Lucy." 
    print "How are you?" 
    print "Goodbye, Lucy."
main()

注意最后一行的 main(),它的作用就是调用执行函数 main。没有这一行,该程序仅仅定义了 函数 main,并没有要求执行 main 函数。

虽然像程序 1.2 那样不将所有语句定义放在函数中也是可以的,但习惯上常定义成 main。 这样做至少有一个好处,那就是一旦导入了模块文件,就可以通过键入 main()来多次执行程 序。没有函数的话,就只能通过多次导入模块来执行程序了。

注释

程序中可以使用注释,用于解释变量的含义、函数的功能、模块文件的创建者、程序版 本等等。注释不仅可以帮助他人理解程序,甚至对自己也有帮助理解的作用(试想一下当你 重新拿起几年前写的程序想扩展程序功能时,注释对你的帮助)。

Python 中的注释是以“#”开始的一行,解释器遇见“#”时会自动忽略其后直到行末的 内容。例如我们将上面的 greet()函数存入文件,并加上合适的注释,得到以下程序:

【程序 1.3】eg1_3.py

# Author: Lu Chaojun
# eg1_3.py (version 1.0)
def greet():
    print "Hello, Lucy." 
    print "How are you?" 
    print "Goodbye, Lucy."
greet() # call the function