洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

时间:2022-09-01 20:08:21

decimal

1.作用:

用于浮点数计算。相比内置的二进制浮点数实现 float这个类型有助于 金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度,或者用户希望计算结果与手算相符的场合。Decimal 重现了手工的数学运算,这就确保了二进制浮点数无法精确保有的数据精度。 高精度使 Decimal 可以执行二进制浮点数无法进行的模运算和等值测试

2.函数:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

其实decimal模块最常用的函数就是Decimal()和getcontext(),其他基本很少用,以后用到再细说

Decimal():

简单的查看特性:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

运算:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

这样太长对不对,所以需要调整精度,则使用函数getcontext():

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

里面的prec子方法则调整精度的,所以可以先设置好精度再计算:

注意getcontext()函数必须加括号实例化才行【什么是实例在类的章节会提到】

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

也可以对字符串浮点型进行操作:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

说到精度,那不得不提到round()这个BIF

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

round()如果只有一个数作为参数,类似四舍五入。当出现.5的时候,round()取靠近的偶数,这就是为什么round(2.5) = 2。当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的这样情况,如果要取舍的位数前的小数是奇数,则直接舍弃,如果偶数则向上取舍。所以它不是简单意义上的四舍五入,而是ROUND_HALF_EVEN的策略

格式化也可以得到想要的精度:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

python默认的是17位小数的精度,但是如果想得到更高精度的使用格式化则不行:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

可以显示这么多,但是发现没,10除以3会等于一个3.00……,大家都知道等于3.333……对吧?所以不准确,所以在高精度时使用格式化不行

再看看前面提到的decimal模块的getcontext,prec就是默认的精度,显示为28位,也可以设置为50位甚至更高,都可以。这样在分析复杂的浮点数的时候,可以有更高的自己可以控制的精度。

math模块的ceil()和floor()也有点这么个意思,自行体会

fractions

1.作用:

表达分数的模块

2.函数:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

这个模块的方法很少,并且其实用得也挺少,基本就是拿来表示分数的Fraction而已

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

也可以对字符串浮点型进行操作:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

operator

1.作用:

operator模块是python中内置的操作符函数接口,它定义了一些算术和比较内置操作的函数。operator模块是用c实现的,所以执行速度比python代码快

2.函数:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

其实operator模块的方法基本和常用逻辑操作符和内置运算函数一样,但是你记住比直接使用操作符来运算速度更快就行了:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

但是itemgetter函数要特别提一下:

operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号,例:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

可见,此时的itemgetter函数的参数为索引

那么这个函数最常用的地方在哪?

结合sorted函数进行排序:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

因为key可以接受一个函数(或者匿名函数),所以其实发现功效是一样的【匿名函数在自定义函数那一章详解】

collections

1.作用:

提供许多有用的集合类

2.函数:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

老规矩,我只解析常用方法

namedtuple

因为tuple可以表示不可变集合,例如,一个点的二维坐标: p = (3, 7)。也可以用namedtuple来表示:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

很强势对不对?

看看方法:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

有没有发现,它其实就是用来表示这些的?

deque:使用列表存储数据时,按索引访问元素很快,但是插入和删除元素就很慢,因为列表是线性存储,数据量大的时候,插入和删除效率很低。deque为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

其实和列表的一般方法没什么区别,就是速度快,deque除了实现list的append和pop,还有appendleft和popleft,这样就可以非常高效地往头部添加或删除元素。

defaultdict:使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用它:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

注意默认值是调用函数返回的,而函数在创建defaultdict时传入,除了在Key不存在时返回默认值,(其实在之前也讲解了当访问参数不存在时,返回一个值的,自己去翻前面的文章,绝对讲过),defaultdict的其他行为跟dict是完全一样的

orderedDict:使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用orderedDict:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

注意,orderedDict的Key会按照插入的顺序排列

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

Counter:是一个简单的计数器:

洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍

从上面看Counter其实也是dict的一个子类