★本文为即将出版的图书草稿,先睹为快。 ”
所谓算术运算,是指初等数学中常见的计算,如加、减、乘、除、乘方等。在数学上,每种计算都使用规定的符号实现,形式上简洁明了,Python 语言也继承了此光荣传统。表3-2-1中列出了 Python 实现算术运算所使用的运算符。
表3-2-1 算术运算符
运算符 | 描述 | 示例 |
---|---|---|
+ | 两个对象相加 | 1+2=3 |
- | 得到负数或是一个数减去另一个数 | 2-3=-1 |
* | 两个数相乘或是返回一个被重复若干次的字符串 | 2*3=6 |
/ | 两个数相除 | 5/2=2.5 |
% | 两个数相除后所得的余数 | 5%2=1 |
// | 向下取整,返回两个数相除的整数 | 5//2=2 |
** | 计算一个数的幂运算 | 5**2=25 |
1. 加法
+
能实现两个对象相加——对这句话的理解,会随着学习内容增多而深化,此处暂且将“对象”理解为整数和浮点数,如下操作:
>>> 2 + 3
5
>>> 2.3 + 3.1
5.4
>>> a = 4
>>> b = 6.2
>>> a + b
10.2
到目前为止,加法运算应该没有超出所学过的数学知识范畴。
2. 减法
如果没有特别定义,-
实现的是两个数字相减——这里所说的数字,目前暂且是浮点数、整数,如下操作:
>>> a = 4
>>> b = 6.2
>>> a - b
-2.2
运算符 -
的另外一个作用就是对某个数字取相反数:
>>> -4
-4
>>> -(-4)
4
这些都符合数学中的运算法则。
3. 乘法
在数学中,实现乘法的运算符是
,但在编程语言中,使用的是键盘上的 *
。如果相乘的是两个数字——目前讨论的是浮点数、整数,那么与数学中的运算结果一致。
>>> 3 * 2
6
>>> 3.6 * 2.3
8.28
在表3-2-1中,对运算符 *
的描述中还有“返回一个被重复若干次的字符串”,在第4章4.2节会给予解释。
4. 除法
数学中表示两个数相除,有多种形式,比如
,在 Python 语言中只能选用一种符号,对于 Python 3.x ,使用 /
符号作为除法运算符,计算结果与数学中的 ÷ 计算结果相同。
>>> 5 / 2
2.5
>>> 4.2 / 2
2.1
Python 中的除法也规定分母不能是 0
,否则就会报错:
>>> 1 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
表3-2-1中与除法有关的符号除了 /
之外,还有 %
和 //
。
先来理解 //
运算符“向下取整”的含义。如图3-2-1所示,对于数轴,不论它如何放置,均以其箭头所指方向——数值变大的方向——为“上”,以
轴上的点 B 为例,假设它所表示的值是
,其中
,比如是
。所谓向下取整,即取 B 点所在位置“下边”紧邻的整数,据此并结合图示可知,应该是
,可以记作
,表示对
向下取整的结果为
。再来观察 D 点,其“下”的整数是
,若
,则
。
图3-2-1 “向下取整”的含义
根据上述“向下取整”的解释,请读者在交互模式中执行下述操作,并结合返回值,理解 //
的含义。
>>> 5 / 2
2.5
>>> 5 // 2
2
5 / 2
的值是 2.5
,结合图3-2-1所示的“向下取整”含义,
“下边”的整数是
,故 5 // 2
的结果是 2
。
再来看负数情况:
>>> -5 / 2
-2.5
>>> -5 // 2
-3
显然
“下边”的整数是
,所以 -5 // 2
的结果为 -3
。
用 //
按照“向下取整”原则得到的结果,也就是两个数字相除所得的商。在理解了 //
计算方法的基础上,再理解 %
的含义——两个数相除后所得的余数。
设
两个数相除,表示为:
,其中
为商,
为余数,且
。根据数学知识可知:
。商
已经能够通过 //
得到,所以余数
。
根据上述原理,下面通过操作,理解 %
运算符的计算结果。
>>> 5 % 2
1
根据前述计算余数的原理,在
的计算中,
,那么余数
,即上述返回值。再如:
>>> 7 // -9
-1
>>> 7 % -9
-2
计算
的余数,首先得到
,根据前述计算余数的公式,
,理论分析与 Python 计算结果相同。
对此不再一一列举各种情况,读者不放自己尝试。
5. 幂
在数学中,若干个数相乘可以写成该数字的几次幂,如
即为
。在 Python 中用 **
运算符——两个乘法运算符,中间不能有空格——表示幂运算。
>>> 2 ** 3
8
>>> 2 ** -3
0.125
读者运用所学的数学知识,理解上述运算结果不会遇到困难,此处不赘述。
6. 科学计数法
虽然表3-2-1中没有列出科学计数法的符号——其实它不是一个运算符,但由于在科学计算中会经常用到,所以此处单独作为一项列出。在数学上,一个实数可以写成实数
与一个
的积:
,其中:
必须是一个整数;
是实数,通常
,有时
也会不在此范围,届时要调整
的大小。
这种表示数字的方法称为科学计数法(Scientific notation),由阿基米德提出。
在 Python 中,为科学计数法设计了专有表示方式:
>>> 1e10
10000000000.0
>>> 1E10
10000000000.0
上面两种表示方法,均为
——其中符号 e
不区分大小写。特别要注意,这是 Python 中比较特殊的现象,在其他方面通常要求区分大小写。
E
后面如果是负整数,例如:
>>> 2.3E-4
0.00023
2.3E-4
即表示
。
任何用科学记数法表示的数,都是浮点数类型。
>>> a = 2.3E-4
>>> type(a)
<class 'float'>
>>> b = 1E1
>>> b
10.0
>>> type(b)
<class 'float'>
如果表示
,符号E
前面是不是也可以省略数字
呢?
>>> E8
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'E8' is not defined
不行。为什么?请参考第2章2.3节关于变量的命名规则。
在一个数学算式中,如果有多个表3-2-1中的运算符,在数学称为“混合运算”。用 Python 能实现混合运算,且运算优先级与数学上的规定保持一致。
>>> 3 ** 2 + 4 / 2 - 3 + 2
10.0
在数学运算中,还会用圆括号
明确优先运算的部分,它也被引入到了 Python 语言中,而且在 Python 中还特别提倡使用圆括号,因为表达式的可读性强。
>>> 3 ** 2 + 4 / 2 - (3 + 2)
6.0
需要提醒读者注意,3.1.1节【自学建议】演示了 Python 中的“大整数”不溢出现象,但是对于浮点数运算而言,若超出了中央处理器所能允许浮点数范围,会出现算术溢出。
>>> 1.9 ** 10000
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
所以,在进行浮点数运算的时候要注意了。
但是,如果是一个用科学计数法表示的浮点数超出了系统的浮点数范围,Python 会给出另外一种处理,例如:
>>> n = 2E400
>>> n
inf
>>> type(n)
<class 'float'>
>>> 10 ** 400
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> 10.0 ** 400
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
此处的 2E400
即
,这个数字已经大于了宇宙中原子的总数(按照目前理论估算,在可观测宇宙中的原子总数大约是
),但是 Python 没有针对 2E400
出现算术溢出,而是令其值为 inf
,它表示“无穷大”,并且是一个浮点数——这是 Python 的规定,请勿用数学上的规定来评判。
顺便比较 10 ** 400
与 10.0 ** 400
的区别:前者返回的是整数——不会溢出,后者返回结果应该是浮点数,溢出了。
为了巩固所学,必须做个练习,当然,此练习还“另有深意”。假设两个人,一个人的质量是
,另外一个人的质量是
,当两人相距
的时候,他们之间的引力大小是多少?(
)
显然,直接使用万有引力定理的公式
即可计算:
>>> G = 6.67E-11
>>> F = G * 70 * 50 / (0.5 ** 2)
>>> F
9.338000000000001e-07
计算表明,这两个人在
距离时之间的引力大小是
,仅相当于大约质量为
毫克的物体的重力。牛顿或许深谙此理,故终身未娶——引力仅分毫,余者又皆身外物,何必牵肠挂肚,格物穷理不孤独。
图3-2-2 艾萨克·牛顿爵士
★自学建议 编程语言与数学之间有着密切的关系,本节内容仅仅是皮毛而已。如果读者有意在编程这个领域深入发展,特别建议将数学列为长期学习的内容。不是如同应付考试那样学习,而是如同刷手机那样,经常浏览一些数学内容。常见面,不陌生,用到就能想到。 ”
更多内容,点击【阅读原文】,查看个人网站:www.itdiffer.com