2017-01-12 4 views
1

Я пытаюсь создать небольшой тестовый скрипт, который добавляет что-то к заметке. Ниже приведена основная функция, которую я буду выполнять в скрипте. Проблема заключается в том, что я не могу получить блок else для запуска, когда блок while оценивает значение false (то есть, когда он оценивает все, что не является одним из этих четырех параметров), блок while просто продолжается в бесконечном цикле. Я также попытался вставить break в цикл while, но это завершает сценарий после выполнения цикла while.Else-statement после while-statement и сравнение строк со списком строк?

Как перейти от while к блоку else, когда он оценивается как false? И почему мой нынешний способ не работает так, как мне бы хотелось? Благодарю.

def start(): 
    q01 = input("What is the subject of your note?\n") 
    q02 = input("Are you certain that the subject of your note is " + q01 + "?\n") 
    while q02 == 'No' or 'no' or 'NO' or 'n': 
     q01 = input("So, what is the subject of your note?\n") 
     q02 = input("Are you certain now that the subject of your note is " + q01 + "?\n") 
    else: 
     q03 = Enter("Enter the content of your note") 
+1

Ваше использование 'while' /' else' должно работать, как только условие 'while' фиксируется в соответствии с принятым ответом. – mkrieger1

ответ

3

Ваш преступник является условием во время цикла:

while q02 == 'No' or 'no' or 'NO' or 'n': 

Это эквивалентно:

while (q02 == 'No') or 'no' or 'NO' or 'n': 

Как 'no', 'NO' и 'n' все непустые строки, которыми они оценивают в True и поэтому ваше состояние оценивается как:

while (q02 == 'No') or True or True or True: 

что явно всегда True.

Чтобы это исправить, необходимо настроить условие:

while q02 == 'No' or q02 == 'no' or q02 == 'NO' or q02 == 'n': 

Хотя более вещий вы могли бы вместо того, чтобы сделать это:

while q02 in ['No','no','NO','n']: 
+0

Спасибо, Ник. Очень краткий ответ. – seeker

1

Изменить это утверждение

while q02 == 'No' or 'no' or 'NO' or 'n': 

в

while q02 == 'No' or q02 == 'no' or q02 == 'NO' or q02 == 'n': 

еще один элегантный способ сделать это:

def startMe(): 
    q01 = input("What is the subject of your note?\n") 
    q02 = input("Are you certain that the subject of your note is " + q01 + "?\n") 
    negList = ['No', 'no', 'NO', 'nO', 'n', 'N'] # <<< Easily modifiable list. 

    while any(q02 in s for s in negList): 
     q01 = input("So, what is the subject of your note?\n") 
     q02 = input("Are you certain that the subject of your note is " + q01 + "?\n") 
    break: 
     q03 = input("Enter the content of your note") 
+0

Не могли бы вы объяснить, почему мой метод не работает? – seeker

+0

'else' без' if' предназначен для отказа. –

+0

Не могли бы вы протестировать этот код, поскольку я все еще, кажется, застрял в цикле while, когда вызываю функцию – seeker

0

Ваша логика и код правильный отл ept 1. Использование while q02 == 'No' or q02 == 'no' or q02 == 'NO' or q02 == 'n': InstEd из while q02 == 'No' or 'no' or 'NO' or 'n':

Вы можете попробовать:

def start(): 
    q01 = input("What is the subject of your note?\n") 
    q02 = input("Are you certain that the subject of your note is " + q01 + "?\n") 
    while q02 == 'No' or q02 == 'no' or q02 == 'NO' or q02 == 'n': 
     q01 = input("So, what is the subject of your note?\n") 
     q02 = input("Are you certain now that the subject of your note is " + q01 + "?\n") 
    else: 
     q03 = input("Enter the content of your note") 
start() 
+0

Спасибо, это работает, но почему это так? Я не получал никаких синтаксических ошибок, когда делал это по-своему, поэтому почему этот метод приводит к активации блока else? – seeker

+0

синтаксически правильно .. но не формат .. – Harsha

2

Проблема заключается в том, что условие охранник на while блок всегда True!

>>> q02 = 'y' 
>>> q02 == 'No' or 'no' 
'no' 

Оператор or интересен. Он оценивает его левый операнд, и если он «правдивый», то левый операнд является результатом операции; в противном случае он оценивает его правый операнд. В вашем случае левый операнд является логическим значением (результат q02 == 'No'), а правый операнд - это непустая строка.Непустая строка является «правдой», поэтому это результат.

IOW, q02 == 'No' or 'no' or 'NO' or 'n' вычисляет True тогда и только тогда, когда q02 является 'No'. В противном случае он оценивает строку 'no', которая является «правдивой» относительно цикла while.

>>> q02 = 'y' 
>>> q02 == 'No' or 'no' or 'NO' or 'n' 
'no' 
>>> bool(q02 == 'No' or 'no' or 'NO' or 'n') 
True