Direct naar de hoofdinhoud
Module 5 · Les 2 van 418/36 in de cursus~12 min
Modulelessen (2/4)

Standaard- en trefwoordparameters

Functieparameters kunnen standaardwaarden hebben: als de aanroeper niet slaagt worden gebruikt, worden de standaardinstellingen gebruikt. U kunt ook een functie aanroepen die parameters doorgeeft op naam (trefwoordargumenten).

Standaardparameters

Python
def saluta(nome, saluto="Ciao"):
    return f"{saluto}, {nome}!"

saluta("Ada")              # 'Ciao, Ada!'
saluta("Ada", "Hello")     # 'Hello, Ada!'

Parameters met standaardwaarden moeten na de parameters komen zonder:

Python
def f(a, b=1):     # OK
def f(a=1, b):     # SyntaxError

Trefwoordargumenten

U kunt argumenten op naam doorgeven, in willekeurige volgorde, waardoor de oproep groter wordt leesbaar:

Python
def crea_utente(nome, eta, attivo=True):
    return {"nome": nome, "eta": eta, "attivo": attivo}

crea_utente("Ada", 36)
crea_utente(nome="Ada", eta=36, attivo=False)
crea_utente(eta=36, nome="Ada")     # any order when all are keyword

Gouden regel: bij een aanroep komen positionele argumenten VOOR trefwoordargumenten.

Python
crea_utente("Ada", eta=36)            # OK
crea_utente(nome="Ada", 36)           # SyntaxError

⚠️De veranderlijke standaard valkuil

NOOIT gebruik een veranderlijk object (lijst, dictaat, set) als standaardwaarde: the standaard wordt EENMAAL geëvalueerd, wanneer de functie wordt gedefinieerd en gedeeld alle oproepen.

Python
def aggiungi(elemento, lista=[]):   # BUG!
    lista.append(elemento)
    return lista

aggiungi(1)    # [1]
aggiungi(2)    # [1, 2]    !!! not [2] as you'd expect
aggiungi(3)    # [1, 2, 3]

Het juiste patroon: gebruik None als schildwacht en creëer deze binnen:

Python
def aggiungi(elemento, lista=None):
    if lista is None:
        lista = []
    lista.append(elemento)
    return lista

Het gevaar van veranderlijke standaardargumenten

Gebruik nooit veranderlijke objecten (zoals lijsten of woordenboeken) als standaardwaarden voor parameters: bijvoorbeeld def add(x, my_list=[]). De standaardwaarde wordt slechts één keer geëvalueerd wanneer de functie wordt gedefinieerd, wat betekent dat volgende oproepen exact hetzelfde veranderbare object zullen delen! De beste praktijk is om None te gebruiken:

Python
def add(x, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(x)
    return my_list

Probeer het

Oefening#python.m5.l2.e1
Pogingen: 0Laden…

Definieer `macht(basis, exponent=2)` die grondtal ** exponent retourneert. Bereken `kwadraat = macht(5)` en `kubus = macht(5, exponent=3)`. Evalueer `(vierkant, kubus)`.

Editor laden…
Toon hint

retourbasis ** exponent

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#python.m5.l2.e2
Pogingen: 0Laden…

Definieer `create_record(name, value=None)` dat, wanneer de waarde Geen is, een nieuwe, lege lijst gebruikt. Voeg 1 toe aan waarden en retourneer het recorddictaat {'naam': naam, 'waarden': waarden}. Roep het twee keer aan zonder waarden door te geven en wijs het toe aan `a` en `b`. Evalueer `(a['waarden'], b['waarden'])`.

Editor laden…
Toon hint

Gebruik Geen als standaard en maak de lijst binnen de functie.

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#python.m5.l2.e3
Pogingen: 0Laden…

Definieer een functie \`greet(name, message="Hallo")\` die de opgemaakte tekenreeks \`"{bericht}, {naam}!"\` retourneert. Test de functie door \`greet("Bob")\` als laatste expressie aan te roepen.

Editor laden…
Toon hint

Gebruik een standaardparameter message="Hallo" en een f-string voor de geretourneerde begroeting.

Oplossing beschikbaar na 3 pogingen