在ifelse条件下重用函数输出而不使用临时

2024-06-28 19:33:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

下面是一个示例代码:

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

有没有一种优雅的方法可以多次使用这样的函数输出,而不需要多次调用函数(计算代价很高),也不必临时将输出保存在前一行中?在


Tags: 方法函数答案代码示例if编程语句
3条回答

如果三个调用的值都相同,我只会将值赋给前一行的变量。在

正如Hearner在评论中所写的那样,您的例子有点令人困惑,因为您没有将三元值赋给任何东西,这意味着fooB(x)是一个有副作用的函数,您想调用它,但不指定给变量。在这种情况下,我认为使用三元运算符不是很好。在

如果fooB(fooA())返回某个值,如果比较为真,则返回要赋值的值,否则赋值fooA(),则

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

当然是一种方式,不是特别不雅观。在

如果fooB是一个有副作用的函数,只有在比较结果为真时才想调用它,那么您可以编写例如

^{pr2}$

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

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

可能会更好

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

幸运的是,像您(和我)这样的其他人会喜欢在单个块、表达式或语句中共享临时结果的选项,这是PEP 572的目标,将于2019年底发布于python3.8。因为政治公众人物被接受了。在

您可以通过从源代码编译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

哪一个在我看来比你现在要做的临时变量更漂亮、更直截了当:

^{pr2}$

如果fooA()只依赖于它的参数,那么可以使用memoization,但是仍然会有三次调用函数的开销(当然还有查找memo缓存的开销),所以答案是否定的,这里唯一合理的解决方案是明确地将第一次调用的结果存储在中间变量中。在

相关问题 更多 >