前文对Python的基本类型进行了简单介绍,在本文中,我们将对数值类型进行更为详细的认识,闲言不叙,开始:
在Python中,数字并不是真的只是一种对象类型,而是一组相似类型的分类。Python不仅支持通常的数值类型(整数和浮点数),还提供了字面量来直接创建数字和表达式以处理数字。
完整的Python数值类型工具包括:
- 整数和浮点对象
- 复数对象
- 小数:固定精度对象
- 分数:有理数对象
- 集合:带有数值运算的集合体
- 布尔值:真和假
- 内置函数和模块:round、math、random等
- 表达式;无限制整数精度;位运算;十六进制、八进制和二进制格式
- 第三方扩展:向量、库、可视化、作图等
一.数值字面量
1.整数和浮点数
整数写成十进制数字的串。
浮点数带一个小数点,也可以加上一个科学计数标志e或者E。
代码示例如下:
a=12
b=1.2
c=12e-2
2.十六进制、八进制和二进制
- 字面量
(1)十六进制数以0X或者0x开头,后面接十六进制的数字0-9和A-F(大小写都可以)。
(2)八进制数以0o或者0O开头,后面接数字0-7构成的数字串。
(3)二进制数以0b或者0B开头,后面接二进制数字(0-1) - hex(I)、oct(I)和bin(I)分别把一个十进制整数转换为十六进制、八进制和二进制表示的字符串。
代码示例如下:
a=12
print(hex(a))
print(oct(a))
print(bin(a))
运行结果如下:
0xc
0o14
0b1100
- 使用int(str,base)根据每个给定的进制把一个运行时字符串转换为一个整数。
代码示例如下:
a=int('12',16)
print(a)
运行结果如下:
18
3.位操作
除了一般的数学运算,Python还支持位操作,需要把整数作为二进制位串处理的运算。包括<<、>>、&、|等位操作。第一篇文章写在前面也已经有详细介绍,这里不再赘述。
4.复数
Python的复数字面量写成实部+虚部的写法,这里的虚部是以j和J结尾。复数还可以通过内置函数complex(real,imag)来创建。
代码示例如下:
a=2+3j
b=complex(2,3)
5.编写其他的数据类型
在Python中,需要导入某些模块并调用其函数来创建一些数值类型,如小数和分数。其他他的一些拥有它们自己的字面量语法,如集合。
二.表达式运算符
1.表达式运算符
Python的表达式运算符在第一篇文章写在前面已经有详细介绍,这里不再赘述。
2.运算符优先级
在混合运算中,需要遵循运算符优先级规则。第一篇文章写在前面也已经有详细介绍,这里不再赘述。
3.带括号的子表达式
子表达式带有括号时,会超越Python的优先级规则。Python总会先行计算圆括号中的表达式,然后再将结果用于整个表达式中。
4.混合运算转换
Python首先将被操作的对象转换为其中最复杂的操作数的类型,然后再对相同类型的操作数进行数学运算。(Python是这样划分数值类型的复杂度的:整数比浮点数简单,浮点数比复数简单。)
5.强制转换类型
可以通过手动调用内置函数来强制转换类型。
代码示例如下:
a=int(2.4)
b=float(3)
print(a)
print(b)
运行结果如下:
2
3.0
6.运算符重载和多态
重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。如:‘+’可以表示加法或者拼接。
多态,指的是操作的意义由操作对象来决定。重载是多态的具体表现形式,多态是面向对象编程思想的一种特征。
7.普通比较和链式比较
普通比较:比较操作数的相对大小,返回一个布尔类型的结果。第一篇文章写在前面也已经有详细介绍,这里不再赘述。
链式比较:如表达式(A<B<C)等同于布尔测试(A<B and B<C)。(A==B<C)等同于布尔测试(A==B and B<C)。
补充:str和repr显示格式,str显示用户友好的格式,repr默认交互式命令行显示,像代码样式的结果。
三.除法
1.X/Y:经典除法(Python2.X)和真除法(Python3.X)
经典除法(截断除法):对于整数会省去小数部分,对于浮点数会保持余项(小数部分)。相当于math模块中math.trunc函数的功能。
真除法:即无论任何类型,最终的浮点数结果都会保留小数部分。
2.X//Y(向下取整法)
向下取整法:不考虑操作对象的类型,总会省略结果的小数部分,剩下最小的能整除的整数部分。相当于math模块中math.floor函数的功能。
四.其他内置工具
1.内置函数(无需导入)
- pow函数:两个参数,第一个参数为底数,第二个参数为指数
- abs函数:求绝对值,参数数目不限
- round函数:针对操作数进行四舍五入取值。只有一个参数,默认舍弃小数部分;有两个参数,第二个参数表示取值的位数。结果是一个字符串。
2.math模块(需要事先导入)
- math.pi:数学含义里的圆周率,3.141592653589793
- math.e:数学含义里的自然数e,2.718281828459045
- math.sin函数:求sin值
- math.sqrt函数:求根
- math.floor函数:向下取整,在(四)已有详细介绍
- math.trunc函数:截断取整,在(四)已有详细介绍
3.random模块(需要事先导入)
- random.random函数:随机生成一个浮点数。两个参数表示生成数的范围
- random.randint函数:随机生成一个整型数。两个参数表示生成数的范围
- random.choice函数:随机打乱一个序列中的元素,并且随机选择一个元素。参数为一个序列
- random.shuffle函数:随机打乱一个序列中的元素。参数为一个序列
五.其他数值类型
1.小数类型
- 创建小数对象:小数对象,正式的名称为Decimal。通过调用已导入模块decimal中的函数来创建小数。功能上和浮点数类似,但是有固定的位数和小数点。因此,小数是精度固定的浮点数
- 设置全局小数精度:使用getcontext函数来设置小数的精度
代码示例如下:
from decimal import Decimal
from decimal import getcontext
# 设置小数精度为4,该精度将全局性地应用到调用线程中创建的所有小数
getcontext().prec=4
# 创建一个小数对象a
a=Decimal('1.14')
b=a/Decimal('7')
print(b)
运行结果如下:
0.1629
2.分数类型
分数(Fraction)是Python首次引入的一种新的数值类型,它实现了一个有理数对象。本质上,它显式地保持了一个分子和一个分母,从而避免了浮点数运算的某些不确定性和局限性。
- 分数的创建:Fraction位于模块fractions中,需要导入其构造函数并传入一个人分子和一个分母,从而产生一个分数。
- 浮点数转换为分数:使用float.as_integer_ratio()将浮点数转换为分数
- 分数的混用:
Fraction+int->Fraction
Fraction+float->float
Fraction+Fraction->Fraction
代码示例如下:
import fractions
# 创建一个分数
a=fractions.Fraction(1,3)
print(a)
# 将分数转换为分数
b=(1.5).as_integer_ratio()
print(b)
# 分数混用的格式
c=a+4
print(c)
d=a+1.2
print(d)
e=a+a
print(e)
运行结果如下:
1/3
(3, 2)
13/3
1.5333333333333332
2/3
3.集合
集合(set)是一些唯一的、不可变的对象的无序集合体,一个元素只能在集合中出现一次,不管它被添加了多少。集合是其他对象的集合体,兼备列表和字典的某些共有行为。如,集合是可迭代对象,可以按需增长或缩短,并且可以包含多种对象类型。
- 集合可以通过表达式运算符支持一般的数学集合运算。要注意,我们不能对诸如字符串、列表和元组的一般序列使用下面的运算——我们必须将字符串、列表和元组传入set函数,并创建了相关的相应的集合后,才能使用这些工具。
- 集合set的相关方法。下面展示集合相关的方法。
代码示例如下:
# 通过字面量直接创建一个集合
x={'h','e','l','l','o'}
# 通过set函数创建一个集合,参数为一个可迭代对象
x=set('hello')
x=set(['h','e','l','l','o'])
print(x)
x=set('hello')
# add函数:新增一个元素到集合;和update函数相比,只能添加一个元素
x.add(2)
print('add函数后结果:',x)
x=set('hello')
# update():更新集合,参数为可迭代对象;和add函数相比,可以添加多个元素
x.update((2,'aa'))
print('update函数后结果:',x)
x=set('hello')
# clear函数:清除集合所有元素
x.clear()
print('clear函数后结果:',x)
x=set('hello')
# copy函数:拷贝整个集合并赋值给变量
y=x.copy()
print('copy函数后结果:',y)
x=set('hello')
# pop函数:随机删除集合中一个元素,可以通过变量来获取删除的元素
x.pop()
print('pop函数后结果:',x)
x=set('hello')
# remove函数:删除集合中指定的元素,如果该集合内没有该元素就报错
x.remove('o')
print('remove函数后结果:',x)
x=set('hello')
# discard函数:删除集合中指定的元素,如果该集合内没有该元素也不会报错
x.discard('l')
print('discard函数后结果:',x)
x=set('hello')
y=set('hexxo')
# intersection & :交集; union | :并集合; difference - : 差集
print('intersection函数后结果:',x.intersection(y))
print('union函数后结果:',x.union(y))
print('difference函数后结果:',x.difference(y))
# 使用frozenset定义不可变集合,该函数不可使用add或者pop方法
x=frozenset('hello')
print('frozenset函数创建集合后结果:',x)
运行结果如下:
{'e', 'o', 'l', 'h'}
add函数后结果: {2, 'o', 'e', 'l', 'h'}
update函数后结果: {2, 'o', 'aa', 'e', 'l', 'h'}
clear函数后结果: set()
copy函数后结果: {'e', 'o', 'l', 'h'}
pop函数后结果: {'o', 'l', 'h'}
remove函数后结果: {'e', 'l', 'h'}
discard函数后结果: {'e', 'o', 'h'}
intersection函数后结果: {'e', 'o', 'h'}
union函数后结果: {'o', 'e', 'l', 'h', 'x'}
difference函数后结果: {'l'}
frozenset函数创建集合后结果: frozenset({'e', 'o', 'l', 'h'})
- 集合推导
集合推导会运行一个循环并在每次迭代时收集一个表达式的结果,通过一个循环变量来访问当前迭代值以用于集合表达式中。其结果就是通过运行代码创建了一个新的集合,它具备所有一般的集合行为。
代码示例如下:
x=set('hello')
# 通过字面量收集集合推导的元素
y={p for p in x}
# 通过字面量收集集合推导的元素
y=set(p for p in x)
print(y)
运行结果如下:
{'l', 'e', 'h', 'o'}
4.布尔型
Python中有一个名为bool的显式布尔数据类型,带有True和False作为可用且预赋值的内置名称。在内部,名称True和False是bool的实例,而bool实际只是内置整数类型int的子类(从面向对象的角度来看)。True和False的行为与整数1和0是一样的,只不过它们有独特的显示逻辑:他们是作为关键字True和False显示的,而不是数字1和0。
5.数值拓展
Python有大量的第三方开源拓展可以用来解决更加专门的需求。Numpy,可选的Python拓展提供了高级的数值编程工具,如:矩阵数据类型、向量处理和精密的计算库。
【参考书目】:《Python学习手册》(第5版)