避免或延迟对不可用物品的评估


问题内容

如何在Python中实现惰性评估?几个简单的例子:

>>> def foo(x):
...     print(x)
...     return x
... 
>>> random.choice((foo('spam'), foo('eggs')))
spam
eggs
'eggs'

上面,我们真的不需要评估该元组的所有项目来选择其中一个。在下面,foo()除非查找字典中实际上缺少查找键,否则实际上不需要计算默认值:

>>> d = {1: "one"}
>>> d.get(2, foo("default"))
default
'default'
>>> d.get(1, foo("default"))
default
'one'

我正在寻找一种Python的方式来重构上述示例,从而懒惰地求值。


问题答案:

在Python中进行延迟评估的标准方法是使用生成器

def foo(x):
    print x
    yield x

random.choice((foo('spam'), foo('eggs'))).next()

顺便说一句。Python还允许生成器表达式,因此下面的行不会预先计算任何内容:

g = (10**x for x in xrange(100000000))