Параметры *args в Python — примеры использования
В этом уроке вы узнаете о параметрах Python *args и о том, как их использовать для определения вариативных функций.
- Распаковка кортежа
- Введение в параметр *args в Python
- *args исчерпывает позиционные аргументы
- Распаковка аргументов
Распаковка кортежа
Следующий код распаковывает кортеж в две переменные:
x, y = 10, 20
Python присваивает x значение 10, а y — 20. Это похоже на передачу двух аргументов функции:
def add(x, y): return x + y add(10, 20)
В этом примере Python передал 10 в x и 20 в y.
Аналогично, следующее присваивает 10 x, 20 y и список [30, 40] z:
x, y, *z = 10, 20, 30, 40 print(x) print(y) print(z)
Python использует ту же концепцию для аргументов функции. Например:
def add(x, y, *args): total = x + y for arg in args: total += arg return total result = add(10, 20, 30, 40) print(result)
Функция add принимает три параметра x, y и *args. *args — это специальный аргумент, которому предшествует звездочка(*).
При передаче позиционных аргументов 10, 20, 30 и 40 в функцию Python присваивает 10 x, 20 y и кортеж(30, 40) args. Это похоже на распаковку кортежа, за исключением того, что аргументы — это кортеж, а не список.
Введение в параметр *args в Python
Когда у функции есть параметр, которому предшествует звездочка(*), она может принимать переменное количество аргументов. И вы можете передать ноль, один или более аргументов параметру *args.
В Python параметры типа *args называются вариативными параметрами. Функции, имеющие вариативные параметры, называются вариативными функциями.
Обратите внимание, что вам не нужно называть args для вариативного параметра. Например, вы можете использовать любые осмысленные имена, такие как *numbers, *strings, *lists и т. д. Однако по соглашению Python использует *args для вариативного параметра.
Давайте рассмотрим следующий пример:
def add(*args): print(args) add()
Выход:
()
Функция add показывает пустой кортеж.
Ниже показан тип аргумента args и его содержимое:
def add(*args): print(type(args)) print(args) add()
Выход
<class 'tuple'> ()
Поскольку мы не передали ни одного аргумента функции add(), на выходе отображается пустой кортеж.
Следующий код передает три аргумента функции add():
def add(*args): print(args) add(1,2,3)
Выход:
(1, 2, 3)
Теперь args имеет три числа 1, 2 и 3. Чтобы получить доступ к каждому элементу аргумента args, используйте обозначение квадратных скобок [] с индексом:
def add(*args): print(args[0]) print(args[1]) print(args[2]) add(1, 2, 3)
Кроме того, вы можете использовать цикл for для перебора элементов кортежа.
Ниже показано, как сложить все числа кортежа args в функции add():
def add(*args): total = 0 for arg in args: total += arg return total total = add(1, 2, 3) print(total)
Выход:
6
*args исчерпывает позиционные аргументы
Если вы используете аргумент *args, вы не можете добавить больше позиционных аргументов. Однако вы можете использовать ключевые аргументы.
Следующий пример приводит к ошибке, поскольку в нем используется позиционный аргумент после аргумента *arg:
def add(x, y, *args, z): return x + y + sum(args) + z add(10, 20, 30, 40, 50)
Ошибка:
TypeError: add() missing 1 required keyword-only argument: 'z'
Чтобы исправить это, вам необходимо использовать ключевой аргумент после аргумента *args следующим образом:
def add(x, y, *args, z): return x + y + sum(args) + z add(10, 20, 30, 40, z=50)
В этом примере Python присваивает 10 x, 20 y,(30,40) args и 50 z.
Распаковка аргументов
Следующая функция точки принимает два аргумента и возвращает строковое представление точки с координатами x и y:
def point(x, y): return f'({x},{y})'
Если вы передадите кортеж в функцию point, вы получите ошибку:
a =(0, 0) origin = point(a)
Ошибка:
TypeError: point() missing 1 required positional argument: 'y'
Чтобы исправить это, необходимо добавить к кортежу a префикс *, например:
def point(x, y): return f'({x},{y})' a =(0, 0) origin = point(*a) print(origin)
Выход:
(0,0)
Если перед аргументом a поставить оператор *, Python распаковывает кортеж и присваивает его элементы параметрам x и y.