3.Python 中的基础数据类型
Python 中的基础数据类型
1 为什么要学习数据类型
变量用来存储数据,而生活中的数据类型繁多:例如「我是小红」与 3.14,「我是小红」是一条句子、3.14 是一个数字,二者属于不同类型的数据,支持的操作也不同——句子可以切分成词语,数字可以做加减;存储它们所需的空间大小也不一样。因此,为了方便存储、管理及操作不同类型的数据,Python 对数据的类别做了划分,并让每种类型支持各自的操作。
为应对不同业务需求,Python 把数据分为不同类型,如下图所示:

面试题:
问题:请手写出 Python 中的 7 种数据类型?
答:数值类型、布尔类型、字符串类型、列表类型、元组类型、集合类型、字典类型。
问题:如何判断一个变量到底是什么类型?
答:① 使用 type(变量名称),返回变量的数据类型。
② 使用 isinstance(变量名称, 数据类型),只能返回 True 或 False(真的还是假的)。
2 数值型
2.1 int(整型)
整数:2345, 10, 50。
Python 中,除 10 进制外还有三种进制:
- 二进制:以
0b或0B开头,数字为 0 1 - 八进制:以
0o或0O开头,数字为 0 1 2 3 4 5 6 7 - 十六进制:以
0x或0X开头,数字为 0 1 2 3 4 5 6 7 8 9 a b c d e f
这三种进制可以非常方便地进行位运算,位运算知识后续介绍。
12 # 十进制
0b101 # 二进制
0o10 # 八进制
0xff # 十六进制
0xf # 十六进制
0x10 # 十六进制


使用 int() 实现类型转换
- 浮点数直接舍去小数部分,如
int(9.9)结果为9。 - 布尔值
True转为1,False转为0,如int(True)结果为1。 - 字符串若符合整数格式(浮点数格式不行),则直接转为对应整数,否则报错。
# 类型转换
int(9.9) # 浮点数直接舍去小数部分
int(True) # 布尔类型 True 为 1
int(False) # 布尔类型 False 为 0
int('456') # 字符串符合整数格式转换成对应整数


自动转型
整数和浮点数混合运算时,表达式结果自动转型成浮点数。比如:2+8.0 的结果是 10.0。
# 自动转型
2 + 8.0

整数可以有多大
Python 2 中,int 是 32 位,可存储 -2147483648 到 +2147483647 的整数(约 ±21 亿);long 类型是 64 位,可存储 $-2{63}$~$2$ 之间的数值。
Python 3 中,int 可以存储任意大小的整数,long 被取消。甚至可以存储下面这样的值:
googol = 10 ** 100
googol

Python 3 中可以做超大数的计算而不会造成整数溢出,这也是 Python 特别适合科学运算的原因。
2.2 float(浮点型)
小数:3.14,或科学计数法 314e-2。
浮点数类型称为 float。
浮点数用 $a*b^{10}$ 形式的科学计数法表示,例如 3.14 可写成 314E-2 或 314e-2。
这些数字在内存中也按科学计数法存储。
# 浮点数
3.14
314e-2 # 科学计数法
314E-2 # 科学计数法

类型转换和四舍五入
-
与
int()类似,也可以用float()把其他类型转成浮点数。 -
整数与浮点数混合运算时,结果自动转型为浮点数,如
2 + 8.0结果为10.0。 -
round(value)可返回四舍五入的值。注:它不会改变原值,而是产生一个新值。
# 类型转换
float(10) # 整数转浮点数
float(True) # 布尔转浮点数
float(False)
float('123') # 字符串转浮点数
# 浮点数转整数
int(3.6) # 用 int() 转直接舍去小数部分
round(3.6) # 用 round() 可以实现四舍五入
import math
print(math.ceil(3.6)) # 右取整,上取整 4
print(math.floor(3.6)) # 左取整,下取整 3 与 int 函数功能相同



2.3 时间的表示
计算机中时间的表示从 1970 年 1 月 1 日 00:00:00 开始,以秒计算。我们也把 1970 年这个时刻称为 Unix 时间点。
这样,时间就全部可以用数字来表示了。

