Перейти к основному содержимому

*args и **kwargs

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

Но иногда нельзя заранее сказать, сколько их будет передано.

Именно эту задачу решают *args и **kwargs: они позволяют функции принимать неизвестное количество аргументов.


Произвольные аргументы — *args

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

Тогда функция получит аргументы в виде кортежа и сможет обращаться к каждому элементу по его позиции.

В документации Python произвольные аргументы (Arbitrary Arguments) часто сокращают до *args.

Пример

Приём любого количества аргументов с помощью *args:

Prompt
Напишите функцию, которая с помощью *kids принимает любое количество аргументов. Выведите третьего ребёнка. Вызовите её с "Emil", "Tobias", "Linus".
Вывод: полная программа на Python

Что такое *args?

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

Все они попадают в args, который внутри функции является кортежем:

Пример

Чтение отдельных аргументов из *args:

Prompt
Напишите функцию с *args и выведите тип, первый, второй и все аргументы. Вызовите её с "Emil", "Tobias", "Linus".
Вывод: полная программа на Python

Использование *args вместе с обычными аргументами

Обычные параметры и *args могут стоять рядом.

Обычные параметры нужно указывать первыми.

Здесь greeting принимает значение "Hello", а names собирает все остальные значения.

Пример

Prompt
Напишите функцию с обычным параметром greeting и *names. Выведите приветствие с каждым именем. Вызовите с "Hello", "Emil", "Tobias", "Linus".
Вывод: полная программа на Python

Практический пример с *args

Именно в гибких функциях *args действительно помогает:

Пример

Сложение любого количества переданных значений:

Prompt
Напишите функцию с *numbers, которая вычисляет сумму любого количества значений. Проверьте на (1,2,3), (10,20,30,40) и (5).
Вывод: полная программа на Python

Пример

Поиск наибольшего значения:

Prompt
Напишите функцию с *numbers, которая находит максимальное значение. Для пустого ввода верните None. Проверьте на (3, 7, 2, 9, 1).
Вывод: полная программа на Python

Произвольные именованные аргументы — **kwargs

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

Тогда функция получит их в виде словаря и сможет находить каждый элемент по его ключу.

В документации Python произвольные именованные аргументы (Arbitrary Keyword Arguments) часто сокращают до **kwargs.

Пример

Приём любого количества именованных аргументов с помощью **kwargs:

Prompt
Напишите функцию, которая с помощью **kid принимает именованные аргументы. Выведите фамилию. Вызовите с fname="Tobias", lname="Refsnes".
Вывод: полная программа на Python

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

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

Все они попадают в kwargs, который внутри функции является словарём:

Пример

Чтение значений из **kwargs:

Prompt
Напишите функцию с **myvar и выведите тип, имя, возраст и все данные. Вызовите с name="Tobias", age=30, city="Bergen".
Вывод: полная программа на Python

Использование **kwargs вместе с обычными аргументами

Обычные параметры и **kwargs тоже работают вместе.

Здесь обычные параметры также указываются первыми:

Пример

Prompt
Напишите функцию с username и **details. Выведите имя пользователя и все дополнительные сведения. Вызовите с "emil123" и дополнительными именованными аргументами.
Вывод: полная программа на Python

Сочетание *args и **kwargs

В одной функции могут быть и *args, и **kwargs.

Указывайте параметры в таком порядке:

  1. обычные параметры
  2. *args
  3. **kwargs

Пример

Prompt
Напишите функцию с title, *args и **kwargs. Выведите все три. Вызовите со смешанными позиционными и именованными аргументами.
Вывод: полная программа на Python

Распаковка аргументов

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

Запомните: в определении * и ** собирают аргументы. При вызове они их распаковывают.

Пример

Превращение списка в отдельные аргументы с помощью *:

Prompt
Напишите функцию, которая принимает три параметра и возвращает их сумму. Используйте *, чтобы распаковать список [1, 2, 3] в вызов функции.
Вывод: полная программа на Python

Пример

Превращение словаря в именованные аргументы с помощью **:

Prompt
Напишите функцию, которая принимает fname и lname и выводит приветствие. Используйте **, чтобы распаковать словарь в вызов функции.
Вывод: полная программа на Python