数值类型
上一堂课我们学习了Python变量的定义不需要指定类型,让Python的变量看起来更像是名字标签,想贴哪儿就贴哪儿。通过这个标签,就可以轻易找到变量在内存中对应的存放位置。但这绝不是说Python就没有数据类型这回事儿,大家应该还记得字符串和非字符串运算的"大坑"。
虽然Python在变量定义的时候不需要显示指定类型,但是在内存中存储的数据是有具体类型的,只是这个工作Python悄悄完成了,我们感觉不到而已。例如在内存中:一个人的姓名是字符串类型、年龄是数值类型,婚姻状况是布尔类型。这里的字符串类型、数值类型、布尔类型都是 Python 语言中提供的基本数据类型。
我们先来学习Python的数值类型,Python数值类型有4种:
int (整数类型)
float (浮点类型)
complex (复数类型)
bool (布尔类型)
注意:布尔类型也是数值类型,事实上布尔类型是整数类型的一种。
整型
整型就是平时所见的整数,用来表示整数数值,即没有小数部分的数值。
Python3 的整型已经与长整型进行了无缝结合,现在 Python3 的整型类的长度不受限制,具体能到多大,就看大家电脑的配置了,因为最大只受所在计算机硬件的限制。所以,在 Python3 中可以很容易地进行大数运算。
# 有个小宝宝今年3岁,马上就过年了,过完年小宝宝就4岁了,我们来温习一下变量并计算一下
小宝宝年龄 = 3
小宝宝年龄 = 小宝宝年龄 + 1
print(f'过完年小宝宝就 {小宝宝年龄} 岁啦') # 别急这种输出方式马上就会讲到
# 天文学家保守估计,宇宙中的星系数量可能会达到1万亿个。而保守估计,每一个星系当中有1000万亿颗恒星,算一算目前人类观测到的宇宙里大概有多少颗恒星?
# 这在以前是需要写算法去实现的!但是在Python中,so easy。
宇宙恒星数量 = 10000000000123 * 10000000000000456
print(f'目前人类观测到宇宙的恒星数量大概有 {宇宙恒星数量} 颗')
运行结果
过完年小宝宝就 4 岁啦
目前人类观测到宇宙的恒星数量大概有 100000000001234560000000056088 颗
注意:Python中整数类型(int)包括十进制整数、八进制整数、十六进制整数和二进制整数,简单说就是一个整数有不同的表示方式,我们习惯性的使用十进制的整数,而在计算机中所有的数据都是用二进制(0和1)表示。
浮点型
浮点型就是平时所说的小数,例如,圆周率3.14就是一个浮点型数据,再例如地球到太阳的距离约1.5亿千米,也是一个浮点型。Python中 区分整型和浮点型的唯一方式,就是看有没有小数点。
谈到浮点型,就不得不说一下E记法。E记法也就是平时所说的科学计数法,用于表示特别大和特别小的数。打个比方,如果给Python提供一个非常极端的数据,那么它可能会采用E记法来表示。
# 足球世界里 梅西身价: 7000万欧元, 中国武磊:400万欧元, 梅西值多少个武磊 - -梅西身价 = 7000.0
武磊身价 = 400.0
梅西值多少个武磊 = 梅西身价 / 武磊身价
print(f'梅西值 {梅西值多少个武磊} 个武磊')
# 地球到太阳距离大概1.5亿公里,大概多少微米呢,用浮点数表示一下地日距离 = 1.5 * 100000000 * 1000 * 1000000
print(f'地日距离大约 {地日距离} 微米')
# 运行结果
梅西值 17.5 个武磊
地日距离大约 1.5e+16 微米
1.5e+16(大写的E或小写的e都可以)。
其实大家应该已经发现了,这个E的意思是指数,指底数为10,E后边的数字就是10的多少次幂(如果实在不懂好像也没什么关系!)。
复数类型
整数和浮点数(小数)在数学中被统称为实数。与实数对应的是复数。
**复数在数学中被表示为:a+bi,其中a被称为实部,b被称为虚部,i 被称为虚数单位。复数在数学、理论物理学和电气工程等方面应用广泛,例如向量就可以使用复数表示。

