最小化包含并以表达式为条件的if语句[重复]
Posted
技术标签:
【中文标题】最小化包含并以表达式为条件的if语句[重复]【英文标题】:Minimizing if statement that contains and is conditioned on an expression [duplicate] 【发布时间】:2021-09-30 22:12:08 【问题描述】:我经常要写这样的行:
if exp(var1):
new_variable = exp2(exp(var1))
如您所见,此语句对 exp
进行两次评估 - 一次用于条件,然后在 if
语句的主体内。有没有一种简洁的 Pythonic 方式来编写这个,以便 exp
只被评估一次?
我知道我会写:
temp_variable = exp(var1)
if temp_variable:
new_variable = exp2(temp_variable)
但这引入了一个新变量。我的问题是,是否有比这个更优雅的解决方案。
【问题讨论】:
我不知道不引入新变量的方法。if temp := exp(var1): exp2(temp)
可用于内联分配。
引入另一个变量并没有错。事实上,拥有变量的一个目的是存储中间结果以供进一步重用。
@DYZ。更不用说仅仅因为您没有命名变量,并不意味着它没有被创建。
@mkrieger1。我想我已经做出了足够不同的答案来证明这不是重复的。
【参考方案1】:
您必须了解您在这里所做的权衡。只要您运行exp(var1)
,就会生成返回值。在if
检查运行后,它可能会立即被取消引用并收集垃圾,但此时该变量确实存在。所以对exp(var1)
的两个调用都创建了一个对象。他们不做的是将其分配给您当前命名空间中的名称。
所以权衡是运行两次(可能很昂贵)计算,或者用一个临时名称污染你的命名空间。在我看来,后一种选择更加愚蠢:有很多方法可以使用有效的名称。
在通过PEP-572 引入的python 3.8 的assignment expressions 之前,您必须添加额外的代码行:
well_named_result = exp(var1)
if well_named_result:
new_variable = exp2(well_named_result)
在 python 3.8 及更高版本中,您可以使用 :=
walrus operator 来保存即使是轻微的侵犯:
if well_named_result := exp(var1):
new_variable = exp2(well_named_result)
现在,如果你想调用 exp2
无论如何,但根据最初的三位一体使用不同的参数,你确实可以不用额外的名称:
new_variable = exp2(exp(var1) or some_default_value)
【讨论】:
以上是关于最小化包含并以表达式为条件的if语句[重复]的主要内容,如果未能解决你的问题,请参考以下文章