首页 > 解决方案 > 最小化包含并以表达式为条件的 if 语句

问题描述

我经常不得不写如下几行:

if exp(var1):
   new_variable = exp2(exp(var1))

如您所见,此语句计算exp两次 - 一次用于条件,然后在if语句体中。是否有一种简洁的pythonic方式来编写它,以便exp只评估一次?

我知道我可以写:

temp_variable = exp(var1)
if temp_variable:
     new_variable = exp2(temp_variable)

但这引入了一个新变量。我的问题特别是是否有比这个更优雅的解决方案。

标签: pythonpython-3.xif-statementvariable-assignment

解决方案


您必须了解您在这里所做的权衡。一旦你运行exp(var1),返回值就会生成。它可能会在if检查运行后立即被取消引用和垃圾收集,但此时该变量确实存在。所以这两个调用都exp(var1)创建了一个对象。他们不做的是将其分配给您当前命名空间中的名称。

所以权衡是运行两次(可能很昂贵)计算,或者用一个临时名称污染你的命名空间。在我看来,后一种选择更加愚蠢:有很多方法可以使用有效的名称。

在通过PEP-572引入的 python 3.8 的赋值表达式之前,您必须添加一行额外的代码:

well_named_result = exp(var1)
if well_named_result:
   new_variable = exp2(well_named_result)

在 python 3.8 及更高版本中,您可以使用:= walrus 运算符来保存即使是轻微的侵犯:

if well_named_result := exp(var1):
   new_variable = exp2(well_named_result)

现在,如果您想exp2无论如何都调用,但根据最初的三位一体使用不同的参数,您确实可以在没有额外名称的情况下调用:

new_variable = exp2(exp(var1) or some_default_value)

推荐阅读