Python 进阶:元组、字典、集合与函数全解析(2026 版)
这四个部分是 Python 中最常用也最能体现 Python 语言特性的内容。掌握它们的高级用法,能显著提升代码的简洁性、性能和可维护性。
1. 元组(Tuple)—— 不可变序列
1.1 核心特性
- 不可变(immutable):创建后不能修改、添加、删除元素
- 可哈希:可作为
dict的 key 或set的元素 - 性能更好:比列表更省内存、访问更快
1.2 进阶用法
# 1. 命名元组(推荐)
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y) # 像对象一样访问
# 2. 元组解包(Tuple Unpacking)
a, b = (1, 2)
x, y, *rest = (1, 2, 3, 4, 5) # *rest 收集剩余元素
first, *middle, last = range(10)
# 3. 只含一个元素的元组(易错点)
t1 = (1) # 这是一个整数!
t2 = (1,) # 这才是元组
# 4. 作为 dict 的 key
locations = {
(39.9, 116.3): "北京",
(31.2, 121.5): "上海"
}
适用场景:函数返回多个值、固定配置数据、作为 dict key 等。
2. 字典(Dict)—— Python 最强大的数据结构
2.1 现代字典特性(Python 3.7+ 保证有序)
# 合并与更新(Python 3.9+)
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
d3 = d1 | d2 # 合并(推荐)
d1 |= d2 # 原地更新
# 字典解包
def func(**kwargs):
print(kwargs)
func(**d1, **d2)
2.2 进阶技巧
# 1. defaultdict
from collections import defaultdict
dd = defaultdict(list)
dd['key'].append(1) # 不需要提前判断
# 2. dict.get() 的高级用法
value = data.get('key', '默认值')
# 3. setdefault(原子操作)
user = {}
user.setdefault('groups', []).append('admin')
# 4. 字典推导式
squares = {x: x**2 for x in range(10) if x % 3 != 0}
# 5. 视图对象(View)
for key in d.keys(): # keys() 返回动态视图
...
# 6. 键存在检查(推荐写法)
if key in d: # 比 d.get() 更快
性能提示:字典查找、插入、删除平均时间复杂度为 O(1)。
3. 集合(Set)—— 去重与数学运算
3.1 核心特性
- 无序、不重复
- 元素必须可哈希
- 数学集合操作支持极好
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# 集合运算
a | b # 并集
a & b # 交集
a - b # 差集
a ^ b # 对称差集
# 子集/超集判断
a <= b # a 是 b 的子集
a < b # a 是 b 的真子集
3.2 进阶用法
# frozenset(不可变集合,可作为 dict 的 key)
fs = frozenset([1, 2, 3])
# 集合推导式
squared = {x**2 for x in range(10)}
# 高效去重(保留顺序)
def dedup(lst):
seen = set()
return [x for x in lst if not (x in seen or seen.add(x))]
最佳实践:大量数据去重、成员判断、消除重复元素时优先使用集合。
4. 函数(Function)—— Python 的灵魂
4.1 参数进阶
# 1. 可变参数
def func(*args, **kwargs):
...
# 2. 仅限关键字参数(Python 3+)
def connect(host, port, *, ssl=True, timeout=30):
...
# 3. 仅限位置参数(Python 3.8+)
def div(a, b, /):
return a / b
# 4. 参数默认值陷阱(重要!)
def bad_func(items=[]): # 错误!默认可变对象
items.append(1)
return items
# 正确写法
def good_func(items=None):
if items is None:
items = []
4.2 函数式编程特性
# 高阶函数
numbers = [1, 2, 3, 4]
squares = list(map(lambda x: x**2, numbers))
evens = list(filter(lambda x: x % 2 == 0, numbers))
# 偏函数
from functools import partial
add_five = partial(lambda x, y: x + y, 5)
print(add_five(10)) # 15
4.3 装饰器(Decorator)—— Python 进阶核心
import time
from functools import wraps
def timer(func):
@wraps(func) # 保留原函数元信息
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} 执行时间: {time.time()-start:.4f}s")
return result
return wrapper
@timer
def slow_function():
time.sleep(1)
4.4 闭包(Closure)与 nonlocal
def make_counter():
count = 0
def counter():
nonlocal count # 关键!
count += 1
return count
return counter
c1 = make_counter()
print(c1(), c1()) # 1 2
5. 总结对比表
| 特性 | 元组 (tuple) | 字典 (dict) | 集合 (set) |
|---|---|---|---|
| 可变性 | 不可变 | 可变 | 可变 |
| 可哈希 | 是 | 否(可作为值) | 否(frozenset 可) |
| 顺序 | 有序 | 有序(3.7+) | 无序 |
| 重复 | 允许 | 键不重复 | 不允许 |
| 最佳用途 | 固定数据、返回值 | 映射关系 | 去重、集合运算 |
进阶学习建议:
- 熟练使用
collections模块(defaultdict、Counter、deque、namedtuple) - 掌握函数式编程风格(
map、filter、reduce) - 大量练习装饰器和闭包
- 理解 Python 的“EAFP”(Easier to Ask for Forgiveness than Permission)哲学
需要我继续深入以下任意专题吗?
- 装饰器进阶(带参数、类装饰器、functools 详解)
- 生成器与迭代器协议
collections模块实战- Python 函数式编程与并发
请告诉我你的需求,我立刻为你写下一节!