第五部分:数值类型

数值类型

在python中,数字并不只是一种对象类型,而是一组相似类型的分类。python不仅支持通常的数值类型(整数和浮点数),还提供了字面量来创建数字和表达式以处理数字。

完整的python数值类型包括:

  • 整数和浮点对象;
  • 复数对象;
  • 小数:固定精度对象;
  • 分数:有理数对象;
  • 集合:带有数值运算的集合体
  • 布尔值:真和假
  • 内置函数和模块:round;math;random等;
  • 表达式:无限制整数精度;位运算;十六进制、八进制和二进制等;
  • 第三方扩展:向量、库、可视化、作图等;

数值字面量
1234,-24,0,99999999999: 整数(无大小限制)
1.23,1.,3.14e-10,4E210,4.0e+210: 浮点数
0o177,0x9ff,0b101010 : 3.X中的八进制、十六进制、二进制字面量
O177,0o177,0x9ff,0b101010: 2.X
3+4j,3.0+4.0j,3J: 复数字面量
set(‘spam‘),{1,2,3,4}:集合: 2.X和3.X中的构造方式
Decimal(‘1.0’),fraction(1,3): 小数和分数扩展类型
bool(X),True,False: 布尔类型和字面量

注:

  • 整数和浮点数字面量
    如果你编写一个带有小数点或者幂的数字,python会将它创建为一个浮点数对象,并且当这个对象在表达式中时,将启用浮点数(而不是整数)的运算法则。
    python2.X的整数:一般整数和长整数
    python2.X中整数分为一般整数(通常32位)和长整数(无限精度),并且一个整数可以以l或者L结尾,将其强制转换为长整数,但是实际中,整数的值超过为其分配的位数时会自动转换为长整数。
    python3.X中的整数:单独的一种类型
    3.X中的一般整数和长整数已经合二为一,只有整数这一种,支持无限精度,因此,整数在程序中不再有末尾的l或者L表示,并且整数也不再显示这个字符。

  • 十六进制、八进制、二进制
    这些字面量在程序代码中都产生一个整数对象,他们仅仅是特定值的不同语法表示而已,内置函数hex()、oct()和bin()可以吧一个整数转换为这三种进制表示的字符串,而int(str,base)根据每个给定的进制吧一个运行时字符串转换位一个整数。

  • 复数
    从内部来看,复数是通过一对浮点数来实现的,但是对复数的所有数字运算都会按照复数的运算法则进行。复数也可以通过内置函数complex(real,imag)来创建。

  • 编写其他的数值类型

内置数值工具
表达式运算符(+,-,*…)
内置数学函数(pow,abs,round…)
工具模块(random,math…)

python表达式运算符
在这里插入图片描述
注:
在2.X中,值不相等可以写成x<>y,或者x!=y,但是在3.x中前者的形式被移除了。
x//y对于的向下取整除法表达式。3.X中x/y表达式会执行真除法,在2.X中则为经典除法。
比较运算符可以链式使用:X<Y<Zd的结果与X<Y and Y<Z相同
在2.x中比较混合类型的相对大小时允许的,这会吧数字转换为一个普通类型,在3.x中,比较非数字的混合类型的相对大小时不允许的。
在python3.x中,字典的相对大小比较也不再支持(尽管支持等价性测试);比较sorted(aDict.items())是一种可能的替代。

混合运算遵循运算符优先级
就很普通,符合常理,略

混合类型向上转换
除了在表达式中混合运算符外,还可以混合数值类型。例如把一个整数与一个浮点数相加。而在混合类型的表达式中,python首先将操作的对象转换成其中最复杂的操作数的类型,然后再对相同类型的操作数进行数学运算。
在python中:整数比浮点数简单,浮点数比复数简单。
同理,任何混合类型的表达式,其中一个操作数是更复杂的数字,就会导致其他的操作数升级为一个复杂的数字。,使得表达式获得一个复杂的结果。
你可以通过手动调用内置函数来强制转换类型。
int(): 转为整数;
float(): 转为浮点数;

但这些混合类型仅使用于数值类型,一般来说,python不会再其他的类型之间进行转换。一个整数和一个字符串相加,就会产生错误。

注:
在python2.X中,非数值类型也可以被比较,但是不会执行任何的转换,而会比较对象类型名称的字符串;但在3.X中,非数值类型的相对大小比较时绝对不允许的,并会引发异常

数字的实际应用

变量与基础表达式
变量在第一次赋值时创建;
变量在表达式中使用时,会被替换成它们的值;
变量在表达式中使用之气那,必须已被赋值;
变量引用对象,而且从不需要事先声明;

你不需要在python中提前声明变量,但是在变量使用之前必须至少被赋值一次。
数值的显示格式
str和repr显示格式:两者都会把任意对象转化成对应的字符串表示,repr会产生看起来像代码的结果;str会转换成一种通常对用户更加友好的格式。

普通比较与链式比较:
除了链接,数值比较是基于相对大小的,不过浮点数不是总会按照你的预期工作,而且有时需要借助转换或者其他处理才能进行有意义的比较:
在这里插入图片描述
这是因为浮点数因为有限的比特位数,不能精确的表示某些值,后面的小数和分数就可以避免在和谐问题。

除法:经典除法、向下取整除法和真除法
X/Y:在2.X中,这个操作对整数会省去小数部分,对浮点数会保持余项(小数部分)。3.X中会变成真除法,即无论任何类型,最终的浮点数结果都会保留小数部分。
x//y:向下取整法。在python2.X和3.X中均能使用,操作不考虑对象的类型,总是会省略结果的小数部分,剩下最小的能整除的整数部分,他的结果类型取决于操作数的类型。

