迭代器、可迭代对象、生成器、生成器表达式(5) 官方文档说明

参考链接: Python官网:术语对照表

iterable -- 可迭代对象
    能够逐一返回其成员项的对象。 可迭代对象的例子包括所有序列类型
     (例如 list, str 和 tuple) 以及某些非序列类型例如 dict, 文件对象 以及定
     义了 __iter__() 方法或是实现了 序列 语义的 __getitem__() 方法的任
     意自定义类对象。
    可迭代对象被可用于 for 循环以及许多其他需要一个序列的地方(zip()、map() ...)。
    当一个可迭代对象作为参数传给内置函数 iter() 时,它会返回该对象的迭代器。
    这种迭代器适用于对值集合的一次性遍历。在使用可迭代对象时,
    你通常不需要调用 iter() 或者自己处理迭代器对象。
    for 语句会为你自动处理那些操作,
    创建一个临时的未命名变量用来在循环期间保存迭代器。
    参见 iterator、sequence 以及 generator。


iterator -- 迭代器
    用来表示一连串数据流的对象。重复调用迭代器的 __next__() 方法
    (或将其传给内置函数 next())将逐个返回流中的项。
    当没有数据可用时则将引发 StopIteration 异常。
    到这时迭代器对象中的数据项已耗尽,继续调用其 __next__() 方法
    只会再次引发 StopIteration 异常。迭代器必须具有 __iter__() 方法
    用来返回该迭代器对象自身,因此迭代器必定也是可迭代对象,可被
    用于其他可迭代对象适用的大部分场合。一个显著的例外是那些会多
    次重复访问迭代项的代码。容器对象(例如 list)在你每次向其传
    入 iter() 函数或是在 for 循环中使用它时都会产生一个新的迭代器。
    如果在此情况下你尝试用迭代器则会返回在之前迭代过程中被耗尽
    的同一迭代器对象,使其看起来就像是一个空容器。
    更多信息可查看 迭代器类型。


generator -- 生成器
    返回一个 generator iterator 的函数。它看起来很像普通函数,
    不同点在于其包含 yield 表达式以便产生一系列值供给 for-循环使用
    或是通过 next() 函数逐一获取。通常是指生成器函数,但在某些情
    况下也可能是指 生成器迭代器。如果需要清楚表达具体含义,请使
    用全称以避免歧义。

generator iterator -- 生成器迭代器
    generator 函数所创建的对象。
    每个 yield 会临时暂停处理,记住当前位置执行状态(包括局部变
    量和挂起的 try 语句)。当该 生成器迭代器 恢复时,它会从离开
    位置继续执行(这与每次调用都从新开始的普通函数差别很大)。

generator expression -- 生成器表达式
    返回一个迭代器的表达式。 它看起来很像普通表达式后面带有定
    义了一个循环变量、范围的 for 子句,以及一个可选的 if 子句。 
    以下复合表达式会为外层函数生成一系列值:
    >>>
    >>> sum(i*i for i in range(10))         # sum of squares 0, 1, 4, ... 81
    285

参考链接: Python官网:内置类型
参考链接: Python官网:迭代器类型
参考链接: Python官网:生成器类型

迭代器类型

Python 支持在容器中进行迭代的概念。 这是通过使用两个单独方法来实现的;
它们被用于允许用户自定义类对迭代的支持。 
将在下文中详细描述的序列总是支持迭代方法。
容器对象要提供迭代支持,必须定义一个方法:

container.__iter__()
    返回一个迭代器对象。 该对象需要支持下文所述的迭代器协议。 
    如果容器支持不同的迭代类型,则可以提供额外的方法来专门地
    请求不同迭代类型的迭代器。 (支持多种迭代形式的对象的例
    子有同时支持广度优先和深度优先遍历的树结构。) 此方法对
    应于 Python/C API 中 Python 对象类型结构体的 tp_iter 槽位。

迭代器对象自身需要支持以下两个方法,它们共同组成了 迭代器协议:
iterator.__iter__()
    返回迭代器对象本身。 这是同时允许容器和迭代器配合 for 和 in 语
    句使用所必须的。 此方法对应于 Python/C API 中 Python 对象类型
    结构体的 tp_iter 槽位。
iterator.__next__()
    从容器中返回下一项。 如果已经没有项可返回,则会引发
     StopIteration 异常。 此方法对应于 Python/C API 中 Python 对象
     类型结构体的 tp_iternext 槽位。

Python 定义了几种迭代器对象以支持对一般和特定序列类型、字典
和其他更特别的形式进行迭代。 除了迭代器协议的实现,特定类型
的其他性质对迭代操作来说都不重要。

一旦迭代器的 __next__() 方法引发了 StopIteration,它必须一直对
后续调用引发同样的异常。 不遵循此行为特性的实现将无法正常使用。
生成器类型

Python 的 generator 提供了一种实现迭代器协议的便捷方式。 如果
容器对象 __iter__() 方法被实现为一个生成器,它将自动返回一个
迭代器对象(从技术上说是一个生成器对象),该对象提供 __iter__() 
和 __next__() 方法。 有关生成器的更多信息可以参阅 yield 表达式的文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值