3. Python 基础回顾:变量、数据类型、列表、字典、元组、集合
在深入数据分析和实时监控大屏开发之前,必须牢固掌握 Python 的核心数据结构。本章将系统回顾变量与六大内置类型,重点对比它们的可变性、有序性及适用场景,为后续的 Pandas 数据处理和 WebSocket 数据推送打下坚实基础。
3.1 变量与动态类型
Python 是动态类型语言,变量无需声明类型,赋值即创建。变量名本质上是对象的引用。
| 特性 | 说明 | 示例 |
|---|---|---|
| 动态类型 | 变量类型由运行时赋值决定 | x = 10 → int;x = "abc" → str |
| 强类型 | 不同类型间不会隐式转换 | "1" + 2 抛出 TypeError |
| 引用语义 | 变量存储对象的内存地址 | a = [1,2]; b = a 指向同一列表 |
| 命名规则 | 字母/下划线开头,区分大小写 | _count、dataStream 合法 |
监控大屏提示: 在实时刷新场景中,频繁使用变量重新绑定来更新数据源,例如
current_data = fetch_latest(),旧对象会被垃圾回收,不会造成内存泄漏。
3.2 基本数据类型
Python 内置的基本类型包括数字、字符串和布尔值,它们是构建复杂数据结构的原子单元。
- 整数 (int):无大小限制,支持二进制、八进制、十六进制字面量。
- 浮点数 (float):双精度 64 位,注意精度问题(如
0.1 + 0.2)。 - 字符串 (str):不可变序列,支持 Unicode,常用方法
split()、join()、format()。 - 布尔值 (bool):
True/False,是 int 的子类(True == 1)。 - 空值 (NoneType):
None表示缺失或空状态。
# 基本类型示例
count = 1024 # int
temperature = 36.5 # float
device_id = "sensor_01" # str
is_online = True # bool
last_value = None # NoneType
# 类型检查
print(type(count)) # <class 'int'>
print(isinstance(temperature, float)) # True
3.3 列表 (List) —— 有序可变序列
列表是最常用的容器,支持任意类型混合存储,适合存储时序数据点或待处理任务队列。
| 操作 | 代码示例 | 结果 |
|---|---|---|
| 创建 | data = [1, 2.5, "a"] | [1, 2.5, 'a'] |
| 索引 | data[0] | 1 |
| 切片 | data[1:3] | [2.5, 'a'] |
| 追加 | data.append(True) | [1, 2.5, 'a', True] |
| 删除 | data.pop(1) | 返回 2.5,列表变为 [1, 'a', True] |
| 推导式 | [x*2 for x in range(5)] | [0, 2, 4, 6, 8] |
监控应用: 使用列表缓存最近 N 条实时数据,实现滑动窗口统计。
window = []; window.append(new_point); if len(window) > 100: window.pop(0)
3.4 字典 (Dict) —— 键值映射
字典通过哈希表实现 O(1) 查找,是配置参数、JSON 解析、聚合数据的核心结构。
# 字典定义与操作
sensor_config = {
"id": "temp_01",
"unit": "celsius",
"threshold": 80.0,
"alerts": []
}
# 访问与修改
print(sensor_config["unit"]) # celsius
sensor_config["threshold"] = 85.0 # 更新阈值
sensor_config["alerts"].append("高温") # 操作嵌套列表
# 安全获取
value = sensor_config.get("location", "default_room")
# 遍历
for key, val in sensor_config.items():
print(f"{key}: {val}")
| 方法 | 作用 | 时间复杂度 |
|---|---|---|
dict[key] | 获取值,key 不存在则抛出 KeyError | O(1) |
dict.get(key, default) | 安全获取,不存在返回默认值 | O(1) |
dict.setdefault(key, default) | key 不存在时插入默认值 | O(1) |
dict.update(other) | 合并另一个字典 | O(n) |
dict.pop(key) | 删除并返回值 | O(1) |
3.5 元组 (Tuple) —— 不可变序列
元组一旦创建不可修改,适合存储固定结构的数据,如坐标、数据库连接参数、函数多返回值。
- 定义:
point = (10, 20)或single = (1,)(逗号不可省略)。 - 解包:
x, y = point直接赋值给多个变量。 - 作为字典键:元组可哈希,
cache[(lat, lng)] = value。 - 性能:比列表占用更少内存,迭代速度略快。
# 元组典型用法
db_config = ("localhost", 5432, "monitor_db")
host, port, db_name = db_config # 解包
# 函数返回多个值
def get_min_max(data):
return min(data), max(data)
low, high = get_min_max([23, 45, 12, 67])
print(f"范围: {low} ~ {high}")
3.6 集合 (Set) —— 无序不重复
集合基于哈希表实现,用于去重、交集/并集/差集运算,在监控告警去重和标签管理中非常实用。
| 运算 | 符号 | 方法 | 示例 |
|---|---|---|---|
| 并集 | | | union() | {1,2} | {2,3} → {1,2,3} |
| 交集 | & | intersection() | {1,2} & {2,3} → {2} |
| 差集 | - | difference() | {1,2} - {2,3} → {1} |
| 对称差 | ^ | symmetric_difference() | {1,2} ^ {2,3} → {1,3} |
| 子集 | <= | issubset() | {1} <= {1,2} → True |
# 集合去重与告警标签管理
alert_tags = {"critical", "high", "medium", "low"}
active_alerts = {"high", "low", "info"}
# 找出需要升级的告警
critical_alerts = alert_tags & active_alerts
print(f"需关注: {critical_alerts}")
# 去重统计
device_ids = ["s1", "s2", "s1", "s3", "s2"]
unique_devices = set(device_ids)
print(f"独立设备数: {len(unique_devices)}")
3.7 数据结构对比总览
3.8 可变与不可变 —— 关键区别
理解可变性对数据刷新机制至关重要:可变对象(列表、字典、集合)可以在原地址修改,不可变对象(元组、字符串、数字)每次修改都会创建新对象。
常见陷阱: 将可变对象作为函数默认参数会导致状态累积。
def add_item(item, lst=[]): lst.append(item); return lst —— 多次调用会共享同一个列表。
# 可变性演示
# 列表可变
a = [1, 2, 3]
b = a
b.append(4)
print(a) # [1, 2, 3, 4] —— a 也被修改
# 元组不可变
c = (1, 2, 3)
d = c
# d[0] = 99 # TypeError: 'tuple' object does not support item assignment
d = (99, 2, 3) # 创建新元组
print(c) # (1, 2, 3) —— 原元组不变
3.9 实践:监控数据包解析
综合运用上述数据结构,模拟解析一条来自传感器的 JSON 格式数据包。
# 模拟原始数据包(字符串)
raw_packet = '{"sensor_id":"S01","ts":1700000000,"values":[23.5,24.1,22.8],"tags":["indoor","floor1"]}'
import json
data = json.loads(raw_packet) # 解析为字典
# 提取关键字段
sensor_id = data["sensor_id"] # 字符串
timestamps = (data["ts"],) # 元组包装
readings = data["values"] # 列表
unique_tags = set(data["tags"]) # 集合去重
# 计算统计
avg_temp = sum(readings) / len(readings)
print(f"传感器 {sensor_id} 平均温度: {avg_temp:.1f}°C")
print(f"标签: {unique_tags}")
大屏刷新优化: 使用
collections.deque 替代列表实现固定长度滑动窗口,deque(maxlen=100) 自动丢弃旧数据,避免手动 pop(0) 的 O(n) 开销。