Argument pozycyjny a argument ze słowem kluczowym

81

Na tej podstawie

Argument pozycyjny to nazwa, po której nie następuje znak równości (=) i wartość domyślna.

Po argumencie słowa kluczowego następuje znak równości i wyrażenie, które podaje jego wartość domyślną.

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

print rectangleArea(width=1, height=2)

Pytanie > Zakładam, że oba argumenty widthi heightsą argumentami pozycyjnymi. W takim razie dlaczego możemy go również wywołać za pomocą składni argumentu słowa kluczowego?

q0987
źródło
1
"dlaczego możemy to również nazywać słowami kluczowymi składni prawdziwego argumentu?" Ponieważ tak właśnie działa język.
S.Lott

Odpowiedzi:

152

Cytowany tekst służy do definicji funkcji i nie ma nic wspólnego z wywołaniami funkcji. W wywołaniu tej funkcji używasz funkcji „nazwany argument”. Ten link, który podasz, nie jest zbyt dobrej jakości, autorzy wydają się być zdezorientowani między dwoma różnymi rzeczami.

Dokumentacja Pythona odnosi się do argumentów pozycyjnych i słów kluczowych tylko w odniesieniu do wywołania funkcji (zobacz sekcję5.3.4 Calls ).

Kiedy mówią o definicji funkcji w sekcji7.6 Function definitions , jest to zupełnie inny termin „domyślne wartości parametrów”.

Podejrzewam, że osoby, które razem wzięte, że kurs-ware nie były całkowicie zaznajomiony z Pythona :-)


Jako przykład odwołaj się do następującej definicji i wywołań:

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.

Znaczenie =zmian w zależności od tego, czy jest to definicja, czy zaproszenie.

W definicji oznacza argument jako opcjonalny i ustawia wartość domyślną.

W wywołaniu po prostu pozwala ci określić, które argumenty powinny być wartościami, w dowolnej kolejności.

paxdiablo
źródło
36

Ponieważ python 3.8 wprowadził tylko argumenty pozycyjne, ten post wymaga aktualizacji.

Argumenty pozycyjne, argumenty słów kluczowych, argumenty wymagane i argumenty opcjonalne są często mylone. Argumenty pozycyjne NIE SĄ TAKIE SAME JAK argumenty wymagane. i słowa kluczowe argumenty NIE SĄ TAKIE SAME JAK argumenty opcjonalne.

Argumenty pozycyjne to argumenty, które można wywołać na podstawie ich pozycji w definicji funkcji.

Argumenty słów kluczowych to argumenty, które można wywołać za pomocą nazwy.

Argumenty wymagane to argumenty, które należy przekazać do funkcji.

Argumenty opcjonalne to argumenty, których nie można przekazać do funkcji. W Pythonie opcjonalne argumenty to argumenty, które mają wartość domyślną .

Argument pozycyjny, który jest opcjonalny (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

Wymagany argument pozycyjny (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

Argument słowa kluczowego, który jest opcjonalny

def f(*, a=1):
    pass


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

argument słowa kluczowego, który jest wymagany

def f(*, a)
    pass


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

Argument pozycyjny i słowo kluczowe, który jest opcjonalny

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

Wymagany argument pozycyjny i słowo kluczowe

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

Podsumowując, argument może być opcjonalny lub wymagany, a nie oba jednocześnie . Może być również pozycyjny, kluczowy lub oba jednocześnie .

Python 3.8 wprowadził parametry tylko pozycyjne .

def f(positional_argument, /, positional_or_keyword_argument, *, keyword_argument):
    pass
Nazime Lakehal
źródło
Czy miałeś na myśli f(/,a,*)zamiast f(*, a, /)w ostatnich dwóch przykładach?
Jagerber48,
21

Argument słowa kluczowego to po prostu argument pozycyjny z wartością domyślną. Musisz określić wszystkie argumenty, które nie mają wartości domyślnej. Innymi słowy, argumenty słów kluczowych są tylko „opcjonalne”, ponieważ zostaną ustawione na wartość domyślną, jeśli nie zostaną konkretnie podane.

chroipahtz
źródło
OK, to ma sens, ale czy możesz wyjaśnić, dlaczego nazywa się to argumentem „słowa kluczowego”? Wiem, że argument „pozycyjny” oznacza, że ​​ich pozycja ma znaczenie, kiedy wywołujesz funkcję.
NoName
3

Argumenty pozycyjne można wywołać, używając wartości w kolejności lub nadając im nazwy. Na przykład wszystkie trzy z poniższych działań będą działać w ten sam sposób:

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

print(rectangleArea(1, 2))
print(rectangleArea(width=1, height=2))
print(rectangleArea(height=2, width=1))
David Robinson
źródło
Myślę, że to nie jest poprawne. Według oficjalnego słownika Pythona tutaj , pozycyjny argumentem jest argument, że nie jest argumentem kluczowym. Definicja argumentu słowa kluczowego to argument poprzedzony identyfikatorem (np. name=) W wywołaniu funkcji lub przekazany jako wartość w słowniku poprzedzona znakiem **. Te dwie definicje są sprzeczne z twoim przykładem.
Rafael
1

argumenty pozycyjne: argumenty przekazane do funkcji w prawidłowej kolejności pozycyjnej. poniżej program rozumie pozycyjne argumenty funkcji

#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 

przypuśćmy, że minęło „przyjdź” jako pierwsze, „dobrze” drugie, a potem wynik będzie dobrze. również wywołanie funkcji, ciągi 3 stają się błędem.

Karthik Sivaraman
źródło
0

Zrozumienie argumentów słów kluczowych funkcji.

Argumenty słów kluczowych to argumenty, które identyfikują parametry na podstawie ich nazw.

#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.
Karthik Sivaraman
źródło
0

Pomocne może być tutaj zdefiniowanie parametrów i argumentów.

  1. Parametr: nazwana jednostka w definicji funkcji / metody, która określa argument.
  2. Argument: wartość przekazywana do funkcji.

Na przykład,

def my_function(parameter_1, parameter_2):
    pass

my_function(argument_1, argument_2)

Teraz, kiedy mówisz argument pozycyjny, mówisz o argumentach , więc nie ma to nic wspólnego z definicją funkcji. widthaw heighttwoim przykładzie są to parametry pozycyjne lub parametry słów kluczowych (tzw. parametry pozycyjne lub słowa kluczowe).

Sposób wywoływania / przekazywania wartości do funkcji określa, czy są to argumenty pozycyjne, czy argumenty słów kluczowych .

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

Niewiele osób wie, że można określić parametr tylko pozycyjny, używając /w liście parametrów (przykład tutaj ).

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

Podobnie, możesz mieć parametry zawierające tylko słowa kluczowe, używając *znaku.

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

Wreszcie mamy również var-pozycyjne i var-słowo kluczowe (aka odpowiednio * args i ** kwargs). Oznacza to, że do funkcji można przekazać dowolną sekwencję argumentów pozycyjnych lub argumentów słów kluczowych.

Rafael
źródło