全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 1 篇文章 15 道配套习题

迭代器与生成器专题

专题说明

迭代器和生成器是Python中实现惰性求值和高效处理大数据的核心机制。本专题从迭代器协议的基本概念出发,深入讲解可迭代对象与迭代器的区别、生成器函数的yield机制、生成器表达式、yield from语法以及itertools标准库的使用,帮助学习者掌握Python迭代系统的完整知识体系。

学习目标

  1. 理解迭代器协议和可迭代对象的概念
  2. 掌握生成器函数和yield的工作原理
  3. 熟练使用生成器表达式处理数据流
  4. 理解yield from的用法和适用场景
  5. 掌握itertools标准库的常用工具函数

学习内容

本专题涵盖以下核心知识点:

迭代器协议

  • 可迭代对象 vs 迭代器
  • __iter__和__next__方法
  • StopIteration异常
  • for循环的底层实现

生成器函数

  • yield关键字和生成器函数
  • 生成器的状态和生命周期
  • send()方法传递数据
  • throw()和close()方法

生成器表达式

  • 与列表推导式的区别
  • 内存优势
  • 嵌套生成器表达式

yield from

  • 委托给子生成器
  • 替代嵌套循环
  • 双向数据传递

itertools工具

  • 无限迭代器:count、cycle、repeat
  • 有限迭代器:chain、islice、zip_longest
  • 组合迭代器:product、permutations、combinations

学习建议

  1. 先理解迭代器协议,再学习生成器
  2. 理解yield的惰性求值特性
  3. 善用生成器表达式替代列表推导式节省内存
  4. itertools是处理迭代的高级工具,值得深入学习

📝 配套习题(15 题)

💡 参考答案在文末
判断题
1

itertools是Python标准库模块,提供高效迭代工具函数,包括chain连接迭代器、zip_longest不等长配对、islice切片迭代器、count无限计数、cycle循环迭代等。

A

B

2

迭代器协议要求对象实现__iter__方法返回迭代器本身,以及__next__方法返回下一个元素或抛出StopIteration异常表示迭代结束。

A

B

3

自定义迭代器类需要实现完整的迭代器协议:__iter__方法返回迭代器本身,__next__方法返回下一个元素并在迭代结束时抛出StopIteration异常。

A

B

4

yield from语法用于将生成器的产出委托给另一个子生成器,简化嵌套生成器的编写,可以自动处理子生成器的所有产出和最终返回值。

A

B

5

itertools提供的count、cycle、repeat是无限迭代器,可以产生无限序列。使用时必须手动终止(如break或islice限制),否则会无限循环。

A

B

单选题
6

itertools.count(10, 2)产生的序列是:

A

10, 12, 14, 16...(无限)

B

10, 11, 12, 13...

C

10, 10, 10...

D

只产生10

7

迭代器的__next__方法在什么情况下抛出StopIteration?

A

每次调用时

B

没有更多元素时

C

遇到错误时

D

调用__iter__时

8

yield from iterable与for item in iterable: yield item的区别是?

A

两者完全相同

B

yield from可以处理子生成器的return值

C

for yield更高效

D

yield from不能用于列表

9

itertools.chain([1,2], [3,4])的输出是?

A

[[1,2], [3,4]]

B

[1,2,3,4]

C

[(1,3), (2,4)]

D

[1,2] + [3,4]

10

以下哪个是正确的可迭代对象设计(可多次迭代)?

A

只实现__next__

B

iter__返回self,实现__next

C

__iter__返回新的迭代器实例

D

只实现__iter__

填空题
11

itertools.____________连接迭代器。____________不等长配对。____________切片迭代器。count无限计数。cycle无限循环。repeat重复元素。from_iterable展开嵌套。内存高效,惰性计算。可处理无限序列。list(chain([1,2],[3]))返回[1,2,3]。

12

yield ____________委托子生成器。自动产出____________元素。可获取子生成器的____________值。简化嵌套迭代。chain生成器用yield from iterable。子生成器return值赋给result = yield from sub()。yield from支持双向通信。用于组合多个迭代器。

13

count(____________, ____________)无限计数。____________(seq)无限循环元素。repeat(obj, times)重复。无限迭代器需手动终止。用islice限制数量。用takewhile条件限制。用break退出循环。count(10,2)序列:10,12,14...无限。

14

迭代器协议:____________返回________________________返回下一个元素。迭代结束抛StopIteration。next()函数调用next方法。for循环自动处理StopIteration。迭代器只能正向遍历一次。可迭代对象需实现iter返回迭代器。

15

迭代器类实现________________________。__iter__返回____________。__next__返回元素或抛StopIteration。可迭代对象__iter__返回新迭代器。迭代器用完耗尽,可迭代对象可多次迭代。计数迭代器用index跟踪位置。自定义迭代器比生成器更灵活。

参考答案
1.正确 2.正确 3.正确 4.正确 5.正确 6.A 7.B 8.B 9.B 10.C 11.chain;zip_longest;islice 12.from;所有;return 13.start;step;cycle 14.iter;self;next 15.iter;next;self
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 运算符与表达式专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码