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

  • Параметры - это имена, перечисленные в определении функции. Например: в приведенном выше фрагменте кода num1 и num2 являются параметрами.
  • Аргументы - это значения, которые мы передаем при вызове функции. Например: в приведенном выше фрагменте кода в обоих вызовах функции 10 и 12 передаются аргументы функции.
  • Позиционный аргумент - когда мы передаем аргументы функции без явного присвоения их параметрам. Например: в приведенном выше фрагменте кода мы используем позиционные аргументы при первом вызове func.
  • Аргумент ключевого слова - когда мы передаем аргументы функции, явно назначая их параметрам. Например: в приведенном выше фрагменте кода мы используем аргументы ключевого слова во втором вызове func.
  • Значения по умолчанию - значение, присвоенное параметру во время определения функции. Например: в приведенном выше фрагменте кода 20 является значением по умолчанию, присвоенным параметру num2.

Порядок параметров по умолчанию

ПРАВИЛО: Если при определении функции у вас есть параметр со значением по умолчанию, все параметры, следующие за ним, ДОЛЖНЫ также иметь значения по умолчанию.

Неверно

В приведенном выше определении функции для func пара параметров (num3, num4) без значения по умолчанию следует за параметром (num2) с значение по умолчанию. Это приводит к синтаксической ошибке.

Правильный

Это не приведет к ошибке, поскольку мы указали значения по умолчанию для переменных num3 и num4.

Порядок аргумента ключевого слова

ПРАВИЛО: при вызове функции аргумент ключевого слова должен следовать за аргументом ключевого слова. Следовательно, никакие позиционные аргументы не могут следовать за аргументом ключевого слова.

Неверно

12 передается как аргумент ключевого слова. Однако следующие за ним аргументы (20 и 30) передаются как позиционные аргументы. Это приводит к синтаксической ошибке.

Правильный

На этот раз мы передаем аргументы (20 и 30) как аргументы ключевого слова. Следовательно, ошибки не возникает.

Значение параметров по умолчанию

НЕПРАВИЛЬНОЕ ПОНЯТИЕ: значения по умолчанию присваиваются параметрам во время каждого вызова функции.

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

Это станет более понятным, если вы последуете примеру ниже.

Функция имеет два параметра: num и arr. arr имеет значение по умолчанию - пустой список. Функция не делает ничего особенного. Он просто вставляет параметр num в массив arr, а затем печатает массив.

Ожидание

'''
OUTPUT
[10]
[20]
[30]
'''

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

Но это НЕ правильный результат

Действительный

'''
OUTPUT
[10]
[10, 20]
[10, 20, 30]
'''

А, странно, правда? 🤯

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

Решение

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

Вывод

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

Свяжитесь со мной в LinkedIn, Twitter

Первоначально опубликовано на https://www.realpythonproject.com 2 мая 2021 г.