Python 中的复数与数学中的复数的形式完全一致,都是由实部和虚部组成,并且使用 j 或 J 表示虚部。当表示一个复数时,可以将实部和虚部相加,例如,一个复数,实部为 3.14,虚部为 12.5j,则这个复数为 3.14+12.5j。
我们平时使用复数的场景很少,大家了解一下就可以了。
布尔类型
人们常说“小孩才分对错,大人只看利弊”,计算机却一直坚持是非分明。在Python中,布尔类型主要用来表示真值或假值,,标识符 True 和 False 被解释为布尔值。另外,Python 中的布尔值可以转换为数值,True 表示 1, False 为 0(Python 中的布尔类型的值可以进行数值运算,例False+1 的结果为 1,把布尔类型当成 1 和 0 来参与运算这种做法是不妥的,容易引起代码的混乱,最好不要这么用!)。
在Python中,所有的对象都可以进行真值测试。其中,只有下面列出的几种情况得到的值为假,其他对象在 if 或者 while 语句中都表现为真:
False 或 None。
数值中的零,包括 0、0.0、虚数 0j。
空序列,包括字符串、空元组、空列表、空字典。
自定义对象的实例,该对象的 bool() 方法返回 False,或者 len() 方法返回 0。
例如,1 + 1 > 3,我们都知道是错的,Python也知道:
# 小宝宝说 1 加 1 等于 3, 一起来看一下是否正确?
x = 1 + 1 > 3 # 这里涉及到计算赋值 和 操作符的优先级,稍后会讲到
y = 1 + 1 == 2
print(f'小宝宝说 1 + 1 > 3 : {x}')
print(f'我说 1 + 1 = 2 : {y}')
# 结果:
小宝宝说 1 + 1 > 3 : False
我说 1 + 1 = 2 : True
数值类型的相互转换
很多数值类型的数据都可以被转换为布尔值,那么数值类型是否也可以相互转换呢?
Python中的很多数据类型都可以相互转换,但是具体情况比较复杂,本章重点介绍数值类型之间的相互转换。
在Python的数值类型中,除复数外,其他三种数值类型如整数、浮点和布尔都可以相互转换,分为隐式类型的转换和显式类型的转换。
隐式类型的转换
数字之间可以进行数学计算,在进行数学计算时若数值类型不同,则会发生隐式类型的转换,规则如下图所示:

来一起看看示例:
结果 = 1 + True # 布尔值True被转换成整数
print(f'1 + True = {结果}')
结果 = 1.0 + 1 # 整数1被转换成浮点数
print(f'1.0 + 1 = {结果}')
结果 = 1.0 + True # 布尔值True被转换成浮点数
print(f'1.0 + True = {结果}')
结果 = 1.0 + 1 + True # 整数1和布尔值True都被转换成浮点数
print(f'1.0 + 1 + True = {结果}')
\# 运行结果
1 + True = 2
1.0 + 1 = 2.0
1.0 + True = 2.0
1.0 + 1 + True = 3.0
显式类型的转换

