购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 基本数据类型

在内存中存储的数据可以有多种类型。例如,一个人的姓名可以用字符型存储,年龄可以使用数值型存储,而婚否可以使用布尔类型存储。这些都是Python中提供的基本数据类型。

2.4.1 数值类型

在程序开发时,经常使用数字记录游戏的得分、网站的销售数据和网站的访问量等信息。在Python中,提供了数值类型(Numeric Type)用于保存这些数值,并且它们是不可改变的数据类型。如果修改数值类型变量的值,那么会先把该值存放到内容中,然后修改变量让其指向新的内存地址。

在Python中,数值类型主要包括3种数据类型:整数(int)、浮点数(float)、复数(complex)。使用内置函数type(object)可以返回object的数据类型。内置函数isinstance(obj,class)可以用来测试对象obj是否为指定类型class的实例。

【例2-6】 通过内置函数isinstance测定对象是否为指定类型的实例。

运行结果:

1.整数

整数用来表示整数数值,即没有小数部分的数值,如200、0、-173。在Python中,整数包括正整数、负整数和零,并且它的位数是任意的(Python的整数没有长度限制,当超过计算机自身的计算功能时,会自动转用高精度计算),如果要指定一个非常大的整数,只需要写出其所有位数即可。整数类型包括十进制整数、八进制整数、十六进制整数和二进制整数。

(1)十进制整数

十进制整数的表现形式大家都很熟悉。例如,10,-9。

(2)八进制整数

由0~7组成,进位规则是“逢八进一”,并且以0o开头的数,如0o23(转换成十进制数为19)。在Python 3.x中,对于八进制数,必须以0o/0O开头。

(3)十六进制整数

由0~9,A~F组成,进位规则是“逢十六进一”,并且以0x/0X开头的数,如0x27(转换成十进制数为39)、0X1b(转换成十进制数为27)。

注意:Python中小整数对象池和大整数对象池(对象池即缓存的机制)如下。

(1)小整数对象池

由于数值较小的整数对象在内存中会很频繁地使用,如果每次都向内存申请空间、请求释放,会严重影响Python的性能。好在整数对象属于不可变对象,可以被共享而不会被修改导致问题,所以为小整数对象划定一个范围,即小整数对象池,在Python运行时初始化并创建范围内的所有整数,这个范围内的整数对象是被共享的,即一次创建,多次共享引用。

Python对小整数的定义是[-5,256]这些整数对象是提前建立好的,不会被垃圾回收。在一个Python的程序中,无论这个整数处于LEGB(Python变量作用域的规则,L:Local(function),函数内的名字空间;E:Enclosing function locals,外部嵌套函数的名字空间(例如closure);G:Global(module),函数定义所在模块(文件)的名字空间;B:Builtin(Python),Python内置模块的名字空间)中的哪个位置,所有位于这个范围内的整数使用的都是同一个对象。同理,单个字母也是这样的。

(2)大整数对象池

终端是每次执行一次,所以每次的大整数都重新创建,而在PyCharm中,每次运行是所有代码都加载到内存中,属于一个整体,所以这个时候会有一个大整数对象池,即处于一个代码块的大整数是同一个对象。

【例2-7】 在IDLE(Python 3.7 64-bit)环境中验证小、大整数对象池。

运行结果:

注意:每个计算机的此值可能会有所不同。

2.浮点数

浮点数是带小数的数字,由整数部分和小数部分组成,主要用于处理包括小数的数。如4.、.5.、.-2.7315e2。其中4.相当于4.0,.5相当于0.5,-2.7315e2是科学记数法(浮点数也可以使用科学计数法表示),相当于-2.7315x10 2 ,即-273.15。

所谓“浮点”(floating-point)是相对于“定点”(fixed-point)而言的,即小数点不再固定于某个位置,而是可以浮动的。在数据存储长度有限的情况下,采用浮点表示方法,有利于在数值变动范围很大或者数值很接近0时,仍能保证一定长度的有效数字。

与整数不同,浮点数存在上限和下限。计算结果超出上限和下限的范围会导致溢出错误。

注意:浮点数只能以十进制数形式书写。

需要说明的是,在使用浮点数进行计算时,可能会出现小数位数不确定的情况。计算机不一定能够精确地表示程序中书写或计算的实数。有以下两个原因。

1)因为存储有限,计算机不能精确显示无限小数,会产生误差。

2)计算机内部采用二进制数表示,但是,不是所有的十进制实数都可以用二进制数精确表示。

3.复数

