Python 数据类型
计算机处理的本质是"数据",不同类型的数据需要用不同的方式存储和运算。Python 内置了丰富的标准数据类型,这一章我们重点讲数字、布尔、None这三个最基础的(字符串、列表、字典等容器类型后面单独成章)。
1. Python 的标准类型概览
Python 把数据类型按"是否可变"和"是否是容器"分成几类:
- 数字类型:int(整数)、float(浮点)、complex(复数)。不可变。
- 布尔类型:bool,只有 True / False。不可变。
- None 类型:NoneType,只有一个值 None。不可变。
- 序列类型:str(字符串)、list(列表)、tuple(元组)。list 可变,str/tuple 不可变。
- 映射类型:dict(字典)。可变。
- 集合类型:set(集合)、frozenset。set 可变,frozenset 不可变。
这一章先讲数字、布尔、None。其他类型后续章节展开。
2. 数字:int 与 float
# 1. 整数 int:Python 3 整数没有大小限制(不像 C/Java 有 int32/int64)
a = 42
b = -100
c = 0 # 0 也是 int
# 二进制(0b 开头)、八进制(0o)、十六进制(0x)
bin_num = 0b1010 # 等于十进制 10
oct_num = 0o17 # 等于十进制 15
hex_num = 0xFF # 等于十进制 255
print(bin_num, oct_num, hex_num) # 10 15 255
# 用下划线分隔大数,提高可读性(Python 3.6+)
population = 1_400_000_000 # 14 亿
print(population) # 1400000000
# 2. 浮点数 float:带小数点的数
pi = 3.14159
temp = -2.5
science = 1.5e8 # 科学计数法,等于 1.5 × 10^8 = 150000000.0
print(science) # 150000000.0
# 3. 复数 complex(数学/工程用,日常很少用)
z = 3 + 4j
print(z.real) # 3.0 实部
print(z.imag) # 4.0 虚部Python 3 的整数没有大小限制(不像 C/Java 的 int32 最大 21 亿),算大数完全没问题:
big = 10 ** 100 # 10 的 100 次方,一个 googol
print(big)
# 输出: 10000000000...0 (101 位,1 后面 100 个 0)浮点数精度陷阱:计算机用二进制存小数,有些数无法精确表示,会出现奇怪的结果:
print(0.1 + 0.2)
# 输出: 0.30000000000000004 <- 不是 0.3!
# 处理金额等需要精确的场景,用 decimal 模块
from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2")) # 0.33. 布尔 bool
布尔只有两个值,True(真)和 False(假),首字母必须大写。比较运算的结果就是布尔值。
# 布尔 bool:只有两个值,True 和 False(首字母必须大写)
is_open = True
is_closed = False
print(type(is_open)) # <class 'bool'>
# 比较运算的结果就是布尔值
print(10 > 3) # True
print(10 == 3) # False
print("abc" == "abc") # True
# 布尔值可以做算术(True=1,False=0)
print(True + True) # 2
print(True + False) # 1
print(True * 5) # 54. truthy 与 falsy
Python 在需要布尔值的场合(if、while、and/or),会把任意类型的值自动转成布尔。哪些算 False(称为 falsy),其余都算 True(truthy),记住下面 7 个 falsy 即可:
# 在 if/while 等需要布尔值的场合,以下值都被当作 False(假)
# 称为"falsy"值:
print(bool(0)) # False 数字 0
print(bool(0.0)) # False 浮点 0
print(bool("")) # False 空字符串
print(bool([])) # False 空列表
print(bool({})) # False 空字典
print(bool(None)) # False None
print(bool(())) # False 空元组
# 其他所有值都是 True(truthy)
print(bool(1)) # True
print(bool("a")) # True
print(bool([0])) # True (列表里有元素,哪怕只有 0)
print(bool("False")) # True (非空字符串都是 True,哪怕内容是 False)这个机制非常重要,在 if 判断里经常用:
name = input("你的名字:")
if name: # 等价于 if name != "":
print(f"你好,{name}")
else:
print("名字不能为空")5. None —— "什么都没有"
None 是一个特殊的值,表示"没有值"、"未定义"、"空"。类似其他语言的 null / nil / undefined。函数没有 return 时默认返回 None。
# None 是"什么都没有"的特殊值,类似其他语言的 null
result = None
print(type(result)) # <class 'NoneType'>
# 函数没有 return 时,默认返回 None
def greet():
print("hi")
r = greet() # 输出: hi
print(r) # None
# 判断是否为 None,用 is 而不是 ==
if r is None:
print("函数没返回值")
# 输出: 函数没返回值判断是否是 None,必须用 is 而不是 ==。这是约定俗成的写法,原因是 None 是单例(全局只有一个),is 比 == 更准确、更快。
6. 类型转换
不同类型之间可以用 int() / float() / str() / bool() 显式转换:
# 类型转换:用 int() / float() / str() / bool() 显式转换
# 字符串转数字
n = int("42") # 42
f = float("3.14") # 3.14
# int("3.14") # ❌ ValueError,字符串看起来像浮点数不能直接转 int
# 数字之间转换
print(int(3.9)) # 3 (浮点转整数,直接截断小数,不是四舍五入)
print(float(5)) # 5.0
print(round(3.5)) # 4 round 函数才是真正的四舍五入
# 任何类型转字符串
s1 = str(42) # "42"
s2 = str(3.14) # "3.14"
s3 = str([1, 2, 3]) # "[1, 2, 3]"
# 转 bool(配合前面讲的 falsy 规则)
print(bool(0)) # False
print(bool("非空")) # True新手常见错误:用 input() 读用户输入,得到的是字符串,直接做数学运算会出问题——必须先 int() 或 float() 转换:
age_str = input("你的年龄:") # 用户输入 "20",这是字符串
# print(age_str + 1) # ❌ TypeError: 字符串不能加整数
age = int(age_str) # 转成整数
print(age + 1) # 217. 查看类型:type 与 isinstance
# 1. type() 查看类型
x = 42
print(type(x)) # <class 'int'>
print(type("hi")) # <class 'str'>
print(type([1,2])) # <class 'list'>
# 2. isinstance() 判断是否是某类型(推荐,支持继承)
print(isinstance(x, int)) # True
print(isinstance(x, (int, float))) # True 可以传一个元组判断多种类型
print(isinstance("hi", str)) # True
# type() vs isinstance() 的区别:
# - type() 只能精确匹配,不考虑继承
# - isinstance() 考虑父类(面向对象时重要)
# 日常判断类型,优先用 isinstance()8. 可变 vs 不可变(核心概念)
这是 Python 一个非常重要的特性,会影响后面所有的数据结构:
- 不可变类型(immutable):int、float、bool、str、tuple。"修改"它们其实是创建了一个新对象,旧对象没变。
- 可变类型(mutable):list、dict、set。修改它们(如 list.append)就是原地改,对象身份不变。
# 不可变的例子
a = 10
b = a
a = a + 1 # a 指向了新的 11,但 b 还是 10
print(a, b) # 11 10
# 可变的例子(对比)
m = [1, 2]
n = m
m.append(3) # 原地修改 m,n 也跟着变(指向同一对象)
print(m, n) # [1, 2, 3] [1, 2, 3]理解这点能避免 80% 的"为什么我的列表莫名其妙变了"的 bug。
小结
这一章学了三个基础类型:int / float(数字)、bool(布尔)、None(空)。掌握了类型转换、type/isinstance、truthy/falsy 规则,以及最重要的可变 vs 不可变概念。下一篇看运算符——怎么对这些数据做运算。
← 上一篇 Python 变量
下一篇 Python 运算符 →