内容正文:
单元3 基本数据类型
任务3-1:测试数字的类型和取值范围
【任务目标】
在Python交互环境中测试整数、浮点数等数字的类型和取值范围,示例代码如下。
>>> type(20)
<class 'int'>
>>> type(0b110)
<class 'int'>
>>> type(0o110)
<class 'int'>
【任务实施】
演示过程……
>>> type(0x110)
<class 'int'>
>>> type(True)
<class 'bool'>
>>> type(2.5)
<class 'float'>
>>> type(2+3j)
<class 'complex'>
3.1 数字类型
本节主要内容:
整数类型
浮点数类型
复数类型
小数类型
分数类型
3.1.1 整数类型
整数类型可细分为整型(int)数和布尔型(bool)数。
整型数(简称“整数”)是不带小数点的数。例如,123、-12、0、9999999999999999等。在Python中,整数可表示任意大小的数字(受计算机内存限制)。
例如,下面在交互模式下分别输出2和9的100次方。
>>> 2**100
1267650600228229401496703205376
>>> 9**100
265613988875874769338781322035779626829233452653394495974574961739092490901302182994384699044001
整数通常表示为十进制。Python还允许将整数表示为二进制、八进制和十六进制。
二进制:以“0b”或“0B”开头,数码包括0和1。例如0b101、0B11。
八进制:以“0o”或“0O”开头,数码包括0~7。例如0o15、0O123。
十六进制:以“0x”或“0X”开头,数码包括0~9、A~F或a~f。例如0x12AB、0x12ab。
不同进制只是整数的不同书写形式,Python程序运行时会将整数处理为十进制数。
布尔型数(也称布尔值或逻辑值)只有True和False两种取值。
True和False类似于数字1和0。例外的情况是将布尔值转换为字符串时,True转换为“True”,False转换为“False”。
在Python中,因为布尔型是整数类型的子类型,所以逻辑运算和比较运算均可归入数字运算的范畴。
可以使用type()函数查看数据类型,示例代码如下。
>>> type(123)
<class 'int'>
>>> type(123.0)
<class 'float'>
可以使用int()函数将一个字符串按指定进制转换为整数。int()函数的基本语法格式如下。
int('整数字符串',n)
int()函数按指定进制将整数字符串转换为对应的整数,示例代码如下。
>>> int('111') #默认按十进制转换
111
>>> int('111',2) #按二进制转换
7
>>> int('111',8) #按八进制转换
73
>>> int('111',10) #按十进制转换
111
>>> int('111',16) #按十六进制转换
273
>>> int('111',5) #按五进制转换
31
int()函数的第一个参数只能是整数字符串,即字符串中应该是一个有效的整数(包括正负号),不能包含小数点或其他字符(字符串开头的空格可以忽略),否则会出错,示例代码如下。
>>> int('+12')
12
>>> int('-12')
-12
>>> int(' 123')
123
>>> int('12.3') #字符串中包含小数点,出错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '12.3'
>>> int('123abc') #字符串中包含字母,出错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '123abc'
3.1.2 浮点数类型
浮点数类型的名称为float。
12.5、2.、.5、3.0、1.23e+10、1.23E-10等都是合法的浮点数常量。
浮点数取值范围为-10308~10308。
超出取值范围会产生溢出错误(OverflowError)。
示例代码如下。
>>> 2. #小数点后的0可以省略
2.0
>>> .5 #小数点前的0可以省略
0.5
>>> 10.0**308
1e+308
>>> 10.0**309 #超出浮点数的取值范围
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
>>> -10.0**308
-1e+308
>>> -10.0**309 #超出浮点数的取值范围
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
float()函数可将整数和字符串转换为浮点数,示例代码如下。
>>> float(12)
12.0
>>> float('12')
12.0
>>> float('+12')
12.0
>>> float('-12')
-12.0
3.1.3 复数类型
复数类型的名称为complex。
复数常量表示为“实部+虚部”形式,虚部以j或J结尾。例如,2+3j、2-3J、2j。
可用complex()函数来创建复数,其基本格式如下。
complex(实部,虚部)
示例代码如下。
>>> complex(2,3)
(2+3j)
3.1.4 小数类型
因为计算机硬件特点,浮点数不能执行精确运算
示例代码如下。
>>> 0.3+0.3+0.3+0.1 #计算结果并不是1.0
0.9999999999999999
>>> 0.3-0.1-0.1-0.1 #计算结果并不是0
-2.7755575615628914e-17
Python 2.4开始引入了一种新的数字类型:小数类型。
小数可以看作是固定精度的浮点数,它有固定的位数和小数点,可以满足要求精度的计算。
1.创建和使用小数对象
小数对象使用decimal模块中的Decimal()函数创建
示例代码如下。
>>> from decimal import Decimal #从模块导入函数
>>> Decimal('0.3')+Decimal('0.3')+Decimal('0.3')+Decimal('0.1')
Decimal('1.0')
>>> Decimal('0.3')-Decimal('0.1')-Decimal('0.1')-Decimal('0.1')
Decimal('0.0')
>>> type(Decimal('1.0'))
<class 'decimal.Decimal'>
2.小数的全局精度
全局精度指作用于当前程序的小数的有效位数设置,默认全局精度为28位有效数字。
可使用decimal模块中的上下文对象来设置小数的全局精度。
首先,调用decimal模块的getcontext()函数获得当前的上下文对象
再通过上下文对象的prec属性设置全局精度
示例代码如下
>>> from decimal import * #导入模块
>>> Decimal('1')/Decimal('3') #用默认精度计算小数
Decimal('0.3333333333333333333333333333')
>>> context=getcontext() #获得上下文对象
>>> context.prec=5 #设置全局小数精度为5位有效数字
>>> Decimal('1')/Decimal('3')
Decimal('0.33333')
>>> Decimal('10')/Decimal('3')
Decimal('3.3333')
3.小数的临时精度
临时精度在with模块中使用。
首先,调用decimal模块的localcontext ()函数返回本地上下文对象
再通过本地上下文对象的prec属性设置临时精度
示例代码如下。
>>> with localcontext() as local:
... local.prec=3
... Decimal('1')/Decimal('3')
... Decimal('10')/Decimal('3')
...
Decimal('0.333')
Decimal('3.33')
3.1.5 分数类型
分数是Python 2.6和3.0版本引入的新类型。
分数对象明确地拥有一个分子和分母,分子和分母保持最简。
使用分数可以避免浮点数的不精确性。
分数使用fractions模块中的Fraction()函数来创建,其基本语法格式如下。
x = Fraction(a,b)
其中,a为分子,b为分母,python自动计算为最简分数
示例代码
>>> from fractions import Fraction #从模块导入函数
>>> x=Fraction(2,8) #创建分数
>>> x
Fraction(1, 4)
>>> x+2 #计算1/4+2
Fraction(9, 4)
>>> x-2 #计算1/4-2
Fraction(-7, 4)
>>> x*2 #计算1/4*2
Fraction(1, 2)
>>> x/2 #计算1/4除以2
Fraction(1, 8)
分数的打印格式和其在交互模式下直接显示的样式有所不同,示例代码如下。
>>> x=Fraction(2,8)
>>> x #交互模式直接显示分数
Fraction(1, 4)
>>> print(x) #打印分数
1/4
可以使用Fraction.from_float()函数将浮点数转换为分数,示例代码如下。
>>> Fraction.from_float(1.25)
Fraction(5, 4)
$$