Аргументы переменной длины#
Иногда необходимо сделать так, чтобы функция принимала не фиксированное количество аргументов, а любое. Для такого случая в Python можно создавать функцию со специальным параметром, который принимает аргументы переменной длины. Такой параметр может быть как ключевым, так и позиционным.
Примечание
Даже если вы не будете использовать этот прием в своих скриптах, есть большая вероятность, что вы встретите его в чужом коде.
Позиционные аргументы переменной длины#
Параметр, который принимает позиционные аргументы переменной длины,
создается добавлением перед именем параметра звездочки. Имя параметра
может быть любым, но по договоренности чаще всего используют имя
*args
Пример функции:
In [1]: def sum_arg(a, *args):
....: print(a, args)
....: return a + sum(args)
....:
Функция sum_arg создана с двумя параметрами:
параметр
a
если передается как позиционный аргумент, должен идти первым
если передается как ключевой аргумент, то порядок не важен
параметр
*args
- ожидает аргументы переменной длинысюда попадут все остальные аргументы в виде кортежа
эти аргументы могут отсутствовать
Вызов функции с разным количеством аргументов:
In [2]: sum_arg(1, 10, 20, 30)
1 (10, 20, 30)
Out[2]: 61
In [3]: sum_arg(1, 10)
1 (10,)
Out[3]: 11
In [4]: sum_arg(1)
1 ()
Out[4]: 1
Можно создать и такую функцию:
In [5]: def sum_arg(*args):
....: print(args)
....: return sum(args)
....:
In [6]: sum_arg(1, 10, 20, 30)
(1, 10, 20, 30)
Out[6]: 61
In [7]: sum_arg()
()
Out[7]: 0
Ключевые аргументы переменной длины#
Параметр, который принимает ключевые аргументы переменной длины,
создается добавлением перед именем параметра двух звездочек. Имя
параметра может быть любым, но, по договоренности, чаще всего,
используют имя **kwargs
(от keyword arguments).
Пример функции:
In [8]: def sum_arg(a, **kwargs):
....: print(a, kwargs)
....: return a + sum(kwargs.values())
....:
Функция sum_arg создана с двумя параметрами:
параметр
a
если передается как позиционный аргумент, должен идти первым
если передается как ключевой аргумент, то порядок не важен
параметр
**kwargs
- ожидает ключевые аргументы переменной длинысюда попадут все остальные ключевые аргументы в виде словаря
эти аргументы могут отсутствовать
Вызов функции с разным количеством ключевых аргументов:
In [9]: sum_arg(a=10, b=10, c=20, d=30)
10 {'c': 20, 'b': 10, 'd': 30}
Out[9]: 70
In [10]: sum_arg(b=10, c=20, d=30, a=10)
10 {'c': 20, 'b': 10, 'd': 30}
Out[10]: 70