Python 中可以通过 time.time() 获得当前时刻,返回以秒为单位、带微秒(1/1000 毫秒)精度的浮点值。
例如:
import time
b = time.time()
print(type(b))
print(b)
int(b)
total_minutes = b / 60
total_minutes
total_minutes = b // 60
total_hours = total_minutes // 60
total_days = total_hours // 24
total_years = total_days // 365


2.4 数字和算数运算符
Python 支持整数(如 50、520)和浮点数(如 3.14、10.0、1.23e2),可以对数字做如下运算。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
+ |
加法 | 3+2 |
5 |
- |
减法 | 30-5 |
25 |
* |
乘法 | 3*6 |
18 |
/ |
浮点数除法 | 8/2 |
4.0 |
// |
整数除法 | 7//2 |
3 |
% |
模(取余) | 7%4 |
3 |
** |
幂 | 2**3 |
8 |
a = 7 / 2 # 除法结果为小数
a = 7 // 2 # 整除结果为整数
a = 7 % 2 # 取余
7 % 4
2 ** 3 # 幂运算
divmod(10, 5) # 返回一个元组,(整除结果, 余数)
divmod(10, 3)


使用 divmod() 函数同时得到商和余数:
divmod(13, 3)
divmod() 是一个函数(后续详细介绍),返回一个元组(后续也会学到)。
2.5 复合赋值运算符
运算符 +、-、*、/、//、**、% 与赋值符 = 结合,可以构成复合赋值运算符。
a = a + 1 等价于 a += 1:
| 运算符 | 例子 | 等价 |
|---|---|---|
+= |
a += 2 |
a = a + 2 |
-= |
a -= 2 |
a = a - 2 |
*= |
a *= 2 |
a = a * 2 |
/= |
a /= 2 |
a = a / 2 |
//= |
a //= 2 |
a = a // 2 |
**= |
a **= 2 |
a = a ** 2 |
%= |
a %= 2 |
a = a % 2 |
3 布尔型
Python 2 中没有布尔值,直接用数字 0 表示 False、数字 1 表示 True。
Python 3 中,True 和 False 被定义为关键字,但它们的本质仍是 1 和 0,甚至可以与数字相加。
bool 类型是 int 类型的一个子类。
a = True
b = 3
a + b
b = True
isinstance(b, int)


True 代表 1、False 代表 0,但更重要的是:Python 中任何一个数据对象要么为 True、要么为 False,因此可以直接用在布尔测试的表达式中,不必非要通过大小比较或函数测试。
if "a":
pass
while 1:
pass
可以用 bool() 函数测试数据对象、表达式是 True 还是 False。例如:
print(bool())
print(bool(0))
print(bool(1))
print(bool('a'))
print(bool(''))

常见数据类型的真假:
- 整数值
0、浮点数值0.0等,以及空字符串,都为假。 None为假。- 空数据对象都为假,如
[]、{}、()等。
3.1 比较运算符
所有比较运算符返回 True 表示真,返回 False 表示假。
以下假设变量 a 为 15、变量 b 为 30:
| 运算符 | 描述 | 实例 |
|---|---|---|
== |
等于——比较对象的值是否相等 | (a == b) 返回 False |
!= |
不等于——比较两个对象的值是否不相等 | (a != b) 返回 True |
> |
大于——返回 x 是否大于 y | (a > b) 返回 False |
< |
小于——返回 x 是否小于 y | (a < b) 返回 True |
>= |
大于等于——返回 x 是否大于等于 y | (a >= b) 返回 False |
<= |
小于等于——返回 x 是否小于等于 y | (a <= b) 返回 True |
a = 15
b = 30
print(f"a == b: {a == b}")
print(f"a != b: {a != b}")
print(f"a > b: {a > b}")
print(f"a < b: {a < b}")
print(f"a >= b: {a >= b}")
print(f"a <= b: {a <= b}")

3.2 逻辑运算符
| 运算符 | 格式 | 说明 |
|---|---|---|
| or 逻辑或 | x or y |
x 为 True,则不计算 y,直接返回 True x 为 False,则返回 y |
| and 逻辑与 | x and y |
x 为 True,则返回 y 的值 x 为 False,则不计算 y,直接返回 False |
| not 逻辑非 | not x |
x 为 True,返回 False x 为 False,返回 True |
x = True
y = False
print(f"x and y: {x and y}")
print(f"x or y: {x or y}")
print(f"not x: {not x}")
print(f"not y: {not y}")