Python 的显示转换实际上并没有把一个东西从一种类型“转换”成另一种类型。它只是由原来的东西创建一个新东西,而且这个新东西正是你想要的类型。int()、float()、bool()函数可以指定把数据从一种类型转换为另一种类型。
一起来看示例:
结果 = int(1.0) + 1
print(f'int(1.0) + 1 = {结果}')
结果 = int(6.6)
print(f'int(6.6) = {结果}')
x = int(False)
y = int(True)
print(f'int(False) = {x}, int(True) = {y}')
结果 = float(6)
print(f'float(6) = {结果}')
x = float(False)
y = float(True)
print(f'float(False) = {x}\nfloat(True) = {y}')
a = bool(0)
b = bool(0.0)
c = bool(2)
d = bool(6.6)
print(f'bool(0) = {a}\n bool(0.0) = {b}\n bool(2) = {c}\n bool(6.6) = {d}')
# 运行结果
int(1.0) + 1 = 2
int(6.6) = 6
int(False) = 0, int(True) = 1
float(6) = 6.0
float(False) = 0.0
float(True) = 1.0
bool(0) = False
bool(0.0) = False
bool(2) = True
bool(6.6) = True
运算符
刚刚我们学习了Python的数值类型,有了数据,我们就可以通过运算符把它们连接起来,形成表达式,进而通过表达式进行运算,最后得到一个结果,大家有没有发现这和小学学过的数学运算非常的相似,没错,原理是一样的。
算术操作符
Python的算术操作符基本上和大家知道的数学运算符一样,但也有些不一样,来看看都有哪些算术操作符:
+ - / % //
前面四个就不用介绍了,加、减、乘、除,大家都懂,接下来让我们一个个来学习Python的运算符。
以下假设变量 a=10,变量 b=21,运算结果如下表所示:
运算符 |
描述 |
实例 |
+ |
加 -- 两个对象相加 |
a + b 输出结果 31 |
- |
减 -- 得到负数或是一个数减去另一个数 |
a - b 输出结果 -11 |
* |
乘 -- 两个数相乘或是返回一个被重复若干次的字符串 |
*a b 输出结果 210** |
/ |
除 -- x 除以 y |
b / a 输出结果 2.1 |
% |
取模 -- 返回除法的余数 |
b % a 输出结果 1 |
** |
幂 -- 返回x的y次幂 |
ab 为10的21次方 |
// |
取整除 -- 向下取接近商的整数 |
9 // 2 = 4 -9 // 2 = -5 |
看示例:
# 算术操作符 ( + - * /)就不演示了大家可以自行尝试 一起来看看: ( % ** // ) x = 15 % 6
print("15 % 6 的值为:", x)
x = 3 ** 4
print("3 ** 4 的值为:", x)
x = 16 // 7
print("16 // 7 的值为:", x)
# 运行结果
15 % 6 的值为: 3
3 ** 4 的值为: 81
16 // 7 的值为: 2
赋值运算符
以下假设变量a为 2,变量b为 3:
运算符 |
描述 |
实例 |
= |
简单的赋值运算符 |
c = a + b 将 a + b 的运算结果赋值为 c |
+= |
加法赋值运算符 |
c += a 等效于 c = c + a |
-= |
减法赋值运算符 |
c -= a 等效于 c = c - a |
*= |
乘法赋值运算符 |
c = a 等效于 c = c a |
/= |
除法赋值运算符 |
c /= a 等效于 c = c / a |
%= |
取模赋值运算符 |
c %= a 等效于 c = c % a |
**= |
幂赋值运算符 |
c = a 等效于 c = c a |
//= |
取整除赋值运算符 |
c //= a 等效于 c = c // a |
:= |
海象运算符,可在表达式内部为变量赋值。Python3.8 版本新增运算符。 |
在这个示例中,赋值表达式可以避免调用 len() 两次: if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)") |
看示例:
a = 5
y = 23
y += a
print(y)
y *= a
print(y)
y %= a
print(y)
#运行结果 注意:y的值是一直在变化的
28
140
0
比较运算符
以下假设变量a为10,变量b为20:
运算符 |
描述 |
实例 |
== |
等于 -- 比较对象的值是否相等 |
a == b 返回False。 |
!= |
不等于 -- 比较两个对象的值是否不相等 |
a != b 返回 True。 |
> |
大于 -- 返回x是否大于y |
a > b 返回 False。 |
< |
小于 -- 判断x是否小于y。比较运算符返回1表示真,返回0表示假。 这分别与特殊的变量True和False等价。注意,这些变量名的大写。 |
a < b 返回 True。 |
>= |
大于等于 -- 返回x是否大于等于y。 |
a >= b 返回False。 |
<= |
小于等于 -- 返回x是否小于等于y。 |
a <= b 返回 True。 |
看示例:
print("8 == 13 : ", a == b)
print("8 != 13 : ", a != b)
print("8 > 13 : ", a > b)
print("8 < 13 : ", a < b)
#运行结果
8 == 13 : False
8 != 13 : True
8 > 13 : False
8 < 13 : True

