此页面的目的是演示 2 个迭代协议的动态:
- 可迭代
- 迭代器
1. 但首先(添加令人困惑的相似单词),让我们解决迭代问题
- 迭代 - 当然 - 是从源中逐项获取项目并依次对每个项目执行某些操作
- 在Python中,这常用在
- 默认情况下 - 这些结构迭代整个结构
- 然而,有时可能需要更细粒度的控制 - 就像在生成器中
- 为此,有 2 个重要的概念/协议,Python 的大部分都是在它们之上构建的:
- a) 可迭代对象
- b) 迭代器对象
- 两者都反映在标准Python协议中
- 这不是额外的东西:实际上,for/while 循环和推导式直接构建在迭代协议的这些较低级别元素上
2. ITER() 方法从可迭代对象创建迭代器
-
可迭代对象(对象的集合或流)是可以传递到内置 iter() 函数的任何对象
- 一旦传递了内置的 iter() 函数,它就会返回一个传递类型的 迭代器对象,即创建一个字符串迭代器
>>> example_iterator = iter('abc')
>>> example_iterator
<str_iterator object at 0x063DCE38>
登录后复制
登录后复制
- 请注意,迭代器是一个隐式序列对象,提供顺序(不是随机!)对底层顺序数据集的访问
- 例如范围对象本身不是迭代器
- 迭代器不允许访问底层序列的任意元素
- 它们仅提供对系列下一个元素的访问
- 它们提供顺序访问
<!-- THIS IS NOT AN ITERATOR -->
>>> r = range(10)[5]
>>> r
5
登录后复制
登录后复制
3. NEXT() 函数从迭代器返回下一个值
- 内置的 next() 需要一个 迭代器 对象 - 它返回集合迭代中的下一个值
- 迭代器由 2 个组件组成:
- 检索集合的下一个元素的机制
- 表示系列结束的机制
在具有内置对象系统的编程语言中,这种抽象通常对应于可以由类实现的特定接口
-
next() 允许按要求依次考虑每个项目 - 而不是从开始到结束的整个系列
- 有2个消息迭代器接口包括
-
下一个 → 查询下一个元素
-
iter → 返回迭代器
- 约束:迭代器只能迭代一次
4. 课堂示例 - 从可迭代到迭代器再到停止迭代异常
- Python 会随意引发 StopIteration 类型的 异常
>>> example_iterator = iter('abc')
>>> example_iterator
<str_iterator object at 0x063DCE38>
登录后复制
登录后复制
5. 实际示例 - 对多个命令行输入进行单元测试
- 定义/获取可迭代对象,例如列表 ["20.01", "y"]
- 将可迭代对象传递给 iter() → 创建迭代器对象
- 将迭代器对象传递到 next() 中,以便每次在代码中调用输入函数时生成列表的下一个值
<!-- THIS IS NOT AN ITERATOR -->
>>> r = range(10)[5]
>>> r
5
登录后复制
登录后复制
- 第一次遇到input()时,传递的是“20.01”值,
- 第二次是“y”
- 第三次就例外了
6. 链接
- https://mypy.readthedocs.io/en/stable/protocols.html#iteration-protocols
- 5.2 隐式序列 - Python 中的 SICP
以上是解释 Python 中的 Iterable 与 Iterator的详细内容。更多信息请关注PHP中文网其他相关文章!