什么是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
创建此列表时将计算整个值列表。
问题内容: 我正在尝试在Python3中使用。这是我正在使用的一些代码: 但是,由于在Python3中返回了迭代器,因此该代码在Python3中不起作用(但在Python2中可以正常工作,因为该版本的always返回a ) 我当前的解决方案是在迭代器上添加一个函数调用以强制求值。但这似乎很奇怪(我不在乎返回值,为什么要将迭代器转换为列表?) 有更好的解决方案吗? 问题答案: 当您对返回的值不感兴趣
问题内容: 我知道Java在这种情况下具有智能/惰性评估: 但是关于: 即使返回true 也被调用? 问题答案: 在Java(和其他类似C的语言)中,这称为 短路评估 。* 是的,在第二个示例中总是被调用。也就是说,除非编译器/ JVM可以确定它没有可观察到的副作用,否则在这种情况下它可以选择进行优化,但是无论如何您都不会注意到它们之间的差异。 两者截然不同; 前者本质上是一种优化技术,而第二种则
我正在写一篇关于Java流API的文章。我已经阅读了Stream的整个软件包文档,并在这里查看了类似的问题。 如果我说:“直到终端操作被命中,才会评估流上的中间操作,这将实际执行它们,”我是否正确?我在StackOverflow上看到了混合答案,而且每个中间操作都返回一个Stream,所以我想知道它是否只是返回自己,然后只是跟踪要执行的中间操作。这就是“懒惰评估/执行”的意思吗? 下面的javad
问题内容: 例如,如果我有以下语句: 如果foo1为true,python将检查foo2的条件吗? 问题答案: 是的,Python懒惰地评估布尔条件。 该文件说, 表达式x和y首先计算x;如果x为假,则返回其值;否则,将评估y并返回结果值。 表达式x或y首先计算x; 如果x为true,则返回其值;否则,将评估y并返回结果值。
问题内容: 我最近读到了Python 3的一个好处是它很懒。那就更好了 而不是 我很好奇的是如何使用这种懒惰。如果生成映射对象,例如,如何访问生成的操作/列表中的特定元素。在我所见过的几乎所有文档中,他们都会做类似或的事情(据我所知),它放弃了惰性概念,因为它隐式将地图转换为列表。 我想我正在寻找的是能够以与我可以懒惰地懒惰地生成地图对象类似的方式使用地图对象的能力,并且可以在没有巨大计算量的情况
下面的备选案文1或备选案文2是否正确(例如,其中一个优于另一个),或者它们是否等同? 备选案文1 或 备选案文2