3.3 同一运算符
同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址。
| 运算符 | 描述 |
|---|---|
is |
is 是判断两个标识符是不是引用同一个对象 |
is not |
is not 是判断两个标识符是不是引用不同对象 |
is 与 == 的区别:
is判断两个变量引用的对象是否为同一个,即比较对象地址。==判断两个变量引用对象的值是否相等,默认调用对象的__eq__()方法。
a = ['str', 1]
b = ['str', 1]
print('a的地址:', id(a))
print('b的地址:', id(b))
print('a的内容:', a)
print('b的内容:', b)
print('a == b:', a == b)
print('a is b:', a is b)

整数缓存问题
- 命令行模式下,Python 仅对较小的整数对象进行缓存(范围
[-5, 256]),并非所有整数。
C 语言底层用数组实现,连续分配空间,便于查找。 - 文件模式下,所有数字都会被缓存,范围是
[-∞, +∞]。- 缓存实现:
[-5, 256]仍用数组实现;不在[-5, 256]范围内的数,缓存到链表中,不连续分配空间。
- 缓存实现:
总结
is比较两个对象的id值是否相等,是否指向同一内存地址;==比较两个对象的内容是否相等,值是否相等;is运算符比==效率高,在变量与None比较时,应使用is。
a = ['str', 1]
b = ['str', 1]
print('a的地址:', id(a))
print('b的地址:', id(b))
print('a的内容:', a)
print('b的内容:', b)
print('a == b:', a == b)
print('a is b:', a is b)
# 整数缓存问题
c = 1000
d = 1000
print(f'c的内容{c}; c的地址:{id(c)}')
print(f'd的内容{d}; d的地址:{id(d)}')
print('c == d:', c == d)
print('c is d:', c is d)


4 基本运算符
前面我们讲解了 +、-、*、/、//、% 等运算符,这里继续讲解其他运算符,并进行学习和测试。
| 运算符 | 说明 |
|---|---|
and,or,not |
布尔与、布尔或、布尔非 |
is,is not |
同一性判断,判断是否为同一个对象 |
<,<=,>,>=,!=,== |
比较值是否相当,可以连用 |
| ^ & |
按位或,按位异或、按位与 |
<<,>> |
移位 |
~ |
按位翻转 |
+,-,*,/,//,% |
加,减,乘,浮点除、整数除、取余 |
** |
幂运算 |
- 比较运算符可以连用,含义与日常写法完全一致。
a = 4
3 < a < 10 # 关系运算符可以连用

- 位操作
a = 0b11001
b = 0b01000
c = a | b # 按位或
d = a & b # 按位与
e = a ^ b # 按位异或
print(f'c的值:{c}', f'c的二进制表示:{bin(c)}')
print(f'a:{bin(a)}')
print(f'b:{bin(b)}')
print(f'c:{bin(c)}')
print(f'd:{bin(d)}')
print(f'e:{bin(e)}')
a = 4
# 左移 1 位相当于乘以 2; 左移 2 位,相当于乘以 4
print(a << 2)
# 右移 1 位相当于除以 2
print(a >> 1)

