编程语言是操作计算机来执行任务的手段,它也在我们组织关于过程的想法中,作为一种框架。程序用于在编程社群的成员之间交流这些想法。所以,程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行。
当我们描述一种语言时,我们应该特别注意这种语言的手段,来将简单的想法组合为更复杂的想法。每个强大的语言都拥有用于完成下列任务的机制:
- 基本的表达式和语句,它们由语言提供,表示最简单的构建代码块。
- 组合的手段,复杂的元素由简单的元素通过它来构建,以及
- 抽象的手段,复杂的元素可以通过它来命名,以及作为整体来操作。
在编程中,我们处理两种元素:函数和数据。(不久之后我们就会探索它们并不是真的非常不同。)不正式地说,数据是我们想要操作的东西,函数描述了操作数据的规则。所以,任何强大的编程语言都应该能描述基本数据和基本函数,并且应该拥有组合和抽象二者的方式。
1.2.1 表达式
在实验 Python 解释器之后,我们现在必须重新开始,按照顺序一步步地探索 Python 语言。如果示例看上去很简单,要有耐心 — 更刺激的东西还在后面。
我们以基本表达式作为开始。一种基本表达式就是数值。更精确地说,是你键入的,由 10 进制数字表示的数值组成的表达式。
1 2 |
>>> 42 42 |
表达式表示的数值也许会和算数运算符组合,来形成复合表达式,解释器会求出它:
1 2 3 4 |
>>> -1 - -1 0 >>> 1/2 + 1/4 + 1/8 + 1/16 + 1/32 + 1/64 + 1/128 0.9921875 |
这些算术表达式使用了中缀符号,其中运算符(例如+
、-
、*
、/
)出现在操作数(数值)中间。Python包含许多方法来形成复合表达式。我们不会尝试立即将它们列举出来,而是在进行中介绍新的表达式形式,以及它们支持的语言特性。
1.2.2 调用表达式
最重要的复合表达式就是调用表达式,它在一些参数上调用函数。回忆代数中,函数的数学概念是一些输入值到输出值的映射。例如,max
函数将它的输入映射到单个输出,输出是输入中的最大值。Python 中的函数不仅仅是输入输出的映射,它表述了计算过程。但是,Python 表示函数的方式和数学中相同。
1 2 |
>>> max(7.5, 9.5) 9.5 |
调用表达式拥有子表达式:运算符在圆括号之前,圆括号包含逗号分隔的操作数。运算符必须是个函数,操作数可以是任何值。这里它们都是数值。当求解这个调用表达式时,我们说max
函数以参数 7.5 和 9.5 调用,并且返回 9.5。
调用表达式中的参数的顺序极其重要。例如,函数pow
计算第一个参数的第二个参数次方。
1 2 3 4 |
>>> pow(100, 2) 10000 >>> pow(2, 100) 1267650600228229401496703205376 |
函数符号比中缀符号的数学惯例有很多优点。首先,函数可以接受任何数量的参数:
1 2 |
>>> max(1, -2, 3, -4) 3 |
不会产生任何歧义,因为函数的名称永远在参数前面。
其次,函数符号可以以直接的方式扩展为嵌套表达式,其中元素本身是复合表达式。在嵌套的调用表达式中,不像嵌套的中缀表达式,嵌套结构在圆括号中非常明显。
1 2 |
>>> max(min(1, -2), min(pow(3, 5), -4)) -2 |
(理论上)这种嵌套没有任何限制,并且 Python 解释器可以解释任何复杂的表达式。然而,人们可能会被多级嵌套搞晕。你作为程序员的一个重要作用就是构造你自己、你的同伴以及其它在未来可能会阅读你代码的人可以解释的表达式。
最后,数学符号在形式上多种多样:星号表示乘法,上标表示乘方,横杠表示除法,屋顶和侧壁表示开方。这些符号中一些非常难以打出来。但是,所有这些复杂事物可以通过调用表达式的符号来统一。虽然 Python 通过中缀符号(比如+
和-
)支持常见的数学运算符,任何运算符都可以表示为带有名字的函数。
1.2.3 导入库函数
Python 定义了大量的函数,包括上一节提到的运算符函数,但是通常不能使用它们的名字,这样做是为了避免混乱。反之,它将已知的函数和其它东西组织在模块中,这些模块组成了 Python 库。需要导入它们来使用这些元素。例如,math
模块提供了大量的常用数学函数:
1 2 3 4 5 |
>>> from math import sqrt, exp >>> sqrt(256) 16.0 >>> exp(1) 2.718281828459045 |
operator
模块提供了中缀运算符对应的函数:
1 2 3 4 5 |
>>> from operator import add, sub, mul >>> add(14, 28) 42 >>> sub(100, mul(7, add(8, 4))) 16 |
import
语句标明了模块名称(例如operator
或math
),之后列出被导入模块的具名属性(例如sqrt
和exp
)。
Python 3 库文档列出了定义在每个模块中的函数,例如数学模块。然而,这个文档为了解整个语言的开发者编写。到现在为止,你可能发现使用函数做实验会比阅读文档告诉你更多它的行为。当你更熟悉 Python 语言和词汇时,这个文档就变成了一份有价值的参考来源。
1.2.4 名称和环境
编程语言的要素之一是它提供的手段,用于使用名称来引用计算对象。如果一个值被给予了名称,我们就说这个名称绑定到了值上面。
在 Python 中,我们可以使用赋值语句来建立新的绑定,它包含=
左边的名称和右边的值。