前言
你可能不需要经常处理分数,但当你需要时,Python的Fraction类会给你很大的帮助。本文将给大家详细介绍关于利用标准库fractions模块让Python支持分数类型的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:
fractions模块
fractions模块提供了分数类型的支持。
Fraction类
该类是fractions模块的核心,它继承了numbers.Rational
类并且实现了该类所有的方法。
构造函数并不复杂:
1
2
|
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的方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
>>> 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()
用于减小这种误差。这个方法本来是为了通过限制分母来得到一个近似值,但是在出现舍入误差的时候反倒使得结果更加精确了,如下面的例子:
1
2
3
4
5
|
>>> 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模块和哈希值的计算。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
>>> 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
|
其他函数
1
2
|
fractions.Fraction.from_float(flt)
fractions.Fraction.from_decimal(dec)
|
在Python3.2之前,Fraction类不支持通过将浮点数和Decimal传入构造方法来获得实例。而是提供了上面两个类方法,通过调用类方法的方式来产生实例,目前版本(Python 3.6.1)这两个类方法仍然存在。
1
|
fractions.gcd(a, b)
|
用于计算最大公约数。这个函数在Python3.5之后就废弃了,官方建议使用math.gcd()
。
总结
没啥要总结的…只能说Python太方便了…对了,这篇博客其实也是个挖了挺久的坑了,之前里面有一部分源码没看懂所以一直没发上来。哈哈,后面这个标准库学习的系列还是会一直更下去的!
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
参考资料:
https://docs.python.org/3.6/library/fractions.html
原文链接:http://blog.csdn.net/jy692405180/article/details/73432526