利用标准库fractions模块让Python支持分数类型的方法详解


Posted in Python onAugust 11, 2017

前言

你可能不需要经常处理分数,但当你需要时,Python的Fraction类会给你很大的帮助。本文将给大家详细介绍关于利用标准库fractions模块让Python支持分数类型的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

fractions模块

fractions模块提供了分数类型的支持。

Fraction类

该类是fractions模块的核心,它继承了numbers.Rational类并且实现了该类所有的方法。

构造函数并不复杂:

class fractions.Fraction(numerator=0, denominator=1) 
class fractions.Fraction(int|float|str|Decimal|Fraction)

可以同时提供分子(numerator)和分母(denominator)给构造函数用于实例化Fraction类,但两者必须同时是int类型或者numbers.Rational类型,否则会抛出类型错误。当分母为0,初始化的时候会导致抛出异常ZeroDivisionError。

而如果只提供一个参数,则可以用上述五种类型进行初始化。当使用字符串进行初始化时,fractions模块使用内置的正则表达式进行匹配。而使用浮点数或者Decimal进行初始化时,fractions模块会在内部调用as_integer_ratio()

下面的代码示例来自官方文档,展示了各种实例化Fraction的方式:

>>> from fractions import Fraction
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
>>> Fraction('3/7')
Fraction(3, 7)
>>> Fraction(' -3/7 ')
Fraction(-3, 7)
>>> Fraction('1.414213 \t\n')
Fraction(1414213, 1000000)
>>> Fraction('-.125')
Fraction(-1, 8)
>>> Fraction('7e-6')
Fraction(7, 1000000)
>>> Fraction(2.25)
Fraction(9, 4)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> from decimal import Decimal
>>> Fraction(Decimal('1.1'))
Fraction(11, 10)

限制分母

fractions.Fraction.limit_denominator(max_denominator=1000000)

有时候将浮点数或者Decimal作为Fraction实例的初始化数据可能会遇到舍入误差的问题,如上面调用Fraction(1.1)时不返回Fraction(11, 10)的例子。这时Fraction类提供了一个实例方法limit_denominator()用于减小这种误差。这个方法本来是为了通过限制分母来得到一个近似值,但是在出现舍入误差的时候反倒使得结果更加精确了,如下面的例子:

>>> from fractions import Fraction
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> Fraction(1.1).limit_denominator()
Fraction(11, 10)

将Fraction用于算术运算、关系运算和其他多种操作

上面提到,Fraction类继承了numbers.Rational类并且实现了该类所有的方法。所以Fraction类事实上通过重载很多特殊函数,使得其实例可以直接用于多种算术运算。

不仅支持算术运算,Fraction类同时也支持关系运算、pickle模块、copy模块和哈希值的计算。

>>> from fractions import Fraction
>>> x = Fraction(1, 2)
>>> y = Fraction(1, 3)
>>> x + y
Fraction(5, 6)
>>> x - y
Fraction(1, 6)
>>> x * y
Fraction(1, 6)
>>> x / y
Fraction(3, 2)
>>> x ** 2
Fraction(1, 4)
>>> -x
Fraction(-1, 2)
>>> abs(x)
Fraction(1, 2)
>>> round(x)
0
>>> import math
>>> math.floor(x)
0
>>> math.ceil(x)
1
>>> x == y
False
>>> x > y
True

其他函数

fractions.Fraction.from_float(flt) 
fractions.Fraction.from_decimal(dec)

在Python3.2之前,Fraction类不支持通过将浮点数和Decimal传入构造方法来获得实例。而是提供了上面两个类方法,通过调用类方法的方式来产生实例,目前版本(Python 3.6.1)这两个类方法仍然存在。

fractions.gcd(a, b)

用于计算最大公约数。这个函数在Python3.5之后就废弃了,官方建议使用math.gcd()

总结

没啥要总结的…只能说Python太方便了…对了,这篇博客其实也是个挖了挺久的坑了,之前里面有一部分源码没看懂所以一直没发上来。哈哈,后面这个标准库学习的系列还是会一直更下去的!

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

参考资料:

https://docs.python.org/3.6/library/fractions.html

Python 相关文章推荐
Python 类与元类的深度挖掘 I【经验】
May 06 Python
Python heapq使用详解及实例代码
Jan 25 Python
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
Python3多线程操作简单示例
May 22 Python
Python实现的根据IP地址计算子网掩码位数功能示例
May 23 Python
python re模块的高级用法详解
Jun 06 Python
Python键盘输入转换为列表的实例
Jun 23 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
Python编写带选项的命令行程序方法
Aug 13 Python
Django 框架模型操作入门教程
Nov 05 Python
详解Python模块化编程与装饰器
Jan 16 Python
Python对字符串实现去重操作的方法示例
Aug 11 #Python
python中模块查找的原理与方法详解
Aug 11 #Python
python利用lxml读写xml格式的文件
Aug 10 #Python
Python编程实现及时获取新邮件的方法示例
Aug 10 #Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 #Python
Python基础之getpass模块详细介绍
Aug 10 #Python
Python中字典(dict)合并的四种方法总结
Aug 10 #Python
You might like
PHP setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
JavaScript使用cookie
2007/02/02 Javascript
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
实现音乐播放器的代码(html5+css3+jquery)
2015/08/04 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
深入解析Python中的线程同步方法
2016/06/14 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
Django 静态文件配置过程详解
2019/07/23 Python
python mysql断开重连的实现方法
2019/07/26 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
京剧自荐信
2014/01/26 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
清洁员岗位职责
2015/02/15 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书