在Python中是否有特纳利条件操作器?


当前回答

模拟 Python Ternary 操作器。

例如

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

出口:

'b greater than a'

其他回答

在 2.5 之前的版本中,有以下技巧:

[expression] and [on_true] or [on_false]

它可以提供错误的结果,当 on_true 具有虚假的 Boolean 值。

雖然它有評估表達的好處留在右邊,這在我看來更清楚。

是否有“C”的“?”:“特纳利运营商的同等值?

作为Python Enhancement Proposal 308的一部分,2006年在Python中添加了一个条件表达的操作员,其形式不同于常见的?:操作员,它看起来如下:

<expression1> if <condition> else <expression2>

相当于:

if <condition>: <expression1> else: <expression2>

下面是一个例子:

result = x if a > b else y

可使用的另一个合成(可与 2.5 之前的版本兼容):

result = (lambda:y, lambda:x)[a > b]()

工人被精心评估。

另一种方式是通过索引一个<unk>(不符合大多数其他语言的条件运营商):

result = (y, x)[a > b]

或明确构建的词典:

result = {True: x, False: y}[a > b]

另一个(不太可靠),但更简单的方法是使用和和或运营商:

result = (a > b) and x or y

但是,如果 x 是虚假的,它就不会工作。

一个可能的工作岗位是创建 x 和 y 列表或列表如下:

result = ((a > b) and [x] or [y])[0]

或:

result = ((a > b) and (x,) or (y,))[0]

如果您正在使用字典,而不是使用一个温和的条件,您可以利用获得(关键,默认),例如:

shell = os.environ.get('SHELL', "/bin/sh")

来源:?:在维基百科的Python

连接多个运营商的方式:

f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

我发现默认的Python合成val = a if cond other b cumbersome,所以有时我这样做:

iif = lambda (cond, a, b): a if cond else b
# So I can then use it like:
val = iif(cond, a, b)

当然,它有一个缺点,总是评估双方(a和b),但合成对我来说更清楚。

a if condition else b

记住这个金字塔,如果你有记住问题:

     condition
  if           else
a                   b