什么是生成器?
生成器(generator)就是 python 中一种一边循环一边计算的机制
生成器有什么作用?
比如当我们生成一个列表,我们可以通过列表式直接创建一个列表。但是受到内存的限制,列表的容量肯定是有限的。而且创建一个非常大的列表时消耗的内存也是非常大的。如果我们仅仅需要访问前面几个元素,那么后面绝大多数占用的空间都浪费了。而生成器可以帮助我们不必创建完整的列表,在需要时通过循环来创建出后面的元素,节省大量的空间。
生成器创建的方法:
要创建生成器有很多种方法。第一种方法很简单,只要把一个列表的【】改成()
1 L =[x for x in range(5)] 2 3 G =(x for x in range(5))
分别输出 L 和 G 得出以下结果:
L:[0,1,2,3,4]
G:<generator object <genexpr> at 0x02101C90>
可以发现 G 是一个生成器对象;如果想要打印出来可以通过 next() 函数获得生成器的下一个返回值:
next(G) # 执行此操作会打印出 0 next(G) # 执行此操作会打印出 1 …… next(G) # 执行此操作会打印出 5
在没有元素时,,在使用 next 会抛出一个 stoplteration 异常。
创建生成器方法2:
1 def lister(times): 2 n = 0 3 while n < times: 4 yield n 5 n += 1 6 7 for x in lister(5): 8 print(x)
yield 函数可以将整个函数转换成生成器
上面的代码执行时会不断调用 yield ,就会不断中断产生一个数值,记录下来,此时 lister(5) 便是一个 generator 对象。当然也可以采用 next 函数逐次输出。
对于 yield 转换的函数可以使用 send 来进行传值达到控制的目的:
如 g = lister()
g.send(6)
迭代:
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。
可迭代对像(Iterable):
可被循环的都是可被迭代的,统称为可迭代对像。
可迭代对像的判断:
可以使用 isinstance() 判断一个对象是否是 Iterable 对像:
用法: isinstance(obj,class)
如:
1 from collections import Iterable 2 3 isinstance ([ ], Iterable) 4 5 ##返回值为 True
迭代器(Iterator):
生成器都是 Iterator 对像,但 list ,dict, str,tuple等类型虽然都是 Iterable 却不是 Iterator;
生成器的值的对像被称为迭代器
迭代器对像从集合的第一个元素开始访问,直到所有元素被访问完结束。迭代器只能往前不会后退。
可以使用 isinstance() 判断一个对象是否是 Iterable 对像:
用法: isinstance(obj,class)
如:
1 from collections import Iterator 2 3 isinstance ([ ], Iterator) 4 5 #返回值为False
迭代器的转换:
对于非迭代器的可迭代对像可以使用 iter() 函数将 Iterable 转化为 Iterator。
迭代器的目的:
减少内存的占用