python - 如何在 Python lambda 表达式中表达条件执行?

标签 python lambda conditional short-circuiting inline-if

我发现了什么:

Dive in to Python 中,我读到了 andor 运算符的特殊性质 以及如何使用 bool 运算符的短路评估通过 and-or trick 更简洁地表达条件。它的工作方式非常类似于 C 中的三元运算符。

C:

result = condition ? a : b

python :

result = condition and a or b

这似乎派上了用场,因为 lambda 函数在 Python 中仅限于单行代码,但它使用逻辑语法来表达控制流。

自 Python 2.5 以来,inline-if 似乎作为一种更易读的语法来拯救 and-or 技巧:

result = a if condition else b

所以我猜这是可读性较差的 and-or-construct 的 pythonic 替代品。 即使我想嵌套多个条件,看起来还是挺全面的:

result = a if condition1 else b if condition2 else c

但在一个充满不确定性的世界里,我经常发现自己编写了一些这样的代码来访问 a.b.c :

result = a and hasattr(a, 'b') and hasattr(a.b, 'c') and a.b.c or None 

所以在 inline-if 的帮助下,我可能会去掉一些 andsors,从而得到一个非常可读的片段代码:

result = a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None

我还在这个 recipe 中发现了一种有点神秘的条件方法。

result = (a, b)[condition] 

但这不会短路,如果条件的结果不返回 bool 值、0 或 1,则会导致各种错误。

我想知道的:

现在我想知道如果向下兼容性不是一个问题,或者只是一个品味问题以及多少您是否对短路评估的世界感到宾至如归?

更新

我刚刚意识到 inline-if 不仅仅是 and-or-trick 的语法糖,因为当 a 在 bool 上下文中为 false 时它不会失败。所以它可能更不易出错。

最佳答案

pythonic 要做的事情是当你把你的代码扩展到超过合理的范围来塞进一个单一的函数并且只使用一个普通的函数时识别出来。请记住,lambda 可以做的事,命名函数也做不到。

当然每个人的突破点都不一样,但是如果你发现自己在写:

return a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None

太多了,考虑只做这个:

try:
     return a.b.c
except AttributeError:
     return None

关于python - 如何在 Python lambda 表达式中表达条件执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5142423/

相关文章:

python - 如何在 python 字典中保持循环以搜索值?

计数的python数据透视表

c# - 针对多个属性构建动态 where 子句

java.util.NoSuchElementException : No value present Java 8 Lambda

python - 在一行中使用一个表达式两次 - 作为字符串格式的条件和?

python - Pandas 数据框条件 .mean() 取决于特定列中的值

Python字典,子元素访问

Python MySQLdb 连接错误

c# - 如何在 DataTable 中使用 LINQ?

javascript - Not not (!!) 在 if 条件内