一、引言:为什么数据类型如此重要?
在 Python 编程中,数据类型决定了:
- 数据的存储方式
- 可以对数据执行的操作
- 数据的取值范围
- 不同类型之间的运算规则
理解数据类型是编写正确、高效程序的基础。Python 是动态类型语言,虽然你不需要显式声明类型,但必须清楚每个变量的类型及其行为。
二、Python 内置核心数据类型概览
Python 提供了丰富的内置数据类型,主要分为以下几类:
|-----------|----------------------------------|----------|
| 类别 | 数据类型 | 说明 |
| 数字类型 | int
, float
, complex
| 数值计算 |
| 文本类型 | str
| 字符串处理 |
| 布尔类型 | bool
| 逻辑判断 |
| 序列类型 | list
, tuple
, range
| 有序数据集合 |
| 映射类型 | dict
| 键值对存储 |
| 集合类型 | set
, frozenset
| 无序唯一元素集合 |
| 二进制类型 | bytes
,bytearray
,memoryview
| 二进制数据处理 |
💡 本文将重点讲解最常用的核心类型。
三、数字类型(Numeric Types)
1. 整数(int)
表示整数值,没有大小限制(仅受内存限制)。
age = 25
temperature = -10
big_number = 123456789012345678901234567890
常用操作:
a = 10
b = 3
print(a + b) # 13 加法
print(a - b) # 7 减法
print(a * b) # 30 乘法
print(a / b) # 3.333... 除法(结果为 float)
print(a // b) # 3 整除
print(a % b) # 1 取余
print(a ** b) # 1000 幂运算
⚠️ 注意:/
运算符总是返回浮点数 ,即使结果是整数(如 4 / 2
返回 2.0
)。
2. 浮点数(float)
表示带小数点的数字,遵循 IEEE 754 标准。
price = 19.99
pi = 3.1415926535
scientific = 1.5e-4 # 科学计数法,等于 0.00015
浮点数精度问题:
print(0.1 + 0.2) # 输出:0.30000000000000004
print(0.1 + 0.2 == 0.3) # False!
✅ 解决方案 :使用 decimal
模块进行高精度计算(如金融计算):
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2') == Decimal('0.3')) # True
3. 复数(complex)(了解即可)
用于数学和工程计算,形式为 a + bj
。
z = 3 + 4j
print(z.real) # 3.0
print(z.imag) # 4.0
四、文本类型:字符串(str)
字符串是字符的序列,用单引号、双引号或三引号包围。
name = "Alice"
message = 'Hello, World!'
multi_line = """这是一个
多行字符串"""
字符串的常用操作
1. 字符串拼接
first = "Hello"
last = "World"
full = first + " " + last # "Hello World"
✅ 推荐使用 f-string(Python 3.6+):
name = "Alice"
age = 25
print(f"我是{name},今年{age}岁。")
2. 字符串索引与切片
text = "Python"
print(text[0]) # 'P' 第一个字符
print(text[-1]) # 'n' 最后一个字符
print(text[1:4]) # 'yth' 切片 [start:end)
print(text[:3]) # 'Pyt' 从开头到索引3(不含)
print(text[3:]) # 'hon' 从索引3到结尾
3. 常用字符串方法
|----------------------|-----------|------------------------------------------|
| 方法 | 说明 | 示例 |
| .upper()
| 转大写 | "hello".upper()
→ "HELLO"
|
| .lower()
| 转小写 | "HELLO".lower()
→ "hello"
|
| .strip()
| 去除首尾空白 | " abc ".strip()
→ "abc"
|
| .replace(old, new)
| 替换 | "abc".replace("a", "x")
→ "xbc"
|
| .split(sep)
| 分割 | "a,b,c".split(",")
→ ['a', 'b', 'c']
|
| .join(list)
| 连接 | "-".join(['a','b','c'])
→ "a-b-c"
|
| .find(sub)
| 查找位置 | "abc".find("b")
→ 1
|
| .startswith()
| 是否以某字符串开头 | "abc".startswith("a")
→ True
|
email = " Alice@EXAMPLE.COM "
clean_email = email.strip().lower()
print(clean_email) # "alice@example.com"
五、布尔类型(bool)
布尔值只有两个:True
和 False
,用于逻辑判断。
is_student = True
has_permission = False
布尔值的来源:
-
比较运算的结果
-
条件判断的结果
-
任何对象都可以被"真值测试"
print(5 > 3) # True
print(10 == 10) # True
print("hello" != "") # True真值测试(Truthiness)
print(bool(1)) # True
print(bool(0)) # False
print(bool("abc")) # True
print(bool("")) # False
print(bool([1, 2])) # True
print(bool([])) # False
✅ 规则 :空值(0
, ""
, []
, {}
, None
)为 False
,其他为 True
。
六、序列类型
1. 列表(list)------ 有序、可变
列表是最常用的数据结构,可以存储不同类型的数据。
fruits = ["苹果", "香蕉", "橙子"]
numbers = [1, 2, 3, 4, 5]
mixed = ["Alice", 25, True, 3.14]
列表的常用操作:
# 访问元素
print(fruits[0]) # "苹果"
print(fruits[-1]) # "橙子"
# 修改元素
fruits[1] = "葡萄"
# 添加元素
fruits.append("草莓") # 末尾添加
fruits.insert(1, "芒果") # 在索引1处插入
# 删除元素
fruits.remove("苹果") # 删除指定值
del fruits[0] # 删除索引0的元素
popped = fruits.pop() # 弹出并返回末尾元素
# 列表长度
print(len(fruits))
# 列表切片(同字符串)
print(numbers[1:4]) # [2, 3, 4]
# 遍历列表
for fruit in fruits:
print(fruit)
列表推导式(List Comprehension)
一种简洁创建列表的方式:
# 普通方式
squares = []
for x in range(1, 6):
squares.append(x**2)
# 推导式方式(推荐)
squares = [x**2 for x in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# 带条件的推导式
evens = [x for x in range(10) if x % 2 == 0]
2. 元组(tuple)------ 有序、不可变
元组与列表相似,但创建后不能修改。
coordinates = (10, 20)
person = ("张三", 25, "北京")
single_item = (42,) # 单个元素的元组,必须加逗号
元组的特点:
-
更安全:防止意外修改
-
性能略高:占用内存更少
-
可作为字典的键(列表不行)
访问元素(同列表)
print(person[0]) # "张三"
不可修改
person[0] = "李四" # TypeError!
3. range 对象
表示一个不可变的数字序列,常用于 for
循环。
r1 = range(5) # 0, 1, 2, 3, 4
r2 = range(1, 6) # 1, 2, 3, 4, 5
r3 = range(0, 10, 2) # 0, 2, 4, 6, 8 (步长为2)
for i in range(3):
print(i) # 0, 1, 2
💡 range
不是列表,但可以转换:
list(range(5)) # [0, 1, 2, 3, 4]
七、映射类型:字典(dict)
字典是键值对(key-value)的集合,类似于现实生活中的"字典"。
student = {
"name": "王五",
"age": 22,
"city": "上海",
"grades": [85, 90, 78]
}
字典的常用操作:
# 访问值
print(student["name"]) # "王五"
print(student.get("age")) # 22
print(student.get("phone", "未知")) # 安全访问,键不存在时返回默认值
# 修改/添加值
student["age"] = 23 # 修改
student["major"] = "计算机" # 添加新键值对
# 删除键值对
del student["city"]
popped = student.pop("grades") # 弹出并返回值
# 遍历字典
for key in student:
print(f"{key}: {student[key]}")
# 推荐的遍历方式
for key, value in student.items():
print(f"{key}: {value}")
# 获取所有键、值、键值对
print(student.keys()) # dict_keys(['name', 'age', 'major'])
print(student.values()) # dict_values(['王五', 23, '计算机'])
print(student.items()) # dict_items([('name', '王五'), ...])
字典推导式
# 创建平方数字典
squares_dict = {x: x**2 for x in range(1, 6)}
print(squares_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
八、集合类型
1. 集合(set)------ 无序、唯一
集合存储不重复的元素,且无序。
unique_numbers = {1, 2, 3, 3, 4}
print(unique_numbers) # {1, 2, 3, 4} 重复的3被自动去除
集合的常用操作:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# 并集
print(set1 | set2) # {1, 2, 3, 4, 5}
print(set1.union(set2))
# 交集
print(set1 & set2) # {3}
print(set1.intersection(set2))
# 差集
print(set1 - set2) # {1, 2}
print(set1.difference(set2))
# 对称差集
print(set1 ^ set2) # {1, 2, 4, 5}
# 添加/删除
set1.add(4)
set1.remove(1) # 元素必须存在
set1.discard(10) # 元素不存在也不会报错
2. 冻结集合(frozenset)
不可变的集合,可以作为字典的键。
fset = frozenset([1, 2, 3])
# fset.add(4) # AttributeError!
九、类型转换(Type Casting)
Python 允许在不同类型之间转换。
|----------|-------------------|---------------------------------|
| 函数 | 说明 | 示例 |
| int(x) | 将参数转换为整数类型 | int("123") → 123 |
| float(x) | 将参数转换为浮点数类型 | float("3.14") → 3.14 |
| str(x) | 将参数转换为字符串类型 | str(100) → "100" |
| bool(x) | 将参数转换为布尔值类型 | bool(1) → True |
| list(x) | 将参数转换为列表类型 | list("abc") → ['a', 'b', 'c'] |
| tuple(x) | 将参数转换为元组类型 | tuple([1, 2]) → (1, 2) |
| set(x) | 将参数转换为集合类型,去除重复元素 | set([1, 2, 2]) → {1, 2} |
| dict(x) | 将一系列键值对转换为字典类型 | 需要提供键值对序列 |
请注意,对于`dict(x)`函数的具体示例,通常需要给出一个由键值对组成的可迭代对象作为输入。例如,可以使用列表中的元组来创建字典:dict([("key1", "value1"), ("key2", "value2")])将会得到{"key1": "value1", "key2": "value2"}这样的结果。
# 示例:用户输入通常是字符串,需要转换
age_str = input("请输入年龄:") # "25"
age_int = int(age_str)
print(age_int + 5) # 30
⚠️ 转换失败会抛出异常:
int("abc") # ValueError!
十、总结:Python 数据类型核心要点
|----------------|---------|----------------|---------|-----------|
| 类型 | 可变性 | 有序性 | 唯一性 | 典型用途 |
| int
/ float
| ❌ | ❌ | ❌ | 数值计算 |
| str
| ❌ | ✅ | ❌ | 文本处理 |
| bool
| ❌ | ❌ | ❌ | 逻辑判断 |
| list
| ✅ | ✅ | ❌ | 存储有序数据列表 |
| tuple
| ❌ | ✅ | ❌ | 存储不可变数据序列 |
| dict
| ✅ | ✅(Python 3.7+) | 键唯一 | 存储键值对映射 |
| set
| ✅ | ❌ | ✅ | 存储唯一元素集合 |
学习建议:
- 熟练掌握 int**,** float**,** str**,** bool**,** list**,** dict ------ 这是最常用的五种类型。
- 理解可变与不可变的区别 :
list
可变,tuple
不可变。 - 善用推导式:让代码更简洁高效。
- 注意类型转换:特别是用户输入和文件读取时。
📌 动手练习:
-
创建一个包含你个人信息的字典(姓名、年龄、城市等)。
-
创建一个列表,存储你喜欢的电影,并用
for
循环打印。 -
使用
set
找出两个列表的共同元素。示例练习
my_info = {"name": "你的名字", "age": 20, "hobbies": ["阅读", "编程"]}
print(f"我叫{my_info['name']},爱好是{', '.join(my_info['hobbies'])}。")