我不理解这种语法。
用于演示三元运算符的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/
答案 0 :(得分:1)
a<b
是bool
(True
或False
)。由于bool
是int
的子类型,因此可以在需要整数的上下文中使用它,例如作为列表/元组索引:
>>> 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)
首先请注意,所有这些都给出了a
和b
的最小值值:
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
我们可以依次考虑:
res1
构造2个整数的tuple
。 a < b
返回一个布尔值,在这种情况下为True
。在Python中,True == 1
,因为bool
是int
的子类。最后,[]
是__getitem__
的语法糖,这是用于位置索引的方法。由于Python从0
开始计数,因此第一个索引为a
。您也可以自己确认以下内容:(b, a).__getitem__(1)
返回10
。res2
构造了一个字典,将布尔值映射到a
和b
。在__getitem__
对象上调用dict
将返回给定键的值。和以前一样,这里的密钥是True
。由于字典将True
映射到a
,因此这是返回的值。res3
构造一个匿名(lambda
)函数的元组,每个函数返回标量,即b
和a
。根据{{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 )
表达同一件事是一种很好而简洁的方法,实际上,在这种情况下我将使用的代码行