全站搜索未启用
跳到主要内容

5.5.1迭代器
1.迭代器概述

迭代器自版本 2.2 被加入 Python , 它为类序列对象提供了一个类序列的接口。迭代器是一组数据结构,用户可以利用它们的索引从0 开始一直"迭代" 到序列的最后一个条目。用"计数"的方法迭代序列是很简单的。Python 的迭代无缝地支持序列对象, 而且它还允许程序员迭代非序列类型, 包括用户定义的对象。

2.迭代器的优势

(1)提供了可扩展的迭代器接口。

(2)对列表迭代带来了性能上的增强。

(3)在字典迭代中性能提升。

(4)创建真正的迭代接口, 而不是原来的随机对象访问。

(5)与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后兼容。

(6)迭代非序列集合(如映射和文件)时, 可以创建更简洁可读的代码。

3.迭代的机制

从根本上说, 迭代器有一个 next() 方法的对象, 而不是通过索引来计数。当一个循环机制(如 for 语句)需要下一个项时, 调用迭代器的 next() 方法就可以获得它。条目全部取出后, 会引发一个 StopIteration 异常, 这并不表示错误发生, 只是告诉外部调用者, 迭代完成。

4.迭代器的使用

(1)序列。

(2)字典。

(3)文件。

5.可变对象和迭代器

在迭代可变对象的时候修改它们并不是一个好主意,这在迭代器出现之前就是一个问题。

6.创建迭代器

对一个对象调用 iter() 就可以得到它的迭代器。

5.5.2生成器
1.生成器的概念与构建

前面我们讨论了迭代器的有效性以及它们如何给非序列对象提供一个类序列的迭代器接口。正如我们之前讲到的一样,只需要利用next()函数来调用获得下个元素。

然而,除非你实现了一个迭代器的类,否则迭代器并没有那么“聪明”。生成器的动机之一便是:调用函数到在迭代中以某种方式生成下一个值,并且做到和next()调用操作一样简单。

生成器的另外一个方面甚至更加强大——协同程序。协同程序是可以运行的独立函数调用,可以暂停或者挂起,并从程序离开的地方继续或者重新开始。在调用者和(被调用的)协同程序之间也有通信。

2.简单的生成器特性

与迭代器相似,生成器以其他的方式来运作:当到达一个真正的返回或者函数结束没有更多的值返回时[当调用next()],就会抛出一个StopIteration 异常。

3.加强的生成器特性

在python2.5 中,一些加强特性加入生成器中,所以除了用next()来获得下一个生成的值,用户还可以将值回送给生成器[send()],在生成器中抛出异常,以及要求生成器退出[close()]。

最后修改: 2020年02月28日 Friday 01:12