-
加法操作
-
数字相加
3+2 ==> 53 + 2
-
字符串拼接
"3"+"2" ==> "32"'3' + '2'
-
列表、元组等合并
[10,20,30]+[5,10,100] ==> [10,20,30,5,10,100][10, 20, 30] + [5, 10, 100]
-
-
乘法操作
-
数字相乘
3 * 2 ==> 63 * 2
-
字符串复制
"sxt" * 3 ==> "sxtsxtsxt"'sxt' * 3
-
列表、元组等复制
[10,20,30] * 3 ==> [10,20,30,10,20,30,10,20,30][10, 20, 30] * 3
-
5 复合赋值运算符
复合赋值可以让程序更精炼、提高效率。
| 运算符 | 描述 | 示例 | 等价于 |
|---|---|---|---|
+= |
加法赋值 字符串拼接 | sum += na += "sxt" |
sum = sum + na = a + "sxt" |
-= |
减法赋值 | num1 -= n |
num = num - n |
*= |
乘法赋值 | a *= b |
a = a * b |
/= |
浮点除赋值 | a /= b |
a = a / b |
//= |
整数除赋值 | a //= b |
a = a // b |
%= |
取余赋值 | a %= b |
a = a % b |
**= |
幂运算赋值 | a **= 2 |
a = a ** 2 |
<<= |
左移赋值 | a <<= 2 |
a = a << 2 |
>>= |
右移赋值 | a >>= 2 |
a = a >> 2 |
&= |
按位与赋值 | a &= b |
a = a & b |
|= |
按位或赋值 | a |= b |
a = a | b |
^= |
按位异或赋值 | a ^= b |
a = a ^ b |
注:与 C 和 Java 不同,Python 不支持自增(++)和自减(--)
6 运算符优先级问题
如下优先级从高到低排列。
| 运算符 | 描述 |
|---|---|
** |
指数(最高优先级) |
~ |
按位翻转 |
* / % // |
乘,除,取模和取整除 |
+ - |
加法减法 |
>> << |
右移,左移运算符 |
& |
位 'AND' |
^ | |
位运算符 |
<= < > >= |
比较运算符 |
== != |
等于运算符 |
is is not |
身份运算符 |
in not in |
成员运算符 |
not or and |
逻辑运算符 |
实际使用中,记住如下简单规则即可,复杂表达式一定要用小括号组织。
- 乘除优先加减
- 位运算和算术运算 > 比较运算符 > 赋值运算符 > 逻辑运算符
7 术语表(重要英文单词)
7.1 数据类型
| 术语 | 全拼 / 说明 | 释义 |
|---|---|---|
| int | Integer | 整型,Python 3 中任意精度,不会溢出 |
| float | Floating-point number | 浮点型,IEEE 754 双精度,有精度误差 |
| bool | Boolean | 布尔型,True / False;是 int 的子类 |
| NoneType | — | None 的类型,表示"无",单例 |
| literal | — | 字面量,源码中直接写出的常量值,如 0b101、3.14 |
| Epoch / Unix time | — | Unix 时间点,1970-01-01 00:00:00 UTC 起的秒数 |
| googol | — | 古戈尔,10 ** 100,1 后面 100 个零 |
7.2 运算与规则
| 术语 | 全拼 / 说明 | 释义 |
|---|---|---|
| operator | — | 运算符 |
| operand | — | 操作数,参与运算的对象 |
| precedence | — | 优先级,决定多个运算符的执行次序 |
| associativity | — | 结合性,同优先级时的求值方向(** 是右结合,其余多左结合) |
| floor division | — | 整除 //,向下取整 |
| modulo | — | 取模 %,求余数 |
| divmod | Divide + Modulo | 内建函数,一次返回 (商, 余数) 二元组 |
| compound assignment | — | 复合赋值,如 +=、//=、**= |
| chained comparison | — | 链式比较,如 3 < a < 10 |
| short-circuit | — | 短路求值,and/or 在确定结果后不再求后续表达式 |
| truthy / falsy | — | 真值 / 假值,对象在布尔上下文中的真假判定 |
| constant folding | — | 常量折叠,编译器合并同一编译单元内重复字面量的优化 |
| small integer cache | — | 小整数缓存,CPython 预建 [-5, 256] 的整数对象 |
| banker's rounding | — | 银行家舍入,.5 时取最近偶数,Python round() 的默认行为 |
| walrus operator | — | 海象运算符 :=,Python 3.8+,赋值表达式,优先级最低 |
7.3 异常
| 术语 | 全拼 / 说明 | 释义 |
|---|---|---|
SyntaxError |
— | 语法错误,编译期抛出,文件无法启动 |
ValueError |
— | 值错误,类型对但值不合法,如 int('3.14') |
ZeroDivisionError |
— | 除数为 0 时抛出 |
OverflowError |
— | 溢出错误(Python 3 的 int 不会触发,float 会) |
8 系列导航
9 参考链接
- Python 3 官方文档(中文)
- 内置类型 — 官方文档
- 运算符优先级 — 官方语言参考
- 真值测试 — 官方文档
round()内置函数 — 官方文档decimal模块(精确十进制)time模块 — 官方文档- PEP 285 — 加入 bool 类型
- PEP 572 — 海象运算符
分类:Python

浙公网安备 33010602011771号