Domyślne argumenty w Pythonie
Python pozwala, aby argumenty funkcji miały wartości domyślne. Jeżeli funkcja zostanie wywołana bez argumentu, argument otrzyma wartość domyślną.
Domyślne argumenty:
Python ma inny sposób reprezentowania składni i wartości domyślnych argumentów funkcji. Wartości domyślne wskazują, że argument funkcji przyjmie tę wartość, jeśli podczas wywołania funkcji nie zostanie przekazana żadna wartość argumentu. Wartość domyślna jest przypisywana za pomocą operatora przypisania(=) formularza nazwa słowa kluczowego =wartość.
Rozumiemy to poprzez funkcję student . Funkcja student zawiera 3 argumenty, z których 2 mają przypisane wartości domyślne. Zatem funkcja student akceptuje jeden wymagany argument ( imię ), a pozostałe dwa argumenty są opcjonalne.
Python3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> |
Wywołując funkcje, musimy pamiętać o następujących kwestiach:
- W przypadku przekazywania argumentów słów kluczowych istotna jest kolejność argumentów.
- Dla jednego parametru powinna być tylko jedna wartość.
- Przekazana nazwa słowa kluczowego powinna odpowiadać rzeczywistej nazwie słowa kluczowego.
- W przypadku wywołania funkcji zawierającej argumenty inne niż słowa kluczowe, ważna jest kolejność.
Przykład 1: Wywoływanie funkcji bez argumentów słów kluczowych
Python3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # 1 positional argument> student(> 'John'> )> # 3 positional arguments> student(> 'John'> ,> 'Gates'> ,> 'Seventh'> )> # 2 positional arguments> student(> 'John'> ,> 'Gates'> )> student(> 'John'> ,> 'Seventh'> )> |
Wyjście:
John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard
W pierwszym wywołaniu wymagany jest tylko jeden argument, a pozostałe argumenty korzystają z wartości domyślnych. W drugim połączeniu nazwisko a wartość standardowych argumentów jest zastępowana z wartości domyślnej na nową wartość przekazującą. Widzimy, że kolejność argumentów jest istotna już przy drugim, trzecim i czwartym wywołaniu funkcji.
Przykład nr 2: Wywoływanie funkcji z argumentami kluczowymi
Python3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # 1 keyword argument> student(firstname> => 'John'> )> # 2 keyword arguments> student(firstname> => 'John'> , standard> => 'Seventh'> )> # 2 keyword arguments> student(lastname> => 'Gates'> , firstname> => 'John'> )> |
Wyjście:
John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard
W pierwszym wywołaniu wymagany jest tylko jeden argument słowa kluczowego. W drugim wywołaniu jeden jest argumentem wymaganym, a drugi opcjonalnym (standardowym), którego wartość jest zastępowana z domyślnej na nową wartość przekazującą. W trzecim wywołaniu widzimy, że kolejność w argumencie słowa kluczowego nie jest istotna.
Przykład nr 3: Niektóre nieprawidłowe wywołania funkcji
Python3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> # required argument missing> student()> # non keyword argument after a keyword argument> student(firstname> => 'John'> ,> 'Seventh'> )> # unknown keyword argument> student(subject> => 'Maths'> )> |
Powyższy kod zgłosi błąd, ponieważ:
- W pierwszym wywołaniu wartość nie jest przekazywana do parametru imię który jest wymaganym parametrem.
- W drugim wywołaniu po argumencie słowa kluczowego znajduje się argument inny niż słowo kluczowe.
- W trzecim wywołaniu przekazujący argument słowa kluczowego nie jest dopasowywany do rzeczywistych argumentów nazwy słowa kluczowego.
Używanie zmiennych obiektów jako domyślnych wartości argumentów w Pythonie
Należy to zrobić bardzo ostrożnie. Powodem jest to, że domyślne wartości argumentów są oceniane tylko raz, gdy sterowanie osiągnie funkcję
Definicja po raz pierwszy. Następnie w kolejnych wywołaniach funkcji odwołują się te same wartości (lub modyfikowalne obiekty).
Na przykładzie wszystko stanie się znacznie jaśniejsze
Python3
# mutable default argument values example using python list> # itemName is the name of the item that we want to add to list> # that is being passed, or if it is not passed then appending in> # the default list> def> appendItem(itemName, itemList> => []):> > itemList.append(itemName)> > return> itemList> print> (appendItem(> 'notebook'> ))> print> (appendItem(> 'pencil'> ))> print> (appendItem(> 'eraser'> ))> |
Wyjście
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']
Tego się spodziewałeś, jeśli założysz, że w każdym wywołaniu funkcji tworzona jest nowa lista, gdy nie przekazujemy jej listy
['zeszyt']
['ołówek']
['gumka do mazania']
Ale jak widać na rzeczywistym wyjściu programu, za każdym razem, gdy funkcja jest wywoływana, używana jest ta sama lista, przy nowym wywołaniu nie jest tworzona żadna nowa lista.
Przykład użycia słownika
Python3
# mutable default argument values example using python dictionary> # itemName is the name of item and quantity is the number of such> # items are there> def> addItemToDictionary(itemName, quantity, itemList> => {}):> > itemList[itemName]> => quantity> > return> itemList> print> (addItemToDictionary(> 'notebook'> ,> 4> ))> print> (addItemToDictionary(> 'pencil'> ,> 1> ))> print> (addItemToDictionary(> 'eraser'> ,> 1> ))> |
Wyjście
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1} Czego się spodziewałeś, jeśli założysz, że przy każdym wywołaniu funkcji tworzony jest nowy słownik
{‘notatnik’: 4}
{‘ołówek’: 1}
{‘gumka’: 1}
Ale wyraźnie widać, że rzeczywisty wynik programu jest inny i wskazuje to na użycie tego samego słownika w każdym kolejnym wywołaniu.
Najważniejszym wnioskiem jest to, że powinniśmy unikać takich scenariuszy.
Najlepsze praktyki
Przypisz wartość domyślną jako none, a następnie sprawdź funkcję, czy oczekiwanym argumentem listy lub słownika jest brak, czy nie.
Jeśli nie, przypisz go za pomocą listy lub słownika, w zależności od wymagań.
Python3
# using None as values of the default arguments> print> (> '#list'> )> def> appendItem(itemName, itemList> => None> ):> > if> itemList> => => None> :> > itemList> => []> > itemList.append(itemName)> > return> itemList> print> (appendItem(> 'notebook'> ))> print> (appendItem(> 'pencil'> ))> print> (appendItem(> 'eraser'> ))> # using None as value of default parameter> print> (> '
#dictionary'> )> def> addItemToDictionary(itemName, quantity, itemList> => None> ):> > if> itemList> => => None> :> > itemList> => {}> > itemList[itemName]> => quantity> > return> itemList> print> (addItemToDictionary(> 'notebook'> ,> 4> ))> print> (addItemToDictionary(> 'pencil'> ,> 1> ))> print> (addItemToDictionary(> 'eraser'> ,> 1> ))> |
Wyjście
#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1} Tutaj wyraźnie widać, że za każdym razem, gdy wywoływana jest funkcja, a lista lub słownik nie jest przekazywana jako argument do funkcji, wówczas tworzona jest nowa lista lub słownik.