python中的生成器、迭代器(基础篇)

什么是生成器?

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

1.生成器的特点

  1. 节约内存
  2. 迭代到下一次的调用时,所使用的参数是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的。

2.创建生成器方法

最简单的方法,只要把一个列表生成式的[]改成(),就是一个生成器,列表生成式:L= [x*2 for x in range(5)]:
在这里插入图片描述

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实现的时候,还可以用函数来实现一个生成器。

下面我使用一个fib函数实现生成器:
在这里插入图片描述
用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。上面我使用while循环调用next()
来获取返回值。

迭代器

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

1. 可迭代对象

以直接作用于 for 循环的数据类型有以下几种:

一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;

一类是 generator ,包括生成器和带 yield 的generator function。

这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

什么是迭代器?

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator ,把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数

发布了38 篇原创文章 · 获赞 10 · 访问量 7184

猜你喜欢

转载自blog.csdn.net/chenxuezhong0413/article/details/100621041