Аргументы: позиционные и именованные
Аргументы: позиционные и именованные
В предыдущем уроке мы научились определять функции с параметрами и вызывать их. Но Python предлагает гибкий механизм передачи аргументов: их можно передавать по позиции (как в большинстве языков) или по имени. Это делает вызовы функций читаемее и устраняет целый класс ошибок.
Позиционные аргументы
Когда вы вызываете add(3, 5), Python сопоставляет аргументы с параметрами по порядку: первый аргумент → первый параметр, второй → второй. Это позиционные аргументы — самый простой способ вызова:
def describe_person(name, age, city):
print(f"{name}, {age} лет, живёт в {city}")
describe_person("Алиса", 25, "Москва") # позиционный вызов
describe_person("Борис", 30, "Питер")
Порядок имеет значение. Перепутаете местами — получите неверный результат:
describe_person(25, "Алиса", "Москва") # "25, Алиса лет, живёт в Москве" — неверно!
Позиционные аргументы понятны и лаконичны, но при 3+ параметрах вызов становится труднее читать. Кто разберёт create_user("alice", True, False, 2) без заглядывания в сигнатуру функции?
Именованные аргументы (keyword arguments)
Аргумент можно передать по имени параметра. Такие аргументы называют именованными или keyword arguments (kwargs):
describe_person(name="Алиса", age=25, city="Москва")
describe_person(city="Питер", name="Борис", age=30) # порядок не важен!
При именованном вызове порядок не важен — Python сам сопоставит каждый аргумент по имени. Это особенно полезно при вызове функций со многими параметрами:
def create_connection(host, port, user, password, timeout, use_ssl):
print(f"Подключение к {host}:{port} как {user}")
# Позиционный — непонятно что есть что:
create_connection("localhost", 5432, "admin", "secret", 30, True)
# Именованный — самодокументируемый код:
create_connection(
host="localhost",
port=5432,
user="admin",
password="secret",
timeout=30,
use_ssl=True
)
Смешанный вызов
Можно смешивать позиционные и именованные аргументы в одном вызове, но с одним правилом: все позиционные должны идти раньше именованных:
def greet(greeting, name, punctuation):
print(f"{greeting}, {name}{punctuation}")
greet("Привет", "Алиса", "!") # только позиционные — OK
greet("Привет", name="Алиса", punctuation="!") # смешанные — OK
greet("Привет", punctuation="!", name="Алиса") # тоже OK — именованные в любом порядке
# greet(greeting="Привет", "Алиса", "!") # SyntaxError: позиционный ПОСЛЕ именованного
Python сам следит за этим правилом — при нарушении выдаёт SyntaxError ещё до запуска программы.
Передача одного аргумента дважды — ошибка
Именованные аргументы нельзя комбинировать так, чтобы один параметр получил значение дважды:
def add(a, b):
return a + b
# add(3, a=3) # TypeError: got multiple values for argument 'a'
Практический пример: читаемый вызов
Сравните два вызова одной и той же функции:
import datetime
# Непонятный позиционный вызов:
d1 = datetime.date(2025, 4, 15)
# Именованный — сразу понятно, что год, что месяц, что день:
d2 = datetime.date(year=2025, month=4, day=15)
Обе строки делают одно и то же, но вторая не требует знания порядка параметров. Для стандартных функций с устоявшимся порядком (как date(year, month, day)) позиционный вызов привычен. Для собственных функций со сложной сигнатурой — именованные аргументы делают код понятнее.
Именованные аргументы при вызове print()
Вы уже использовали именованные аргументы не зная об этом:
print("Hello", "World", sep=", ", end="!\n")
# Hello, World!
sep и end — это именованные параметры функции print(). Именно поэтому их передают по имени, а не по позиции — порядок строк для вывода и разделитель концептуально разные вещи.
Проверь себя
Что произойдёт при вызове?
def power(base, exp):
return base ** exp
result = power(exp=3, base=2)
print(result)
Именованные аргументы можно передавать в любом порядке. base=2, exp=3 → 2 ** 3 → 8.
Итог
- Позиционные аргументы сопоставляются по порядку — компактны, но требуют знания порядка параметров.
- Именованные аргументы (
param=value) игнорируют порядок и делают вызов самодокументируемым. - Можно смешивать: сначала позиционные, затем именованные.
- Именованный аргумент нельзя использовать, если параметр уже получил позиционное значение.
- Для функций с 3+ параметрами именованные аргументы значительно улучшают читаемость.
В следующем уроке разберём значения по умолчанию — как задать параметру запасное значение, которое используется, если аргумент не передан.