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

 问题来了,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(')          

 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模块的更多相关文章

  1. python decimal和fractions模块

    1.简介 默认,浮点数学缺乏精确性 decimal 模块提供了一个 Decimal 数据类型用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于金融应用和其它需要精确十进制表达的场合, ...

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

    math模块 提供基础的数学函数, cos(3.14) = -0.999..(弧度制) acos(1) = 0.0 sqrt(9) = 3.0 degrees(3.14) = 179.9999..(弧 ...

  3. python的标准模块

    本文用于记录python中的标准模块,随时更新. decimal模块(解决小数循环问题): >>> import decimal >>> a = decimal.D ...

  4. Python之复数、分数、大型数组数学运算(complex、cmath、numpy、fractions)

    一.复数的数学运算 复数可以用使用函数 complex(real, imag) 或者是带有后缀j的浮点数来指定 a=complex(2,4) print(a) # (2+4j) b=2-5j # 获取 ...

  5. Python基本语法

    目录缩进流程控制语句表达式函数对象的方法类型数学运算 缩进Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯.并且Python语言利用缩进表示语句块的开始和退 ...

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

    Python的设计目标之一是让代码具备高度的可阅读性.它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观.它不像其他的静态语言如C.Pascal那样需要重复书写声明语句,也不像 ...

  7. Python 入門語法和類型(转载学习)

    http://www.cnblogs.com/mcdou/archive/2011/08/02/2125016.html Python的设计目标之一是让源代码具备高度的可读性.它设计时尽量使用其它语言 ...

  8. deciaml(十进制浮点运算)

    # -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #========== ...

  9. python 数字类型

    数值类型:整型(int)-通常被称为是整型或整数,是正或负整数,不带数点.长整型(long integers)-无限大小的整数,整数最后是一个大写或者小写的L浮点型(floadting point r ...

随机推荐

  1. [转]同一台Windows机器中启动多个Memcached服务

    Memcached的安装后,如果手头上只有一台机器,又想做多节点测试咋办? 这就需要在一台机器上启动多个Memcached服务了. 假设Memcached在如下目录:C:\memcached\memc ...

  2. Linux指令--touch

    原文出处:http://www.cnblogs.com/peida/archive/2012/10/30/2745714.html linux的touch命令不常用,一般在使用make的时候可能会用到 ...

  3. linkin大话java

    青春不灭,理想犹存,linkin--勿忘初心! 不知不觉已经和java并肩作战将近了2年,在这2年之中模模糊糊研究了java2ee领域的好多东西,但是都没有做系统的整理.以前写的笔记也是零零散散不成一 ...

  4. JS 中的this指向问题和call、apply、bind的区别

    this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...

  5. vhost-user 简介

    什么是 vhost-user 在 vhost 的方案中,由于 vhost 实现在内核中,guest 与 vhost 的通信,相较于原生的 virtio 方式性能上有了一定程度的提升,从 guest 到 ...

  6. 安装linux下面用来配置网络,防火墙,系统服务等设置的图形小工具Setup

    Setup命令是linux下面用来配置网络,防火墙,系统服务等设置的图形小工具.使用起来非常方便简单,可是centos\redhat最小化安装之后发现setup命令工具用不了. 接下来介绍如何安装se ...

  7. System.nanoTime

    System.currentTimeMillis()返回的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数. System.nanoTime()返回的是纳秒,nanoTime而返回的可能是任意 ...

  8. CF698C. LRU [容斥原理 概率]

    CF698C. LRU 题意:n种物品,大小为k的队列,\(p_i\)的概率选择第i种物品放入队尾,如果已经有i了就不放了.队列大小>k时弹出队首.求\(10^{100}\)次操作后每种物品在队 ...

  9. R语言dplyr包初探

    昨天学了一下R语言dplyr包,处理数据框还是很好用的.记录一下免得我忘记了... 先写一篇入门的,以后有空再写一篇详细的用法. #dplyr learning library(dplyr) #fil ...

  10. 学习H5仿制网站时遇到的问题

    学习H5的第二周,开始仿制网站,在本过程中也发现了自己存在的更多问题. 1.TOP块:在制作top中,遇到的第一个问题,一旦top左右的背景色不同该怎样去调整 解决方式:建立两个div取代一个div ...