3.数字运算的奇淫巧技
1.对于数字的四舍五入,如果我们想要对浮点数进行四舍五入的话
可以使用内部的round() 函数
round(1.23, 1)
得到的结果是 1.2
round(-1.23, 1)
得到的结果是-1.2
Round函数的第二个参数 ndigits参数可以为负数,这样四舍五入的运算会作用在十位,百位,千位上面。
round(1627731, -1)
得到的结果是
1627730
比如
round(1627731, -2)
1627700
如果不是进行四舍五入,而只是简单的输出一些宽度的数的时候,只需要在格式化的时候指定精度就可以了
>>> x = 1.23456
>>> format(x, ‘0.2f’)
‘1.23’‘
更多的实例如下
>>> x = 1234.56789
>>> # Two decimal places of accuracy
>>> format(x, ‘0.2f’)
‘1234.57’
>>> # Right justified in 10 chars, one-digit accuracy
>>> format(x, ‘>10.1f’)
‘ 1234.6’
>>> # Left justified
>>> format(x, ‘<10.1f’)
‘1234.6 ‘
>>> # Centered
>>> format(x, ‘^10.1f’)
‘ 1234.6 ‘
>>> # Inclusion of thousands separator
>>> format(x, ‘,’)
‘1,234.56789’
>>> format(x, ‘0,.1f’)
‘1,234.6’
如果希望使用指数型的表示,则可以将f改为e 或者E,从而进行大小写的行为
>>> format(x, ‘e’)
‘1.234568e+03’
>>> format(x, ‘0.2E’)
‘1.23E+03′
整体的格式为'[<>^]?width[,]?(.digits)?’
其中的?代表着可选部分
当我们使用了format进行格式化输出的时候,值会根据round函数以相同的规则进行计算后返回
这样可以进行简单的截断输出,但是这样不适合真正的数据计算,真正的数据计算,还是得考虑使用decimal模块
2. 那么我们就说下如何使用decimal模块
这个模块往往是对数据进行精确的计算,并且不希望有任何的误差出现的时候使用的
使用的方式如下
>>> from decimal import Decimal
>>> a = Decimal(‘4.2’)
>>> b = Decimal(‘2.1’)
>>> a + b
>>> print(a + b)
6.3
>>> (a + b) == Decimal(‘6.3’)
初始化数据的时候,需要传入字符串
但是在使用的时候,和一般的数字没什么区别
Decimal的一个特性是支持控制计算的每一个方面,包含位数和四舍五入运算,我们可以如下的进行使用
>>> from decimal import localcontext
>>> with localcontext() as ctx:
ctx.prec = 3
print (a/b)
得到的输出的小数点后就是三位
类似的可以避免出现误差计算方式,还有很多,比如math.fsum可以提供更加精确的计算能力
同时decimal使用format的时候,也支持精准的输出
3. 进制转换
一般来说,不同进制的转换本质上就是数字和文本之间的转换
对于python来说,对于十进制转换其他进制,只需要分别使用 bin函数,oct函数 hex函数,我们来看下使用
>>> x = 1234
>>> bin(x)
‘0b10011010010’
>>> oct(x)
‘0o2322’
>>> hex(x)
‘0x4d2’
>>>
如果不希望输出 0b 0x这样的前缀,则可以使用format函数进行格式化输出
比如
>>> format(x, ‘b’)
‘10011010010’
>>> format(x, ‘o’)
‘2322’
>>> format(x, ‘x’)
‘4d2’
同样如果想要将不同进制的字符串转换为十进制整数的时候,直接使用int函数后跟进制即可
>>> int(‘4d2’, 16)
1234
>>> int(‘10011010010’, 2)
1234
需要注意的是,如果是八进制转换会十进制的话,需要保证前缀一定是0o
4.复数的数学运算
我们希望使用复数进行运算的话,我们使用函数
Complex(real,imag) 或者带有后缀j的浮点数来指定
比如
>>> a = complex(2, 4)
>>> b = 3 – 5j >>> a (2+4j) >>> b (3-5j) |
这样我们对应的实部,虚部以及共轭复数可以如下的获取
>>> a.real
2.0 >>> a.imag 4.0 >>> a.conjugate() (2-4j) |
同样也支持其他的函数运算,比如正弦,余弦,平方根,cmath模块
>>> cmath.sin(a)
(24.83130584894638-11.356612711218174j)
>>> cmath.cos(a)
(-11.36423470640106-24.814651485634187j)
>>> cmath.exp(a)
(-4.829809383269385-5.5920560936409816j)
5.Python中的特殊数字
在其中支持正无穷,负无穷 Nan这一类特殊的浮点数
对于这类特殊数字的创建,我们可以使用float来进行创建
>>> a = float(‘inf’)
>>> b = float(‘-inf’)
>>> c = float(‘nan’)
与之配合的函数有 math.isinf(),math.isnan()函数
这些特殊数字在进行数字计算的时候
>>> a = float(‘inf’)
>>> a + 45
inf
>>> a * 10
inf
>>> 10 / a
0.0
NaN值有一个特别之处就是在进行比较的时候总是返回False
>>> c = float(‘nan’)
>>> d = float(‘nan’)
>>> c == d
False
>>> c is d
False
6.Python中的分数计算
我们可以使用fractions模块来执行包含分数的数字计算,比如
>>> a = Fraction(5, 4)
>>> b = Fraction(7, 16)
并且可以执行相关的运算,以分数的方式
>>> print(a + b)
27/16
>>> print(a * b)
35/64
>>> print(c.limit_denominator(8))
4/7
同样一个float转fraction的方式可以为
>>> x = 3.75
>>> y = Fraction(*x.as_integer_ratio())
7.Python中的Numpy
我们可以使用Numpy库进行运算,更加适合进行数字运算,比如我们如果直接在一个数组上进行数学运算,可能会得到一个错误
>>> x = [1, 2, 3, 4]
X + 10 这样会得到一个错误
但是如果使用Numpy的话,我们可以进行如下的计算
>>> import numpy as np
>>> ax = np.array([1, 2, 3, 4])
>>> ax + 10
array([11, 12, 13, 14])
对于其的运算,会作用于每一个标量上,比如
>>> ay = np.array([5, 6, 7, 8])
>>> ax * ay
array([ 5, 12, 21, 32]
除此外,还存在着大量的通用函数,可以作为math中类似函数的替代,比如
>>> np.sqrt(ax)
array([ 1. , 1.41421356, 1.73205081, 2. ])
>>> np.cos(ax)
array([ 0.54030231, -0.41614684, -0.9899925 , -0.65364362])
Numpy底层使用了C的连续内存分配机制,更加适合后见一个连续的内存区域,比如购进一个二维网格数组
>>> grid = np.zeros(shape=(10000,10000), dtype=float)
>>> grid
array([[ 0., 0., 0., …, 0., 0., 0.],
[ 0., 0., 0., …, 0., 0., 0.],
[ 0., 0., 0., …, 0., 0., 0.],
…,
[ 0., 0., 0., …, 0., 0., 0.],
[ 0., 0., 0., …, 0., 0., 0.],
[ 0., 0., 0., …, 0., 0., 0.]])
同样,多维数组中的操作,还是会应用于每一个标量智商
而且内部存在着row和column的概念,比如
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> a
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> a[1]
array([5, 6, 7, 8])
获取一列
>>> a[:,1]
array([ 2, 6, 10])
>>> a[1:3, 1:3]
array([[ 6, 7],
[10, 11]])
以及进行where操作
>>> np.where(a < 10, a, 10)
array([[ 1, 2, 3, 4],
[ 5, 10, 10, 8],
[ 9, 10, 10, 10]])
别忘了,我们在一个开始进行了import,import numpy as np,这样在使用的时候直接使用np就行,方便了很多
同时numpy支持我们使用矩阵和线性代数的运算,比如我们创建一个矩阵
>>> m = np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
>>> m
matrix([[ 1, -2, 3],
[ 0, 4, 5],
[ 7, 8, -9]])
>>> m.T
matrix([[ 1, 0, 7],
[-2, 4, 8],
[ 3, 5, -9]])
以及numpy.linalg子包中包含更多的操作函数
>>> numpy.linalg.det(m)
-229.99999999999983
8.python中的随机数
Random模块具有大量的和随机相关的函数
比如我们希望从一个序列中获取一个随机下标的元素,可以使用random.choice()
>>> values = [1, 2, 3, 4, 5, 6]
>>> random.choice(values)
4
>>> random.choice(values)
6
从一个序列中随机取出一些元素作为新的子序列,则可以使用random.sample()
>>> random.sample(values, 3)
[4, 3, 1]
>>> random.sample(values, 3)
[5, 4, 1]
如果要一个随机整数,请使用random.randint()
>>> random.randint(0,10)
2
>>> random.randint(0,10)
5
>>> random.randint(0,10)
7
后面需要传入一个上下限
如果需要生成一个从0到1的浮点数,那么使用random.random()
>>> random.random()
0.9406677561675867
>>> random.random()
0.133129581343897
如果需要获取N位的随机数,那么可以使用random.getrandbits(200)
这里需要注意,上面所有的随机数的生成,都是使用了一个确定性算法生成的,如果有更多的种子需要,可以使用random.seed()进行初始化
除此之外,还包含着呢一些更为高级的函数,比如random.uniform() 计算均匀分布随机数,random.guess() 计算正态分布随机数