"Передача переменного числа аргументов в функции: примеры"
Быстрый ответ
Python предоставляет возможность передачи переменного количества аргументов в функцию с помощью конструкций *args
и **kwargs
. Используйте *args
для передачи неназванных (позиционных) аргументов и **kwargs
для передачи именованных (ключевых) аргументов.
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='банан')
Раскрываем суть *args
и **kwargs
Для упрощения понимания и соблюдения чистоты кода на Python, рекомендуется следовать нескольким принципам:
Ставьте аргументы в нужном порядке
Порядок аргументов, указанных в определении функции, следует описанной модели: сначала обычные позиционные аргументы, затем *args
, после – ключевые аргументы со значениями по умолчанию, а в самом конце **kwargs
:
def function(positional_args, *args, default_keyword_args=default_value, **kwargs):
pass # это заготовка для функции общего назначения
Устанавливайте None
для необязательных аргументов
Использование None
сделает очевидным факт, что аргумент является необязательным:
def function_with_optional_arg(arg=None):
if arg is not None:
# что-то делаем с аргументом
else:
# что-то делаем, если аргумент не был передан
Улучшайте отладку с информативными сообщениями об ошибках
Качество управления ошибками ваших функций напрямую влияет на их удобство использования. Если возникают проблемы с *args
и **kwargs
, информативное сообщение об ошибке поможет вам найти решение:
try:
complicated_function(*too_many_args, **unexpected_kwargs)
except TypeError as e:
print("Ошибка TypeError! Но мы не опускаем руки!", e)
Визуализация
Представьте функцию в Python как оператора колл-центра, где аргументы – это звонящие клиенты. Обычный оператор может обслужить лишь пару клиентов:
def agent_handle(customer1, customer2):
# У нас обслуживание по очереди!
Теперь представьте супер-оператора, который готов обрабатывать неограниченное количество звонков:
def super_agent_handle(*customers):
# Мы готовы обслужить каждого!
В нашем списке клиентов *customers
есть Алиса 😄, Боб 😡, Чарли 😕 и много других. И супер-оператор с лёгкостью справляется со всеми:
Список клиентов: [😄, 😡, 😕, ...]
Супер-оператор — это функция с *args
(готовая принять любое количество клиентов!)
Преимущества и подводные камни
Распределение аргументов между функциями
Если вам требуется передавать *args
и **kwargs
в разные функции, используйте списки и словари:
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
:
def print_keyword_arguments(**kwargs):
for key, value in kwargs.items():
print(f"{key} = {value}")
Учтите разницу в подходах в разных языках
В зависимости от языка программирования существуют разные механизмы работы со списками произвольного объёма аргументов. Если вы уже знакомы с некоторыми другими языками, обратите внимание на отличия.
Полезные материалы
- 4. Больше инструментов управления потоком – Документация Python 3.12.2 — Прекрасное введение в использование списков аргументов из официальной документации Python.
- Python args и kwargs: demystified – Real Python — Детальный разбор работы с
*args
и**kwargs
. - python – Использование *args и **kwargs – Stack Overflow — Обсуждение использования
*args
и**kwargs
в сообществе Python. - *args и **kwargs в Python – GeeksforGeeks — Обстоятельное изучение темы для энтузиастов программирования.
- Как использовать *args и **kwargs в Python 3 – DigitalOcean — Практическое пособие по работе с
*args
и**kwargs
.