Python:如何在返回值上调节函数的一部分的执行

时间:2014-07-24 12:17:22

标签: python function

我想实现一个函数f,它会在给定输入x的情况下返回两个值yw。此函数首先使用x计算w的值,然后使用计算值y计算x。但是,由于y的计算成本很高,我希望函数只在我需要函数的结果时计算其值。

也就是说,对f的以下调用不会执行计算y的函数部分......

x, _ = f(w)

...以下调用将执行它......

x, y = f(w)

是否可以用这种方式定义功能?当然,一个简单的替代方法是将一个额外的布尔变量传递给f,它确定是否要计算y,但我想知道是否还有其他方法可以做到这一点。谢谢!

2 个答案:

答案 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)

如果您想获得生成器产生的所有值,只需使用listtuple函数进行迭代,就像这样

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