python - 我可以在保留 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
但这不起作用。
解决方案
预评估:
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), ))
这里有活生生的例子
推荐阅读
- javascript - 即使在查询中使用 rand() 后,PHP 中的 SQL 选择查询每次都会给出相同的输出
- python - 代码段中的 NameError
- elasticsearch - Logstash 无法检索存储在 logstash-keystore 中的密钥
- spring - 限制 spring rest docs 中响应数组的数量
- ruby-on-rails - 使用 Rails Arel 从块生成复杂的单个 SQL 查询
- javascript - 类型“未知”.ts(2339) 上不存在属性“名称”
- function - Powershell调用函数在if语句中带有参数
- node.js - 如何使用 https 在弹性 beantalk 中配置单个 ec2 实例
- ios - 命令 PhaseScriptExecution 颤动
- java - 准备注册的可调用参数时出错