利用标准库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 Requests 基础入门
Apr 07 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
python实现linux下抓包并存库功能
Jul 18 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
python requests包的request()函数中的参数-params和data的区别介绍
May 05 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 Python
python实现图片转字符画的完整代码
Feb 21 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 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php页面缓存方法小结
2015/01/10 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
nginx 设置多个站跨域
2021/03/09 Servers
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
定制FileField中的上传文件名称实例
2017/08/23 Python
Python代码太长换行的实现
2019/07/05 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
Python持续监听文件变化代码实例
2020/07/22 Python
python中return不返回值的问题解析
2020/07/22 Python
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
机关门卫制度
2014/02/01 职场文书
小学生优秀评语大全
2014/04/22 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
综合素质自我评价评语
2015/03/06 职场文书
教师学习心得体会范文
2016/01/21 职场文书
德劲DE1102数字调谐收音机机评
2022/04/07 无线电