Python入门笔记(三) 数字类型和数学运算

第三篇学习笔记,内容和Python的数字类型相关。

类型

python3中支持intfloatcomplex三种,其中int支持任意长度的运算,float实现的是小数的运算,complex支持了复数的运算。

整数

整数没有长度的限制,同时可以使用十六进制,八进制或者二进制的整数,对应的前缀分别是0x0o0b
例如:

1
2
3
4
5
6
7
8
>>> 0b1010110
86
>>> 0xFFFF
65535
>>> 0xffff
65535
>>> 0o76543
32099

浮点数

浮点数可以用小数来表示,也可以用2.5e2之类的科学计数法来表示。

复数

复数的表示和数学上稍微有一些不同,在python中复数的虚部使用的是字母j而不是i。同时复数的实部和虚部都是浮点数类型。

表示时可以用a+bj的形式也可以用complex(a, b)

表示复数的时候虚部和j不能分开,否则报错。如果虚部为$1$,仍然不能省略虚部,否则会报错。

类型转换

只需要将类型名称作为函数名就可以实现数据类型之间的转换。如:

整数的转换

使用int()函数。该函数的使用方法有两种:

  1. 对数字类型使用,则括号内只能接受整数或者浮点数,其中浮点数的转换规则是向原点靠近。如int(3.5) = 3, int(-3.1) = -3。括号内数字缺省时返回$0$。
  2. 对字符串使用,则括号内第一个参数是字符串,第二个参数是指定你要转换的字符串的进制。如int('23', 16) = 35。字符串必须要是符合该进制的,否则会报错。转换的结果是字符串在该进制下对应的十进制整数

浮点数的转换

使用float()函数,括号内可以接受数或者字符串,数不能为复数

字符串也必须是可以正确转为浮点数的字符串,比如有多个小数点的就不能正常转换,会报错。字符串内最多包含一个+或者-,否则报错。符号和数字之间不能有空格,否则报错。

有一些特殊的字符串可以转换为一些特殊的浮点类型,如'infinity''inf'(不区分大小写),转换后就是inf。在前面加上一个减号可以变成负无穷。还有'nan'也会被转换成nan

复数的转换

使用complex(x[, y])可以生成一个复数。其中实部为x,而虚部为y(可缺省,此时虚部为0)。前一个参数可以为字符串,此时括号内只能有这一个参数,并且字符串中的复数必须是紧凑的,即数和符号间不能有空格,如1+2j,而不能是1 + 2j

运算

具体运算

python中数的运算大体和其他编程语言相似,其中加,减,乘都没有什么区别,对于除法,python中/除法得到的总是一个浮点数,而要丢弃余数则需要用////除法得到的也不总是整数,这与被除数和除数的数据类型有关。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 15 // 4
3
>>> 15.0 // 4
3.0
>>> 15 // 4.0
3.0
>>> 15.0 // 4.0
3.0
>>> 15.2 // 3.4
4.0
>>> -15.2 // 3.4
-5.0
>>> 15.0 // (-4.0)
-4.0

可见//运算不仅丢弃了余数,取商的方向也是严格按照小于原来商的方向取的。

python中的乘方运算符时**,如:

1
2
3
4
5
6
7
8
>>> 5 ** 2
25
>>> 5.0 ** 8
390625.0
>>> 9 ** 0.5
3.0
>>> 9 ** -1
0.1111111111111111

不同的数混合处理时,会一并转换为浮点数

使用%可以求得余数。如:

1
2
3
4
5
6
7
8
>>> 5 % 3
2
>>> 5.0 % 1.6
0.19999999999999973
>>> 5.0 % (-1.6)
-1.4000000000000004
>>> -5.0 % 1.6
1.4000000000000004

可以看出,//%对于整除的理解是相同的。

赋值运算符除了最基本的=之外,其他和c++类似,如乘方a = a ** b可以简写为a **= b,加法a = a + b可以简写为a += b。需要注意的是,python中没有++--之类的自增自减操作。只能通过+= 1-= 1实现类似的自增自减操作。

运算优先级

python中运算的优先级和正常的数学运算差别不大。都是乘方最先,乘除(含取余)其次,加减最后。事实上,python中有一点稍显不同,那就是当+-是一元运算符时,两者的优先级位于乘方和乘除之间。

和数字操作有关的函数

绝对值

和绝对值相关的有abs(x)fabs(x)两个函数。

abs(x)是内置函数,而fabs(x)是在math模块中定义的,两者的区别还在于fabs(x)适用于整数和浮点数,而abs(x)还适用于复数。复数的abs就是复数的模。

取整

和取整相关的有ceil(x)floor(x)两个函数。

ceil(x)是向上取整,floor(x)是向下取整。两者返回的都是整数

两者都定义在math模块中。

指数和对数

和指数与对数相关的函数有exp(x)log(x)log10(x)

exp(x)返回$e^x$,log(x)返回$\ln x$,log10(x)返回$\lg x$。三者返回的都是浮点数。

三者都定义在math模块中。

求幂

可以使用pow(x, y[, z])函数求$x^y \mod z$(如果省略$z$则只计算$x^y$,此时$x, y$可以为浮点数;而若要使用$z$则$x, y, z$必须均为整数)。

该函数为内建函数,可以不导入模块,直接调用。函数返回值类型与结果有关,结果是整数则返回值为整数,否则为浮点数。

实际上在math模块中也存在一个pow(x, y)函数,但该函数只接受2个参数(均可为浮点数),并且只返回浮点数。

求算术平方根

使用math模块中的sqrt(x)求$x$的算术平方根。$x$需要是非负实数。

该函数作用不大。

分离整数和小数部分

使用math模块中的modf(x)函数以二元组形式得到$x$的整数部分与小数部分,两部分的数值符号与$x$相同,整数部分以浮点型表示。如:

1
2
>>> math.modf(123.45)
(0.45000000000000284, 123.0)

四舍五入

使用math模块中的round(x[, n])函数对浮点数进行四舍五入,其中$n$是四舍五入到哪一位,默认为0(个位)。返回值是浮点数。

应该说,该函数的效果并不理想,一是因为它在python2.x版本和python3.x版本中有着不同的实现,导致两个版本对于同一个数的处理结果可能不同;二是该函数因为受计算机浮点数表示精度的影响,可能会产生误差,如round(2.355, 2)会得到2.35的神奇结果。所以如果要追求精确性,就最好别用它。

三角函数

math模块中定义了sin(x)cos(x)tan(x)asin(x)acos(x)atan(x)等三角函数。

此外,还定义了degrees(x)radians(x)这两个函数,分别用于弧度转角度和角度转弧度,如:

1
2
3
4
>>> math.degrees(math.pi/2)
90.0
>>> math.radians(90.0)
1.5707963267948966

与输出数有关的函数

bin(x)oct(x)hex(x)分别可以输出int类型数的二进制,八进制,十六进制的表示。如:

1
2
3
4
5
6
>>> bin(123)
'0b1111011'
>>> oct(123)
'0o173'
>>> hex(123)
'0x7b'