Параметры по умолчанию и несколько возвращаемых значений
Содержание курса
Процедура написания функции с опциональным параметром и множественным возвратом
Теперь объединим оба механизма в одну функцию. Разберём это пошагово на конкретном примере — напишем функцию, которая возводит число в степень, но при отрицательном показателе возвращает особый статус.
Шаг 1. Объявить сигнатуру: обязательные параметры идут первыми, необязательные — после.
def safe_power(base, exp=2):
base — обязательный, exp — необязательный со значением по умолчанию 2.
Шаг 2. В теле вычислить результат и сформировать статус.
def safe_power(base, exp=2):
if exp < 0:
result = None
status = 'ошибка: отрицательный показатель не поддерживается'
else:
result = base ** exp
status = 'ok'
Здесь два пути: отрицательный показатель даёт None и строку с описанием, неотрицательный — вычисленное значение и 'ok'.
Шаг 3. Написать return result, status — Python сам упакует значения в кортеж.
def safe_power(base, exp=2):
if exp < 0:
result = None
status = 'ошибка: отрицательный показатель не поддерживается'
else:
result = base ** exp
status = 'ok'
return result, status
Один return в конце — он всегда возвращает кортеж из двух элементов, независимо от ветки.
Шаг 4. Вызвать функцию — с дефолтным параметром или с переопределённым.
# Только обязательный аргумент — exp берёт значение по умолчанию 2
r, s = safe_power(4)
print(r, s) # 16 ok
# Оба аргумента — exp переопределён
r, s = safe_power(4, 3)
print(r, s) # 64 ok
# Отрицательный показатель
r, s = safe_power(4, -1)
print(r, s) # None ошибка: отрицательный показатель не поддерживается
Шаг 5. Использовать статус перед тем, как работать с результатом.
r, s = safe_power(4)
if s == 'ok':
print(f'Результат: {r}')
else:
print(f'Не удалось выполнить операцию: {s}')
Проверка статуса до использования результата — это и есть смысл паттерна «результат + статус»: вызывающий код знает, можно ли доверять значению r. Без такой проверки вы рискуете использовать None там, где ожидаете число, — и получить ошибку уже в другом месте программы, далеко от источника проблемы.
Распаковка работает по тому же правилу, что в предыдущей секции: количество переменных слева должно совпадать с количеством возвращаемых значений.
Вся процедура в сжатом виде: сначала обязательные параметры, потом необязательные; в теле — вычисление и статус; один return с несколькими значениями через запятую; при вызове — распаковка в нужное количество переменных; дальше — работа со статусом.
