缘由
- 最近欲一睹python源码,结果大跌眼镜,经常看到_ iter _这个玩意,无奈基础不行,遂遍寻解释。
迭代器
- 通俗的说,可在for语句循环的对象就是可迭代对象,就要用上面那玩意。我们平时看不到是因为它已被封装在我们平时常用的数据结构中了。当然,我们如果自己要创建一个这种容器也是可以的,这就是迭代器。下面介绍两种常用的迭代器方式。
- 使用_iter_()和next()方法
- 内置函数iter将可迭代对象转化为迭代器
>>> ita = iter([1,2,3])
>>> type(ita)
<type 'listiterator'>
>>> next(ita)
1
>>> next(ita)
2
>>> next(ita)
3
上面是用next()方法逐一读取元素
- 好,下面创建一个容器
class Container:
def __init__(self, start = 0, end = 0):
self.start = start
self.end = end
def __iter__(self):
print("iterator")
return self
def __next__(self):
print("next")
if self.start < self.end:
i = self.start
self.start += 1
return i
else:
raise StopIteration()
迭代器就建好了。测试一下
>>> c = Container(0, 5)
>>> for i in c:
.... print(i)
0
next
1
next
2
next
3
next
4
next
实际上,这种迭代器的方法的好处是,可以减小内存消耗,因为每次只需记录一个值。
生成器
生成器(generator)是创建迭代器的第三种方法,它通过yield语句快速建立迭代关系。它的好处就是短平快。
>>> def container(start, end):
... while start<end:
... yield start
... start += 1
...
>>> c = container(0,5)
>>> c
<generator object container at 0x7fac812e0be0>
>>> next(c)
0
>>> next(c)
1
上面看到的yield函数,就是能快速让普通函数变成生成器。程序运行到yield会返回值并暂停,当next()的时候会继续执行。