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

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

Я предпочитаю
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  # это заготовка для функции общего назначения
Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Устанавливайте 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.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой синтаксис используется для передачи неназванных (позиционных) аргументов в функцию в Python?
1 / 5