python問號冒號 - 三元運算子英文




Python有三元條件運算符嗎? (16)

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

這在語義上是等價的。 請注意,某些樣式指南可能會在明確的基礎上限制此用法 - 它確實在非常少的語法中包含了很多含義。

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


三元運算符在不同的編程語言中

在這裡,我只是嘗試在幾種編程語言之間展示ternary operator一些重要區別。

Javascript中的三元運算符

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

Ruby中的三元運算符

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Scala中的三元運算符

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

R編程中的三元運算符

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

Python中的三元運算符

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

現在你可以看到蟒蛇語言的美麗。 它具有高度可讀性和可維護性。


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

三元條件運算符只允許在單行中測試條件替換多行if-else使代碼緊湊。

句法 :

[on_true] if [expression] else [on_false]

1-使用三元運算符的簡單方法:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2-直接使用元組,字典和lambda的方法:

# 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])
# 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]()) # in output you should see three 10

3-三元運算符可以寫為嵌套if-else:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

以上方法可寫為:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a

你可以這樣做 :-

[condition] and [expression_1] or [expression_2] ;

例:-

print(number%2 and "odd" or "even")

如果數字是奇數,則打印“奇數”或如果數字是偶數則打印“偶數”。

結果: -如果condition為true,則執行exp_1,否則執行exp_2。

注意: - 0,None,False,emptylist,emptyString的計算結果為False。 並且除0之外的任何數據都評估為True。

以下是它的工作原理:

如果條件[條件]變為“真”,那麼將評估expression_1但不評估表達式_2。 如果我們“和”有0(零)的東西,結果總是很明顯。所以在下面的陳述中,

0 and exp

表達式exp將不會被評估,因為“和”0將始終求值為零,並且不需要計算表達式。 這就是編譯器本身在所有語言中的工作方式。

1 or exp

表達式exp根本不會被評估,因為“或”1總是為1.所以它不會費心去評估表達式exp,因為無論如何結果都是1。 (編譯器優化方法)。

但是如果是的話

True and exp1 or exp2

第二個表達式exp2將不會被評估為True,而當exp1不為false時True and exp1將為True。

同樣在

False and exp1 or exp2

表達式exp1將不會被計算,因為False等於寫0並且0表示“和”本身為0但是在exp1之後使用“或”,它將在“或”之後計算表達式exp2。

注意: -這種使用“或”和“和”的分支只能在expression_1的Truth值不為False(或0或None或emptylist []或emptystring''時使用。)因為expression_1變為如果為false,則將評估expression_2,因為exp_1和exp_2之間存在“或”。

如果您仍然想讓它適用於所有情況,無論exp_1和exp_2的真值是什麼,請執行以下操作: -

[condition] and ([expression_1] or 1) or [expression_2] ;


你可能經常會發現

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

對於2.5之前的版本,有訣竅:

[expression] and [on_true] or [on_false]

on_true具有false布爾值時,它可能會給出錯誤的結果。 1
雖然它確實有從左到右評估表達式的好處,但在我看來這更清晰。

1. 是否有相當於C的“?:”三元運算符?


對於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 。 如果你想要這個行為,方法就沒問題,否則使用這個:

{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版本兼容。


您可以索引到元組:

(falseValue, trueValue)[test]

test需要返回TrueFalse
總是將它實現為以下可能更安全:

(falseValue, trueValue)[test == True]

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

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

是。

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

是的,它是在2.5版本中added
語法是:

a if condition else b

評估第一個condition ,然後根據conditionBoolean值返回ab
如果condition計算結果為True a則返回,否則返回b

例如:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

請注意,條件是表達式 ,而不是語句 。 這意味著您不能在條件中使用賦值或pass或其他語句:

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

在這種情況下,您必須使用普通的if語句而不是條件語句。

請記住,由於以下幾個原因,一些Pythonist對此不滿意:

  • 參數的順序與許多其他語言(例如C,Ruby,Java等)不同,當不熟悉Python的“驚人”行為的人使用它時(可能會顛倒順序),這可能會導致錯誤。
  • 有些人覺得它“笨拙”,因為它與正常的思想流程相反(首先考慮條件然後考慮影響)。
  • 文體的原因。

如果您在記住訂單時遇到問題,請記住,如果您大聲朗讀它,您(幾乎)會說出您的意思。 例如, x = 4 if b > 8 else 9x = 4 if b > 8 else 9大聲朗讀x = 4 if b > 8 else 9因為x will be 4 if b is greater than 8 otherwise 9

官方文件:


是的,您可以這樣使用它:

is_fat = True
state = "fat" if is_fat else "not fat"

閱讀有關三元條件運算符的更多信息


更多的提示而不是答案(不需要在hundreth時間重複顯而易見的事情),但我有時會將它用作此類構造中的oneliner快捷方式:

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

,成為:

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

有些(很多:)可能會皺眉頭(甚至是ruby-ish :),但我個人認為它更自然 - 即你如何正常表達它,以及在大塊代碼中更具視覺吸引力。


模擬python三元運算符。

例如

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'

語法:Ternary運算符將給出:

[on_true] if [expression] else [on_false]

例如

x, y = 25, 50
big = x if x < y else y
print(big)

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




python-2.5