1.3 fractions模块

Posted avention

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.3 fractions模块相关的知识,希望对你有一定的参考价值。

 数学世界中,浮点数还可以用分数形式展示,不可约简的分数形式往往更简洁直观。

 问题来了,Python中如何输出不可约简的分数形式呢?
 答案:用Fraction类来实现。这个类属于标准库的fractions模块。按照国际惯例,用之前需要先导入模块:from fractions import Fraction
 
 下面重点介绍fractions的核心:Fraction类。
 
  1,该类的构造方法:class fractions.Fraction(numerator = 0,denominator = 1)
    Fraction在实例化的时候,需要的参数是2个,numerator = 0(分子)、denominator = 1(分母),
      这两个参数都指定了默认参数且这两个参数必须同时是int类型或者numbers.Rational类型,否则会抛出类型错误;
      如果在实例化时输入的分母为0,会抛出异常ZeropisionError;
      如果在实例化时只输入一个参数值的时候,这个参数值会赋给numerator参数作为分子,分母就是默认值1。
 
  2,  Farction在实例化时,能输入的参数类型有如下五种:int、float、str、Decimal、Fraction
      如果在实例化时只提供一个参数,则可以用上述五种类型进行初始化;
      如果使用字符串进行初始化时,fractions模块使用内置的正则表达式进行匹配;
      如果使用浮点数或者Decimal进行初始化时,fractions模块会在内部调用as_integer_ratio()函数进行处理

