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

81

На основании этого

Позиционный аргумент - это имя, за которым не следует знак равенства (=) и значение по умолчанию.

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

def rectangleArea(width, height):
    return width * height

print rectangleArea(width=1, height=2)

Вопрос > Я предполагаю, что оба аргумента widthи heightявляются позиционными. Тогда почему мы можем также вызвать его с помощью синтаксиса аргумента ключевого слова?

q0987
источник
1
"почему мы также можем вызвать это с помощью синтаксиса реального аргумента ключевого слова?" Потому что так работает язык.
S.Lott

Ответы:

152

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

Ссылка Python относится к позиционным аргументам и аргументам ключевого слова только в отношении вызова функции (см. Раздел5.3.4 Calls ).

Когда они говорят об определении функции в разделе7.6 Function definitions , это совершенно другой термин «значения параметров по умолчанию».

Я подозреваю, что люди, которые составляли этот курс, не были полностью знакомы с Python :-)


В качестве примера обратитесь к следующему определению и вызовам:

def fn (a, b, c = 1):          # a/b required, c optional.
    return a * b + c

print fn (1, 2)                # returns 3, positional and default.
print fn (1, 2, 3)             # returns 5, positional.
print fn (c = 5, b = 2, a = 2) # returns 9, named.
print fn (b = 2, a = 2)        # returns 5, named and default.
print fn (5, c = 2, b = 1)     # returns 7, positional and named.
print fn (8, b = 0)            # returns 1, positional, named and default.

Смысл =меняется в зависимости от того, в определении или в звонке.

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

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

Paxdiablo
источник
36

Поскольку в python 3.8 представлены только позиционные аргументы, этот пост нуждается в обновлении.

Позиционные аргументы, аргументы ключевого слова, обязательные аргументы и необязательные аргументы часто путают. Позиционные аргументы НЕ ТО ЖЕ, КАК обязательные аргументы. аргументы и ключевые слова НЕ ТО ЖЕ, КАК необязательные аргументы.

Позиционные аргументы - это аргументы, которые можно вызывать по их положению в определении функции.

Аргументы ключевого слова - это аргументы, которые можно вызвать по имени.

Обязательные аргументы - это аргументы, которые необходимо передать функции.

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

Позиционный аргумент, который является необязательным (python 3.8)

def f(a=2, /):
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

Требуемый позиционный аргумент (Python 3.8)

def f(a, /):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

Необязательный аргумент ключевого слова

def f(*, a=1):
    pass


f()  # Allowed
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

аргумент ключевого слова, который требуется

def f(*, a)
    pass


f()  # Error, argument required
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

Позиционный и ключевой аргумент, необязательный

def f(a=1)
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a=1, /):
    pass

Позиционный и ключевой аргумент, который требуется

def f(a):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a, /):
    pass

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

Python 3.8 представил только позиционные параметры .

def f(positional_argument, /, positional_or_keyword_argument, *, keyword_argument):
    pass
Назиме Лейкхал
источник
Вы имели в виду f(/,a,*)вместо f(*, a, /)в двух последних примерах?
Jagerber48
21

Аргумент ключевого слова - это просто позиционный аргумент со значением по умолчанию. Вы должны указать все аргументы, которые не имеют значения по умолчанию. Другими словами, аргументы ключевого слова являются только «необязательными», потому что для них будут установлены значения по умолчанию, если они не указаны специально.

Chroipahtz
источник
Хорошо, это имеет смысл, но не могли бы вы подробнее объяснить, почему он называется аргументом «ключевое слово»? Я знаю, что «позиционный» аргумент означает, что их позиция имеет значение, когда вы вызываете функцию.
NoName
3

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

def rectangleArea(width, height):
    return width * height

print(rectangleArea(1, 2))
print(rectangleArea(width=1, height=2))
print(rectangleArea(height=2, width=1))
Дэвид Робинсон
источник
Я не думаю, что это правильно. Согласно официальному глоссарию Python здесь , позиционный аргумент - это аргумент, который не является аргументом ключевого слова. Определение аргумента ключевого слова - это аргумент, которому предшествует идентификатор (например name=) в вызове функции или передается как значение в словаре, которому предшествует **. Эти два определения противоречат вашему примеру.
Rafael
1

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

#positional arguments example
def combine(str1, str2):
#To join str1 and str2 with str3
    str3 = str1 + str2
    print(str3)

#call combine() and pass 2 strings
combine("Well", "come")   #positional arguments 

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

Картик Шивараман
источник
0

Поймите аргументы ключевого слова функции.

Аргументы ключевого слова - это аргументы, которые идентифицируют параметры по их именам.

#keyword arguments example: 
def employee(name, Id):
    print("Employee Name: ", name)
    print("Employee Id  : ", Id)
#call employee() and pass 2 arguments
employee(name = "inban", Id = "pay001")
employee(Id = "pay002", name = "karthik") #we can change the order args.
Картик Шивараман
источник
0

Здесь может помочь определение параметров и аргументов.

  1. Параметр: именованная сущность в определении функции / метода, указывающая аргумент.
  2. Аргумент: значение, переданное функции.

Например,

def my_function(parameter_1, parameter_2):
    pass

my_function(argument_1, argument_2)

Теперь, когда вы говорите «позиционный аргумент», вы говорите об аргументах , поэтому не имеет ничего общего с определением функции. widthа heightв вашем примере - это позиционные параметры или параметры ключевого слова (так называемые параметры позиционного или ключевого слова).

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

rectangleArea(1, 2) # positional arguments
rectangleArea(width=1, height=2) # keyword arguments

Мало кто знает, что вы можете указать только позиционный параметр, используя /в списке параметров (пример отсюда ).

def func(positional_only1, positional_only2, /, positional_or_keyword): ...

Точно так же вы также можете иметь параметры, содержащие только ключевые слова, используя *символ.

def func(positional_or_keyword, *, keyword_only1, keyword_only2): ...

Наконец, у нас также есть var-positional и var-keyword (также известные как * args и ** kwargs соответственно). Это означает, что вы можете иметь произвольную последовательность позиционных аргументов или аргументов ключевого слова, передаваемую функции.

Рафаэль
источник