Python中的惰性评估

发布于 2021-01-29 19:21:16

什么是Python中的惰性评估?

一个网站说:

在Python 3.x中,该range()函数返回一个特殊的范围对象,该对象按需计算列表元素(延迟或延迟评估):

>>> r = range(10)
>>> print(r)
range(0, 10)
>>> print(r[3])
3

这是什么意思?

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    range()(或xrange()在Python2.x中)返回的对象被称为惰性迭代。

    [0,1,2,..,9]生成器没有将整个范围存储在内存中,而是存储的定义(i=0; i<10; i+=1)并仅在需要时才计算下一个值(又称惰性求值)。

    本质上,生成器允许您返回类似于结构的列表,但是这里有一些区别:

    1. 列表创建后将存储所有元素。生成器在需要时生成下一个元素。
    2. 列表可以遍历尽可能多的,因为你需要,发电机只能遍历 正好 一次。
    3. 列表可以按索引获取元素,而生成器则不能-列表从头到尾仅生成一次值。

    生成器可以通过两种方式创建:

    (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创建此列表时将计算整个值列表。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看