python - 最小化包含并以表达式为条件的 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)
但这引入了一个新变量。我的问题特别是是否有比这个更优雅的解决方案。
解决方案
您必须了解您在这里所做的权衡。一旦你运行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)
推荐阅读
- c++ - 委托构造函数和引用参数
- sql - 无重复联合或连接查询
- docker - 无法使用 Google Cloud Kubernetes 替换
- python-3.x - 在 Python 中将列表连接成字符串
- android - 如何在 64 位设备(android)上运行颤振应用程序?
- android - Unity - 首次运行时未加载 Android 上的数据库
- tensorflow - 用 Tensorflow 解决有向图问题
- android-source - 在aosp中构建静态库
- css - vuetify 上有卡片页脚/卡片组功能吗?
- javascript - Javascript - 更新对象道具的功能