Параметры по умолчанию и несколько возвращаемых значений
Содержание курса
Ошибка порядка параметров и правило расстановки
Python требует, чтобы все параметры со значениями по умолчанию шли после обязательных. Это не стилевое соглашение — это жёсткое синтаксическое правило. Если его нарушить, интерпретатор бросит SyntaxError ещё до запуска программы.
Посмотрим на неверный вариант:
def power(exp=2, base): # SyntaxError!
return base ** exp
Python не сможет разобрать эту сигнатуру и выдаст:
SyntaxError: non-default argument follows default argument
Почему это запрещено? Когда Python видит вызов power(3), ему нужно однозначно решить, какому параметру принадлежит аргумент 3. Если параметр со значением по умолчанию стоит первым, возникает неразрешимая неоднозначность: то ли 3 — это exp, то ли base, то ли Python должен «пропустить» exp и отдать 3 в base? Интерпретатор не угадывает — он просто запрещает такую сигнатуру.
Правильный порядок — сначала обязательные, потом необязательные:
def power(base, exp=2):
return base ** exp
Теперь при вызове всё однозначно. Можно передать только base, и exp возьмёт значение по умолчанию. Можно передать оба аргумента, и значение по умолчанию будет проигнорировано:
print(power(3)) # 9 — exp = 2 (по умолчанию)
print(power(3, 3)) # 27 — exp = 3 (переопределён)
Оба вызова корректны. Первый — типичный сценарий, когда дефолтного значения достаточно. Второй — когда нужно переопределить поведение без создания новой функции.
Запомнить правило просто: смотришь на сигнатуру слева направо — сначала идут все параметры без =, потом все с =. Любое другое чередование — ошибка.
