Вторая функция не видит ввод данных первой

Рейтинг: 1Ответов: 2Опубликовано: 04.03.2025
def menu_1():
    name = input("Введите имя:")
    main_menu()

def menu_2():
    print("Имя: ",name)
    main_menu()

def main_menu():
    print("ГЛАВНОЕ МЕНЮ\n","1 — Ввести или обновить информацию\n","2 — Вывести информацию\n",
          "0 — Завершить работу\n")
    number_menu = int(input("Введите номер пункта меню:"))
    if number_menu == 1:
        menu_1()
    elif number_menu == 2:
        menu_2()
    elif number_menu == 0:
        print("Работа завершена!")
    else:
        print("Некорректный ввод меню!")
        main_menu()


main_menu()

Ответы

▲ 3

Есть три функции, которые делят состояние: menu_1, menu_2, main_menu.

Состояние хранит только имя. Тем не менее заведём класс State c одним полем name. Экземпляр состояния будем передавать в вызываемые функции как эстафетную палочку:

class State:
    def __init__(self):
        self.name = None


def menu_1(state):
    state.name = input("Введите имя:")
    main_menu(state)


def menu_2(state):
    print("Имя: ", state.name)
    main_menu(state)


def main_menu(state):
    print("ГЛАВНОЕ МЕНЮ\n","1 — Ввести или обновить информацию\n","2 — Вывести информацию\n",
          "0 — Завершить работу\n")
    number_menu = int(input("Введите номер пункта меню:"))
    if number_menu == 1:
        menu_1(state)
    elif number_menu == 2:
        menu_2(state)
    elif number_menu == 0:
        print("Работа завершена!")
    else:
        print("Некорректный ввод меню!")
        main_menu(state)


main_menu(State())

Идём дальше. Есть три функции, которые принимают один и тот же параметр. Не пора ли сделать их методами объекта? Методами State? Делаем. Синтаксис меняется, семантика остаётся старой: три функции (теперь уже три метода объекта) перебрасывают друг другу общее состояние, по соглашению оно зовётся self:

class State:
    def __init__(self):
        self.name = None

    def menu_1(self):
        self.name = input("Введите имя:")
        self.main_menu()

    def menu_2(self):
        print("Имя: ", self.name)
        self.main_menu()

    def main_menu(self):
        print("ГЛАВНОЕ МЕНЮ\n","1 — Ввести или обновить информацию\n","2 — Вывести информацию\n",
              "0 — Завершить работу\n")
        number_menu = int(input("Введите номер пункта меню:"))
        if number_menu == 1:
            self.menu_1()
        elif number_menu == 2:
            self.menu_2()
        elif number_menu == 0:
            print("Работа завершена!")
        else:
            print("Некорректный ввод меню!")
            self.main_menu()


State().main_menu()

Решение рекурсивное, что не нужно и плохо. Через тысячу циклов Питон упадёт с ошибкой из-за слишком глубокой рекурсии. Меняем на цикл:

class State:
    def __init__(self):
        self.name = None

    def menu_1(self):
        self.name = input("Введите имя:")

    def menu_2(self):
        print("Имя: ", self.name)

    def main_menu(self):
        while True:
            print("ГЛАВНОЕ МЕНЮ\n","1 — Ввести или обновить информацию\n","2 — Вывести информацию\n",
                  "0 — Завершить работу\n")
            number_menu = int(input("Введите номер пункта меню:"))
            if number_menu == 1:
                self.menu_1()
            elif number_menu == 2:
                self.menu_2()
            elif number_menu == 0:
                print("Работа завершена!")
                break
            else:
                print("Некорректный ввод меню!")


State().main_menu()

В принципе тут можно убрать методы menu_1 и menu_2, но я этого делать не буду в расчёте на усложнение программы в будущем. Всю логику сложной программы в main_menu не поместишь.

▲ 0

дело в том что при вызове функции menu_1() надо записать её в переменную name (или с другим названием), я бы в конце добавил бы return name тогда данные которые в том name который в функции передадутся в тот name который в основной программе

upd: я забыл про вторую функцию, при еще вызове надо написать menu_2(name), а при объявлении надо def menu_2(name) думаю тут можно легко разобраться если прочитать выше сказанное