在if-else条件下重用函数输出而不是临时的

时间:2018-06-08 08:44:09

标签: python function if-statement

嗨,谢谢你的检查,我正在用Python编程,并且有一个简单的问题,到目前为止我还没有找到答案。 我有一个函数输出,我需要在if-else语句中多次使用。

这是一个示例代码:

result = fooB(fooA()) if fooA()==*someComparison* else fooA()

是否有一种优雅的方式可以多次使用这样的函数输出而无需多次调用函数(计算成本昂贵)或者必须暂时将输出保存在上一行中?

3 个答案:

答案 0 :(得分:1)

我只是将值分配给前一行的变量,如果它在所有三个调用中都是相同的。

正如Hearner已经在评论中写道的那样,你的例子有点令人困惑,因为你没有将三元的值分配给任何东西,暗示fooB(x)是一些带有副作用的功能,你想要调用它,但是不分配给变量。在那种情况下,我认为使用三元运算符并不是很漂亮。

如果比较为真,fooB(fooA())会返回您要分配的值,或者分配fooA(),那么

a = fooA()
b = fooB(a) if a == bar else a

肯定是要走的路,而不是特别不优雅。

如果fooB是一些带副作用的函数,如果比较为真,你只想调用它,你可以写一个例如。

a = fooA()
a == bar and fooB(a)

但不是每个人都喜欢这样的成语

a = fooA()
if a == bar:
    fooB(a)

可能更喜欢......

答案 1 :(得分:1)

到目前为止,你想要的是不可能的,因为python三元运算符只允许表达式而不是语句。如果您对这种差异感到好奇,我建议您阅读this amazing answer on the topic。但是这个问题的重要部分是你所要求的是一个任务(即tmp = fooA(),正如你自己正确指出的那样),这是一个陈述。

幸运的是,像你(和我)这样的其他人会喜欢在单个块,表达式或语句中共享临时结果的选项,这是PEP 572的目标,应该是2019年末的python3.8鉴于PEP被接受了。

您可以通过从源代码编译the POC来尝试。这就是它的样子:

>>> my_func = lambda: 'foo'
>>> tmp + 'bar' if (tmp := my_func()) == 'foo' else tmp
foobar
>>> tmp + 'bar' if (tmp := my_func()) == 'baz' else tmp
foo

这比你目前对临时变量所做的更漂亮,更直接:

>>> tmp = my_func()   # store the temp var
>>> if tmp == 'foo':  # the test
...    tmp += 'bar'   # the optional change
>>> tmp               # printing/reassigning the temp var
foobar

答案 2 :(得分:0)

如果fooA()仅取决于它的参数,你可以使用memoization,但是你仍然需要调用函数三次的开销(以及查找memo缓存的开销)当然),所以答案是否定的,这里唯一明智的解决办法是将第一次调用的结果存储在一个中间变量中。