利用标准库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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
Python通过解析网页实现看报程序的方法
Aug 04 Python
跟老齐学Python之玩转字符串(2)更新篇
Sep 28 Python
使用Python生成url短链接的方法
May 04 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 Python
python 同时运行多个程序的实例
Jan 07 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
如何使用Python自动控制windows桌面
Jul 11 Python
softmax及python实现过程解析
Sep 30 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
python和node.js生成当前时间戳的示例
Sep 29 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
深入理解PHP之require/include顺序 推荐
2011/01/02 PHP
php数组使用规则分析
2015/02/27 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
详解Vue2的diff算法
2021/01/06 Vue.js
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
高级护理实习生自荐信
2013/09/28 职场文书
高一化学教学反思
2014/02/05 职场文书
教师自我鉴定范文
2014/03/20 职场文书
闭幕式主持词
2014/04/02 职场文书
会议主持词开场白
2015/05/28 职场文书
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技