第 3 章 基本数学运算

第 3 章 基本数学运算

刚开始在交互模式中使用 Python 时,我们已经看到它可以完成简单的算术运算。现在来看 Python 还能对数字做些什么,还能完成哪些数学运算。也许你没有意识到,不过要知道,数学确实无处不在!特别是在编程中,我们一直都在使用数学。这并不是说你必须成为一位数学大师才能学习编程,不过可以想想看……每个游戏都有某种需要累计的分数;在屏幕上绘制图形时必须使用数字来确定图形的位置和颜色;移动的物体会有方向和速度,这都要用数字来描述。所有有意思的程序几乎都会以某种方式使用数字和数学。所以下面就来学习 Python 中有关数学和数字的一些基础知识。

{%}

顺便说一句,这里学习的很多知识同样适用于其他编程语言,也可以在电子表格之类的其他程序中使用。并不是只有 Python 采用这种方式完成数学运算。

3.1 四大基本运算

在第 1 章中我们已经看到 Python 可以做一些数学运算:使用加号(+)完成加法,另外使用星号(*)完成乘法。

如你所料,Python 使用连字号(-)(也称为减号)来做减法:

>>> print 8 - 5
3

由于计算机键盘上没有除号(÷),所以所有程序都使用前斜杠(/)表示除法。

>>> print 6/2
3

这是对的。不过有时 Python 做除法时会得到意外的结果:

>>> print 3/2
1

咦?我还以为计算机精通数学计算呢,原来不过如此!所有人都知道

3 / 2 = 1.5

这到底怎么回事?

嗯,虽然看起来好像很傻,其实 Python 确实想表现得聪明一些。要解释这个问题,你要知道整数和小数。如果你还不知道它们的区别,先来看看术语箱中简单的解释。

术语箱

整数(integer)就是我们平常数数时所说的数,如 1、2、3,另外还包括 0 和负数,如 -1、-2、-3。

小数(decimal number)也称为实数(real number),这些数有小数点而且后面有小数位,如 1.25、0.3752 和 -101.2。

在计算机编程中,小数也称为浮点数(floating-point number,有时简写为 floats,或者如果只有一个浮点数,就简写为 float)。这是因为小数点会“浮动”。0.00123456 或 12345.6 都是浮点数。

因为你输入的 3 和 2 都是整数,所以 Python 认为你同样想要整数作为答案。所以它会把答案 1.5 取整为比它小且最接近的整数,也就是 1。换句话说,Python 完成了不带余数的除法。

要解决这个问题,可以这样试试看:

>>> print 3.0 / 2
1.5

这样就好多了!如果把两个数中的任何一个作为小数输入,Python 就会知道你想在答案中保留小数部分。

{%}

整除

在 Python 2 中,做除法的方式称为“整除”(floor division)。但 Python 3 的工作方式不一样,在 Python 3 中,如果你使用常规的除法操作符(前斜杠“/”),则做的是常规除法,而不是整除。

>>> print (3/2)
1.5

