最小化包含并以表达式为条件的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语句[重复]的主要内容,如果未能解决你的问题,请参考以下文章

条件语句

Java-Runoob:Java 条件语句

SQL条件语句(IF, CASE WHEN, IF NULL)

第五章-if语句

条件分支语句

02_5if switch分支与循环语句