Python中的复数与数学中的复数的形式完全一致,都是由实部和虚部组成,并且使用j或J表示虚部。当表示一个复数时,可以将其实部和虚部相加,例如,一个复数,实部为3.14,虚部为12j,则这个复数为3.14+12j。复数是Python内置的数据类型,使用1j表示-1的平方根。复数对象有两个属性real和imag用于查看实部和虚部。

2.4.2 布尔类型

布尔类型(Bool Type)是主要用来表示真或假的值。在Python中,标识符True和False被解释为布尔值。另外,Python中的布尔值可以转化为数值,其中True表示1,而False表示0。Python中的布尔类型的值可以进行数值运算,例如,“False+1”的结果为1。但是不建议对布尔类型的值进行数值运算。

在Python中,所有的对象都可以进行真值测试。其中,只有下面列出的几种情况得到的值为假,其他对象在if或者while语句中都表现为真。

1)False或None。

2)数值中的零,包括0、0.0、虚数0。

3)空序列,包括空字符串、空元组、空列表、空字典。

4)自定义对象的实例,该对象的__bool__()方法返回False,或__len__()方法返回0。

2.4.3 NoneType类型

在Python中,有一个特殊的常量None(N必须大写)。和False不同,它不表示0,也不表示空字符串,而表示没有值,也就是空值。这里的空值并不代表空对象,即None和[]、“”不同。

None有自己的数据类型,可以在IDLE中使用type函数查看它的类型,执行代码type(None),结果为﹤class'NoneType'﹥。由此可以看到,它属于NoneType类型。

需要注意的是,None是NoneType数据类型的唯一值(其他编程语言可能称这个值为null或undefined),也就是说,不能再创建其他NoneType类型的变量,但是可以将None赋值给任何变量。如果希望变量中存储的东西不与任何其他值混淆,就可以使用None。

2.4.4 数据类型转换

Python是强类型语言。当一个变量被赋值为一个对象后,这个对象的类型就固定了,不能隐式转换成另一种类型。当运算需要时,必须使用显式的变量类型转换。例如input函数所获得的输入值总是字符串,有时需要将其转换为数值类型,方能进行算术运算。例如:

变量的类型转换并不是对变量原地进行修改,而是产生一个新的预期类型的对象。

Python以转换目标类型名称提供类型转换内置函数。

1)float函数:将其他类型数据转换为浮点数。

2)str函数:将其他类型数据转换为字符串。

3)int函数:将其他类型数据转换为整型。

4)round函数:将浮点型数值圆整为整型。所谓的圆整计算总是“四舍”,但并不一定总是“五入”。因为总是逢五向上圆整会带来计算概率的偏差。所以,Python采用的是“银行家圆整”:将小数部分为.5的数字圆整到最接近的偶数,即“四舍六入五留双”。

5)bool函数。将其他类型数据转换为布尔类型。

6)chr和ord函数:进行整数和字符之间的相互转换:chr将一个整数按ASCII码转换为对应的字符,ord是chr的逆运算,把字符转换成对应的ASCII码或Unicode值。

7)eval函数:将字符串中的数据转换成Python表达式原本类型。

【例2-8】 数据类型转换常见函数应用示例。

运行结果:

在进行数据类型转换时,如果把一个非数字字符串转换为整型,将产生错误。

【例2-9】 模拟超市抹零结账行为。要求:先将各个商品金额累加,计算出商品总金额,并转换为字符串输出,然后再应用int函数将浮点型的变量转换为整型,从而实现抹零,并转换为字符串输出。

运行结果:

2.4.5 对象和引用

1.对象

在Python中定义的数据一般称为对象(Object)。计算机中的数据是按块存储,可以简单地把计算机的内存空间视为等分为多个格子储物柜,并按照顺序为格子编码,当有对象被定义时,Python将对象的数值放到储物柜的某个格子中,并在格子贴上带编号的标签,由此完成了对象的定义。

上述过程中,标签可视为“对象名(Name)”,存储到格子中的内容视为对象的“值(Value)”,而对象所在的格子的编号则可视为对象在内存中的地址,Python中将对象的内存地址称为“身份编号(Id)”。值和身份编号是Python中对象的重要特性,此外,对象还有一个特性:类型(Type),类型决定了对象在“储物柜”中占据“格子”的数量。

Python对象的身份编号可唯一表示一个变量,任何对象的身份编号都可以使用Python的内建函数id获取,比如:

运行结果:

2.引用

Python对象的身份Id是只读的,用户不能直接更改对象的身份Id。Python中部分对象的值也是不可以改变的,值不能被改变的对象称为不可变对象,Python的数值类型就是不可变对象。

