利用标准库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中使用Boolean操作符做真值测试实例
Jan 30 Python
python实现超简单端口转发的方法
Mar 13 Python
Python实现SVN的目录周期性备份实例
Jul 17 Python
python 编程之twisted详解及简单实例
Jan 28 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
Python单链表原理与实现方法详解
Feb 22 Python
对python中各个response的使用说明
Mar 28 Python
python3安装OCR识别库tesserocr过程图解
Apr 02 Python
Python类class参数self原理解析
Nov 19 Python
python 爬取吉首大学网站成绩单
Jun 02 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常用函数的用法详解
2013/05/10 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
js获取页面description的方法
2015/05/21 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python中类的初始化特殊方法
2017/12/01 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python爬虫之自制英汉字典
2019/06/24 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
python实现超市商品销售管理系统
2019/11/22 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
史泰博(Staples)中国官方网站:办公用品一站式采购
2016/09/05 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
护理专业毕业生自荐信范文
2014/01/05 职场文书
秋季运动会广播稿
2014/02/22 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
奔腾年代观后感
2015/06/09 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
Python编写nmap扫描工具
2021/07/21 Python
美元符号 $
2022/02/17 杂记