由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))
# 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 in range(5000000)]
是生成器,仍然是列表。range(...)
它的工作并一次生成x
一个,但是在x/2
创建此列表时将计算整个值列表。