迭代器
1.该对象需提供next方法,返回迭代器的下一项
2.如果没有下一项即迭代完成时会抛出一个StopIteration异常。
list1 = [1,2,3] iter1 = iter(list1) iter2 = iter(list1)
for i in iter1:print("迭代器1:",i)
print("迭代器2",next(iter2))
for i in iter2:print("迭代器2:",i)
总结:
我们for循环列表字典等,并不是真正的for循环列表本身。而是for循环他们返回的一个迭代器对象,这些迭代器对象只能迭代一次
事实上除了for外,sum,min,max函数等内置对象都会使用迭代器协议访问对象。也就是说他们会先调用这些对象中的__iter__
方法,如果没有的话则会去找__getitem__
方法
生成器
def test_generator(n): for i in range(n): yield i ** 2 generator1 = test_generator(3) generator1 next(generator1)
1.生成器本身是一种特殊的迭代器,也就是说生成器就是迭代器。
2.生成器会自动实现迭代器协议,也就是说只要我们yield后,自动就生成了next对象包括StopIteration等结构。
3.生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。生成器不仅“记住”了它的数据状态,生成还记住了程序执行的位置。
二者区别
1.迭代器是访问容器的一种方式,也就是说容器已经出现。我们是从已有元素拓印出一份副本,只为我们此次迭代使用。而生成器则是,而生成器则是自己生成元素的。也就是前者是从有到有的复制,而后者则是从无到有的生成。
2.在用法上生成器只需要简单函数写法,配合yield就能实现。而迭代器真正开发中很难使用到。我们可以把生成器看做,python给我们提供的特殊接口实现的迭代器。
如果到这里还是不太清楚,那我们就再研究深入一点
list1 = list(dir(generator1)) # 生成器所有的方法 list2 = list(dir(iter([1,2,3]))) # 迭代器所有的方法
标签:__,迭代,python,生成器,list1,yield,iter From: https://www.cnblogs.com/boye169/p/17055092.html