Аргументы функции в Python

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

Фиксированное количество аргументов

Мы уже знаем о том, как определять и вызывать функции в Python. Например:

def greet(name, msg):
    """Эта функция выводит для человека с именем name
    приветствие и сообщение из msg """
    print("Привет,", name + '. ' + msg)

greet("Маша", "Доброе утро!")

Вывод:

Привет, Маша. Доброе утро!

Здесь у функции greet () два аргумента.

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

Если мы вызовем ее с другим количеством аргументов, интерпретатор выдаст сообщение об ошибке. Ниже приведен вызов этой функции с одним аргументом и без аргументов с соответствующими сообщениями об ошибках.

>>> greet("Маша")    # только один аргумент
TypeError: greet() missing 1 required positional argument: 'msg'
>>> greet()    #  вызов без аргументов
TypeError: greet() missing 2 required positional arguments: 'name' and 'msg'

Переменное количество аргументов

До сих пор мы определяли для функции фиксированное количество аргументов. В Python есть и другой тип функций — которые могут принимать переменное количество аргументов.

Ниже описаны три различные формы этого типа.

Аргумент по умолчанию

В Python аргументам функции можно присваивать значения по умолчанию.

Мы можем предоставить аргументу значение по умолчанию, используя оператор присваивания =. Вот пример:

def greet(name, msg="Доброе утро!"):
    """
    Эта функция выводит 
    для человека с именем name
    сообщение msg.

    Если текст сообщения не передан,
    по умолчанию используется "Доброе
    утро!"
    """

    print("Привет, ", name + '. ' + msg)

greet("Катя")
greet("Борис", "Как дела?")

Вывод:

Привет, Катя. Доброе утро!
Привет, Борис. Как дела?

В этой функции параметр name не имеет значения по умолчанию, его наличие обязательно.

А вот у параметра msg есть значение по умолчанию — «Доброе утро!». Так что во время вызова данный аргумент необязателен. Если все же указать его, то Python перезапишет значение по умолчанию.

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

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

def greet(msg = "Доброе утро!", name):

мы бы получили сообщение об ошибке:

SyntaxError: non-default argument follows default argument

Именованный аргумент

Когда мы вызываем функцию с некоторыми значениями, эти значения присваиваются аргументам в соответствии с их позицией.

Например, в приведенной выше функции greet (), когда мы вызвали ее как greet ("Борис", "Как дела?"), Значение "Борис" присваивается аргументу name, аналогично "Как дела?" — аргументу msg.

Python позволяет вызывать функции с использованием именованных аргументов. Когда мы вызываем функции таким образом, порядок аргументов можно изменять. Все следующие вызовы вышеуказанной функции работают и дают тот же результат.

# 2 именованных аргумента
greet(name = "Борис", msg = "Как дела?")

# 2 именованных аргумента (идут не по порядку)
greet(msg = "Как дела?", name = "Борис") 

# 1 позиционный, 1 именованный аргумент
greet("Борис", msg = "Как дела?")           

Как вы видите, позиционные аргументы с именованными можно смешивать во время вызова функции. Но помните: сначала позиционные, потом — именованные.

Если написать сначала именованные аргументы, а только потом — позиционные, Python выдаст ошибки. Например:

greet(name="Борис", "Как дела?")

Вызов функции приведет к ошибке:

SyntaxError: non-keyword arg after keyword arg

Произвольный список аргументов

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

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

def greet(*names):
    """Эта функция выводит приветствие для всех
    людей, перечисленных в кортеже names."""

    # names — кортеж с именами
    for name in names:
        print("Привет, ", name)


greet("Катя", "Андрей", "Борис", "Маша")

Вывод:

Привет, Катя
Привет, Андрей
Привет, Борис
Привет, Маша

Здесь мы вызвали функцию с несколькими аргументами. Но мы обернули их в кортеж перед передачей в функцию. Внутри функции мы используем цикл for, чтобы обработать все аргументы из кортежа names.

codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©