在Python中,什么是懒惰?

一个网站说:

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

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

这是什么意思?

推荐答案

range()(或Python2.x中的xrange())返回的对象称为lazy iterable.

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

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

  1. 列表在创建时存储所有元素.生成器在需要时生成下一个元素.
  2. 一个列表可以根据需要进行多次迭代,而一个生成器只能迭代exactly次.
  3. 列表可以通过索引获取元素,而生成器不能——它只从开始到结束生成一次值.

A generator can be created in two ways:

(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)

Note:尽管range(5000000)在Python3中是一个发生器.x、 [x/2 for x in range(5000000)]仍然是一个列表.range(...)执行它的任务,一次生成x个值,但创建此列表时,将计算x/2个值的整个列表.

Python-3.x相关问答推荐

如何匹配字母,数字,短划线,逗号,但不是如果没有数字和字母?

Gekko优化超出了方程式的界限(由于某种原因,会产生变量)

如何将CSV或FDF数据解析到Python词典并注入到模板PDF表单中?

是否可以使用参数对Flask重定向?

Python多处理池:缺少一个进程

为什么在Python中使用RANDINT函数时会出现此TypeError?

如何使用 Selenium Python 连续单击一个按钮直到另一个元素出现?

在特定条件下从 DataFrame 中提取特定组

从列表的元素和python中的多个多索引数据帧执行方程

安装没有 sudo 权限的 python3 和 pip3

协议不支持地址系列在将 Scapy L3socket 与 WSL 一起使用时

Python:获取未绑定的类方法

保存 StandardScaler() 模型以用于新数据集

预分配一个无列表

Pytorch 的随机 Select ?

Python 错误:IndexError:字符串索引超出范围

是否有与 Laravel 4 等效的 python?

将 args、kwargs 传递给 run_in_executor

异常被忽略是什么类型的消息?

新项目:Python 2 还是 Python 3?