
2.1 数字类型
在编程中,经常使用数字来记录游戏得分、表示可视化数据、存储Web应用信息等。Python根据数字的用法以不同的方式处理它们。鉴于整数使用起来最简单,下面就先来看看Python是如何管理它们的。
2.1.1 数字类型的表示方法
表示数字或数值的数据类型称为数字类型。Python的内置数字类型分为整型(int)、浮点型(float)、复数类型(complex),它们分别对应数学中的整数、小数和复数,此外,还有一种比较特殊的整型——布尔类型(bool)。Python没有字符类型。使用Python编写程序时,不需要声明变量的类型,整型、长整型可以用二进制、八进制、十六进制。由于Python不需要显式地声明变量的类型,因此变量的类型由Python内部管理,在程序的后台实现数值与类型的关联,以及类型转换等操作。下面针对Python中的这4种数字类型分别进行讲解。
1.整型
类似-2、-1、0、1、2这样的数据称为整型数据(简称整数)。在Python中,可以使用4种进制表示整型,分别为二进制(以“0B”或“0b”开头)、八进制(以“0o”或“0O”开头)、十进制(默认表示方式)和十六进制(以“0x”或“0X”开头)。例如,使用二进制、八进制和十六进制表示十进制的整数10的示例代码具体如下:

2.浮点型
Python将带小数点的数据都称为浮点数,类似1.2、0.5、3.14、-1.4、3.12e2这样的数据被称为浮点型数据。大多数编程语言都使用了这个术语,它指出了这样一个事实:小数点可出现在数字的任何位置。浮点型数据用于保存带有小数点的数值,Python的浮点数一般以十进制形式表示,对于较大或较小的浮点数,可以使用科学计数法表示。例如:

3.复数类型
类似3+2j、3.1+4.9j、-2.3-1.9j这样的数据被称为复数,Python中的复数有以下3个特点:
➢ 复数由实部和虚部构成,一般形式为real+imagj。
➢ 实部real和虚部imag都是浮点型。
➢ 虚部必须有后缀j或J。
在Python中有两种创建复数的方式:一种是按照复数的一般形式直接创建,另一种是通过内置函数complex()创建。例如:

注意
复数类型的写法与数学中的写法类似,但是写为c=7+8i,则Python不能识别其中的“i”,将提示语法错误。
4.布尔类型
Python中的布尔类型(bool)只有两个取值:True和False。实际上,布尔类型是一种特殊的整型,其中True对应的整数为1,False对应的整数为0。Python中的任何对象都可以转换为布尔类型,若要进行转换,则符合以下条件的数据都会被转换为False。
➢ None.
➢ 任何为0的数字类型,如0、0.0、0j。
➢ 任何空序列,如''''、()、[]。
➢ 任何空字典,如{}。
➢ 用户定义的类实例,如类中定义了__bool__()或者__len__()。
除以上对象外,其他的对象都会被转换为True。可以使用bool()函数检测对象的布尔值。例如:

2.1.2 技能训练1
上机练习1根据身高体重计算BMI指数
需求说明
BMI指数即身体质量指数,是目前国际常用的衡量人体胖瘦程度以及是否健康的一个标准。BMI指数计算公式如下:

编写程序,实现根据输入的身高、体重计算BMI值的功能。
2.1.3 类型转换函数
在Python程序中,不同的基本类型的值经常需要进行相互的类型转换,类型转换分为自动类型转换和强制类型转换。
1.自动类型转换
Python的所有数值型变量可以进行相互转换,如果系统支持把某种基本类型的值直接赋值给另一种基本类型的变量,则这种方式称为自动类型转换。当把一个表述范围较小的数值或变量直接赋给另外一个表述范围较大的变量时,系统将可以进行自动类型转换,否则需要强制类型转换。
【示例1】 数据类型转换

num_a为整型,num_b为浮点型,所以在操作时会将整型自动转为浮点型进行计算。运行代码,控制台输出结果如下:

2.强制类型转换
Python内置了一系列可实现强制类型转换的函数,保证用户在有需求的情况下,将目标数据转换为指定的类型。数字间进行转换的函数有int()、float()、str(),这些函数的功能说明如表2-1所示。
表2-1 类型转换函数的功能说明

通过代码演示这些函数的使用方法,具体如下:

(1)int()函数
我们可以方便地使用int()函数将其他的Python数据类型转换为整型。它会保留传入数据的整数部分并舍去小数部分。Python里最简单的数据类型是布尔型,它只有两个可选值:True和False。当转换为整数时,它们分别代表1和0:

当将浮点数转换为整数时,所有小数点后面的部分会被舍去:

也可以将仅包含数字和正负号的字符串转换为整数,下面有几个例子:

将一个整数转换为整数没有太大意义,既不会产生任何改变也不会造成任何损失:

【示例2】 通过int()函数将字符串转换为整型

利用int()函数将字符串、浮点型(不保留小数点)和布尔型变为整型后进行加法计算操作。运行代码,控制台输出结果如下:

(2)float()函数
整数全部由数字组成,而浮点数(在Python里称为float)包含非数字的小数点。浮点数与整数很像:你可以使用运算符(+、-、*、/、//、**和%)以及divmod()函数进行计算。使用float()函数可以将其他数字类型转换为浮点型。与之前一样,布尔型在计算中等价于1.0和0.0:

将整数转换为浮点数仅需要添加一个小数点:

此外,也可以将包含有效浮点数(数字、正负号、小数点、指数及指数的前缀e)的字符串转换为真正的浮点型数字:

在使用类型转换函数时有两点需要注意:
➢ int()函数、float()函数只能转换符合数字类型格式规范的字符串。
➢ 使用int()函数将浮点数转换为整数时,若有必要会发生截断(取整),而非四舍五入。
用户在使用类型转换函数时,必须考虑到以上两点,否则可能会因字符串不符合要求而导致在转换时产生错误,或因截断而产生预期之外的计算结果。
(3)str()函数
我们经常需要在消息中使用变量的值。例如,要祝朋友生日快乐,可能会编写以下的代码:

你可能认为,上述代码会打印一条简单的生日祝福语:Happy 23th Birthday!。但如果你运行这些代码,将发现它们会引发错误:

这是一个类型错误,意味着Python无法识别你使用的信息。在这个示例中,Python发现你使用了一个值为整数(int)的变量,但它不知道该如何解读这个值(见❶)。Python知道,这个变量表示的可能是数值23,也可能是字符2和3。像上面这样在字符串中使用整数时,需要显式地指出你希望Python将这个整数用作字符串。为此,可调用函数str(),它让Python将非字符串值表示为字符串:

这样,Python就知道你要将数值23转换为字符串,进而在生日祝福消息中显示字符2和3。经过上述处理后,将显示你期望的消息,而不会引发错误:

大多数情况下,在Python中使用数字都非常简单。如果结果出乎意料,请检查Python是否按你期望的方式将数字解读为了数值或字符串。
【示例3】 键盘输入数据实现数字加法计算

非字符串数据使用+与字符串连接时,必须使用str()函数进行转换,否则将出现“TypeError”错误。运行代码,控制台输出结果如下:

2.1.4 技能训练2
上机练习2指出你最喜欢的数字
需求说明
将你最喜欢的数字存储在一个变量中,再使用这个变量创建一条消息,指出你最喜欢的数字,然后将这条消息打印出来。
上机练习3模拟商店收银抹零行为
需求说明
在商店购买东西时,可能会遇到这样的情况:挑选完商品进行结算时,商品的总价带有0.1元或0.2元的零头,商店老板在收取现金时经常会将这些零头抹去。
编写程序,模拟实现商店收银抹零行为。