Как я могу заставить свою функцию вернуться к определенной точке кода после выражения elif? - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь получить пользовательский ввод для добавления сведений о людях в словарь после того, как они пройдут первый цикл while. Он спрашивает их, хотят ли они добавить еще одну запись, если пользователь вводит что-либо, кроме «y» или «n», я хочу, чтобы он произнес неверную запись, и спрашивает их снова, вводят ли они затем «y» или «n». Я бы хотел, чтобы он снова вернулся к началу цикла while.

Попытался изменить код, циклы и операторы if, elif и else, но не может понять это.

import pprint


everyone = {}

def people_database():
    yesno = "y"
    while yesno == "y":
        name = input("What is the name you would like to add?: ")
        age = input("What is the age you would like to add?: ")
        residence = input("What is the residence you would like to add?: ")
        everyone["people"] = {"Name": name,
                              "Age": age,
                              "Residence": residence}
        yesno = input("Would you like to add another? Enter y or n: ")
        if yesno == "y" or yesno == "Y":
            continue
        elif yesno == "n" or yesno == "N":
            break
        else:
            while yesno != "y" or yesno != "Y" or yesno != "n" or yesno != "N":
                print("Not a valid input.")
                yesno = input("Would you like to add another? Enter y or n: ")
                if yesno == "y" or yesno == "Y":
                    continue
                elif yesno == "n" or yesno == "N":
                    break

people_database()

Если после ввода неправильной записи они вводят правильную запись, функция должна запуститься снова.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Я думаю, что было бы очень полезно создать функцию для получения ввода да / нет.Но по моему мнению, это не должно быть рекурсивным в отличие от ответа Лиамхокинса.Простого цикла while будет достаточно.И нет необходимости печатать какие-либо сообщения об ошибках, поскольку для пользователя совершенно очевидно, что что-то пошло не так, если вопрос задается снова с четкими инструкциями, как ответить.

def get_decision(question: str='y/n: '):
    ans = ''
    while ans not in ['y', 'n']:
        ans = input(question)
    return ans

everyone = {}


def people_database():
    while True:
        name = input("What is the name you would like to add?: ")
        age = input("What is the age you would like to add?: ")
        residence = input("What is the residence you would like to add?: ")
        everyone["people"] = {"Name": name,
                              "Age": age,
                              "Residence": residence}

        if get_decision('Would you like to add another? Enter y or n: ') == 'n':
            break

people_database()

Вы, конечно, можете расширить списокпринятых ответов и соответственно усложняют условие принятия решения, но это минимальный пример.По моему мнению, принятие только одного символа для определенного действия более понятно, чем угадывание, что пользователь делает, хотя в этом случае это довольно однозначно.


Примечание, я не знаю полной историиваш случай, но кажется, что переопределение ключа people в словаре не полезно в цикле.Возможно, вы захотите увеличить идентификатор, чтобы имитировать «базу данных»:

people = {}


def people_database():
    person_id = 0
    while True:
        name = input('Name?: ')
        age = input('Age?: ')
        residence = input('Residence?: ')

        people[person_id] = {
            'Name': name,
            'Age': age,
            'Residence': residence
        }

        if get_decision('Would you like to add another? Enter y or n: ') == 'n':
            break

        person_id += 1


if __name__ == '__main__':
    people_database()
0 голосов
/ 21 января 2019

Ваш второй цикл while проверяет, является ли yesno не y или не Y или не n или не N. Он всегда будет работать, потому что не может быть всех этих случаев одновременно. Измените or s на and s

Кроме того, ваш первый цикл while должен также проверять наличие верхнего регистра Y.

...