利用标准库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中使用PIL模块处理图像的教程
Apr 29 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
Django框架视图介绍与使用详解
Jul 18 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 Python
python调用API接口实现登陆短信验证
May 10 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 Python
如何使用flask将模型部署为服务
May 13 Python
Python实现信息管理系统
Jun 05 Python
pandas中pd.groupby()的用法详解
Jun 16 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 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中取得image按钮传递的name值
2006/10/09 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
处理单名多值表单的详解
2013/06/08 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
Python中os和shutil模块实用方法集锦
2014/05/13 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
Python reduce函数作用及实例解析
2020/05/08 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
汽车队司机先进事迹材料
2014/02/01 职场文书
社区安全检查制度
2014/02/03 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
海飞丝广告词
2014/03/20 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
2015年党性分析材料
2014/12/19 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
寒假生活随笔
2015/08/15 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
《日月潭》教学反思
2016/02/20 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS