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


81

Виходячи з цього

Позиційний аргумент - це ім'я, за яким не стоїть знак рівності (=) та значення за замовчуванням.

За аргументом ключового слова слідують знак рівності та вираз, що вказує значення за замовчуванням.

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

print rectangleArea(width=1, height=2)

Питання > Я припускаю, що і те, widthі інше heightє позиційними аргументами. Тоді чому ми можемо також називати його синтаксисом аргументу ключового слова?


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.

Значення =змін залежно від того, чи є це у визначенні чи у дзвінку.

У визначенні він позначає аргумент необов’язковим і встановлює значення за замовчуванням.

У виклику це просто дозволяє вказати, які аргументи повинні бути якими значеннями, в будь-якому порядку, який ви хочете.


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, /)у ваших останніх двох прикладах?
Ягербер48,

21

Аргумент ключового слова - це просто позиційний аргумент зі значенням за замовчуванням. Ви повинні вказати всі аргументи, які не мають значення за замовчуванням. Іншими словами, аргументи ключових слів є лише "необов’язковими", оскільки для них буде встановлено значення за замовчуванням, якщо вони не вказані спеціально.


Гаразд, це має сенс, але чи можете ви докладніше пояснити, чому це називається аргументом "ключове слово"? Я знаю, що "позиційний" аргумент означає, що їх позиція має значення, коли ви викликаєте функцію.
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=) у виклику функції або передається як значення у словнику, перед яким **. Ці два визначення суперечать вашому прикладу.
Рафаель

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 відповідно). Це означає, що ви можете мати довільну послідовність позиційних аргументів або аргументів ключових слів, переданих функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.