Чем отличаются `*args` и `**kwargs`?

*args используется для передачи произвольного количества позиционных аргументов в функцию. Они передаются как кортеж.

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

*args и **kwargs - это специальные синтаксические конструкции в Python, которые позволяют функциям принимать переменное количество аргументов.

*args (позиционные аргументы):

  • *args используется для передачи переменного количества позиционных аргументов в функцию.
  • Внутри функции args представляет собой кортеж (tuple), содержащий все переданные позиционные аргументы.
  • Имя args - это общепринятое соглашение, можно использовать другое имя, но звездочка * обязательна. Например, *my_args.
  • Аргументы, переданные через *args, доступны в функции по индексу.

Пример:

def my_function(*args):
  for arg in args:
    print(arg)

my_function(1, 2, 3, "hello") # Вывод: 1, 2, 3, hello

**kwargs (именованные аргументы):

  • **kwargs используется для передачи переменного количества именованных (ключевых) аргументов в функцию.
  • Внутри функции kwargs представляет собой словарь (dictionary), где ключи - это имена аргументов, а значения - соответствующие им значения.
  • Имя kwargs - это общепринятое соглашение, можно использовать другое имя, но двойная звездочка ** обязательна. Например, **my_kwargs.
  • Аргументы, переданные через **kwargs, доступны в функции по имени (ключу).

Пример:

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

my_function(name="Alice", age=30, city="New York") # Вывод: name: Alice, age: 30, city: New York

Основные отличия:

  • *args принимает позиционные аргументы, **kwargs принимает именованные аргументы.
  • *args представляет собой кортеж, **kwargs представляет собой словарь.
  • При вызове функции аргументы для *args передаются по порядку, аргументы для **kwargs передаются в виде ключ=значение.

Когда использовать:

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

Комбинирование:

Можно использовать *args и **kwargs одновременно. В этом случае они обычно указываются в конце списка параметров функции. Важно помнить, что порядок важен: сначала идут обычные позиционные аргументы, затем *args, и в конце **kwargs.

Пример комбинирования:

def my_function(arg1, arg2, *args, **kwargs):
  print(f"arg1: {arg1}")
  print(f"arg2: {arg2}")
  print(f"args: {args}")
  print(f"kwargs: {kwargs}")

my_function(1, 2, 3, 4, name="Alice", age=30)
# Вывод:
# arg1: 1
# arg2: 2
# args: (3, 4)
# kwargs: {'name': 'Alice', 'age': 30}
0