逻辑运算符
Python语言支持逻辑运算符,以下假设变量 a 为 0, b为 1:
运算符 |
逻辑表达式 |
描述 |
实例 |
and |
x and y |
布尔"与" 当x 和 y 都为 True 时返回 True,否则返回False |
a and b 返回 False。 |
or |
x or y |
布尔"或" 当 x 和 y 都为 False 时返回 False,否则返回True |
a or b 返回 True。 |
not |
not x |
布尔"非" 把 not 理解为杠精,一定要反着来 x 为 True 返回 False, x 为 False 返回 True。 |
not(a and b) 返回False |
示例:
x = True
y = False
print("True and False : ", x and y)
print("True or False : ", x or y)
print("not False : ", not y)
print("not True : ", not x)
#运行结果
True and False : False
True or False : True
not False : True
not True : False
优先级问题
当一个表达式存在多个运算符的时候,可能出现以下情况:
加法运算符说:“我先到的,我先计算!”
乘法运算符说:“哥我运算一次够你翻几个圈了,哥先来!”
减法运算符说:“你糊涂了,我现在被当成负号使用,没有我,你们再努力,结果也是得到相反的数!”
除法运算符这时候默默地说:“抢吧抢吧,我除以零,大家同归于尽!”
为了防止以上矛盾的出现,我们规定了运算符的优先级,当多个运算符同时出现在一个表达式的时候,严格按照优先级规定的级别来进行运算。
先乘、除,后加、减,如有括号先运行括号里边的。没错,从小学我们就学到了运算符优先级的精髓,在编程中也是这么继承下来的。不用刻意去背。当然,在适当的地方加上括号强调一下优先级,我觉得会是更好的方案。
以下表格列出了从最高到最低优先级的所有运算符:
优先级 |
运算符 |
描述 |
1 |
() |
小括号 |
2 |
** |
算术运算符(指数 ) |
3 |
~ |
位运算(位反) |
4 |
+, - |
算术运算符(正负号) |
5 |
*, /, %, // |
算术运算符(乘,除,求余数和取整除) |
6 |
+, - |
算术运算符(加、减) |
7 |
>>, << |
位运算(右移,左移) |
8 |
& |
位运算(位与) |
9 |
^ |
位运算(位异或) |
10 |
|
|
11 |
<=, <, > , >=,== , != |
比较运算符 |
12 |
*=, %=, /=, //=, -=, +=, = ,= |
赋值运算符 |
13 |
not |
逻辑运算符(逻辑非) |
14 |
and or |
逻辑运算符(逻辑与、逻辑或) |
以下实例演示了Python所有运算符优先级的操作:
结果 = (2 + 3) * 5 - 80 / 2 ** 3
print("(2 + 3) * 5 - 80 / 2 ** 3 运算结果为:", 结果)
# 运行结果
(2 + 3) * 5 - 80 / 2 ** 3 运算结果为: 15.0
运算步骤如下:
- *5 5 - 80 / 2 3
- *5 5 - 80 / 8**
- 25 - 80 / 8
- 25 - 10.0
- 15.0
分支语句
我们在前面写的代码中大都是一些简单的语句,所写的代码相当于一个命令清单,Python会从上到下的进行执行,一条道走到黑,我们要想把程序设计得更聪明点——比如可以根据不同的条件执行不同的任务,这就是条件分支,学习流程控制方面最基础的条件分支语句 if。
如何控制程序的流程,使得程序具有“判断能力”,就像人脑一样能够分析问题呢? 首先要分析问题可能存在的各种不同情况,通过对不同情况的判断,让程序根据不同的情况做出相应的处理。
比如:现在我们要准备编写一个猜数字游戏,游戏的逻辑流程是:
- 首先在游戏中随机生成一个0到10的数字。
- 提示用户在控制台输入一个数值去和生成的数字进行比较,如果两个数值相等表示猜对,输出“鸿** **运当头,恭喜恭喜”。
- 输入的数值比生成的数值大的情况输出:“不好意思,您猜大了”,相反则输出:“您猜的有点小”。
来一起看个具体情况:
假设随机生成的数是7,用户输入3,程序输出 “您猜的有点小”;如果用户输入9,程序输出 “不好意思,您猜大了“。
要想完成这个简单的游戏,我们就需要学习使用条件语句 if 结合刚刚学过的比较运算符(>)、小于号(<)以及等于号(==)。
Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块,我们先来看看 if 结构的语法,如下图:

