利用标准库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中的一些陷阱与技巧小结
Jul 10 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
python如何将多个PDF进行合并
Aug 13 Python
python获取引用对象的个数方式
Dec 20 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
python类共享变量操作
Sep 03 Python
Python实现七个基本算法的实例代码
Oct 08 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 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二维数组转成字符串示例
2014/02/17 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
用JAVASCRIPT如何给<textarea></textarea>赋值
2007/04/20 Javascript
Javascript !!的作用
2008/12/04 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
python学习笔记:字典的使用示例详解
2014/06/13 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
python去除文件中重复的行实例
2018/06/29 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
小学教师节活动方案
2014/01/31 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
超市理货员岗位职责
2014/07/04 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
python 远程执行命令的详细代码
2022/02/15 Python