大家可能会对上述的说法产生疑问,在对一个已经定义好的数值类型对象重新赋值时,明明可以操作成功,也不报错。比如:

运行结果:8

由上述运行结果来看,对象num_01的值也确实从6改为8,为什么说数值类型是不可改变的?这与Python中变量的赋值方式有关。实际上,上述操作改变的并非对象num_01的值,而是对象num_01的引用。

Python中的赋值是通过引用实现的。当用户在定义对象时,解释器对象的值放入内存地址,并将该内存块地址的引用赋给对象,经此过程,对象名便等同于内存地址的别名,用户可以通过变量名获取对象的值。在对对象进行修改时,解释器实际上会将新数值放入新内存地址,再将新内存地址的引用赋给待修改对象。

由上述运行结果来看,重新赋值后对象的身份地址发生了改变。

在Python中的身份运算符为is和is not,用于判断两个对象是否相同。Python中对象的唯一标识即为身份,因此身份运算符的运算过程即对象身份的比较过程。

2.4.6 字符串类型

字符串就是符号或者数值的一个连续序列,用来表示文本的数据类型,可以是计算机所能表示的一切字符的集合。在Python中,字符串属于不可变序列,通常使用单引号“’’”、双引号“”””或者三引号“’’’‘’’或”””“”””括起来。这三种引号形式在语义上没有差别,只是在形式上有些差别。其中单引号和双引号中的字符序列必须在一行上,而三引号内的字符序列可以分布在连续的多行上。

注意:Python中没有字符的概念,即使只有一个字母,也属于字符串类型。

通常字符串由如下五部分组成。

1.字符串(String)

字符串是由字符(比如字母、数字、汉字和符号)组成的序列,如Python is wonderful!、16300240001、李二毛、’’等。其中,’’表示空字符串。字符串和数字一样,都是不可变对象。所谓不可变,是指不能修改对象的内容。例如:“人生苦短”。

2.字符串界定符

字符串界定符用来区分字符串和其他词法单位,有以下三种形式。

1)单引号,如:''、'1+1=2'、'He said “how are you?”'。当字符串中含有双引号时,最好使用单引号作为界定符,即单引号内的双引号不算结束符。

2)双引号,如:””、”中国”、”It's my book.”。当字符串中含有单引号时,最好使用双引号作为界定符,即双引号内的单引号不算结束符。

3)三引号,可以是连续三个单引号,也可以是连续三个双引号,如'''Hello'''、'''您好'''。其常用于多行字符串,可以包含单双引号,可见即所得,常常作为文档注释。跟普通的注释相比,使用三引号标注的注释会作为函数的一个默认属性,可以通过“函数名._doc_”进行访问。

字符串开始和结尾使用的引号形式必须一致。另外当需要表示复杂的字符串时,还可以进行引号的嵌套,规则为在单引号表示的字符串中可以嵌套双引号,但是不允许嵌套单引号;使用双引号表示的字符串中,允许嵌入单引号,但不允许包含双引号。

3.转义符

Python中的字符串还支持转义字符。所谓转义字符是指使用反斜杠“\”对一些特殊字符进行转义,即改变原有字符含义的特殊字符。常用的转义字符如表2-1所示。

表2-1 常见的转义符

4.原始字符串

原始字符串用于显示字符串原来的意思,不让转义字符生效。这就要用r或R来定义原始字符串。例如:r“C:\PythonPractice\nHelloPython.py”。

5.字符串的索引

字符串中的每个字符所处的位置都是固定的,有顺序的。字符串的每个字符都对应着一个位置编号,从0开始,然后依次递增1,这个位置编号是索引或者下标。字符串的索引分为正向索引(从左向右的顺序排列,如图2-6所示)和反向索引(从右向左排列,如图2-7所示)。

图2-6 字符串的索引(正向)

图2-7 字符串的索引(反向)

字符串中的字符是根据索引标记的,如果希望获取字符串的任意字符,可以使用索引来获取。其语法格式为字符串[索引]。需要注意的是,当使用索引访问字符串值的时候,索引值的范围不能越界,否则程序会报索引越界的异常。

与C语言不同的是,Python中的字符串是不能改变的。如果希望对某个索引位置赋值,就会导致错误。当对字符串做追加、修改、截取等操作时,Python会在内存中新建一个字符串。 AgPtPtJ2Ec+ajYBkAaPMdtjYYFbN0VPp18xgrYvuM4Xm4j2RDlBlDpoeUUPfUhnd

点击中间区域
呼出菜单
上一章
目录
下一章
×