首页 > 解决方案 > 条件表达式/三元运算符

问题描述

我不明白这种语法。

演示三元运算符的 Python 程序

a, b = 10, 20

使用元组选择项目

print( (b, a) [a < b] )

使用字典选择项目

print({True: a, False: b} [a < b])

PS:我猜这是来自旧版本的 Python,因为在较新的版本中(不知道来自哪个版本) True 和 False 是保留关键字,所以它们不能被赋值。

lamda 比上述两种方法更有效,因为在 lambda 中,我们确保只有一个表达式将被评估,这与 tuple 和 Dictionary 不同

print((lambda: b, lambda: a)[a < b]())

语法应该是:

[on_true] 如果 [表达式] 否则 [on_false]

那么如何

print( (b, a) [a < b] )
print({True: a, False: b} [a < b])
print((lambda: b, lambda: a)[a < b]())

适合这种语法?[a<b]元组/字典/lambda之后的含义是什么?我以前从未见过这种语法。它也适用于 list[b, a]先于[a<b]

我希望它看起来像这样

print( a if a < b else b )

资源链接: https ://www.geeksforgeeks.org/ternary-operator-in-python/

标签: pythonternary-operatorconditional-operator

解决方案


您的误解可能是关于 a < b 。

在所有这些情况下,评估 a < b 的布尔结果被用作之前对象的键。

如果是

print( (b, a) [a < b] )

print((lambda: b, lambda: a)[a < b]())

该对象是一个元组,包含变量本身或非常简单的匿名函数,它们返回这些变量。

如果是

print({True: a, False: b} [a < b])

该表达式被评估并用作字典的键,该字典具有 True 和 False 作为键。假设这意味着它必须是较旧的 Python 版本是不正确的,因为字典不代表值的重新分配,而只是一个数据结构,其中键映射到值。True 和 False 是有效的键,这种情况正是这里使用的。

最后:

 print( a if a < b else b )

是表达同一件事的一种简洁明了的方式,实际上是我在这种情况下使用的代码行


推荐阅读