Python从入门到精通
上QQ阅读APP看书,第一时间看更新

2.3 基本数据类型

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

2.3.1 数字

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

在Python中,数字类型主要包括整数、浮点数和复数。下面分别介绍。

1.整数

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

整数类型包括十进制整数、八进制整数、十六进制整数和二进制整数。下面分别进行介绍。

(1)十进制整数。十进制整数的表现形式大家都很熟悉。例如,下面的数值都是有效的十进制整数。

    31415926535897932384626
    66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
    666666666666666666666666666666666666666
    -2017
    0

在IDLE中执行的结果如图2.19所示。

图2.19 有效的整数

说明

在Python 2.x中,如果输入的数比较大时,Python会自动在其后面加上字母L(也可能是小写字母l)。例如,在Python 2.7.14中输入31415926535897932384626后的结果如图2.20所示。

图2.20 在Python 2.x中输入比较大的数时的效果

注意

不能以0作为十进制数的开头(0除外)。

(2)八进制整数。由0~7组成,进位规则是“逢八进一”,并且以0o开头的数,如0o123(转换成十进制数为83)、−0o123(转换成十进制数为−83)。

注意

在Python 3.x中,对于八进制数,必须以0o/0O开头。这与Python 2.x不同,在Python 2.x中,八进制数可以以0开头。

(3)十六进制整数。由0~9,A~F组成,进位规则是“逢十六进一”,并且以0x/0X开头的数,如0x25(转换成十进制数为37)、0Xb01e(转换成十进制数为45086)。

注意

十六进制必须以0X或0x开头。

(4)二进制整数。只有0和1两个基数,进位规则是“逢二进一”。如101(转换为十制数为5)、1010(转换为十进制为10)。

2.浮点数

浮点数由整数部分和小数部分组成,主要用于处理包括小数的数,如1.414、0.5、−1.732、3.1415926535897932384626等。浮点数也可以使用科学记数法表示,如2.7e2、−3.14e5和6.16e−2等。

注意

在使用浮点数进行计算时,可能会出现小数位数不确定的情况。例如,计算0.1+0.1时,将得到想要的0.2,而计算0.1+0.2时,将得到0.30000000000000004(想要的结果为0.3),执行过程如下所示。

01  >>> 0.1+0.1
02  0.2
03  >>> 0.1+0.2
04  0.30000000000000004

对于这种情况,所有语言都存在这个问题,暂时忽略多余的小数位数即可。

【例2.1】 根据身高、体重计算BMI指数。(实例位置:资源包\TM\sl\02\01)

在IDLE中创建一个名称为bmiexponent.py的文件,然后在该文件中定义两个变量,一个用于记录身高(单位为米),另一个用于记录体重(单位为千克),根据公式:BMI=体重/(身高×身高)计算BMI指数,代码如下:

说明

在上面的代码中,str()函数用于将数值转换为字符串;if语句用于进行条件判断。

运行结果如图2.21所示。

图2.21 根据身高、体重计算BMI指数

3.复数

Python中的复数与数学中的复数的形式完全一致,都是由实部和虚部组成,并且使用j或J表示虚部。当表示一个复数时,可以将其实部和虚部相加,例如,一个复数,实部为3.14,虚部为12.5j,则这个复数为3.14+12.5j。

2.3.2 字符串

字符串就是连续的字符序列,可以是计算机所能表示的一切字符的集合。在Python中,字符串属于不可变序列,通常使用单引号“''”、双引号“""”或者三引号“''' '''”或“""""""”括起来。这三种引号形式在语义上没有差别,只是在形式上有些差别。其中单引号和双引号中的字符序列必须在一行上,而三引号内的字符序列可以分布在连续的多行上。例如,定义3个字符串类型变量,并且应用print()函数输出,代码如下:

执行结果如图2.22所示。

图2.22 使用3种形式定义字符串

注意

字符串开始和结尾使用的引号形式必须一致。另外,当需要表示复杂的字符串时,还可以进行引号的嵌套。例如,下面的字符串也都是合法的。

    '在Python中也可以使用双引号(" ")定义字符串'
    "'(··)nnn'也是字符串"
    """'---' "_"***"""

【例2.2】 输出字符画——坦克。(实例位置:资源包\TM\sl\02\02)

在IDLE中创建一个名称为ascii_art.py的文件,然后在该文件中输出一个表示字符画的字符串,由于该字符画有多行,所以需要使用三引号作为字符串的定界符。关键代码如下:

运行结果如图2.23所示。

图2.23 输出字符画

Python中的字符串还支持转义字符。所谓转义字符,是指使用反斜杠“\”对一些特殊字符进行转义。常用的转义字符如表2.2所示。

表2.2 常用的转义字符及其说明

注意

在字符串定界符引号的前面加上字母r(或R),那么该字符串将原样输出,其中的转义字符将不进行转义。例如,输出字符串“"失望之酒\x0a机会之杯"”将正常输出转义字符换行,而输出字符串“r"失望之酒\x0a机会之杯"”,则原样输出,执行结果如图2.24所示。

图2.24 转义和原样输出的对比

2.3.3 布尔类型

布尔类型主要用来表示真或假的值。在Python中,标识符True和False被解释为布尔值。另外,Python中的布尔值可以转化为数值,其中True表示1,而False表示0。

说明

Python中的布尔类型的值可以进行数值运算,例如,“False + 1”的结果为1。但是不建议对布尔类型的值进行数值运算。

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

 False或None;

 数值中的零,包括0、0.0、虚数0;

 空序列,包括字符串、空元组、空列表、空字典;

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

2.3.4 数据类型转换

Python是动态类型的语言(也称为弱类型语言),不需要像Java或者C语言一样在使用变量前必须先声明变量的类型。虽然Python不需要先声明变量的类型,但有时仍然需要用到类型转换。例如,在实例2.1中,要想通过一个print()函数输出提示文字“您的身高:”和浮点型变量height的值,就需要将浮点型变量height转换为字符串,否则将显示如图2.25所示的错误。

图2.25 字符串和浮点型变量连接时出错

在Python中,提供了如表2.3所示的函数进行各数据类型间的转换。

表2.3 常用类型转换函数

【例2.3】 假设某超市因为找零麻烦,特设抹零行为。现编写一段Python代码,实现模拟超市的这种带抹零的结账行为。(实例位置:资源包\TM\sl\02\03)

在IDLE中创建一个名称为erase_zero.py的文件,然后在该文件中,首先将各个商品金额累加,计算出商品总金额,并转换为字符串输出,然后再应用int()函数将浮点型的变量转换为整型,从而实现抹零,并转换为字符串输出。关键代码如下:

运行结果如图2.26所示。

常见错误:在进行数据类型转换时,如果把一个非数字字符串转换为整型,将产生如图2.27所示的错误。

图2.26 模拟超市抹零结账行为

图2.27 将非数字字符串转换为整型产生的错误