利用标准库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 用户登录验证的小例子
Mar 06 Python
Python实现ssh批量登录并执行命令
Oct 25 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
Python中函数参数匹配模型详解
Jun 09 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
python自定义时钟类、定时任务类
Feb 22 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
利用Python将多张图片合成视频的实现
Nov 23 Python
python 批量将中文名转换为拼音
Feb 07 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中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
js验证上传图片的方法
2015/05/12 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
Seajs源码详解分析
2019/04/02 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
Python使用MD5加密字符串示例
2014/08/22 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
python画双y轴图像的示例代码
2019/07/07 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Python如何绘制日历图和热力图
2020/08/07 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
Java程序员面试题
2016/09/27 面试题
2014道德模范事迹材料
2014/02/16 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
共产党员承诺书
2014/03/25 职场文书
英语教师个人工作总结
2015/02/09 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
养成教育工作总结
2015/08/13 职场文书