迭代器:
可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
特点:
1.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
2.不能随机访问集合中的某个值 ,只能从头到尾依次访问
3.访问到一半时不能往回退
4.便于循环比较大的数据集合,节省内存
生成器:
一个函数调用时返回一个迭代器,那这个函数就为生成器,如果函数中包含yield语法,那这个函数就变成生成器,生成器是一种特殊的迭代器。
特点:
1. 不会一次生成所有的结果,一次只返回一个结果
2. 不用准备好整个迭代过程中所有的元素,减少内存使用
3. 只能遍历一次
例子:
1. 通过for循环外面添加(),使其变成生成器
g = (x * x for x in range(10))
通过next(g)来获取每一个值,获取最后一个元素之后,再调用会出现StopIteration的错误,可以通过捕捉来处理,更好的方法是使用for循环,因为generator也是可迭代对象,不需要关心StopIteration的错误。
2. 使用yield来实现斐波拉契数列
def fib(max): n, a, b = 0, 0, 1 while n < max: yield a, b ## 生成器 a, b = b, a + b n += 1 return "---done---" def main(): g = fib(6) for i in g: print(i[0],i[1]) if __name__ == ‘__main__‘: main()
3. 使用生成器实现协程并行效果
import time def consumer(name): print("%s 准备抢红包" % name) while True: money = yield print("红包[%s]来了, 被[%s]抢到了" % (money, name)) def producer(name): c1 = consumer(‘A‘) c2 = consumer(‘B‘) c1.__next__() c2.__next__() print("开始准备发红包") for i in range(10,15): time.sleep(1) print("发了一个红包,分两个") c1.send(i) c2.send(i) if __name__ == "__main__": producer("wangzai")