迭代器通过iter方法产生可迭代对象,可迭代对象用next方法进行迭代。iter方法返回self
只要函数定义体有yield关键字,该函数就是生成器函数。从Python源码中我们知道一个技巧,空的生成器用while False来yield None表示
比如python中的“字典”,javascript中的”对象“,又比如你自己写了一个”树“结构的类,想遍历整个树的节点?那么传统的for循环,while循环就无法发挥他们的作用了,这个时候我们就应该引入”迭代器“了。
所以,小结一下,”迭代器“其实目的也是为了”循环“,更严谨一些,是为了“遍历”,你可以把迭代器看成比普通循环更高级别的工具,普通循环能搞定的迭代器也能搞定,普通循环搞不定的迭代器还能搞定,并且使用迭代器比普通循环效率更高
如果一个对象包括一个叫"next"(python3 为__next__)的方法,那么这个对象就叫做“迭代器”
为了使我们刚才创建的Counter迭代器对象“可迭代”,那么:
1,我们就在这个Counter对象里面添加一个叫__iter__的方法 (可迭代化操作)
2, 让这个__iter__方法返回一个“可迭代的迭代器” (这里就是自己了!)
class Counter:
def __init__(self):
self.index = 0
def __iter__(self):
return self
def __next__(self):
i = self.index
if i < 10:
self.index += 1
return i
else:
raise StopIteration
counter = Counter()
for i in counter:
print(i)
用迭代器(生成器)的方法则会大大提高效率,一方面每次next循环都会yield出一个值,供sum函数累加使用,这样就不用占用很大的内存,另一方面,使用迭代器/生成器也不用完全等到前n个数全部遍历完再进行累加,效率更高!