前言
你可能不需要经常处理分数,但当你需要时,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类事实上通过重载很多特殊函数,使得其实例可以直接用于多种算术运算。
新闻热点
疑难解答