利用标准库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 31 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Python批量修改图片分辨率的实例代码
Jul 04 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
如何使用python切换hosts文件
Apr 29 Python
Python实现在线批量美颜功能过程解析
Jun 10 Python
零基础学python应该从哪里入手
Aug 11 Python
matplotlib部件之套索Lasso的使用
Feb 24 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
May 28 Python
python中的plt.cm.Paired用法说明
May 31 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不用正则采集速度探究总结
2008/03/24 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php广告加载类用法实例
2014/09/23 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
Bootstrap Table从零开始
2017/06/30 Javascript
vue webuploader 文件上传组件开发
2017/09/23 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
js判断密码强度的方法
2020/03/18 Javascript
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
Python单元测试框架unittest简明使用实例
2015/04/13 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Django中Forms的使用代码解析
2018/02/10 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
python 实现aes256加密
2020/11/27 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
用HTML5的canvas实现一个炫酷时钟效果
2016/05/20 HTML / CSS
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
1亿有多大教学反思
2014/05/01 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
七一讲话心得体会
2014/09/05 职场文书
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript