Всем доброго времени суток. Сегодня мы рассмотрим, что такое *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 вещи:
- Имена аргументов в функции должны совпадать с именами ключей в словаре.
- Количество аргументов должно совпадать с количеством ключей в словаре.