На этом шаге мы рассмотрим реализацию такой функции.
Вы хотите определить функцию, которая принимает любое количество аргументов.
Чтобы определить функцию, которая принимает любое количество позиционных аргументов, используйте аргумент со звездочкой (*argument):
def avg(first, *rest): return (first + sum(rest)) / (1 + len(rest)) # Пример использования avg(1, 2) # 1.5 avg(1, 2, 3, 4) # 2.5
В этом примере rest - это кортеж всех дополнительных позиционных аргументов. Код обрабатывает его как последовательность при выполнении вычислений.
Чтобы принять любое количество именованных аргументов, используйте аргумент, который начинается с **. Например:
def make_element(name, value, **attrs): keyvals = [' %s="%s"' % item for item in attrs.items()] attr_str = ''.join(keyvals) element = '<{name}{attrs}>{value}</{name}>'.format(name=name, \ attrs=attr_str, value=html.escape(value)) return element # Пример # Создает '<item size="large" quantity="6">Albatross</item>' make_element('item', 'Albatross', size='large', quantity=6) # Создает '<p><spam></p>' make_element('p', '<spam>')
Здесь attrs - это словарь, который хранит переданные именованные аргументы (если они были предоставлены).
Если вам нужна функция, которая может принимать и любое количество позиционных, и любое количество именованных аргументов, используйте * и ** вместе. Например:
def anyargs(*args, **kwargs): print(args) # Кортеж print(kwargs) # Словарь
В этой функции позиционные аргументы попадают в кортеж args, а все именованные аргументы - в словарь kwargs.
Аргумент со "звездочкой" может быть только последним в списке позиционных аргументов в определении функции. Аргумент с "двумя звездочками" может быть только последним. Тонкость тут в том, что аргумент без звездочки может идти и после аргумента со звездочкой:
def a(x, *args, y): pass def b(x, *args, y, **kwargs): pass
Такие аргументы известны как "обязательные именованные аргументы", они обсуждаются на следующем шаге.
На следующем шаге мы рассмотрим определение функций, принимающих только именованные аргументы.