条件 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<b
是 bool
(True
或 False
)。由于 bool
是 int
的子类型,因此可以在需要整数的上下文中使用,例如作为 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'
首先请注意,所有这些都给出了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
returns 布尔值,在本例中为 True
。在 Python、True == 1
中,因为 bool
是 int
的子类。最后,[]
是 __getitem__
的语法糖,这是位置索引调用的方法。由于 Python 从 0
开始计数,因此第一个索引是 a
。你也可以自己确认一下:(b, a).__getitem__(1)
returns 10
.
res2
构造一个将布尔值映射到 a
& b
的字典。在 dict
对象上调用 __getitem__
returns 给定键的值。和以前一样,这里的关键是 True
。由于字典将 True
映射到 a
,这是返回的值。
res3
构造一个匿名 (lambda
) 函数元组,每个函数返回标量,即 b
和 a
。根据 res1
,可以通过整数索引从元组中提取项目。唯一的附加要求是通过 ()
. 实际调用 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 )
表达相同事物的简洁明了的方式,实际上是我在这种情况下使用的代码行
我不明白这个语法。
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<b
是 bool
(True
或 False
)。由于 bool
是 int
的子类型,因此可以在需要整数的上下文中使用,例如作为 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'
首先请注意,所有这些都给出了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
returns 布尔值,在本例中为True
。在 Python、True == 1
中,因为bool
是int
的子类。最后,[]
是__getitem__
的语法糖,这是位置索引调用的方法。由于 Python 从0
开始计数,因此第一个索引是a
。你也可以自己确认一下:(b, a).__getitem__(1)
returns10
.res2
构造一个将布尔值映射到a
&b
的字典。在dict
对象上调用__getitem__
returns 给定键的值。和以前一样,这里的关键是True
。由于字典将True
映射到a
,这是返回的值。res3
构造一个匿名 (lambda
) 函数元组,每个函数返回标量,即b
和a
。根据res1
,可以通过整数索引从元组中提取项目。唯一的附加要求是通过()
. 实际调用
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 )
表达相同事物的简洁明了的方式,实际上是我在这种情况下使用的代码行