由
range()(或
xrange()在Python2.x中)返回的对象被称为惰性迭代。
[0,1,2,..,9]生成器没有将整个范围存储在内存中,而是存储的定义
(i=0; i<10;i+=1)并仅在需要时才计算下一个值(又称惰性求值)。
本质上,生成器允许您返回类似于结构的列表,但是这里有一些区别:
- 列表创建后将存储所有元素。生成器在需要时生成下一个元素。
- 列表可以遍历尽可能多的,因为你需要,发电机只能遍历 正好 一次。
- 列表可以按索引获取元素,而生成器则不能-列表从头到尾仅生成一次值。
生成器可以通过两种方式创建:
(1)与清单理解非常相似:
# this is a list, create all 5000000 x/2 values immediately, uses []lis = [x/2 for x in range(5000000)]# this is a generator, creates each x/2 value only when it is needed, uses ()gen = (x/2 for x in range(5000000))
(2)作为函数,使用
yield返回下一个值:
# this is also a generator, it will run until a yield occurs, and return that result.# on the next call it picks up where it left off and continues until a yield occurs...def divby2(n): num = 0 while num < n: yield num/2 num += 1# same as (x/2 for x in range(5000000))print divby2(5000000)
注意: 即使
range(5000000)在Python3.x中
[x/2 for x inrange(5000000)]是生成器,仍然是列表。
range(...)它的工作并一次生成
x一个,但是在
x/2创建此列表时将计算整个值列表。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)