要在 Python 3 中做整除,需要使用两个前斜杠(//):

>>> print (3//2)
1

这是 Python 2 和 Python 3 最显著的区别之一,也是导致很多 Python 2 程序与 Python 3 程序不兼容的原因。

 

切记

要记住 Python 2 的这种整除行为。这很重要,很多 Python 程序员(包括我自己)都曾经因为忘记这一点犯过错。

3.2 操作符

+、-、* 和 / 符号都称为操作符。这是因为它们会“操作”或处理放在符号两边的数字。= 号也是一个操作符,这称为赋值操作符(assignment operator),因为我们用它为一个变量赋值。

注意!这个词有意思!

操作符(operator)就是会对它两边的东西有影响或者有“操作”的符号。这种影响可能是赋值、检查或者改变一个或多个这样的东西。

{%}

完成算术运算的 +、-、* 和 / 符号都是操作符。

所操作的东西称为操作数(operand)。

3.3 运算顺序

下面哪一个正确?

2 + 3 * 4 = 20

还是

2 + 3 * 4 = 14

这要看你采用什么顺序来计算。如果先做加法,会得到

2 + 3 = 5,

然后得到

5 * 4 = 20

如果先做乘法,就会得到

3 * 4 = 12,

然后是

2 + 12 = 14

第二个顺序是正确的,所以正确答案是 14。在数学中有一种运算顺序(order of operation),指定了先计算哪些操作符,后计算哪些操作符,而不管它们的书写顺序如何。

在我们的这个例子中,尽管 + 号在 * 号前面,但是应当先算乘法。Python 会遵循正确的数学规则,所以它会先做乘法再做加法。可以在交互模式中试试看,看看能不能得到这个结果:

>>> print 2 + 3 * 4
14

Python 使用的顺序与你在数学课上学到的(或者将要学到的)规则完全相同。指数运算最优先,然后是乘除,再后面是加减运算。

如果希望改变运算顺序,先完成某个运算,只需要在它两边加上括号(圆括号),比如:

>>> print (2 + 3) * 4
20

这一次,Python 会先做 2 + 3(因为有括号),可以得到 5,然后再做乘法 5 * 4,得到 20。

再强调一次,这与数学课上讲的是一样的。Python(和所有其他编程语言)都会遵循正确的数学规则和运算顺序。

{%}

3.4 另外两个操作符

还有两个算术操作符要告诉你。程序中需要的 99% 的操作符就是这两个操作符再加上前面刚讲的 4 个基本操作符。

指数——自乘为一个幂

如果把 3 乘 5 次,可以写成

>>> print 3 * 3 * 3 * 3 * 3
243

不过,这就等同于 35,或者“3 的指数为 5”,也就是“3 的 5 次幂”。Python 用一个双星号表示指数或者将一个数自乘为一个幂。

>>> print 3 ** 5
243

切记

很多语言和程序可能使用其他符号来表示自乘为一个幂。一种常用的符号是 ^(例如 3^5)。如果在 Python 中使用这个符号,你不会得到一个错误消息,只不过答案不正确。(这是因为,^ 在 Python 中另有含义————我们可不希望这样!)这个问题可能很难调试。一定要使用 ** 操作符表示自乘为一个幂 [ 也称为求幂(exponentiation)]。

之所以使用指数而不是直接做多次乘法,这是因为键入时会更容易一些。不过更重要的原因是,利用 ** 还可以用非整数作为指数,如下:

>>> print 3 ** 5.5
420.888346239

要想利用乘法来做到这一点可不容易。

取余——求余数

在 Python 中第一次尝试除法时,我们已经看到,如果将两个整数相除,Python 2 会给你一个整数答案。(Python 3 使用 // 操作符。)也就是说,它在完成整数除法。不过,在整数除法中,答案实际上有两部分。

还记得刚开始学除法吗?如果两个数不能整除,最后会得到一个余数(remainder):

7 / 2 = 3,余数是 1

7 / 2 的答案中有一个商(quotient),在这里就是 3,还有一个余数(remainder),这里的余数是 1。如果在 Python 中将两个整数相除,它会给你商。不过余数呢?

Python 有一个特殊的操作符来计算整数相除的余数。这称为取余(modulus)操作符,这个符号是百分号(%)。可以像这样使用:

>>> print 7 % 2
1

所以如果同时使用 / 和 %,就可以得到整数相除的完整答案:

>>> print 7 / 2
3
>>> print 7 % 2
1

可以看到,7 除以 2 得 3,余数是 1。如果做浮点数除法,会得到小数答案:

>>> print 7.0 / 2
3.5

 

{%}

实际上,既然你提到了这一点,应该说操作符和操作员确实很接近……就像老式电话接线员连接电话一样,算术操作符按同样的方式把数字连接在一起。

我想告诉你的还有另外两个操作符。我知道,我刚才已经说过只再讲两个,不过别担心,这两个操作符非常容易!

自增和自减

还记得上一章中的例子:score = score + 1 吗?我们说过,这称为自增(incrementing)。与它类似的是 score = score - 1,这称为自减(decrementing)。这些运算在编程中经常出现,因此有自己专门的操作符:+=(自增)和 -=(自减)。

可以像这样使用:

{%}

或者:

{%}

其中第一个例子将 number 增 1(这会从 7 变成 8)。第二个例子将 number 减去 1(从 7 变成 6)。

3.5 非常大和非常小

还记得第 1 章中将两个非常大的数相乘吗?我们得到的答案也是一个非常大的数。

有时 Python 会用一种稍微不同的方式显示非常大的数。可以在交互模式中试试看:

>>> print 9938712345656.34 * 4823459023067.456
4.79389717413e+025
>>>

(具体键入什么数并不重要——任何包含小数的大数值都可以。)

这个 e 是计算机中显示非常大或非常小的数时采用的一种方法。这叫做 E 记法(E-notation)。处理非常大(或非常小)的数时,要把所有数字以及小数位都显示出来可能很费劲。这种数在数学和科学领域经常出现。例如,如果一个天文程序要显示从地球到 Alpha Centaur 星的公里数,可能会显示为 38000000000000000 或者 38 000 000 000 000 000(38 后面有 15 个 0)。不论哪种方式,数完所有这些 0 都会让你累得够呛。

显示这些数还有另一种方式,就是使用科学计数法(scientific notation),就是一个小数再乘以一个 10 的幂。在科学计数法中,地球到 Alpha Centauri 的距离可以写作:3.8 × 1016(看到了吗,16 抬高了,而且要小一点)。这读作“3.8 乘以 10 的 16 次幂”或者“3.8 乘以 10 的 16 次方”。它的意思就是,把 3.8 的小数点向右移 16 位,并在这个过程中根据需要补 0。

如果可以像这里一样,把 16 写作指数,稍稍抬高一点,再写得小一点,科学计数法就很适用。如果你用纸和笔,或者使用一个支持上标的程序,就可以用科学计数法。

术语箱

上标(superscript)是指一个字符或一组字符比其余文本高一些,例如 1013。这里的 13 就是上标。通常上标还要比正文小一点。

下标(subscript)也类似,不过这些字符会比其余文本低,同样也会小一点, 比如 log2。这里的 2 就是一个下标。

不过并不是哪里都能使用上标,所以还有另一种方法,就是 E 记法。E 记法只是科学计数法的另一种写法。

E 记法

在 E 记法中,这个数要写作 3.8E16 或者 3.8e16。读作“3.8 指数 16”或者简读作“3.8 e 16”。这里假设指数是 10 的幂。这就等同于写成 3.8×1016

在大多数程序和计算机语言(包括 Python)中,大写和小写 E 都是 允许的。

对于非常小的数,如 0.0000000000001752,可以使用一个负指数。科学计数法会写作 1.752×10-13,E 记法会写作 1.752e-13。负指数表示要把小数点向左移而不是向右移。

采用 E 记法,可以在 Python 中输入非常大和非常小的数(或者可以是任何数)。后面我们还会学习如何让 Python 使用 E 记法打印数。

试试采用 E 记法输入一些数:

>>> a = 2.5e6
>>> b = 1.2e7
>>> print a + b
14500000.0

尽管我们用 E 记法输入了数,但得出的答案却是一个常规的小数。这是因为,除非你特别要求,或者数字确实非常大或非常小(有很多个 0),否则 Python 不会用 E 记法显示数字。

可以试试看:

>>> c = 2.6e75
>>> d = 1.2e74
>>> print c + d
2.72e+75

这一次 Python 会自动用 E 记法显示答案,因为显示一个有 73 个 0 的数太不可思议了!

如果希望用 E 记法显示类似 14 500 000 的数,需要给 Python 下达一些特殊的指令。我们将在本书的第 21 章学习更多相关内容。

别担心,放松点

如果你还不太理解 E 记法到底是怎么回事,不用担心。这本书后面的程序中不会用到它。我只是想让你了解一下它的原理,没准以后你会用到。

如果使用 Python 来完成一些数学运算,得到的答案是一个类似 5.673745e16 的数,至少现在你知道这是一个非常大的数,而不是出现了什么错误。

指数与 E 记法

不要把自乘得到幂(也称为求幂)和 E 记法弄混了。

  • 3**5 表示 35,或“3 的 5 次幂”,也就是 3 * 3 * 3 * 3 * 3,等于 243。

  • 3e5 表示 3 * 105 或者“3 乘以 10 的 5 次幂”,也就是 3 * 10 * 10 * 10 * 10 *10,结果等于 300 000。

  • 求幂是指一个数自乘得到幂。E 记法表示乘以 10 的几次幂。

有些人可能会把 3e5 和 3**5 都读作“3 指数 5”,不过,它们是完全不同的。怎么读并不重要,只要你懂得它们分别代表什么含义。

你学到了什么

在这一章,你学到了以下内容。

  • 用 Python 如何完成基本数学运算。

  • 整数和浮点数。

  • 求幂(自乘得到一个幂)。

  • 如何计算取余(余数)。

  • E 记法的有关内容。

测试题

1. Python 中乘法使用哪个符号?

2. Python 计算 8 / 3 的答案是什么?

3. 怎么得到 8 / 3 的余数?

4. 怎么得到 8 / 3 的小数结果?

5. Python 中计算 6 * 6 * 6 * 6 的另一种做法是什么?

6. 采用 E 记法,17 000 000 要写作什么?

7. 4.56e-5 如果按常规的写法是什么(不是 E 记法)?

动手试一试

1. 使用交互模式或者编写一个小程序解决下面的问题。

 (a) 3 个人在餐厅吃饭,想分摊饭费。总共花费 35.27 美元,他们还想留 15% 的小费。每个人该怎么付钱?

 (b) 计算一个 12.5m×16.7m 的矩形房间的面积和周长。

2. 写一个程序,把温度从华氏度转换为摄氏度。转换公式是 C = 5 / 9* (F-32)。(提示:当心整除问题!)

3. 你知道怎么计算坐车去某个地方需要花多长时间吗?相应的公式(用文字表述)是“旅行时间等于距离除以速度”。编写一个程序,计算以 80 km/h 的速度行驶 200 km 需要花多长时间,并显示答案。

目录