CS 41 课程八:标准库(5月23日)
一、课程基本信息
日期 :2023年5月23日
主题:Standard Libraries(标准库)
期末项目提醒
- 截止日期:14天后
- 建议:接下来几周随时可以与我们会面
二、课前补充:函数式编程(续)
Lambda:匿名内联函数
1. Lambda语法
基本格式:
python
lambda params : expression
2. Lambda vs 普通函数
普通函数定义:
python
def square_add_two(x, y):
return x**2 + y**2
等价的Lambda表达式:
python
lambda x, y : x**2 + y**2
语法分解:
python
lambda x, y : x**2 + y**2
↑ ↑
参数 表达式
3. 调用Lambda函数
直接调用:
python
(lambda x, y : x**2 + y**2)(8, 5)
# => 89
说明:
- Lambda定义放在括号内
- 参数放在定义后的括号内
- 立即执行并返回结果
Map函数
1. Map的作用
功能:
- 接受一个函数和一个可迭代对象
- 将函数应用到可迭代对象的每个元素
2. Map实例
python
numbers = [1, 2, 3, 4, 5]
# 使用map和lambda函数对每个数字求平方
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers)
# => [1, 4, 9, 16, 25]
工作流程:
numbers: [1, 2, 3, 4, 5]
↓ ↓ ↓ ↓ ↓
lambda x: x**2: 1² 2² 3² 4² 5²
↓ ↓ ↓ ↓ ↓
result: [1, 4, 9, 16, 25]
练习环节:Let's Try Some Out
三、标准库概述
1. 什么是标准库?
定义:
- 随Python一起提供的包和模块
- 被开发者视为重要/基础的功能
- 只需要import即可访问
2. 模块与包的区别
模块(Module):
- 可重用Python代码的最小单元
- 基本上就是一个包含函数和语句的文件
- 我们一直在编写模块
包(Package):
- 模块的逻辑集合
- 例如:numpy、random等
层级关系:
包(Package)
└── 模块(Module)
└── 函数/类/变量
3. 标准库文档
官方文档地址:
四、Import导入规范
导入方式对比
方式1:导入整个包
python
import sound
sound.effects.echo.echofilter(a, b)
方式2:导入子模块
python
from sound.effects import echo
echo.echofilter(a, b)
方式3:导入特定函数
python
from sound.effects.echo import echofilter
echofilter(a, b)
导入方式选择
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
import sound |
命名空间清晰 | 调用路径长 | 避免命名冲突 |
from sound.effects import echo |
调用简洁 | 中等命名空间 | 使用多个函数 |
from sound.effects.echo import echofilter |
最简洁 | 可能命名冲突 | 只用少数函数 |
五、常用标准库详解
1. pickle - 对象序列化
功能介绍
- 序列化/反序列化Python对象
- 将Python对象转换为二进制表示
使用场景
1. 高效存储数据:
python
import pickle
# 保存对象
data = {'name': 'Alice', 'scores': [95, 87, 91]}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 加载对象
with open('data.pkl', 'rb') as f:
loaded_data = pickle.load(f)
2. 进程间传递信息:
- 在不同进程之间传递复杂对象
- 保持对象的完整结构
实例演示
An example(课堂演示)
⚠️ 安全警告
Pickle安全问题:
- 不要反序列化不可信来源的数据
- pickle可以执行任意代码
- 只用于可信来源的数据
安全建议:
python
# ❌ 危险:加载未知来源的pickle文件
with open('untrusted.pkl', 'rb') as f:
data = pickle.load(f) # 可能执行恶意代码
# ✓ 安全:只加载自己创建的文件
with open('my_data.pkl', 'rb') as f:
data = pickle.load(f)
2. pdb - Python调试器
两种使用方式
方式1:文件内调试
python
import pdb
def buggy_function(x, y):
pdb.set_trace() # 设置断点
result = x / y
return result
方式2:终端调试
bash
python3 -m pdb file.py
常用pdb命令
| 命令 | 说明 |
|---|---|
n (next) |
执行下一行 |
s (step) |
进入函数 |
c (continue) |
继续执行 |
l (list) |
显示代码 |
p variable |
打印变量 |
b line |
设置断点 |
q (quit) |
退出调试 |
3. collections - 特殊容器类型
主要数据结构
常用容器:
1. Counter - 计数器
python
from collections import Counter
words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
counter = Counter(words)
# Counter({'apple': 3, 'banana': 2, 'cherry': 1})
counter.most_common(2)
# [('apple', 3), ('banana', 2)]
2. defaultdict - 默认字典
python
from collections import defaultdict
dd = defaultdict(list)
dd['fruits'].append('apple') # 不需要先初始化
dd['fruits'].append('banana')
# {'fruits': ['apple', 'banana']}
3. deque - 双端队列
python
from collections import deque
dq = deque([1, 2, 3])
dq.appendleft(0) # 左端添加
dq.append(4) # 右端添加
# deque([0, 1, 2, 3, 4])
4. namedtuple - 命名元组
python
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, 22)
print(p.x, p.y) # 11 22
4. functools - 函数工具
主要功能
1. @lru_cache - 缓存装饰器
python
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
2. partial - 部分函数
python
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
cube = partial(power, exponent=3)
square(5) # => 25
cube(5) # => 125
3. reduce - 归约函数
python
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
# => 120 (1 * 2 * 3 * 4 * 5)
5. itertools - 迭代器工具
常用函数
1. count - 无限计数
python
from itertools import count
counter = count(start=10, step=2)
# 10, 12, 14, 16, 18, ...
2. cycle - 循环迭代
python
from itertools import cycle
colors = cycle(['red', 'green', 'blue'])
# red, green, blue, red, green, blue, ...
3. chain - 链接迭代器
python
from itertools import chain
list(chain([1, 2], [3, 4], [5, 6]))
# => [1, 2, 3, 4, 5, 6]
4. combinations - 组合
python
from itertools import combinations
list(combinations('ABC', 2))
# => [('A', 'B'), ('A', 'C'), ('B', 'C')]
5. permutations - 排列
python
from itertools import permutations
list(permutations('ABC', 2))
# => [('A', 'B'), ('A', 'C'), ('B', 'A'),
# ('B', 'C'), ('C', 'A'), ('C', 'B')]
6. re - 正则表达式
正则表达式基础
电话号码匹配示例:
python
import re
pattern = r"\(\d{3}\)[- ]\d{3}-\d{4}"
phone = "(123) 456-7890"
if re.match(pattern, phone):
print("Valid phone number")
模式解释:
\(\d{3}\) [- ] \d{3} - \d{4}
↓ ↓ ↓ ↓ ↓
(123) 空格或- 456 - 7890
常用正则操作
1. 搜索匹配
python
import re
text = "Email: user@example.com"
match = re.search(r'[\w\.-]+@[\w\.-]+', text)
if match:
print(match.group()) # user@example.com
2. 查找所有匹配
python
text = "Numbers: 42, 123, 7"
numbers = re.findall(r'\d+', text)
# ['42', '123', '7']
3. 替换
python
text = "Hello World"
new_text = re.sub(r'World', 'Python', text)
# "Hello Python"
4. 分割
python
text = "apple,banana;cherry:date"
fruits = re.split(r'[,;:]', text)
# ['apple', 'banana', 'cherry', 'date']
六、非标准库包
1. 需要单独安装的包
说明:
- 不在标准库中的包必须通过pip等工具下载
- 提供更专业的功能
2. 流行的第三方包
常见包介绍:
| 包名 | 用途 | 特点 |
|---|---|---|
| Flask | Web框架 | 轻量级、灵活 |
| NumPy | 数值计算 | 多维数组、科学计算 |
| Pandas | 数据分析 | DataFrame、数据处理 |
| Requests | HTTP请求 | 简单易用的网络库 |
安装方式:
bash
pip install flask
pip install numpy
pip install pandas
pip install requests
3. 文档资源
每个包都有自己的文档:
- Flask: https://flask.palletsprojects.com/
- NumPy: https://numpy.org/doc/
- Pandas: https://pandas.pydata.org/docs/
- Requests: https://requests.readthedocs.io/
七、⚠️ pip安全警告
真实案例:2018年恶意包事件
事件经过:
- 恶意包上传:名为"acqusition"的包被上传到PyPI
- 模仿知名包:模仿知名包"acquisition"(拼写相似)
- 恶意代码:包含收集用户SSH和GPG密钥的代码
- 远程传输:将密钥发送到远程服务器
- 事后处理:包被移除,但警示了安全重要性
安全建议
安装前检查:
bash
# ❌ 危险:拼写错误可能安装恶意包
pip install requets # 注意:拼写错误!
# ✓ 正确:仔细检查包名
pip install requests
最佳实践:
- 仔细检查包名:注意拼写
- 验证包来源:查看官方文档
- 检查下载量:流行包通常有大量下载
- 查看维护情况:检查最后更新时间
- 阅读文档:了解包的功能
- 查看GitHub:查看源代码和issue
安全检查清单:
□ 包名拼写正确
□ 来自官方源(PyPI)
□ 有官方文档
□ 下载量合理
□ 近期有维护
□ 社区活跃
八、课程总结
Lambda与Map速查
Lambda语法:
python
lambda 参数 : 表达式
# 示例
square = lambda x: x**2
add = lambda x, y: x + y
Map用法:
python
map(函数, 可迭代对象)
# 示例
list(map(lambda x: x**2, [1, 2, 3]))
# => [1, 4, 9]
标准库分类速查
数据结构:
collections: Counter, defaultdict, deque, namedtuple
函数工具:
functools: lru_cache, partial, reduce
迭代工具:
itertools: count, cycle, chain, combinations, permutations
文本处理:
re: 正则表达式
调试工具:
pdb: Python调试器
序列化:
pickle: 对象序列化
常用标准库导入模板
python
# 数据处理
from collections import Counter, defaultdict, deque
from functools import lru_cache, partial
from itertools import chain, combinations
# 文本处理
import re
# 调试
import pdb
# 序列化
import pickle
关键要点
-
标准库的价值:
- 无需安装,开箱即用
- 经过充分测试
- 性能优化良好
-
选择合适的工具:
- 数据计数 → Counter
- 函数缓存 → lru_cache
- 正则匹配 → re
- 调试 → pdb
-
第三方包:
- 提供专业功能
- 需要pip安装
- 注意安全性
-
最佳实践:
- 优先使用标准库
- 需要时才安装第三方包
- 仔细验证包的可信度
学习资源
官方文档:
- Python标准库:https://docs.python.org/3/library/
- PyPI:https://pypi.org/
推荐阅读:
- Python Module of the Week (PyMOTW)
- Real Python标准库教程
- 各包的官方文档
实践建议
- 浏览标准库文档:了解有哪些工具可用
- 动手实践:在小项目中使用这些库
- 阅读源码:理解实现原理
- 关注安全:特别是使用pickle和第三方包时