Python *args and **kwargs

Всем доброго времени суток. Сегодня мы рассмотрим, что такое *args и **kwargs. Закрепим знания на некоторых примерах и убедимся в их пользе.

Что такое *args?

*args позволяет передать переменное количество аргументов функции. Давайте рассмотрим пример, чтобы прояснить это.

Предположим, вы создали функцию для сложения двух чисел, как тут.

def sum(a, b):
    print("Сумма равна", a+b)

Как вы можете наблюдать, эта программа принимает только два числа. Так вот, если вы хотите передать более двух аргументов, тогда *args вступает в игру.

def sum(*args):
    s = 0
    for i in args:
        s += i
    print("sum is", s)

Теперь вы можете передать любое количество аргументов функции, как тут:

>>> sum(1, 2, 3)
6
>>> sum(1, 2, 3, 4, 5, 7)
22
>>> sum(1, 2, 3, 4, 5, 7, 8, 9, 10)
49
>>> sum()
0

Внимание:

*args — это просто соглашение, вы можете использовать любое другое имя, и оно будет допустимым. 

Например: 

*myargs можно использовать совершенно спокойно.

Что такое **kwargs?

**kwargs позволяет нам передавать переменное число именованных аргументов, как тут: func_name(name=’tim’, team=’school’)

def my_func(**kwargs):
    for i, j in kwargs.items():
        print(i, j)

my_func(name='Иннокентий', sport='баскетбол', roll=19)

Ожидаемый вывод:

sport баскетбол
roll 19
name Иннокентий

Использование *args и **kwargs в вызове функции

Вы можете использовать *args для передачи элементов из итерируемой переменной в функцию. Следующий пример прояснит все.

def my_three(a, b, c):
    print(a, b, c)

a = [1,2,3]
my_three(*a) # этот список разделяется на три элемента

Внимание:

Это работает только тогда, когда количество аргументов совпадает с количеством элементов в итерируемой переменной.

Точно так же вы можете использовать **kwargs для передачи аргументов функции, прямо как тут:

def my_three(a, b, c):
    print(a, b, c)

a = {'a': "one", 'b': "two", 'c': "three" }
my_three(**a)

Обратите внимание, что для этого необходимо 2 вещи:

  1. Имена аргументов в функции должны совпадать с именами ключей в словаре.
  2. Количество аргументов должно совпадать с количеством ключей в словаре.