国际惯例的时刻到了,介绍完一个知识点,来点练习加强一下学习效果

   >>> from fractions import Fraction

  (1)中规中矩地用两个参数来实例化Fraction类

    >>> Fraction(2,-4)
    Fraction(-1, 2)           # 1:Fraction()会把实例化参数约分后输出;2:会把分母上的负号“-”转到分子上
    >>>

  (2)只用一个整数来实例化Fraction类

    >>> Fraction(3)

    Fraction(3, 1)            #看到没,实例化时输入的参数3是赋值给分子,而分母是默认参数1
    >>>

  (3)只用一个字符串实例化Fraction类

    >>> Fraction(‘4‘)          

    Fraction(4, 1)

    >>>
    >>> Farction(‘s‘)
    Traceback (most recent call last):
    File "<pyshell#10>", line 1, in <module>
    Farction(‘s‘)
    NameError: name ‘Farction‘ is not defined
    >>>

    >>> Fraction(‘4.1‘)
    Fraction(41, 10)
    >>>

    #如果使用字符串进行初始化时,fractions模块使用内置的正则表达式进行匹配

    >>> Fraction(‘\t\n 1.2 \t\n‘)
    Fraction(6, 5)     #正则表达式把字符串两侧的空格、Tab、换行符都给剔除了

 

    #脑子中突然闪现出一个调皮的想法:我把空格、Tab、换行符放在数字中间会如何

    >>> Fraction(‘1, \t\n 2‘)
    Traceback (most recent call last):
    File "<pyshell#33>", line 1, in <module>
    Fraction(‘1, \t\n 2‘)
    File "C:\Users\dddd\AppData\Local\Programs\Python\Python35\lib\fractions.py", line 146, in __new__
    numerator)
    ValueError: Invalid literal for Fraction: ‘1, \t\n 2‘          # 啊!好爽!!

 

    #我又要调皮了,如果一个浮点数的只有小数位会怎么样?

    >>> Fraction(‘-.25‘)

    Fraction(-1, 4)      #这样也行!!!

    

    #最后的最后,怎么能忽略了数学中的科学计数法表示的数呢

    >>> Fraction(‘1.2*e-6‘)
    Traceback (most recent call last):
    File "<pyshell#40>", line 1, in <module>
    Fraction(‘1.2*e-6‘)
    File "C:\Users\dddd\AppData\Local\Programs\Python\Python35\lib\fractions.py", line 146, in __new__
    numerator)
    ValueError: Invalid literal for Fraction: ‘1.2*e-6‘


    >>> Fraction(‘1e-6‘)
    Fraction(1, 1000000)


    >>> Fraction(‘e-6‘)
    Traceback (most recent call last):
    File "<pyshell#42>", line 1, in <module>
    Fraction(‘e-6‘)
    File "C:\Users\dddd\AppData\Local\Programs\Python\Python35\lib\fractions.py", line 146, in __new__
    numerator)
    ValueError: Invalid literal for Fraction: ‘e-6‘
    >>>

 

  #可见并不是什么字符串都可以作为Fraction的参数的,需要是整形或浮点型转化成的浮点数

 

  (4)以分数作为参数实例化Faction类

    >>> Fraction(1/7)

    Fraction(2573485501354569, 18014398509481984)   # 我操!什么鬼?


    >>> Fraction(‘1/7‘)
    Fraction(1, 7)
    >>>

    >>> Fraction(‘-1/7‘)

    Fraction(-1, 7)
    >>> Fraction(‘1/-7‘)
    Traceback (most recent call last):
    File "<pyshell#16>", line 1, in <module>
    Fraction(‘1/-7‘)
    File "C:\Users\dddd\AppData\Local\Programs\Python\Python35\lib\fractions.py", line 146, in __new__
    numerator)
    ValueError: Invalid literal for Fraction: ‘1/-7‘                    #不知道为什么每次看到报错都会有心痛的感觉

    >>> Fraction(‘1/(-7)‘)
    Traceback (most recent call last):
    File "<pyshell#19>", line 1, in <module>
    Fraction(‘1/(-7)‘)
    File "C:\Users\dddd\AppData\Local\Programs\Python\Python35\lib\fractions.py", line 146, in __new__
    numerator)
    ValueError: Invalid literal for Fraction: ‘1/(-7)‘                 #看来用‘a/b‘的形式的参数实例化Fraction时,负号‘-‘只能加在a前边了
    >>>

 

   (5)有时候将浮点数或者Decimal作为Fraction实例的初始化数据可能会遇到舍入误差(二进制的浮点数是不精确的)的问题,如调用Fraction(1.2)时不返回Fraction(12, 10)的。这时Fraction类提供了一个实例函数limit_denominator()  来减小这种舍入误差。

      >>> Fraction(‘1/7‘).limit_denominator(max_denominator=100)
      Fraction(1, 7)
      >>> Fraction(1/7).limit_denominator(max_denominator=100)
      Fraction(1, 7)
      >>> Fraction(1/7)
      Fraction(2573485501354569, 18014398509481984)
      >>>
      >>> Fraction(1.2)
      Fraction(5404319552844595, 4503599627370496)
      >>> Fraction(1.2).limit_denominator(max_denominator=100)
      Fraction(6, 5)
      >>>

 

3,由于Fraction类继承了numbers.Rational类并且重载了该类多有的方法,所以其实例可以直接进行一些算数运算、关系运算等。

   先实例化两个Fraction对象   x = Fraction(1,2)   y = Fraction(1,3)

  (1)+

    >>> x + y
    Fraction(5, 6)

  (2)-

    >>> x - y

    Fraction(1, 6)

  (3)*

    >>> x * y
    Fraction(1, 6)

  (4)/

    >>> x / y

    Fraction(3, 2)

  (5)用Python内置函数abs()处理一下呢

    >>> x*(-1)

    Fraction(-1, 2)
    >>> abs(x*(-1))  
       #内置函数能正常处理哦
    Fraction(1, 2)

 

    内置函数能处理,math模块中的函数肯定也能处理咯,试一下

    >>> import math

    >>> math.ceil(x)

    1
    >>> math.floor(x)
    0

 

关于fraction模块就介绍这么多吧,其实我目前还在自学阶段,没有什么实践的机会,等将来用到了再多去多了解一些。

以上是关于1.3 fractions模块的主要内容,如果未能解决你的问题,请参考以下文章

python分数运算使用Fraction模块

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

angularjs-1.3代码学习 模块

如何有条件地将 C 代码片段编译到我的 Perl 模块?

JavaScript单行代码,也就是代码片段

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段