python之迭代器与生成器

转自:http://www.cnblogs.com/Eva-J/articles/7213953.html

一、迭代器

1、如果“可迭代”,就可以被for循环。字符串、列表、元组、字典、集合都可以被for循环,他们都是可迭代的。

2、可以被迭代要满足的要求就叫做可迭代协议。可以被迭代,则内部必须实现__iter__方法

3、迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法

4、为什么要有for循环,用while完全可以去实现

l=[1,2,3]

index=0
while index < len(l):
    print(l[index])
    index+=1

#要毛线for循环,要毛线可迭代,要毛线迭代器

但是非序列类型像字典,集合,文件对象就不能用while,for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for循环来遍历了。

二、生成器:自己写的这个能实现迭代器功能的东西就叫生成器。另一种定义:一个包含yield关键字的函数就是一个生成器函数

1.生成器函数:一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

原文地址:https://www.cnblogs.com/zzq888/p/10303396.html