2013-07-27 71 views
4

我在學習上Codecademy網站蟒蛇之一,我目前的任務是這樣的:Python測試一個字符串是否是某一設定值

寫一個函數,shut_down,這需要一個參數(可以使用 任何你喜歡的東西;在這種情況下,我們會使用s作爲字符串)。該shut_down 函數應該返回「關機...」時,它得到「是」「是」, 或「YES」作爲參數,並「關機中止!」當它得到時「否」, 「否」「否」

如果它獲得除了這些輸入以外的任何東西,函數應該 返回「對不起,我不瞭解你。」

看起來很容易,但不知何故,我仍然無法做到這一點。

我的代碼,我做了測試功能:

def shut_down(s): 
    if s == "Yes" or s == "yes" or s == "YES": 
     return "Shutting down..." 
    elif s == "No" or "no" or "NO": 
     return "Shutdown aborted!" 
    else: 
     return "Sorry, I didn't understand you." 

i = input("Do you want to shutdown?") 
print(i) #was to test the input 
print(shut_down(i)) #never returns "Sorry, I didn't understand you" 

它工作正常的無的,是的,但不知何故,如果我任何是之前或者即使加一個空格我只需鍵入‘A’它打印「關機中止!」雖然它應該打印「對不起,我不瞭解你」。

我在做什麼錯?

+0

謝謝你們,我會接受幾分鐘的答案。你幫了很多忙,我不認爲我會再次忘記'==',大聲笑 – Davlog

回答

10

你忘了你的第一個elif:

def shut_down(s): 
    if s == "Yes" or s == "yes" or s == "YES": 
     return "Shutting down..." 
    elif s == "No" or "no" or "NO":    # you forgot the s== in this line 
     return "Shutdown aborted!" 
    else: 
     return "Sorry, I didn't understand you." 

s == "no"做到這一點:

def shut_down(s): 
    if s == "Yes" or s == "yes" or s == "YES": 
     return "Shutting down..." 
    elif s == "No" or s == "no" or s == "NO":  # fixed it 
     return "Shutdown aborted!" 
    else: 
     return "Sorry, I didn't understand you." 

這是因爲:

elif s == "No" or "no" or "NO": #<---this 
elif s == "No" or True or True: #<---is the same as this 

由於這是公認的答案我會精心制定標準做法:比較嚴格的慣例GS不區分大小寫(equalsIgnoreCase)是使用.lower()這樣

elif s.lower() == "no": 
+0

謝謝你,工作。我不知道我必須在每個或Python之前輸入(在本例中)的'=='。 – Davlog

+3

@Davlog但是你在'Yes'行中是這樣做的?! – glglgl

+1

@Davlog:如果一個答案解決了你的問題,你應該接受它。 –

4

Python的評估非空字符串是True,所以你elif條件總是評價True

>>> bool('No') 
True 

>>> bool('NO') 
True 

做一個布爾orTrue值將始終返回True,所以它永遠不會到達else條件和卡上elif之一。

您需要使用測試條件。

elif choice == 'no' or choice == 'NO' or choice == 'No':

編輯 - 作爲glglgl在評論中指出,==結合比or更難,所以你的病情被評估爲(s == 'No') or 'no' or 'NO',而不是s == ('No' or 'no' or 'NO'),在這種情況下,你會得到的else部分甚至對於'NO'的用戶輸入。

+2

也許值得注意的是,由於[運算符優先規則](http://docs.python.org/2/reference/expressions.html#operator-precedence),'=='更難綁定(s ==「No」)或(「no」)或(「NO」)而不是'==(「No」或「no」或「NO」)。後者會歸結爲「否」。 – glglgl

+0

@glglgl:在答案中添加。謝謝。 :) –

6

而不是檢查大小寫的不同組合,您可以使用lower函數以小寫形式返回s的副本並與之進行比較。

def shut_down(s): 
    if s.lower() == "yes": 
     return "Shutting down..." 
    elif s.lower() == "no":  
     return "Shutdown aborted!" 
    else: 
     return "Sorry, I didn't understand you." 

這更清潔,更容易調試。或者,您也可以使用upper,並與"YES""NO"進行比較。


如果這樣做不是因爲匹配情況下,像nO那麼我會與in聲明去的幫助:

def shut_down(s): 
    if s in ("yes","Yes","YES"): 
     return "Shutting down..." 
    elif s in ("no","No","NO"):  
     return "Shutdown aborted!" 
    else: 
     return "Sorry, I didn't understand you." 
+1

我會做同樣的事,但分配是非常具體的。 – glglgl

+0

這將與非工作,它似乎不應該 – MatLecu

+0

@MatLecu閱讀[這裏](http://docs.python.org/2/library/stdtypes.html#str.lower)爲什麼工作。 – squiguy

相關問題