利用标准库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中解析json格式文件的方法示例
May 03 Python
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 Python
Python实现快速计算词频功能示例
Jun 25 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
python正则-re的用法详解
Jul 28 Python
基于django传递数据到后端的例子
Aug 16 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
Sep 06 Python
python 实现任务管理清单案例
Apr 25 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
python os.listdir()乱码解决方案
Jan 31 Python
10张动图学会python循环与递归问题
Feb 06 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
如何开发一个虚拟域名系统
2006/10/09 PHP
处理php自动反斜杠的函数代码
2010/01/05 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
初中生学习的自我评价
2013/11/14 职场文书
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书
python的变量和简单数字类型详解
2021/09/15 Python