条件 expression/ternary 运算符

Conditional expression/ternary operator

我不明白这个语法。

Python program to demonstrate ternary operator

a, b = 10, 20

Use tuple for selecting an item

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

Use Dictionary for selecting an item

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

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

lamda is more efficient than above two methods because in lambda we are assure that only one expression will be evaluated unlike in tuple and Dictionary

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

语法应为:

[on_true] if [expression] else [on_false]

那么

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

适合这种语法吗? tuple/dictionary/lambda后面的[a<b]是什么意思?我以前从未见过这种语法。它也适用于列表 [b, a][a<b].

之前

我希望它看起来像这样

print( a if a < b else b )

Link 到资源: https://www.geeksforgeeks.org/ternary-operator-in-python/

a<bboolTrueFalse)。由于 boolint 的子类型,因此可以在需要整数的上下文中使用,例如作为 list/tuple 索引:

>>> True == 1
True
>>> False == 0
True
>>> isinstance(True, int)
True
>>> ('a', 'b')[True]  # True == 1
'b'
>>> ('a', 'b')[1<2]  # 1<2 == True == 1
'b'
>>> ('a', 'b')[2<1]  # 2<1 == False == 0
'a'

对于dict键,它是相似的,但甚至不需要类型强制:

>>> {True: 'a', False: 'b'}[1<2]  # 1<2 == True
'a'

首先请注意,所有这些都给出了ab最小值

a, b = 10, 20

res1 = (b, a)[a < b]                    # 10
res2 = {True: a, False: b}[a < b]       # 10
res3 = (lambda: b, lambda: a)[a < b]()  # 10

我们可以依次考虑这些:

  1. res1 构造 2 个整数的 tuplea < b returns 布尔值,在本例中为 True。在 Python、True == 1 中,因为 boolint 的子类。最后,[]__getitem__ 的语法糖,这是位置索引调用的方法。由于 Python 从 0 开始计数,因此第一个索引是 a。你也可以自己确认一下:(b, a).__getitem__(1) returns 10.
  2. res2 构造一个将布尔值映射到 a & b 的字典。在 dict 对象上调用 __getitem__ returns 给定键的值。和以前一样,这里的关键是 True。由于字典将 True 映射到 a,这是返回的值。
  3. res3 构造一个匿名 (lambda) 函数元组,每个函数返回标量,即 ba。根据 res1,可以通过整数索引从元组中提取项目。唯一的附加要求是通过 ().
  4. 实际调用 lambda 函数

注意 none 其中的操作方式与 ternary operator 的运行方式相同 在编译时 (见注释)通过内联 if / else:

res4 = a if a < b else b

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

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

的情况下
print( (b, a) [a < b] )

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

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

的情况下
print({True: a, False: b} [a < b])

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

最后:

 print( a if a < b else b )

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