条件表达式/三元运算符

时间:2018-09-05 13:41:46

标签: python ternary-operator conditional-operator

我不理解这种语法。

  

用于演示三元运算符的Python程序

a, b = 10, 20
  

使用元组选择项目

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

使用词典选择项目

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

PS:我想这是来自旧版本的Python,因为在较新的版本中(不知道从哪个版本开始),True和False是保留关键字,因此无法为其分配值。

  

lamda比上述两种方法更有效   因为在lambda中,我们确保只评估一个表达式,而不像   元组和字典

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

语法应为:

  

[on_true],如果[expression]则为[on_false]

那怎么办

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

适合这种语法吗? 元组/字典/ lambda之后的[a<b]是什么意思?我以前从未见过这种语法。当列表[b, a][a<b]之前,它也适用。

我希望它看起来像这样

print( a if a < b else b )

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

3 个答案:

答案 0 :(得分:1)

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

>>> 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'

答案 1 :(得分:1)

首先请注意,所有这些都给出了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返回一个布尔值,在这种情况下为True。在Python中,True == 1,因为boolint的子类。最后,[]__getitem__的语法糖,这是用于位置索引的方法。由于Python从0开始计数,因此第一个索引为a。您也可以自己确认以下内容:(b, a).__getitem__(1)返回10
  2. res2构造了一个字典,将布尔值映射到ab。在__getitem__对象上调用dict将返回给定键的值。和以前一样,这里的密钥是True。由于字典将True映射到a,因此这是返回的值。
  3. res3构造一个匿名(lambda)函数的元组,每个函数返回标量,即ba。根据{{​​1}},可以通过整数索引从元组中提取项目。唯一的附加要求是通过res1实际调用lambda函数。

请注意,这些操作均与通过嵌入式() / {{1}进行编译时在编译时应用的ternary operator相同(见注释)。 }:

if

答案 2 :(得分:1)

您的误解可能与

在所有这些情况下,评估a

对于

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 )

表达同一件事是一种很好而简洁的方法,实际上,在这种情况下我将使用的代码行