Python中的惰性评估
什么是Python中的惰性评估?
一个网站说:
在Python 3.x中,该range()
函数返回一个特殊的范围对象,该对象按需计算列表元素(延迟或延迟评估):
>>> r = range(10)
>>> print(r)
range(0, 10)
>>> print(r[3])
3
这是什么意思?
-
由
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 in range(5000000)]
是生成器,仍然是列表。range(...)
它的工作并一次生成x
一个,但是在x/2
创建此列表时将计算整个值列表。