利用标准库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开发WebService系列教程之REST,web.py,eurasia,Django
Jun 30 Python
Python中内建函数的简单用法说明
May 05 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
Python实现扣除个人税后的工资计算器示例
Mar 26 Python
强悍的Python读取大文件的解决方案
Feb 16 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
python pandas模块基础学习详解
Jul 03 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
Python气泡提示与标签的实现
Apr 01 Python
pandas数据拼接的实现示例
Apr 16 Python
编写python代码实现简单抽奖器
Oct 20 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 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 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
Python 基础教程之包和类的用法
2017/02/23 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
水产养殖学应届生求职信
2013/09/29 职场文书
大学生求职简历的自我评价
2013/10/21 职场文书
学校卫生检查制度
2014/02/03 职场文书
服装采购员岗位职责
2014/03/15 职场文书
岗位竞聘演讲稿范文
2014/04/24 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
年度考核个人总结
2015/03/06 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
汽车销售员工作总结
2015/08/12 职场文书
vue+echarts实现多条折线图
2022/03/21 Vue.js