*args и **kwargs

*args

Python предоставляет способ обработки произвольного количества аргументов в функции с помощью специальных символов. Эти символы — * и **, и они используются перед именами переменных для обозначения *args и **kwargs соответственно. Вы можете называть параметры *args или **kwargs как угодно, но по общепринятой конвенции их называют args (аргументы) и kwargs (именованные аргументы).
*args используется для передачи произвольного количества неименованных аргументов в функцию. Вот пример:
def add(*args):
    res = 0             # Инициализируем итоговый результат нулем
    for num in args:    # Проходим по списку переданных аргументов
        res += num      # Добавляем каждое число к сумме
    return res

print(add(3, 5, 7, 9))  # 24
В этой программе args — это кортеж значений, которые мы передаем функции. Таким образом, в приведенном выше примере args равен (3, 5, 7, 9). Это позволяет нам передавать функции любое количество аргументов.

**kwargs

**kwargs позволяет нам передавать произвольное количество именованных аргументов. Иными словами, мы используем **kwargs для передачи любых именованных аргументов нашей функции. Вот пример:
def introduce(**kwargs):
    for key, value in kwargs.items():  # Проходим по всем парам "ключ-значение"
        print(f'{key}: {value}')       # Выводим каждую пару "ключ-значение"

introduce(Name='Alice', Age=25, Country='USA')  
# 'Name: Alice'
# 'Age: 25'
# 'Country: USA'
В приведенной выше программе kwargs — это словарь с парами "ключ-значение", которые мы передаем функции. Таким образом, в примере выше kwargs равен {'Name': 'Alice', 'Age': 25, 'Country': 'USA'}.
Вы также можете комбинировать *args и **kwargs в определении функции. При этом *args должно предшествовать **kwargs.
def combined_example(*args, **kwargs):
    print(args)    # Выводит кортеж аргументов
    print(kwargs)  # Выводит словарь именованных аргументов

combined_example(1, 2, 3, Name='Alice', Age=25)  
# (1, 2, 3)
# {'Name': 'Alice', 'Age': 25}
В этой функции args — это кортеж значений (1, 2, 3), а kwargs — это словарь с парами {'Name': 'Alice', 'Age': 25}.
Гибкость в обработке любого количества аргументов и именованных аргументов может быть очень полезна, когда вы хотите, чтобы ваши функции были более динамичными и универсальными.

Комбинирование *args и **kwargs с обычными аргументами функции

*args и **kwargs можно использовать в сочетании с обычными аргументами функции. В таких случаях необходимо помнить несколько правил:
  1. Правильный порядок аргументов в определении функции должен быть следующим: стандартные аргументы, затем *args, затем **kwargs.
  1. Стандартные аргументы (также известные как позиционные аргументы) всегда должны быть указаны перед *args и **kwargs.
def function_example(a, b, *args, **kwargs):
    print(a)       # Выводит первый стандартный аргумент
    print(b)       # Выводит второй стандартный аргумент
    print(args)    # Выводит дополнительные неименованные аргументы
    print(kwargs)  # Выводит именованные аргументы

function_example(1, 2, 3, 4, 5, Name='Alice', Age=25)
# 1
# 2
# (3, 4, 5)
# {'Name': 'Alice', 'Age': 25}
Здесь 1 и 2 — это стандартные аргументы, соответствующие a и b в определении функции. Кортеж (3, 4, 5) представляет дополнительные неименованные аргументы, которые собираются в args. Остальные именованные аргументы собираются в kwargs в виде словаря.
При использовании *args и **kwargs вместе со стандартными аргументами убедитесь, что вы не забыли указать стандартные аргументы при вызове функции, иначе это вызовет TypeError. Например, вызов function_example(1, Name='Alice', Age=25) без указания значения для аргумента b приведет к ошибке.
 
To check your solution you need to sign in
Sign in to continue