1.生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
P = (x*x for x in range(10))print(P)
这样我们就构建了一个生成器那么我们打印的结果是什么呢?
at 0x000001FEC5091AF0>
这就是P的结果了 那么当我想打印我要的东西我只需要
print(P.__next__())
有人就要问,我要是想打印第三个怎么办?那没办法只能调用三次了。
1.2使用循环制作一个生成器
1 def shengchengqi(max):2 print('生成器真正在生效')3 b = 04 while b < max:5 b = yield 6 b += 27 8 data = shengchengqi(10)9 print(data.__next__())
如代码所示当我们用循环构建一个生成器的时候只需要使用 yield关键字并且使用一个变量接收即可。
1.3通过yield实现在单线程的情况下实现并发运算的效果
现在我们知道可以根据yield制作一个生成器这里我要借用网上的思路来展示详情请看http://www.cnblogs.com/alex3714/articles/5765046.html
1 def xiaodian(name): 2 print("大家准备吃包子咯") 3 while True: 4 baozi = yield 5 print('包子来咯,%s,被%s吃了' % (baozi, name)) 6 7 def protulr(): 8 c1=xiaodian('booker') 9 c=xiaodian('li')10 c.__next__()11 c1.__next__()12 print('老子要开始做包子了')13 c.send('大肉包')14 c1.send('小笼包')15 c.send('菜包')16 c1.send('woako')
那么这里解释一下啊send的使用方法,send为向生成器内传入值。 并且也会next一下。
2.迭代器
总结一句话就是
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象