Шаг 117.
Основы языка Python.
Пользовательские функции. Переменное число параметров в функции

    На этом шаге мы рассмотрим особенности передачи в функцию переменного числа параметров.

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

def summa(*t):
    """ Функция принимает произвольное количество параметров """
    res = 0
    for i in t: # Перебираем кортеж с переданными параметрами
        res += i
    return res

print(summa(10, 20)) # Выведет: 30
print(summa(10, 20, 30, 40, 50, 60)) # Выведет: 210

    Можно также вначале указать несколько обязательных параметров и параметров, имеющих значения по умолчанию:

def summa(x, y=5, *t): # Комбинация параметров
    res = x + y
    for i in t: # Перебираем кортеж с переданными параметрами
        res += i
    return res

print(summa(10)) # Выведет: 15
print(summa(10, 20, 30, 40, 50, 60)) # Выведет: 210

    Если перед параметром в определении функции указать две звездочки (**), то все именованные параметры будут сохранены в словаре:

def func(**d):
    for i in d:	# Перебираем словарь с переданными параметрами
        print("{0} => {1}".format(i, d[i]), end=" ")

func(a=1, b=2, c=3)  # Выведет: a => 1 с => 3 b => 2

    При комбинировании параметров параметр с двумя звездочками указывается самым последним, Если в определении функции указывается комбинация параметров с одной звездочкой и двумя звездочками, то функция примет любые переданные ей параметры:

def func(*t, **d):
    """ Функция примет любые параметры """
    for i in t:
        print(i, end=" ")
    for i in d: # Перебираем словарь с переданными параметрами
        print ("{0} => {1}".format(i, d[i]), end=" ")
        
func(35, 10, a=1, b=2, c=3) # Выведет: 35 10 a => 1 с => 3 b => 2
func(10) # Выведет: 10
func(a=1, b=2) # Выведет: a => 1 b => 2

    В определении функции можно указать, что некоторые параметры передаются только по именам. Для этого параметры должны указываться после параметра с одной звездочкой, но перед параметром с двумя звездочками. Именованные параметры могут иметь значения по умолчанию. Пример:

def func(*t, a, b=10, **d):
    print(t, a, b, d)

func(35, 10, a=1, c=3) # Выведет: (35, 10) 1 10 {'с': 3}
func(10, a=5) # Выведет: (10,) 5 10 {}
func(a=1, b=2) # Выведет: () 1 2 {}
func(1, 2, 3) # Ошибка. Параметр а обязателен!

    В этом примере переменная t примет любое количество значений, которые будут объединены в кортеж. Переменные а и b должны передаваться только по именам, причем переменной а обязательно нужно передать значение при вызове функции. Переменная b имеет значение по умолчанию, поэтому при вызове допускается не передавать ей значение, но если значение передается, то оно должно быть указано после названия параметра и оператора =. Переменная d примет любое количество именованных параметров и сохранит их в словаре. Обратите внимание на то, что, хотя переменные а и b являются именованными, они не попадут в этот словарь.

    Параметра с двумя звездочками может не быть в определении функции, а вот параметр с одной звездочкой при указании параметров, передаваемых только по именам, должен присутствовать обязательно. Если функция не должна принимать переменного количества параметров, но необходимо использовать переменные, передаваемые только по именам, то можно указать только звездочку без переменной:

def func(x=1, y=2, *, a, b=10):
    print(x, y, a, b)
    
func(35, 10, a=1) # Выведет: 35 10 1 10
func(10, a=5) # Выведет: 10 2 5 10
func(a=1, b=2) # Выведет: 1 2 1 2
func(a=1, y=8, x=7) # Выведет: 7 8 1 10
func(1, 2, 3) # Ошибка. Параметр а обязателен!

    В этом примере значения переменным x и y можно передавать как по позициям, так и по именам. Поскольку переменные имеют значения по умолчанию, допускается вообще не передавать им значений. Переменные a и b расположены после параметра с одной звездочкой, поэтому передать значения при вызове можно только по именам. Так как переменная b имеет значение по умолчанию, допускается не передавать ей значение при вызове, а вот переменная a обязательно должна получить значение, причем только по имени.

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




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