"Передача переменного числа аргументов в функции: примеры"

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Python предоставляет возможность передачи переменного количества аргументов в функцию с помощью конструкций *args и **kwargs. Используйте *args для передачи неназванных (позиционных) аргументов и **kwargs для передачи именованных (ключевых) аргументов.

Python
Скопировать код
def print_args(*args):
    for arg in args:
        print(arg)

print_args('яблоко', 'банан', 'вишня')

def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_kwargs(first='яблоко', second='банан')
Кинга Идем в IT: пошаговый план для смены профессии

Раскрываем суть *args и **kwargs

Для упрощения понимания и соблюдения чистоты кода на Python, рекомендуется следовать нескольким принципам:

Ставьте аргументы в нужном порядке

Порядок аргументов, указанных в определении функции, следует описанной модели: сначала обычные позиционные аргументы, затем *args, после – ключевые аргументы со значениями по умолчанию, а в самом конце **kwargs:

Python
Скопировать код
def function(positional_args, *args, default_keyword_args=default_value, **kwargs):
    pass  # это заготовка для функции общего назначения

Устанавливайте None для необязательных аргументов

Использование None сделает очевидным факт, что аргумент является необязательным:

Python
Скопировать код
def function_with_optional_arg(arg=None):
    if arg is not None:
        # что-то делаем с аргументом
    else:
        # что-то делаем, если аргумент не был передан

Улучшайте отладку с информативными сообщениями об ошибках

Качество управления ошибками ваших функций напрямую влияет на их удобство использования. Если возникают проблемы с *args и **kwargs, информативное сообщение об ошибке поможет вам найти решение:

Python
Скопировать код
try:
    complicated_function(*too_many_args, **unexpected_kwargs)
except TypeError as e:
    print("Ошибка TypeError! Но мы не опускаем руки!", e)

Визуализация

Представьте функцию в Python как оператора колл-центра, где аргументы – это звонящие клиенты. Обычный оператор может обслужить лишь пару клиентов:

Python
Скопировать код
def agent_handle(customer1, customer2): 
    # У нас обслуживание по очереди!

Теперь представьте супер-оператора, который готов обрабатывать неограниченное количество звонков:

Python
Скопировать код
def super_agent_handle(*customers): 
    # Мы готовы обслужить каждого!

В нашем списке клиентов *customers есть Алиса 😄, Боб 😡, Чарли 😕 и много других. И супер-оператор с лёгкостью справляется со всеми:

Список клиентов: [😄, 😡, 😕, ...]

Супер-оператор — это функция с *args (готовая принять любое количество клиентов!)

Преимущества и подводные камни

Распределение аргументов между функциями

Если вам требуется передавать *args и **kwargs в разные функции, используйте списки и словари:

Python
Скопировать код
def party1(*args):
    # Обрабатываем некоторые аргументы.

def party2(**kwargs):
    # Обрабатываем другие аргументы.

args_party_pack = [1, 2, 3]
kwargs_confetti = {'x': 4, 'y': 5}

party1(*args_party_pack)
party2(**kwargs_confetti)

Будьте готовы к исключениям во время исполнения

В Python нет ошибок компиляции, но в процессе работы вас могут ждать такие исключения как TypeError и ValueError. Бережное их обработывание будет способствовать корректной работе вашей программы.

Использование словарей для ключевых аргументов

Метод items() позволяет эффективно итерировать ключи и значения из **kwargs:

Python
Скопировать код
def print_keyword_arguments(**kwargs):
    for key, value in kwargs.items():
        print(f"{key} = {value}")

Учтите разницу в подходах в разных языках

В зависимости от языка программирования существуют разные механизмы работы со списками произвольного объёма аргументов. Если вы уже знакомы с некоторыми другими языками, обратите внимание на отличия.

Полезные материалы

  1. 4. Больше инструментов управления потоком – Документация Python 3.12.2 — Прекрасное введение в использование списков аргументов из официальной документации Python.
  2. Python args и kwargs: demystified – Real Python — Детальный разбор работы с *args и **kwargs.
  3. python – Использование *args и **kwargs – Stack Overflow — Обсуждение использования *args и **kwargs в сообществе Python.
  4. *args и **kwargs в Python – GeeksforGeeks — Обстоятельное изучение темы для энтузиастов программирования.
  5. Как использовать *args и **kwargs в Python 3 – DigitalOcean — Практическое пособие по работе с *args и **kwargs.