Python. Режимы сопоставления аргументов. Классификация. Сопоставление по позиции. Сопоставление по именам. Аргументы по умолчанию. Примеры

Режимы сопоставления аргументов. Классификация. Сопоставление по позиции. Сопоставление по именам. Аргументы по умолчанию. Примеры


Содержание


Поиск на других ресурсах:




1. Режимы сопоставления аргументов в Python. Классификация

Как известно, в языке Python передача аргумента в вызывающую функцию осуществляется через операцию присваивания. При вызове функции объект, который передается, присваивается аргументу (параметру) функции, которая описывается в скобках в инструкции def

def Fn(a):
    # Использование аргумента (параметра) a в функции Fn
    ...
    return

    # Вызов функции Fn и передача ей объекта X
    X = 28
    Fn(X) # В функции Fn() неявно выполняется присваивание a = X

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

  • режим сопоставления по позиции Fn(value). При этом режиме значения, которые передаются в функцию, присваиваются именам в функции в порядке слева направо (смотрите п. 2);
  • режим сопоставления по именам Fn(name=value);
  • режим передачи аргументов по умолчанию;
  • режим передачи/получения переменного количества аргументов;
  • обобщенные способы вызова функции.

 

2. Сопоставление по позиции: Fn(value). Пример

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

Пример.

# Аргументы. Режимы сопоставления.
# Передача аргумента в функцию - сопоставление по позиции

# Функция, получающая 4 аргумента
def Fn(a, b, c, d):
    # в теле функции выводятся значения аргументов с именами
    print('Fn.a = ', a)
    print('Fn.b = ', b)
    print('Fn.c = ', c)
    print('Fn.d = ', d)
    return

# Передача объектов в функцию Fn()
Fn(1, 2, 3, 4) # Fn.a=1, Fn.b=2, Fn.c=3, Fn.d=4

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

Fn.a = 1
Fn.b = 2
Fn.c = 3
Fn.d = 4

Как видно из результата, при вызове функции Fn()

Fn(1, 2, 3, 4)

число (объект) 1 присваивается параметру a в теле функции. Соответственно числа 2, 3, 4 присваиваются параметрам b, c, d в теле функции.

 

3. Сопоставление по именам: Fn(name=value). Пример

Сопоставление по именам – это режим, в котором при вызове функции аргументы (объекты) содержат имена, которые описываются параметрами в теле функции (в инструкции def). Имя параметра в инструкции def получает значение, которое присваивается такому же имени в вызове функции.

Пример.

# Аргументы. Режимы сопоставления.
# Передача аргумента в функцию - сопоставление за именем

# Функция, получающая 4 аргумента
def Fn(a, b, c, d):
    # в теле функции выводятся значения аргументов с именами
    print('Fn.a = ', a)
    print('Fn.b = ', b)
    print('Fn.c = ', c)
    print('Fn.d = ', d)
    return

# Передача объектов в функцию Fn() - задаются конкретные имена
Fn(d=4, a=1, c=3, b=2) # Fn.a=1, Fn.b=2, Fn.c=3, Fn.d=4

Результат выполнения программы

Fn.a = 1
Fn.b = 2
Fn.c = 3
Fn.d = 4

Если при вызове функции Fn(), указать несуществующий параметр, то интерпретатор выдаст ошибку. Например, если в вызове функции фрагмент c=3 заменить на f=3

Fn(d=4, a=1, f=3, b=2)

то интерпретатор выдаст следующую ошибку

TypeError: Fn() got an unexpected keyword argument 'f'

 

4. Режим передачи аргументов по умолчанию: def Fn(name=value). Пример

В этом режиме, при объявлении функции (в инструкции def) допускается устанавливать параметрам значение по умолчанию. Это значит, что если параметр со значением по умолчанию не получит значения в вызывающем коде, то этому параметру будет установлено именно это значение по умолчанию.

Например, если объявлена функция, которая получает значение по умолчанию как показано ниже

