【MVCD 6】

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. 文档资源

每个包都有自己的文档


七、⚠️ pip安全警告

真实案例:2018年恶意包事件

事件经过

  1. 恶意包上传:名为"acqusition"的包被上传到PyPI
  2. 模仿知名包:模仿知名包"acquisition"(拼写相似)
  3. 恶意代码:包含收集用户SSH和GPG密钥的代码
  4. 远程传输:将密钥发送到远程服务器
  5. 事后处理:包被移除,但警示了安全重要性

安全建议

安装前检查

bash 复制代码
# ❌ 危险:拼写错误可能安装恶意包
pip install requets  # 注意:拼写错误!

# ✓ 正确:仔细检查包名
pip install requests

最佳实践

  1. 仔细检查包名:注意拼写
  2. 验证包来源:查看官方文档
  3. 检查下载量:流行包通常有大量下载
  4. 查看维护情况:检查最后更新时间
  5. 阅读文档:了解包的功能
  6. 查看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

关键要点

  1. 标准库的价值

    • 无需安装,开箱即用
    • 经过充分测试
    • 性能优化良好
  2. 选择合适的工具

    • 数据计数 → Counter
    • 函数缓存 → lru_cache
    • 正则匹配 → re
    • 调试 → pdb
  3. 第三方包

    • 提供专业功能
    • 需要pip安装
    • 注意安全性
  4. 最佳实践

    • 优先使用标准库
    • 需要时才安装第三方包
    • 仔细验证包的可信度

学习资源

官方文档

推荐阅读

  • Python Module of the Week (PyMOTW)
  • Real Python标准库教程
  • 各包的官方文档

实践建议

  1. 浏览标准库文档:了解有哪些工具可用
  2. 动手实践:在小项目中使用这些库
  3. 阅读源码:理解实现原理
  4. 关注安全:特别是使用pickle和第三方包时
相关推荐
子夜江寒1 天前
OpenCV图像处理部分基础操作
图像处理·python·opencv
阿豪只会阿巴1 天前
【多喝热水系列】从零开始的ROS2之旅——Day5
c++·笔记·python·ubuntu·ros2
叫我:松哥1 天前
基于Spark智能推荐算法的农业作物推荐系统,推荐算法使用Spark ML风格推荐引擎
大数据·python·机器学习·spark-ml·spark·flask·推荐算法
2501_941875281 天前
从日志语义到可观测性的互联网工程表达升级与多语言实践分享随笔
java·前端·python
叫我:松哥1 天前
基于 Flask 的音乐推荐与可视化分析系统,包含用户、创作者、管理员三种角色,集成 ECharts 进行数据可视化,采用混合推荐算法
开发语言·python·信息可视化·flask·echarts·pandas·推荐算法
此剑之势丶愈斩愈烈1 天前
mybatis-plus乐观锁
开发语言·python·mybatis
vibag1 天前
LangGraph全家桶使用
python·语言模型·langchain·大模型·langgraph
勘察加熊人1 天前
python实现批量中英文文件翻译
开发语言·windows·python
飞仔FeiZai1 天前
基于 Python 与 PyQt5 构建的特斯拉行车记录仪视频播放器
python·音视频·qt5