if 结构执行流程如下图:

学习了 if 语句,猜数字游戏写起来:
import random
谜底数字 = random.randint(0, 10)
输入的字符串 = input("我设了个数字,你来猜猜看:")
猜测数字 = int(输入的字符串)
if 猜测数字 == 谜底数字:
print("鸿运当头,恭喜恭喜:")
if 猜测数字 > 谜底数字:
print("不好意思,您猜大了,谜底数字是:", 谜底数字)
if 猜测数字 < 谜底数字:
print("您猜的有点小,谜底数字是:", 谜底数字)
上面的程序虽然实现了对情况的判断,但是显得有点木讷呆板,怎么改进呢,来学习一下 if -else 结构,语法如下图:

if-else 结构执行流程如下图:

我们来尝试改进一下猜数字游戏:
import random
谜底数字 = random.randint(0, 10)
输入的字符串 = input("我设了个数字,你来猜猜看:")
猜测数字 = int(输入的字符串)
if 猜测数字 == 谜底数字:
print("鸿运当头,恭喜恭喜:")
if 猜测数字 > 谜底数字:
print("不好意思,您猜大了,谜底数字是:", 谜底数字)
else:
print("您猜的有点小,谜底数字是:", 谜底数字)
if-else 结构在处理只有两种条件的情况下非常的方便,像我们猜数字游戏有三种情况的时候可以使用 if 嵌套,所谓 if 嵌套就是在 if 或 else 语句组里面再假如if-else 结构,语法如下:
if 条件表达式1:
if 条件表达式2:
语句块1
else:
语句块2
else:
if 条件表达式3:
语句块3
else:
语句块4
利用 if 嵌套我们可以对猜数字游戏进行改进:
import random
谜底数字 = random.randint(0, 10)
输入的字符串 = input("我设了个数字,你来猜猜看:")
猜测数字 = int(输入的字符串)
if 猜测数字 == 谜底数字:
print("鸿运当头,恭喜恭喜:")
else:
if 猜测数字 > 谜底数字:
print("不好意思,您猜大了,谜底数字是:", 谜底数字)
else:
print("您猜的有点小,谜底数字是:", 谜底数字)
对于猜测数字游戏这种会出现3种的条件的情形下,除了可以使用 if 嵌套还可以使用 if-elif-else 结构(可以理解为是 if 嵌套的缩写模式) ,使用语法如下图:
面对猜测数字会出现3种的条件的情形下,该请出 if-elif-else 结构了,使用语法如下图:

if-elif-else 结构执行流程:

有了 if-elif-else 我们再来对猜数字游戏进行改进。
import random
谜底数字 = random.randint(0, 10)
输入的字符串 = input("我设了个数字,你来猜猜看:")
猜测数字 = int(输入的字符串)
if 猜测数字 == 谜底数字:
print("鸿运当头,恭喜恭喜:")
elif 猜测数字 > 谜底数字:
print("不好意思,您猜大了,谜底数字是:", 谜底数字)
else:
print("您猜的有点小,谜底数字是:", 谜底数字)
这样我们就完成了猜数字游戏,使用if-elif-else结构让程序代码的逻辑清晰易读。
上面学习了条件分支语句的三种结构,条件分支通常会结合比较运算和逻辑运算结合使用,在程序中应用频率非常的高。在使用过程中有一些需要注意的点。
分支语句使用注意:
1、每个条件后面要使用冒号 :,表示接下来是满足条件后要执行的语句块。
2、使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。