• ru
  • Language: en
  • Documentation version: latest

Аргументы переменной длины

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

Note

Даже если вы не будете использовать этот прием в своих скриптах, есть большая вероятность, что вы встретите его в чужом коде.

Позиционные аргументы переменной длины

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