Python:如何根据返回值调整函数的一部分的执行

标签 python function

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

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

x, _ = f(w)

...下面的调用将执行它...

x, y = f(w)

是否可以这样定义函数?当然,一个直接的替代方法是将一个额外的 bool 变量传递给 f 来确定是否要计算 y 但我想知道是否还有其他方法可以做这个。谢谢!

最佳答案

这是生成器的完美案例,您可以使用它延迟执行直到您需要它。

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

关于Python:如何根据返回值调整函数的一部分的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24933466/

相关文章:

c++ - 错误 : Expression must have (Pointer-to-) function type

python - 属性错误 : 'Foo' object has no attribute 'max'

python - subprocess.Popen() 在 Eclipse/PyCharm 和终端执行之间有不一致的行为

python - 如何使用基于列名的向量化运算?

python - Six.moves 中的关键错误返回 sys.modules[fullname]

function - Lua 全局覆盖

c++ - 带有可互换字母的字符串

c - 当我尝试在 C 中调用带参数的函数时出现错误 "error: expected expression before..."

python - 对包含列表作为值的字典列表进行排序

python - 获取 <br/> 之前的文本 python/bs4