首页 > 解决方案 > 我可以在保留 lambda 表达式的同时删除双重评估吗

问题描述

def bar(x):
    # some expensive calculation
    <snip>

foo = lambda(x): bar(x) if bar(x) > 10 else 0

但是在这里我计算了 foo 两次。有没有办法仍然把它写成一个衬里但避免双重评估。我试过

foo = lambda(x): v if (v = bar(x)) > 10 else 0

但这不起作用。

标签: pythonlambdaternary-operator

解决方案


预评估:

foo    = lambda(x): x if x > 10 else 0
result = foo(bar(x))

在这里您可以看到与您的代码有什么相似之处:

lambda (x): foo(x) if foo(x) > 10 else 0 == (lambda(x): x if x > 10 else 0)(foo(x))

除非您创建某种可变状态对象或其他一些奇怪的技巧,否则您所寻求的是不可能的。

@Alakazam 的答案既棘手又聪明,使用它需要您自担风险。最好使用迭代器并next避免额外的中间列表:

lambda x: next(res if res > 10 else 0 for res in (bar(x), ))

这里有活生生的例子


推荐阅读