2024-04-20 12:45:29 发布
网友
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
但这行不通。你知道吗
是的,您可以避免lambda中的双重求值。但它真的很难看,你应该避免它。下面是它的样子:
foo = lambda x: next(b if b > 10 else 0 for b in [bar(x)])
这个容易阅读和理解吗?不,绝对不是。我不打算解释,看你能不能弄明白。这显然不是一个好的解决方案,那么你应该怎么做呢?应该使用实函数而不是lambda。你知道吗
def foo(x): b = bar(x) return b if b > 10 else 0
这是更容易阅读和清楚地更好。你知道吗
您可能只想在函数执行时间很长的情况下这样做,否则不介意运行两次。您不能使用列表理解
foo = lambda x: [res if res>10 else 0 for res in [bar(x)]][0]
预评估:
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))
除非创建某种可变状态对象或其他奇怪的技巧,否则您所寻求的是不可能的。你知道吗
@alakasam的答案既狡猾又聪明,使用它的风险自负。最好使用迭代器和next来避免额外的中间列表:
next
lambda x: next(res if res > 10 else 0 for res in (bar(x), ))
这是live example
是的,您可以避免lambda中的双重求值。但它真的很难看,你应该避免它。下面是它的样子:
这个容易阅读和理解吗?不,绝对不是。我不打算解释,看你能不能弄明白。这显然不是一个好的解决方案,那么你应该怎么做呢?应该使用实函数而不是lambda。你知道吗
这是更容易阅读和清楚地更好。你知道吗
您可能只想在函数执行时间很长的情况下这样做,否则不介意运行两次。您不能使用列表理解
foo = lambda x: [res if res>10 else 0 for res in [bar(x)]][0]
预评估:
在这里,您可以看到与代码的相似之处:
除非创建某种可变状态对象或其他奇怪的技巧,否则您所寻求的是不可能的。你知道吗
@alakasam的答案既狡猾又聪明,使用它的风险自负。最好使用迭代器和
next
来避免额外的中间列表:这是live example
相关问题 更多 >
编程相关推荐