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模块就介绍这么多吧,其实我目前还在自学阶段,没有什么实践的机会,等将来用到了再多去多了解一些。

原文地址:https://www.cnblogs.com/avention/p/8152013.html

时间: 2024-10-06 23:28:11

1.3 fractions模块的相关文章

python decimal和fractions模块

1.简介 默认,浮点数学缺乏精确性 decimal 模块提供了一个 Decimal 数据类型用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度,或者用户希望计算结果与手算相符的场合.Decimal 重现了手工的数学运算,这就确保了二进制浮点数无法精确保有的数据精度. 高精度使 Decimal 可以执行二进制浮点数无法进行的模运算和等值测试. 2.使用 >>> from d

Python3 学习第十弹: 模块学习三之数字处理

math模块 提供基础的数学函数, cos(3.14) = -0.999..(弧度制) acos(1) = 0.0 sqrt(9) = 3.0 degrees(3.14) = 179.9999..(弧度转角度) radians(180) = 3.1415926..(角度转弧度) 常量 pi = 3.1415.. e = 2.7182.. cmath模块(complex math, 复数) 支持复数的运算, >>>import cmath >>>cmath.sqrt(-1

python的标准模块

本文用于记录python中的标准模块,随时更新. decimal模块(解决小数循环问题): >>> import decimal >>> a = decimal.Decimal('10.0') >>> b = decimal.Decimal('3') >>> a / b Decimal('3.333333333333333333333333333') fractions模块(解决分数表示问题): >>> from f

python学习的初次感觉

经历了大学毕业后的找工作,经历了辞去工作后的迷茫!在一次偶然的机会,从朋友那了解到python.说起Python不得不说起一个人,Guido van Rossum他确实很不简单,很厉害的一个创造者!!!下面我来介绍一下大名鼎鼎的Guido van Rossum. Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之所以选中Python(大蟒蛇的意思)作为程序的名字,

python第二周 数字类型

数字类型 Python中,数字并不是一个真正的对象类型,而是一组类似类型的分类.Python不仅支持通常的数字类型(整数和浮点数),而且能够通过常量去直接创建数字以及处理数字的表达式,还通过模块和第三方库提供更多的数字类型支持.Python数字类型的完整工具包括: 整数和浮点数 复数(需要模块支持) 固定精度的十进制数 有理分数 集合 布尔类型 无穷的整数精度 各种数字内置函数和模块 处理数字对象的工具: 表达式操作符:+.-.*././/.>>.**.& 内置数学函数:pow.abs

2 除法啰嗦,不仅是python。

整数除以整数 进入python交互模式之后(以后在本教程中,可能不再重复这类的叙述,只要看到>>>,就说明是在交互模式下),练习下面的运算: >>> 2 / 5 0 >>> 2.0 / 5 0.4 >>> 2 / 5.0 0.4 >>> 2.0 / 5.0 0.4 看到没有?麻烦出来了(这是在python2.x中),按照数学运算,以上四个运算结果都应该是0.4.但我们看到的后三个符合,第一个居然结果是0.why? 因

python cookbook 2 数字 日期 时间(2)

5.字节到大整数的转换 #拥有128位长的16个元素的字节字符串. >>> data = b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004' >>> len(data) 16 将bytes解析为整数,使用 int.from_bytes() 方法 #仅使用与python3 #字节顺序规则(little或big)仅仅指定了构建整数时的字节的低位高位排列方式. >>> int.from_bytes(dat

数字日期和时间

数字的四舍五入 问题: 你想对浮点数执行指定精度的舍入运算. 解决方法: 对于简单的舍入运算,使用内置的round(value, ndigits) 函数即可.比如: 1 #保留小数点后1位数,因为比1.25小,所以四舍五入,取小的 2 r1 = round(1.23, 1) 3 print(r1) 4 5 #保留小数点后1位数,因为比1.25大,所以四舍五入,所以取大的 6 r2 = round(1.27, 1) 7 print(r2) 8 9 #保留小数点后1位数,因为比-1.25小,所以四舍

Python成长笔记 - 基础篇 (二)python基本语法

Python的设计目标之一是让代码具备高度的可阅读性.它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观.它不像其他的静态语言如C.Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和惊喜. Python缩进 Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯.并且Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字.增加缩进表示语句块的开始,而减少缩进则表示语