Python для новичковФункцииПараметры по умолчанию и несколько возвращаемых значений

Параметры по умолчанию и несколько возвращаемых значений

Уроки курсаПараметры по умолчанию и несколько возвращаемых значений

Возврат нескольких значений через кортеж и их распаковка

До этого функция возвращала одно значение — число, строку, булево. Но иногда одного результата недостаточно: нужно вернуть и сам результат, и информацию о том, как прошло вычисление. Python решает это элегантно: оператор return может перечислить несколько значений через запятую, и они автоматически упакуются в кортеж.

def safe_divide(a, b):
    if b == 0:
        return None, 'ошибка: деление на ноль'
    return a / b, 'ok'

Здесь return a / b, 'ok' — это не два оператора и не какой-то особый синтаксис. Python видит запятую между значениями и создаёт кортеж (a / b, 'ok'). Именно этот кортеж и возвращается из функции.

Чтобы убедиться в этом, можно поймать результат в одну переменную:

result = safe_divide(10, 2)
print(result)        # (5.0, 'ok')
print(type(result))  # <class 'tuple'>

Но обычно кортеж сразу распаковывают — это делает код читаемым и избавляет от обращений по индексу:

result, status = safe_divide(10, 2)
print(result)  # 5.0
print(status)  # ok

result, status = safe_divide(10, 0)
print(result)  # None
print(status)  # ошибка: деление на ноль

Распаковка работает ровно так же, как x, y = (1, 2) из урока про кортежи: Python берёт элементы по порядку и раскладывает их по переменным слева от =. Количество переменных слева должно совпадать с количеством значений в возвращаемом кортеже — иначе получите ValueError.

Этот паттерн — возврат результата вместе со статусом — встречается повсеместно. Функция сообщает не только «что получилось», но и «получилось ли вообще». Вызывающий код при этом сам решает, что делать с каждым из значений: проверить статус перед использованием результата, залогировать его или проигнорировать.

Важный момент: возвращаемые значения не обязаны быть одного типа. В safe_divide один из вариантов возвращает float и строку, другой — None и строку. Python не ограничивает вас в том, что именно класть в кортеж.