Необходимо ли в python вызывать return в конце функции если в конце вызывается другая функция?
Делаю игру на pygame и в конце почти каждой функции вызывается другая функция. Сама игра проходит в функции mainloop(), при проигрыше вызывается end_game(), в конце неё вызывается call_menu(), оттуда вызывается game_resume(), там обновляются элементы и вызывается mainloop(), игра продолжается. То есть нет шагов назад, как в обычном скрипте.
Могут ли быть проблемы если не использовать return в конце при таком циклическом вызове? Типа переполнения памяти или ошибки из-за превышения глубины рекурсии, хоть это и не совсем рекурсия. Нужно ли в конце каждой функции писать return next_function() для вызова следующей функции? Или при таком циклическом вызове return не имеет значения?
def mainloop(self):
self.end_game()
def end_game(self):
self.call_menu()
def call_menu(self):
self.game_resume()
def game_resume(self):
self.mainloop() # Возвращение в функцию с главным циклом
Ответы (2 шт):
Не обязательно, но для спокойствия можете сделать return в каждой функции, что то на подобии:
def mainloop(self):
return self.end_game()
def end_game(self):
return self.call_menu()
def call_menu(self):
return self.game_resume()
def game_resume(self):
return self.mainloop() # Возвращение в функцию с главным циклом
Вообще-то у вас именно рекурсия, просто функция не сразу сама себя вызывает, а опосредованно через несколько других функций. Рано или поздно такой подход закончится тем, что исчерпается максимальная глубина рекурсии и код упадёт. Поэтому конкретно в вашем примере лучше сделать как-то так, чтобы не было рекурсии. То есть добавить основную функцию, которая будет в цикле что-то делать и вызывать другие функции.
def main(self):
while True:
self.mainloop()
new_state = self.call_menue()
if new_state == 'exit':
break
elif new_state == 'resume':
self.resume_game()
def mainloop(self):
self.end_game()
def end_game(self):
# убираем вызов меню, просто меняем состояние игры
# self.call_menu()
def call_menu(self):
# убираем вызов, оставляем сам выбор из меню
# self.game_resume()
return <что было выбрано>
def game_resume(self):
# убираем вызов, просто меняем состояние игры
# self.mainloop() # Возвращение в функцию с главным циклом