利用标准库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下Fabric的简单部署方法
Jul 14 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
python学生管理系统的实现
Apr 05 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
使用python实现时间序列白噪声检验方式
Jun 03 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
python 列表推导和生成器表达式的使用
Feb 01 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开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
php类的定义与继承用法实例
2015/07/07 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
php时间函数用法分析
2016/05/28 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
理解 javascript 中的函数表达式与函数声明
2017/07/07 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
html5时钟实现代码
2010/10/22 HTML / CSS
HTML5学习笔记之History API
2015/02/26 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
售后主管岗位职责
2013/12/08 职场文书
上班打牌检讨书
2014/02/07 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
党委班子剖析材料
2014/08/21 职场文书
党员演讲稿
2014/09/04 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
北大自主招生自荐信
2015/03/04 职场文书
应聘教师自荐信
2015/03/26 职场文书
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server