Аргументы: позиционные и именованные

Аргументы: позиционные и именованные

В предыдущем уроке мы научились определять функции с параметрами и вызывать их. Но 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=32 ** 38.

Итог

  • Позиционные аргументы сопоставляются по порядку — компактны, но требуют знания порядка параметров.
  • Именованные аргументы (param=value) игнорируют порядок и делают вызов самодокументируемым.
  • Можно смешивать: сначала позиционные, затем именованные.
  • Именованный аргумент нельзя использовать, если параметр уже получил позиционное значение.
  • Для функций с 3+ параметрами именованные аргументы значительно улучшают читаемость.

В следующем уроке разберём значения по умолчанию — как задать параметру запасное значение, которое используется, если аргумент не передан.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике