[关闭]
@songying 2018-11-14T16:50:17.000000Z 字数 1752 阅读 1167

python 迭代器

python高级特性


参考

Python 高级编程之初识迭代器
https://blog.csdn.net/baidu_35085676/article/details/78954805

python迭代器协议

  1. 该对象实现了__iter__()方法
  2. 该对象实现了__next__()方法,返回当前元素,并指向下一个元素的位置,如果当前位置已无元素,则抛出StopIteration异常。

什么是迭代(iteration)?

所谓迭代,就是依次遍历一个序列中的每个元素的过程。比如说我们通过for来访问一个list中的所有元素的整个过程,就叫做迭代。
不懂的可以参见:廖雪峰:迭代

什么是可迭代对象(Iterable)?

简单来说,可迭代对象其实就是一个容器,你能够用for来遍历它的所有元素。实际上, 只要实现了__iter__方法的对象就是可迭代对象。
在python中,可以直接作用于for循环的对象统称为可迭代对象,这类对象包括两类:

  1. # 判断一个对象是否为 Iterable 对象
  2. from collections import Iterable
  3. isinstance([], Iterable)

迭代器(iterator)

迭代器必须遵守迭代器协议。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
标准的迭代器接口(collection.abc.Iterator)有两个方法:__next____iter__, 也就是说任意对象,只要实现了__next__方法(python3)和__iter__方法, 那么它就是一个迭代器。__next__方法返回容器中的下一个值; __iter__方法返回迭代器自身。

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

  1. # 判断一个对象是否为Iterator 对象
  2. from collections import Iterator
  3. isinstance([], Iterator)

可迭代对象与迭代器比较

  1. 可迭代对象包括迭代器,但不仅仅是迭代器
  2. 如果一个对象实现类__iter__方法, 那么该对象是可迭代对象;
  3. 如果一个对象实现了__next____iter__方法,那么该对象是迭代器。
    python可以从可迭代对象中获取迭代器。

将可迭代对象转化为迭代器

在python中, 提供了内置函数 iter() 来将可迭代对象转化为迭代器。 在python中的可迭代对象有: list, dict, str,set, tuple等。

5. 实现自己的迭代器

我们可以用类实现一个迭代器,在类中添加 next 方法和 __iter__ 方法。

  1. # 我们实现一个类似于 xrange 的产生整数序列的迭代器
  2. class yrange:
  3. def __init__(self, start=0, stop=0):
  4. self.start = start
  5. self.stop = stop
  6. def __iter__(self):
  7. return self
  8. def next(self):
  9. if(self.start < self.stop):
  10. start = self.start
  11. self.start += 1
  12. return start
  13. else:
  14. raise StopIteration

Python内置的一些函数如 listsumsorted 都支持迭代器作为参数

python中构造迭代器

可迭代对象可以通过Python内置函数 iter 来生成一个迭代器(iterator)。

在Python中通过 iter 函数生成的对象叫做迭代器,而本身支持迭代的对象叫做可迭代对象。

  1. Iterator = iter(list) # 产生迭代器
  2. Iterator.next() # 迭代器的下一个元素
  3. for i in list: # 自动迭代,for 循环语句在迭代时,自动调用了内置的 iter 来生成迭代器,省去了我们手动使用 iter(L) 生成迭代器这一步。

手动遍历迭代器

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注