Условный оператор в цикле while, не выполняющий все под ним - PullRequest
1 голос
/ 08 мая 2019

В основном я пытаюсь создать своего рода викторину, используя списки.Код выглядит так:

foot_bones = ["calcaneus", "talus", "cuboid", "navicular", "lateral cuneiform",
             "intermediate cuneiform", "medial cuneiform"]
d = len(foot_bones)
def foot_bones_quiz():
    correct_answers = 0
    answers_left = len(foot_bones)
    guess = input("Enter a bone or q to quit: ")
    while True:        
        if guess.lower() == "q":
            break
        elif guess.lower() in foot_bones:
            print("We got a match on index ",foot_bones.index(guess.lower()))
            #Removes the previous guess from the list to ensure the user can't answer the same thing again
            foot_bones.remove(guess.lower())
            guess = ("Enter a bone or q to quit: ")
            correct_answers += 1
            answers_left -= 1
        else:
            answers_left -= 1
            guess = input("No match. Please try again. You have %s tries left. Enter q to quit"%answers_left)

        if answers_left == 0:
            break
    print("You have %s correct answers out of %s."%(correct_answers,d)

foot_bones_quiz()

Когда я ввожу "calcaneus", я ожидал, что код выполнит все под оператором elif.То, что в конечном итоге происходит, это после того, как он напечатает «Мы получили совпадение на индексном бла», то «Нет совпадения» печатает, что находится под оператором else.

Что не так с моим кодом?

1 Ответ

1 голос
/ 08 мая 2019

Я думаю, что guess под вашим elif должно быть:

guess = input("Enter a bone or q to quit: ")

Вместо:

guess = ("Enter a bone or q to quit: ")

Что происходит, вы вошли в свою первую кость, котораязаставляет ваш код попасть сюда:

        print("We got a match on index ",foot_bones.index(guess.lower()))
        #Removes the previous guess from the list to ensure the user can't answer the same thing again
        foot_bones.remove(guess.lower())
        guess = ("Enter a bone or q to quit: ")
        correct_answers += 1
        answers_left -= 1

Этот блок выполняется.Обратите внимание, что для guess установлено значение "enter a bone or q to quit: ".Вы не просите ввода.

Итак, теперь это предположение "enter a bone or q to quit: ", мы достигаем конца того, что находится под циклом, и перезапускаем его.

Поскольку guess.lower() не находится в foot_bones и не "q", вы в конечном итоге получите оператор else.

...