2011-12-03 97 views
0

如果嵌套的if語句不滿足條件,如何繼續到外部if?例如。我有這個(非常不切實際)的例子:嵌套if語句後繼續elif?

a = 2 

if(a > 1): 
    if(a == 3): 
     print "yes" 
elif(a == 2): 
    print "yes" 

我想要一個== 2接下來檢查。我將如何做到這一點?我有多個條件,如果我需要檢查,所以我寧願沒有一個巨大的字符串和/或語句在一個外部 - 如果我也有不止一個elif語句,所以我不希望所有的elifs混搭在一起,根據該嵌套一個)

更深的例子:

b = 8 

if(a > 1): 
    if(b == 3): 
     doSomething() 
    elif(b == 4): 
     doSomethingElse() 
    elif(b == 5): 
     more() 
elif(-1 <= a <= 1): 
    asd() 
elif(a < -1): 
    if(b == 7): 
     asdfasdf() 
    elif(b == 8): 
     asasdf() 
+0

'如果a> 1'後面加上'elif a == 2' ** **從來沒有任何意義。因爲2大於1.也許你只想要'if',而不是'elif'。或者將它封裝在一個函數中,以便使用'return'。 –

回答

1

您如何期待這一點對計算機是清楚的?

if a > 1: 
    # ANYTHING 
elif a == 2: 
    # ANYTHING 

根據定義,將永遠不會在第二個塊中執行任何操作。

我相信你的打算可能會沿着這條線比較:

def action(): 
    if a > 1: 
    if b == 2: 
     doSomething() 
     return 
    if b == 3: 
     doSomethingElse() 
     return 
if a == 2: # Note: NO elif! 
    doDefaultForA2() 
    return 
showError("Unknown command") 
return 

有多種方式來實現這種行爲。我喜歡function+return模式,因爲它很好地構造代碼。另一種方法是使用一個handled標誌:

unhandled = True 
if a > 1: 
    if b == 2: 
    doSomething() 
    unhandled = False 
    if unhandled and b == 3: 
    doSomethingElse() 
    unhandled = False 
if unhandled and a == 2: # Note: NO elif! 
    doDefaultForA2() 
    unhandled = False 
if unhandled: 
    showError("Unknown command") 

(你可以明顯地擺在了一些這裏的快捷鍵使用ELIF但使用顯式「如果未處理的」使代碼有關的邏輯更容易更詳細。以增加新的選項。)

+0

是的,這是一個非常糟糕的例子,並沒有說明爲什麼我真的需要問這個真正的代碼。我正在考慮突破巢穴,但回報更好,所以謝謝你。 – idlackage

+0

-1第一個選項保持'a> 1,a == 2'冗餘。在第二種選擇中,整個「未處理」的跳躍是一個醜陋的難以理解的難以理解的混亂。 –

+0

@JohnMachin:你沒有完全理解這個問題。這不是關於「a」和實際測試,只是它們重疊,實際決定是否處理案件發生在較低層次。如果它讓你快樂,用「'complexTest1(a)'」替換任何整數測試。 –

3

結合的條件和壓平嵌套:

a = 2 

if (a > 1 and a == 3): 
    print "yes" 
elif (a == 2): 
    print "yes" 
+4

'a == 3'意味着'a> 1'。如果這就是你想組合它們的方式,那麼根本就不需要'a> 1'。 – cHao

0
a = 2 
if a > 1: 
    if a == 3: 
     print "a is 3" 
    elif a == 2: 
     print "a is 2" 
3

考慮的例子僅僅是提示性的,你原來的問題是瞭解嵌套的if-else,聯想,確定範圍....

在Python,不像類ALGOL語言中,我們沒有劃分塊(恩。在C中,我們使用'{'來創建一個塊。這裏所有的塊都通過適當的空白區域縮進。它就像哲學一樣,你讀到的是你會得到的。這一過程是堅持「代碼可讀性」的設計理念。

在類似的上下文中,隨後的if/else語句是外部語句還是內部語句的一部分取決於它是如何縮進的。

你的榜樣

a = 2 

if(a > 1): 
    if(a == 3): 
     print "yes" 
elif(a == 2): 
    print "yes" 

這裏elif是外if的一部分,因爲這是它讀取或者說看起來,這就是它是怎麼縮進。相反,您的代碼的以下修改版本

a = 2 

if(a > 1): 
    if(a == 3): 
     print "yes" 
    elif(a == 2): 
     print "yes" 

會使邏輯顯然不同。更多,因爲縮進的elif塊現在與內部if對齊。

這是現在相比有以下C代碼

if (a > 1) 
    if (a == 3) 
     printf("Hello World\n"); 
else if (a == 2) 
    printf("Yes"); 

你可以輕鬆地說,與如果else if關聯更容易?你想

+0

我的確理解了範圍,並弄清了爲什麼縮進elif會產生完全不同的結果,我只是不知道是否有辦法進入下一個檢查 - 以實現在該嵌套塊中重寫elif的效果,而實際上不必重寫它。 – idlackage

+0

@idlackage,答案是否定的。這是Python的。如果你需要改變你的行爲,你需要改變你的代碼。 – Abhijit

+0

@idlackage:Abhijit說的,除了它不僅適用於Python,也適用於所有不是開玩笑或學術好奇的編程語言。 –

0

什麼結果做:

  • 打印 「是」 時,爲2或3
  • 否則什麼也不做

翻譯成簡單代碼

if a in (2, 3): 
    print "yes" 

「更深」的例子:你不需要你的一些嵌套。下面簡單代碼就相當於你:

if a == 1: 
    if b == 7: 
     print "yes 1, 7" 
    elif b == 8: 
     print "yes 1, 8" 
elif a == 2: 
    print "yes 2" 
elif a == 3: 
    print "yes 3" 
elif a == 4: 
    print "yes 4" 
elif a == 5: 
    print "yes 5" 

順便說一句,請仔細閱讀PEP 8,並看看一些其他人寫的代碼... if(foo == 9):是引起讀者放慢一個陌生的模式速度下降,並可能在未來避開這條道路。

0

另一種編寫這種方法的方法是讓它更容易閱讀,也可以更容易編寫,將其中一個檢查的選項放到字典中。這隻有在你確實檢查平等的情況下才有效,但可能適用於你。

#used when a>1 
bchoices1 = {} 
bchoices1[3] = doSomething 
bchoices1[4] = doSomethingElse 
bchoices1[5] = more 

#used when a==1 
bchoices2 = {} 
bchoices2[7] = asdfasdf 
bchoices2[8] = asdfas 

if(a > 1): 
    bchoices1[b]() 
elif(a == 2): 
    asd() 
elif(a == 1): 
    bchoices2[b]()