Standaardargumenten in Python
Python staat toe dat functieargumenten standaardwaarden hebben. Als de functie zonder het argument wordt aangeroepen, krijgt het argument de standaardwaarde.
Standaardargumenten:
Python heeft een andere manier om syntaxis en standaardwaarden voor functieargumenten weer te geven. Standaardwaarden geven aan dat het functieargument die waarde zal aannemen als er geen argumentwaarde wordt doorgegeven tijdens de functieaanroep. De standaardwaarde wordt toegewezen met behulp van de opdrachttoewijzing(=) operator van het formulier trefwoordnaam =waarde.
Laten we dit begrijpen via een functie student . De functie student bevat 3 argumenten, waarvan er 2 zijn toegewezen met standaardwaarden. De functie dus student accepteert één vereist argument ( Voornaam ), en rest twee argumenten zijn optioneel.
Python3
def> student(firstname, lastname> => 'Mark'> , standard> => 'Fifth'> ):> > print> (firstname, lastname,> 'studies in'> , standard,> 'Standard'> )> |
We moeten de volgende punten in gedachten houden bij het aanroepen van functies:
- Bij het doorgeven van trefwoordargumenten is de volgorde van de argumenten belangrijk.
- Er mag slechts één waarde voor één parameter zijn.
- De doorgegeven zoekwoordnaam moet overeenkomen met de daadwerkelijke zoekwoordnaam.
- Als u een functie aanroept die niet-trefwoordargumenten bevat, is de volgorde belangrijk.
Voorbeeld 1: Functies aanroepen zonder trefwoordargumenten
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'> )> |
Uitgang:
John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard
Bij de eerste aanroep is er slechts één vereist argument en gebruiken de overige argumenten de standaardwaarden. Bij de tweede oproep achternaam en de waarde van standaardargumenten wordt vervangen van de standaardwaarde naar een nieuwe passerende waarde. We kunnen zien dat de volgorde van de argumenten belangrijk is vanaf de 2e, 3e en 4e aanroep van de functie.
Voorbeeld #2: Functies aanroepen met trefwoordargumenten
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'> )> |
Uitgang:
John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard
Bij de eerste aanroep is er slechts één vereist trefwoordargument. In de tweede aanroep is één een vereist argument en één optioneel (standaard), waarvan de waarde wordt vervangen van de standaardwaarde naar een nieuwe passerende waarde. In de derde oproep kunnen we zien dat de volgorde van het trefwoordargument niet belangrijk is.
Voorbeeld #3: Sommige ongeldige functieaanroepen
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'> )> |
De bovenstaande code geeft een foutmelding omdat:
- Bij de eerste aanroep wordt de waarde voor parameter niet doorgegeven Voornaam wat de vereiste parameter is.
- In de tweede aanroep staat er een niet-trefwoordargument na een trefwoordargument.
- Bij de derde aanroep wordt het passerende trefwoordargument niet gekoppeld aan de daadwerkelijke trefwoordnaamargumenten.
Veranderbare objecten gebruiken als standaardargumentwaarden in Python
Dit moet zeer zorgvuldig gebeuren. De reden hiervoor is dat de standaardwaarden van de argumenten slechts één keer worden geëvalueerd wanneer het besturingselement de functie bereikt
Definitie voor de eerste keer. Daarna wordt in de daaropvolgende functieaanroepen naar dezelfde waarden (of veranderlijke objecten) verwezen.
Met het voorbeeld zal het veel duidelijker worden
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'> ))> |
Uitvoer
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser']
Wat je had verwacht als je aanneemt dat er bij elke functieaanroep een nieuwe lijst wordt gemaakt als we er geen lijst aan doorgeven
['notitieboekje']
['potlood']
['gom']
Maar zoals u kunt zien in de daadwerkelijke uitvoer van het programma, wordt elke keer dat de functie wordt aangeroepen, dezelfde lijst gebruikt; er wordt geen nieuwe lijst gemaakt bij een nieuwe aanroep.
Voorbeeld met behulp van woordenboek
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> ))> |
Uitvoer
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1} Wat je had verwacht als je ervan uitging dat bij elke functieaanroep een nieuw woordenboek werd aangemaakt
{‘notitieboekje’: 4}
{‘potlood’: 1}
{‘gum’: 1}
Maar je kunt duidelijk zien dat de daadwerkelijke uitvoer van het programma anders is en dat dit aangeeft dat bij elke volgende oproep hetzelfde woordenboek wordt gebruikt.
De belangrijkste conclusie hier is dat we dergelijke scenario's moeten vermijden.
Beste praktijken
Wijs de standaardwaarde toe als geen en controleer vervolgens in de functie of het verwachte lijst- of woordenboekargument geen is of niet.
Als dit er niet is, wijs er dan een lijst of woordenboek aan toe, afhankelijk van uw behoefte.
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> ))> |
Uitvoer
#list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1} Hier kun je duidelijk zien dat elke keer dat een functie wordt aangeroepen en een lijst of woordenboek niet als argument aan de functie wordt doorgegeven, er een nieuwe lijst of woordenboek wordt aangemaakt.