Python是否有三元條件運算符?


9 Answers

你可以索引到一個元組中:

(falseValue, trueValue)[test]

test需要返回TrueFalse
始終將其實施為:

(falseValue, trueValue)[test == True]

或者您可以使用內置的bool()來確保一個Boolean值:

(falseValue, trueValue)[bool(<expression>)]
Question

如果Python沒有三元條件運算符,是否有可能使用其他語言構造來模擬一個條件運算符?




In [1]: a = 1 if False else 0

In [2]: a
Out[2]: 0

In [3]: b = 1 if True else 0

In [4]: b
Out[4]: 1



你可能經常會發現

cond and on_true or on_false

但是當on_true == 0時會導致問題

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

你會期望這個結果是正常的三元運算符

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1



在其他答案中有一個三元選項,但是如果您正在檢查布爾值或無值,您還可以使用“或”來模擬它:

>>> a = False
>>> b = 5
>>> a or b
5

>>> a = None
>>> a or b
5



Python是否有三元條件運算符?

是。 從語法文件中

test: or_test ['if' or_test 'else' test] | lambdef

感興趣的部分是:

or_test ['if' or_test 'else' test]

所以,三元條件操作的形式是:

expression1 if expression2 else expression3

expression3將被延遲評估(即,只有在布爾上下文中expression2為false時才評估)。 由於遞歸定義,你可以無限期地鏈接它們(雖然它可能被認為是不好的風格)。

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

使用說明:

請注意,每個if必須跟一個else 。 人們學習列表理解和生成器表達式可能會發現這是一個難學的教訓 - 以下將無法正常工作,因為Python期望第三個表達式為else:

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

這引發了一個SyntaxError: invalid syntax 。 因此,上面的內容或者是一段不完整的邏輯(可能用戶期望在假狀態下沒有操作),或者可能意圖將expression2用作過濾器 - 注意以下內容是合法的Python:

[expression1 for element in iterable if expression2]

expression2作為列表理解的過濾器, 並不是三元條件運算符。

更窄範圍的替代語法:

您可能會發現寫下以下內容會有點痛苦:

expression1 if expression1 else expression2

expression1將不得不使用上面的用法評估兩次。 它可以限制冗餘,如果它只是一個局部變量。 然而,這種用例的一個常見和高性能的Pythonic慣用法是使用or是捷徑行為:

expression1 or expression2

這在語義上是等價的。 請注意,一些風格指南可能會以清晰為理由限制這種用法 - 它的意義很小,語法很少。




expression1 if condition else expression2

>>> a = 1
>>> b = 2
>>> 1 if a > b else -1 
-1
>>> 1 if a > b else -1 if a < b else 0
-1



比回答更多的提示(不需要為hundreth時間重複顯而易見),但我有時會將它用作此類結構中的一個簡短的快捷鍵:

if conditionX:
    print('yes')
else:
    print('nah')

,變成:

print('yes') if conditionX else print('nah')

有些(很多:)可能會將它視為unpythonic(即使是ruby-ish :),但我個人覺得它更自然 - 也就是說如何正常表達它,再加上大塊代碼在視覺上更吸引人。




對於Python 2.5及更新版本,有一個特定的語法:

[on_true] if [cond] else [on_false]

在較老的Pythons中,三元運算符沒有實現,但可以模擬它。

cond and on_true or on_false

雖然,有一個潛在的問題,如果cond評估為True並且on_true評估為False則返回on_true而不是on_true 。 如果你想要這個行為,那麼這個方法是OK的,否則使用這個:

{True: on_true, False: on_false}[cond is True] # is True, not == True

它可以被包裝:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

並用這種方式:

q(cond, on_true, on_false)

它與所有Python版本兼容。




作為Python增強建議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]()

懶惰地評估操作數。

另一種方法是通過索引一個元組(這與大多數其他語言的條件操作符不一致):

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

或明確構造的字典:

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

另一個(不太可靠),但更簡單的方法是使用and和操作符:

result = (a > b) and x or y

然而,如果x將是False這將不起作用。

可能的解決方法是使xy列表或元組如下所示:

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

要么:

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

如果您使用字典,而不是使用三元條件,則可以利用get(key, default) ,例如:

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

資料來源: ?:




是。

>>> b = (True if 5 > 4 else False)
>>> print b
True



Related