Необходимо ли в python вызывать return в конце функции если в конце вызывается другая функция?

Рейтинг: 1Ответов: 2Опубликовано: 19.02.2023

Делаю игру на 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()  # Возвращение в функцию с главным циклом

Ответы

▲ 1Принят

Вообще-то у вас именно рекурсия, просто функция не сразу сама себя вызывает, а опосредованно через несколько других функций. Рано или поздно такой подход закончится тем, что исчерпается максимальная глубина рекурсии и код упадёт. Поэтому конкретно в вашем примере лучше сделать как-то так, чтобы не было рекурсии. То есть добавить основную функцию, которая будет в цикле что-то делать и вызывать другие функции.

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()  # Возвращение в функцию с главным циклом
▲ 0

Не обязательно, но для спокойствия можете сделать 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()  # Возвращение в функцию с главным циклом