Вторая функция не видит ввод данных первой
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()
Ответы (2 шт):
дело в том что при вызове функции menu_1() надо записать её в переменную name (или с другим названием), я бы в конце добавил бы return name тогда данные которые в том name который в функции передадутся в тот name который в основной программе
upd: я забыл про вторую функцию, при еще вызове надо написать menu_2(name), а при объявлении надо def menu_2(name) думаю тут можно легко разобраться если прочитать выше сказанное
Есть три функции, которые делят состояние: 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 не поместишь.