Шаг 117.
Python: сборник рецептов.
Функции. Определение функций, принимающих любое количество аргументов

    На этом шаге мы рассмотрим реализацию такой функции.

Задача

    Вы хотите определить функцию, которая принимает любое количество аргументов.

Решение

    Чтобы определить функцию, которая принимает любое количество позиционных аргументов, используйте аргумент со звездочкой (*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

    Такие аргументы известны как "обязательные именованные аргументы", они обсуждаются на следующем шаге.

    На следующем шаге мы рассмотрим определение функций, принимающих только именованные аргументы.




Предыдущий шаг Содержание