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
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:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorTrefwoordargumenten
U kunt argumenten op naam doorgeven, in willekeurige volgorde, waardoor de oproep groter wordt leesbaar:
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 keywordGouden regel: bij een aanroep komen positionele argumenten VOOR trefwoordargumenten.
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.
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:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaHet 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:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listProbeer het
Definieer `macht(basis, exponent=2)` die grondtal ** exponent retourneert. Bereken `kwadraat = macht(5)` en `kubus = macht(5, exponent=3)`. Evalueer `(vierkant, kubus)`.
Toon hint
retourbasis ** exponent
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
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'])`.
Toon hint
Gebruik Geen als standaard en maak de lijst binnen de functie.
Oplossing beschikbaar na 3 pogingen
Extra uitdaging
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.
Toon hint
Gebruik een standaardparameter message="Hallo" en een f-string voor de geretourneerde begroeting.
Oplossing beschikbaar na 3 pogingen