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() 计算正态分布随机数

发表评论

邮箱地址不会被公开。 必填项已用*标注