扩展 - chain() 函数介绍
1 课程概览
本课扩展讲解 Python itertools.chain() 函数的用法。chain() 用于将多个可迭代对象拼接在一起,返回一个惰性迭代器。本课为后续词频统计做铺垫,用于合并多个句子的切词结果。
2 核心概念与定义
- chain() 函数:来自
itertools模块,将多个可迭代对象拼接成一个迭代器。 - 惰性求值(Lazy Evaluation):chain 返回的是迭代器,创建时不会立即遍历,只有在实际迭代时才逐个获取元素,节省内存。
- 一次性迭代:迭代器一旦迭代完毕,再次迭代不会得到数据。
3 模型与算法详解
chain() 函数语法
from itertools import chain
chain(*iterables)
- iterables:多个可迭代对象(如列表、元组、字符串)
- 返回值:chain 对象(迭代器)
chain() 特性
| 特性 | 说明 |
|---|---|
| 返回类型 | chain 对象(迭代器) |
| 惰性求值 | 创建时不立即遍历 |
| 节省内存 | 逐个获取元素 |
| 一次性 | 迭代完毕后再次迭代无数据 |
| 类似功能 | list.extend() |
chain() vs list.extend()
| 对比项 | chain() | list.extend() |
|---|---|---|
| 返回值 | 迭代器 | None(原地修改) |
| 原列表 | 不修改 | 修改 |
| 惰性 | 是 | 否 |
| 内存 | 节省 | 占用更多 |
| 适用场景 | 多个可迭代对象拼接 | 列表扩展 |
chain() 工作流程
- 接收多个可迭代对象
- 返回一个迭代器
- 迭代时依次从每个可迭代对象获取元素
- 需通过
list()转换或遍历获取结果
4 数学原理与推导
chain() 拼接关系
给定可迭代对象 $A = [a_1, a_2, ..., a_m]$ 和 $B = [b_1, b_2, ..., b_n]$:
$$\text{chain}(A, B) = [a_1, a_2, ..., a_m, b_1, b_2, ..., b_n]$$
示例
$$\text{chain}([1, 2, 3], [4, 5, 6]) = [1, 2, 3, 4, 5, 6]$$
5 代码示例
from itertools import chain
# 需求二:演示 chain 函数的用法
def dm02_chain():
# 1. 定义两个列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]
# 2. 使用 chain 拼接
result = chain(list1, list2)
print("chain 对象:", result) # <itertools.chain object>
print("类型:", type(result)) # <class 'itertools.chain'>
# 3. 转换为列表获取结果
result_list = list(result)
print("结果:", result_list) # [1, 2, 3, 4, 5, 6]
# 应用场景:合并多个句子的切词结果
def dm03_chain_words():
# 1. 定义两个句子
list1 = ["今天", "天气", "很好"]
list2 = ["今天", "天气", "很热"]
# 2. 对每个句子切词(假设已切词)
# 使用 map 对每个列表的元素做操作
tap_obj1 = map(lambda x: x, list1)
tap_obj2 = map(lambda x: x, list2)
# 3. 使用 chain 合并切词结果
result = chain(tap_obj1, tap_obj2)
result_list = list(result)
print("合并结果:", result_list)
# ['今天', '天气', '很好', '今天', '天气', '很热']
# 测试
if __name__ == "__main__":
dm02_chain()
dm03_chain_words()
惰性求值示例
from itertools import chain
result = chain([1, 2], [3, 4])
# 第一次迭代
print(list(result)) # [1, 2, 3, 4]
# 第二次迭代(已耗尽)
print(list(result)) # [](空)
6 重难点与易错提醒
- ❗重点:
chain(*iterables)将多个可迭代对象拼接成迭代器。 - ⚠️易错:chain 返回迭代器,需用
list()转换查看结果。 - ⚠️易错:迭代器是一次性的,迭代完毕后再次迭代无数据。
- 💡深入理解:chain 类似于
list.extend(),但不修改原列表,返回迭代器。 - 💡深入理解:chain 常用于合并多个句子的切词结果,为词频统计做准备。
7 课堂问答精选
Q1:chain() 函数的作用是什么?
A:将多个可迭代对象拼接成一个迭代器。例如 chain([1,2], [3,4]) 返回 [1, 2, 3, 4]。
Q2:chain() 和 list.extend() 有什么区别?
A:①chain 返回迭代器,不修改原列表;extend 原地修改列表,返回 None。②chain 是惰性求值,节省内存;extend 立即求值。
Q3:chain() 返回的对象有什么特性?
A:①是迭代器;②惰性求值;③节省内存;④一次性,迭代完毕后再次迭代无数据。
Q4:chain() 在 NLP 中的应用场景?
A:合并多个句子的切词结果,为词频统计做准备。例如 chain(sentence1_words, sentence2_words) 将两个句子的词合并。
8 本课小结
chain(*iterables)将多个可迭代对象拼接成迭代器。- 特性:惰性求值、节省内存、一次性迭代。
- 需用
list()转换查看结果。 - 类似
list.extend(),但不修改原列表。 - 应用:合并多个句子的切词结果,为词频统计做准备。
9 延伸思考
- chain() 相比列表拼接(
+)有什么优势? - 如何使用 chain() 处理大量句子的切词结果?