利用标准库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中的文本处理
Apr 11 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python中字典映射类型的学习教程
Aug 20 Python
pycharm中成功运行图片的配置教程
Oct 28 Python
python读取目录下最新的文件夹方法
Dec 24 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
使用python实现kNN分类算法
Oct 16 Python
Python笔记之代理模式
Nov 20 Python
python 实现兔子生兔子示例
Nov 21 Python
python实现简单图书管理系统
Nov 22 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
Python如何合并多个字典或映射
Jul 24 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 编程请选择正确的文本编辑软件
2006/12/21 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php微信支付接口开发程序
2016/08/02 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
Python and、or以及and-or语法总结
2015/04/14 Python
python中enumerate函数用法实例分析
2015/05/20 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
2014新年寄语
2014/01/20 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js