logo

Прыжки по коду в Python: есть ли в нём goto/label?

Быстрый ответ

Прямого аналога команде goto в Python нет. Но существуют приёмы, эмулирующие её поведение. Вот пример имитации goto с помощью сторонней библиотеки:

Python
Скопировать код
from goto import with_goto

@with_goto
def counter():
    label .start
    for x in range(1, 10):
        if x == 5:
            goto .end
        print(x)
        goto .start
    label .end

counter()

Хоть данный код и работает, рекомендуется придерживаться структурированного сценария управления потоком в Python вместо применения goto. Именно к этому стремится Python 🐍.

Python: нет места для goto

Изучая Python, вы заметите, что здесь нет места для goto и меток. Python — это язык с чётко выстроенной структурой и высокой читабельностью, где не приемлем хаос. Рассмотрим альтернативы, предоставляемые Python.

Рекурсия для повторяющихся задач

"Питоньи" способ вернуться к нужному месту в коде — это применение рекурсии:

Python
Скопировать код
def recursive_printer(n):
    if n > 0:
        print(n)
        recursive_printer(n – 1)
    else:
        print("Отсчёт окончен. Благодарю за помощь!")

recursive_printer(5)

По сути, это аналог goto, но вместо него применяется рекурсивный вызов функции и стек вызовов.

Исключения: не только для ошибок

В Python исключения можно применять как метод контроля потока программы, аналогичный функции goto:

Python
Скопировать код
try:
    for i in range(10):
        if i == 5: raise Exception("Переходим к концу")
        print(i)
except Exception as e:
    print(e)

Управление циклами через break и continue

break и continue могут исполнять роль неофициальных заменителей goto:

Python
Скопировать код
for i in range(1, 10):
    if i % 2 == 0:
        continue
    if i == 7:
        break
    print(i)

Визуализация

Проиллюстрируем различие между GoTo/Label и структурированным подходом Python:

Markdown
Скопировать код
**Традиционная goto/label:**
[🏁 Старт] ➡️ ... ➡️ [🏷 Метка] ➡️ ... ➡️ [↩️ Переход к Метке] ➡️ [🔙 Возврат к Метке]

**Структурированный подход Python:**
[🏁 Старт] ➡️ ... ➡️ 🔄 [Цикл/Функция] ➡️ ... ➡️ [⚡️ Break/Return] ➃ [🔚 Финальная точка]

В Python переходы goto заменяются циклами и функциями, следуя принципу: "Сделай всё максимально просто".

Отображение функций для управления логикой

В Python словари функций позволяют управлять выполнением задач без применения goto:

Python
Скопировать код
def cook_pasta():
    return "Паста приготовлена 🍝"

def bake_pizza():
    return "Пицца готова 🍕"

recipe = {
    'pasta': cook_pasta,
    'pizza': bake_pizza,
}

result = recipe['pizza']()
print(result)

Декораторы для управления потоком выполнения

Python предлагает декораторы, которые дают возможность контролировать поток выполнения, подобно goto:

Python
Скопировать код
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Перед выполнением функции 🔮")
        result = func(*args, **kwargs)
        print("После выполнения функции 🏁")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Привет, {name}!")

Философия структурированных подходов в Python

В Python отдается предпочтение простоте и читабельности кода вместо сложных конструкций с goto. Используя функции и циклы, Python предлагает инструменты для создания чистого и читабельного кода. Оставьте goto для крайних случаев!

Проход по байт-коду

Работа с байт-кодом в Python — это сложный инструмент, которым следует пользоваться осторожно. В таком подходе требуется глубокое разбирательство и опыт работы.

Использование goto: плюсы и минусы

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

Полезные ссылки