在3.X中,/总是执行真除法,不管操作数的类型,都会返回包含任何小数部分的一个浮点数结果。//执行向下取整除法,它截除掉余数并针对整数操作数返回一个整数,如果有任何一个操作数是浮点数类型,则返回一个浮点数。
在2.X中,/表示经典除法,如果两个操作数都是整数的话,执行截断的整数除法,否则,执行浮点数除法(保留小数)。//执行向下取整除法,并且像在3.X中一样工作,对于整数执行截断除法,对浮点数执行浮点除法。
python3.7中的结果
向下取整除法、截断除法
//把结果向下截断到它的下层,即真正结果之下最近的整数。其直接效果是向下舍入,并不是严格的截断,并且这对负数也有效
在这里插入图片描述
如果想获得趋向于0的截断,且不管正负,那么可以使用math.trunc函数
在这里插入图片描述
复数:
复数允许我们将他的实部和虚部作为属性来访问,并支持所有的一般的数学表达式,同时还可以通过标准的cmath模块(复数版的标准math模块)中的工具进行处理。

按位操作:
略,后面有需要再细看

其他数值类型
小数类型:
其正式名称是Decimal,需要调用已导入模块中的函数来此创建小数。从功能上将,小数很像浮点数,但它有固定的位数和小数点。因此,小数是精度固定的浮点数。尽管相对于一般的浮点数类型来说带来了性能上的损失,但是小数类型对表达固定精度的特性(例如货币的累加)以及对实现更好的数值精度而言,是一个理想的工具。

小数基础知识
浮点数运算缺乏精确性,这是因为用来储存数值的空间有限,其结果很接近零,但却没有的位数来实现这样的精度,如果使用了小数对象,那么结果将更准确:
在这里插入图片描述
当你在表达式中混合使用不同精度的小数时,python会自动转换成最高的小数位数:
在这里插入图片描述
你也可以从一个浮点数对象创建小数对象,即通过decimal.Decimal.from_float形式的调用来实现。

设置全局小数精度
decimal模块中的一个上下文对象可以指定精度(小数位数)和舍入模式(向下取整、向上取整等)。该精度将全局性地应用到调用线程中创建的所有小数:
在这里插入图片描述
小数上下文管理器
在2.6和3.0之后的版本中,可以使用with上下文管理器来临时创建小数精度。在with退出后,精度又会重置为初始值。
在这里插入图片描述
分数类型
分数基础知识:
fraction与上面的decimal固定精度类型十分类似,都可以用来处理浮点类型的数值不确定性。分数的使用方法也和小数很像,需要导入其构造函数并传入一个分子和一个分母,从而产生一个分数
在这里插入图片描述
分数对象也可以通过浮点数字符串来创建,这和小数很类似:
在这里插入图片描述
分数和小数中的数值精度:
对于那些内存中给定的有限位数无法精确表示的值,浮点数的局限性尤为明显。Fraction和Decimal都提供了得到精确结果的方式,代价是代码的冗余。
此外,分数和小数都能提供比浮点数更直观和准确的结果,它们以不同的方式做到这点——使用有理数表示以及通过限制精度:
在这里插入图片描述
实际上,分数保持了精确性,又自动简化了结果。

分数转换和混用类型为了支持分数的转换,浮点数对象现在有一个方法,可以产生它们的分子和分母比,分数有一个from_float方法,并float函数可以接受一个Fraction对象作为参数。
在这里插入图片描述

表达式中允许某些类型的混合(分数加浮点数,浮点数加小数之类的)。
尽管可以把浮点数转换位分数,在某些情况下,这么做的时会会有不可避免的精度损失,因为这个数在其初始的浮点数形式下时不准确的。在必要时,我们可以通过限制分母的最大值来简化这样的结果:
在这里插入图片描述
集合
集合时其他对象的集合体,因此具有列表和字典这样的对象的某些共同行为。例如:可迭代,可以按需增长或者缩短,并可以包含多种对象类型。然而,由于集合时无序的,而且不会把键映射到值,因此既不是序列也不是映射类型,它是自成一体的类型。

集合基础知识:
创建一个集合对象,可以向内置的set函数传入一个序列或者其他的可迭代对象(集合并不包含位置顺序,他的顺序时任意的)。
除了表达式,集合对象还提供了与这些操作相对应的方法,从而支持集合的修改:add、update、remove。。。
作为可迭代的容器,集合也可以用于len、for循环和列表推导这样的操作中,然而,因为集合时无序的,因此不支持索引和分片这样的操作。
在3.X中可以直接使用花括号来创建集合,因为集合基本上就很像无值的字典。在3.X中,无论如何创建的,集合都会以新的字面量形式来显示它,而在2.X中,则仍以set的形式显示,但是,如果要空集,则必须使用set函数,在所有的版本中,{}仍然是一个字典。set()才是空集。

不可变性限制与冻结集合
集合只能包含不可变的(可哈希化的)的对象类型,因此,列表和字典不能镶嵌到集合中,元组则可以,元组在集合操作中会比较其完整的值

python3.X和2.X在的集合推导
集合推导类似列表推导的形式,但是编写在花括号中而不是方括号中,并会创建一个集合而不是列表。推导也可以迭代其他类型的对象,例如字符串
在这里插入图片描述
布尔型
python有一个名为bool的显示布尔数据类型,带有True和False作为可用且预赋值的内置名称。*在内部,名称True和False时bool的实例,而bool实际上只是内置整数类型的int的子类(从面向对象的角度来看)*True和False的行为与整数1和0是一样的,只不过它们有独特的显示逻辑:它们是作为关键字True和False显示的,而不是数字1和0.bool位这两个对象重新定义了str和repr的字符串格式。

数值拓展
NumPy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值