2013-02-13 26 views
1

Noob問題我知道,但我需要它確認,因爲這經常發生在我身上。如果您知道在上一個模塊爲真時無法訪問代碼,請問使用elif:有什麼意義嗎?例如。如果返回練習

if foo: 
    return x 
elif bar: 
    return y 

應該僅僅是:

if foo: 
    return x 
if bar: 
    return y 
+0

我沒有看到在這種情況下需要使用elif,但styleguides可能會說不然。 – Gjordis 2013-02-13 06:28:20

回答

7

我可以看到至少有三個原因偏愛if/elif

  • 它明確的代碼的讀者,作者意圖的條件是相互排斥的
  • 如果代碼後重構,改變早期返回一個逾期歸還的if/elif語義不會打破,但if/if威力
  • 它使代碼風格與你正在使用的代碼庫的其餘部分一致的

,並至少有兩個原因喜歡if/if

  • 這是少打字
  • 它使代碼風格與你正在使用的代碼庫的其餘部分一致的

那說,下面是一些推薦閱讀:

+2

添加到第一點,'顯式優於隱式' - 第2行,[* The Zen of Python *](http://www.python.org/dev/peps/pep-0020/) – Volatility 2013-02-13 06:34:27

+0

@Volatility我覺得'return'語句非常明確。 – 2013-02-13 06:43:51

+0

@JanneKarila我在說''互斥'部分';)' – Volatility 2013-02-13 06:45:50

0

IF聲明意味着你的代碼將檢查所有IF條件,而在elif:情況下,如果一個IF條件滿足就不會檢查其他條件。 (正如已經向我指出,這是唯一真正的,如果沒有IF語句從代碼塊具有return

在你的情況下,它是確定使用多IF聲明。

+0

我不認爲這是必然的。如果函數返回的時間太早,解釋器不應該到達下一個if。 – 2013-02-13 06:29:20

+0

函數*具有*從代碼塊返回的多個'if'語句完全不會影響解釋器。 – 2013-02-13 06:30:34

+0

是的,我明白你的觀點。讓我編輯我的答案。 – Frankline 2013-02-13 06:32:13

3

python解釋器沒有任何區別;實際上,這兩個代碼片段將在內部編譯爲相同的指令(編譯器足夠聰明,知道返回後的代碼永遠不會到達,並且將完全優化else部分)。

這是一個風格和可讀性的問題。

1

從Python解釋的觀點來看,沒有,沒有差異 - 或者至少有一個在執行方面沒有差別,儘管這兩種結構的實施方式可能會有一些細微的差異。

但請記住,你正在寫的不僅僅是口譯員;你正在爲其他程序員寫信以後再閱讀你的代碼。寫出你認爲使你的意圖最清楚的內容。

1

如果你知道它不會是真的,那麼不要浪費解釋者的時間來檢查它。如果您使用if,則會每次評估一次;然而,elif只有在前面的if條件爲False時纔會被評估。在這種情況下,您正在使用return,所以您應該從此安全,但通過根據回報更改邏輯流程是不好的。您應該儘可能少(最好只有一個)代碼路徑。此外,它提供了一個乾淨可讀的結構,並使代碼路徑清晰。可讀性計數,顯式優於隱式。

+0

不,如果第一個塊返回,第二個將不會被評估... – root 2013-02-13 06:33:18

+0

問題是'是否有任何一點使用elif:如果你知道當前面的塊是真的時代碼將不會被達到嗎?'他的'return'是一個例子,所以我提供了一個考慮其他可能性的解釋。爲了清楚起見,我修改了我的答案。 – pyrospade 2013-02-13 06:38:30

+0

如果第二個代碼塊中的條件不正確,那麼問題很明顯是'如果您知道代碼不會被達到' - 如果沒有達到,則不會浪費時間。 – root 2013-02-13 06:49:58