Параметры по умолчанию и несколько возвращаемых значений
Уроки курсаПараметры по умолчанию и несколько возвращаемых значений
Возврат нескольких значений через кортеж и их распаковка
До этого функция возвращала одно значение — число, строку, булево. Но иногда одного результата недостаточно: нужно вернуть и сам результат, и информацию о том, как прошло вычисление. 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 не ограничивает вас в том, что именно класть в кортеж.
