利用标准库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中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
跟老齐学Python之有容乃大的list(1)
Sep 14 Python
连接Python程序与MySQL的教程
Apr 29 Python
Python中用于计算对数的log()方法
May 15 Python
解决seaborn在pycharm中绘图不出图的问题
May 24 Python
如何更优雅地写python代码
Jul 02 Python
Python之修改图片像素值的方法
Jul 03 Python
Django上线部署之IIS的配置方法
Aug 22 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
Python是什么 Python的用处
May 26 Python
用python写PDF转换器的实现
Oct 29 Python
Python中的xlrd模块使用整理
Jun 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 array_walk() 数组函数
2011/07/12 PHP
PHP图片上传代码
2013/11/04 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
jQuery 操作option的实现代码
2011/03/03 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
小程序实现tab标签页
2020/11/16 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
Python中的yield浅析
2014/06/16 Python
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
Python登录系统界面实现详解
2019/06/25 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
python 日期排序的实例代码
2019/07/11 Python
python实现数字炸弹游戏
2020/07/17 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
教师实习的自我鉴定
2013/10/26 职场文书
总经理助理岗位职责
2013/11/08 职场文书
太空授课观后感
2015/06/17 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js