2013-07-27 2 views
4

Я учусь питона на Codecademy строку и моя текущая задача заключается в следующем:тестирование Python является ли один из некоторого множества значений

Написать функцию, shut_down, которая принимает один параметр (вы можете использовать что угодно, в этом случае мы будем использовать s для строки). Функция shut_down должна возвращать «Выключение ...», когда он получает «Да», «да», или «YES» в качестве аргумента, и «Shutdown прервана!», когда он получает "Нет", "нет" или "НЕТ".

Если он получает что-либо иное, чем эти входы, функция должна быть return «Извините, я вас не понял».

Казалось легко, но как-то я все еще не могу этого сделать.

Мой код, который я сделал, чтобы проверить функцию:

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" 

Он отлично работает для не-х и да, но так или иначе, если я поставить пробел перед любым да или даже если я просто ввести в „а“ он печатает «Shutdown aborted!» хотя он должен печатать «Извините, я вас не понял».

Что я делаю неправильно?

+0

Спасибо вам, ребята, я буду принимать ответ в течение нескольких минут. Вы много помогли, и я не думаю, что когда-нибудь забуду «==», lol – Davlog

ответ

10

Вы забыли написать s == "no" в первом 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." 

ли это:

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 

Так как это принято отвечать я буду разработать стандартную практику: Конвенция о сравнении стринга гс независимо от капитализации (equalsIgnoreCase) заключается в использовании .lower() как этот

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

спасибо, работал. Я не знал, что мне нужно ввести (в этом примере) '' == 'перед каждым или в python. – Davlog

+3

@Davlog Но вы сделали это в строке 'Да' ?! – glglgl

+1

@Davlog: если ответ решил вашу проблему, вы должны его принять. –

4

Python оценивает непустой строки, чтобы быть True, поэтому ваше состояние elif всегда оценивается в True.

>>> bool('No') 
True 

>>> bool('NO') 
True 

Doing булево or со значением True будет всегда возвращать True, поэтому он никогда не достигает состояния else и застревает на elif один.

Вам необходимо проверить условия использования.

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

EDIT - Как 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 ==" Нет ") или (" нет ") или (" НЕТ ")', а не '' == («Нет» или «Нет» или «НЕТ»). Последний будет сводиться к 's ==« Нет ». – 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

Это будет работать с nO, и похоже, что это не должно – MatLecu

+0

@MatLecu Прочитайте [здесь] (http://docs.python.org/2/library/stdtypes.html#str.lower), почему это работает. – squiguy

Смежные вопросы