def Fn(a=5):
    # тело функции
    # ...
    return

то эту функцию можно вызвать двумя способами

...
Fn()
Fn(value)
...

где value – некоторый объект (число, строка, список и т.д.), созданный ранее в программе.

В первом случае вызывается функция без параметров. Это значит, что в теле функции параметр a получает значение 5 (по умолчанию).
Во втором случае вызывается функция с одним параметром value. Это значит, что в теле функции параметр a получает переданное значение value.

Пример. В примере, функция получает 4 параметра. Параметры c и d получают значения по умолчанию, соответственно 10 и 100.

# Аргументы. Режимы сопоставления.
# Передача аргумента в функцию - указание значений по умолчанию

# Функция, которая получает 4 параметра.
# Параметры c, d получают значение по умолчанию, соответственно 10 и 100
def Fn(a, b, c=10, d=100):
    # в теле функции выводятся значения параметров с именами
    print('Fn.a = ', a)
    print('Fn.b = ', b)
    print('Fn.c = ', c)
    print('Fn.d = ', d)
    return

# Передача объектов в функцию Fn() - задаются значения по умолчанию
Fn(1,2,3,4) # Fn.a=1, Fn.b=2, Fn.c=3, Fn.d=4
Fn(1,2,3) # Fn.a=1, Fn.b=2, Fn.c=3, Fn.d=100
Fn(1,2) # Fn.a=1, Fn.b=2, Fn.c=10, Fn.d=100

Как видно из вышеприведенного кода, функция Fn() может вызваться с двумя, тремя и четырмя аргументами.

Результат выполнения программы

Fn.a = 1
Fn.b = 2
Fn.c = 3
Fn.d = 4
Fn.a = 1
Fn.b = 2
Fn.c = 3
Fn.d = 100
Fn.a = 1
Fn.b = 2
Fn.c = 10
Fn.d = 100

 

5. Режим передачи аргументов по умолчанию. Порядок следования аргументов по умолчанию в инструкции def

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

  • первыми определяются имена аргументов, которые не получают значения по умолчанию. И уже после этого определяются имена аргументов, которые получают значения по умолчанию.

Например. Пусть задана функция Fn(), которая получает три аргумента a, b, c. Если при описании функции, для аргументов a, b задать значения по умолчанию следующим образом

def Fn(a=1, b=2, c): # это есть ошибочный код
    # ...
    # ...
    return

то при запуске программы на выполнение, интерпретатор Python выдаст синтаксическую ошибку со следующим сообщением

non default argument follows default argument

что означает «аргумент не по умолчанию следует за аргументом по умолчанию». Итак, аргументы по умолчанию должны определяться последними в перечне аргументов функции в инструкции def.

Чтобы поправить ситуацию, можно написать следующий код объявления функции Fn()

def Fn(c, a=1, b=2): # это есть корректный код
    # тело функции Fn()
    # ...

В вышеприведенном объявлении функции Fn(), имена аргументов по умолчанию a, b следуют после аргумента не по умолчанию c.

 

6. В каком порядке интерпретатор осуществляет сопоставление аргументов в перечне аргументов функции?

Если объявляется некоторая функция (инструкция def), содержащая аргументы, то интерпретатор следует строго определенному порядку использования сопоставления аргументов. Этот порядок состоит в следующем:

  1. Сопоставление неименованных аргументов по позициям (смотрите п. 2).
  2. Сопоставление аргументов по именам (смотрите п. 3).
  3. Сопоставление дополнительных неименованных аргументов переменной длины по синтаксису кортежа *sequence. Более подробно о сопоставлении неименованных аргументов смотрите здесь.
  4. Сопоставление дополнительных именованных аргументов переменной длины с преобразованием в словарь **name. Более подробно о преобразовании аргументов переменной длины в словарь смотрите здесь.
  5. Сопоставление значений по умолчанию (см. п. 4).

 


Связанные темы