如何理解Python中的迭代器和生成器

举个形象点的例子,这个内容可以用某某赌场的荷官发牌来解释。本来你需要自己去处理一堆牌(一个 collection),现在你有了这个对象,只要不断问他要“下一张”,他要是有自然会给你,没有就结束(StopIteration)

这个理解,首先要从容器说起。

容器(container)

Python 中有 list,set ,tuple,dict 等,这些都是容器,也就是用来装元素的东西。而迭代器,就是迭代的容器中的东西。这里的容器,就可以理解成为荷官手里的牌,她拿着所有的牌。

迭代器(Iterator)

迭代器,顾名思义,就是可以用该工具不断的从容器中取出结果,或者说产生结果。(可以是从容器中取,当然也可以通过某种函数即时计算,可以理解为重复某种“取”的动作)这里可以理解为你在问荷官要牌,你要一张,她给一张,要没了就会报错。

在Python中来说,就是可以使用next()方法来回调的对象,可以对可迭代对象使用iter()方法

temp = iter([1, 2, 3])
print type(temp)
print next(temp)

上面的 temp 就可以理解为迭代器,每一次 next() 都会输出一个对象,就相当于你向荷官又要了一张牌。这里需要注意的是,迭代只能一个个来,不能被索引,你总不能向荷官说,我缺啥牌,给来一张。

其优点便是要一张取一张,自己手里不用占太多地方。不耽误抽烟,收钱。

1.惰性运算,节省内存
2.从前到后一次取值,过程不可逆,亦不可重复。

生成器(generator)

生成器,可以理解为一种高级迭代器。

通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器

这就情况就可以理解为,有两个荷官,在牌发完时候,另外一个 荷官已经把牌洗好了,不用再等这个荷官洗牌。节约了时间,提高了效率。

三者之间关系如下图。简介明了:

到此介绍结束,感谢阅读!

参考链接:https://www.cnblogs.com/wj-1314/p/8490822.html

赞 (0)