我想实现一个函数f
,它会在给定输入x
的情况下返回两个值y
和w
。此函数首先使用x
计算w
的值,然后使用计算值y
计算x
。但是,由于y
的计算成本很高,我希望函数只在我需要函数的结果时计算其值。
也就是说,对f
的以下调用不会执行计算y
的函数部分......
x, _ = f(w)
...以下调用将执行它......
x, y = f(w)
是否可以用这种方式定义功能?当然,一个简单的替代方法是将一个额外的布尔变量传递给f
,它确定是否要计算y
,但我想知道是否还有其他方法可以做到这一点。谢谢!
答案 0 :(得分:3)
这是生成器的完美案例,您可以使用它来延迟执行直到您想要它。
def defer_huge_operation(w):
...
yield x
...
...
...
yield y
op = defer_huge_operation(w)
x = next(op)
...
...
y = next(op)
执行next(op)
时,它将产生x
的值,控件将返回到主程序,当您再次执行next(op)
时,执行将从你离开的地方,将执行巨大的操作,为你y
。
注意:完全使用生成器后,对生成器的进一步next
次调用将引发StopIteration
异常。即使您想再次执行相同的操作,也需要创建一个像这样的新生成器对象
op = defer_huge_operation(w)
如果您想获得生成器产生的所有值,只需使用list
或tuple
函数进行迭代,就像这样
returned_values_list = list(defer_huge_operation(w))
答案 1 :(得分:2)
另一种选择是从函数返回一个带有lazy properties的对象,因此只有在你第一次读取它们时才会计算结果。
即
result = f(w)
x = result.x # only x is calculated now
y = result.y # y is calculated only here
y2 = result.y # y isn't calculated a second time