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 不存在则抛出 KeyErrorO(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 数据结构对比总览

Python 核心数据结构对比图 列表 (List) • 有序可变序列 • 任意类型混合 • 支持索引/切片 • 时间复杂度 O(n) 查找 字典 (Dict) • 键值映射 • 哈希表 O(1) 查找 • 键必须可哈希 • JSON 数据核心 元组 (Tuple) • 有序不可变 • 可哈希,可作字典键 • 内存占用小 • 函数多返回值 集合 (Set) • 无序不重复 • 集合运算 (交并差) • 快速去重 • 成员检测 O(1) 字符串 (Str) • 不可变字符序列 • Unicode 支持 • 丰富方法 (split/join) • 格式化输出 数字 (Number) • int / float / complex • 无大小限制整数 • 浮点精度注意 • 布尔是 int 子类 可变类型:列表、字典、集合 | 不可变类型:元组、字符串、数字

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) 开销。