2017-09-08 45 views
1

Think Python,第二版,作者將條件表達式定義爲」根據條件,具有兩個值之一的表達式「。但是我反映了它之後,我一直認爲定義的準確性可能是值得懷疑。下面是其使用條件表達式編寫的函數:是「根據條件具有兩個值中的一個的表達式」。條件表達式的精確定義? 「

def get_sign(n): 
    """Returns 1 if n is a positive number, -1 if n is a negative number, 
    or 0 if n is a zero 
    """ 
    return 1 if n > 0 else -1 if n < 0 else 0 

這裏條件表達式爲1 if n > 0 else -1 if n < 0 else 0。大概還有兩個意見:

  • 表達有可能值之一,即1-1,或0

  • 該值取決於兩個條件,即n > 0n < 0

那麼,作者的定義是否準確,爲什麼?爲什麼不呢?是「一個表達式,其值取決於一個或多個條件,並且具有多個值之一(至少兩個)。」更準確的定義條件表達式,爲什麼和爲什麼不呢?

+4

對於每個條件表達式,只有2個結果。恰恰是第一個表達式的結果之一是另一個條件表達式。 – Carcigenicate

+1

根據條件評估兩個子域中的一個子域的表達式。 –

+0

@StevenRumbalski這是一個非常好的定義!它有助於清除這個想法。謝謝。 –

回答

6

您仍然有兩個結果。這兩個結果中的一個本身依賴於另一個條件表達式不會改變這一點。

我這裏加括號來說明我的觀點:

1 if n > 0 else (-1 if n < 0 else 0) 

這樣表達的結果是這兩個選項之一:

  1. 1
  2. -1 if n < 0 else 0

第二個表達本身就是另一個條件l表達。第一個值也只是一個表達式,一旦你對它進行評估,它就有一個值;唯一的區別是它產生一個簡單的文字值。所有這些對頂級條件表達式都沒有影響,它只處理兩個結果。

請注意,只有一個表達式被實際評估。如果其中一個表達式有副作用(在表達式之外改變狀態),或者在內存或處理時間方面「昂貴」,則這很重要。例如:

import time 

def sleep10secs(): 
    time.sleep(10) 
    return 'slow' 

print('instant' if True else sleep10secs()) 

將打印instant瞬間,該功能sleep10secs()不叫。