Lecții din modul (2/4)
Parametrii impliciti și pentru cuvinte cheie
Parametrii funcției pot avea valori implicite: dacă apelantul nu trece ele, sunt utilizate valorile implicite. De asemenea, puteți apela o funcție care trece parametri după nume (argumente ale cuvintelor cheie).
Parametrii impliciti
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'Parametrii cu valori implicite trebuie să vină după cei fără:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorArgumente ale cuvintelor cheie
Puteți transmite argumente după nume, în orice ordine, făcând apelul mai mult lizibil:
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 keywordRegula de aur: într-un apel, argumentele poziționale apar ÎNAINTE de argumentele cuvintelor cheie.
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ Capcana implicită mutabilă
NICIODATĂ utilizați un obiect mutabil (listă, dict, set) ca valoare implicită: the implicit este evaluat O dată, când funcția este definită și partajată toate apelurile.
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]Modelul corect: folosește None ca santinelă și creează-l în interior:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaPericolul argumentelor implicite mutabile
Nu utilizați niciodată obiecte modificabile (cum ar fi liste sau dicționare) ca valori implicite pentru parametri: de exemplu def add(x, my_list=[]). Valoarea implicită este evaluată o singură dată când funcția este definită, ceea ce înseamnă că apelurile ulterioare vor împărtăși exact același obiect mutabil! Cea mai bună practică este să utilizați None:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listÎncearcă
Definiți `putere(bază, exponent=2)` care returnează baza ** exponent. Calculați `pătrat = putere(5)` și `cub = putere(5, exponent=3)`. Evaluați `(pătrat, cub)`.
Afișează indiciu
întoarcere bază ** exponent
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
Definiți `create_record(name, values=None)` care, când valorile este None, utilizează o nouă listă goală. Adăugați 1 la valori și returnați dictul de înregistrare {'nume': nume, 'valori': valori}. Apelați-l de două ori fără a trece valori și atribuiți-le lui `a` și `b`. Evaluați `(a['valori'], b['valori'])`.
Afișează indiciu
Folosiți Nici unul ca implicit și creați lista în interiorul funcției.
Soluție disponibilă după 3 încercări
Provocare suplimentară
Definiți o funcție \`greet(name, message="Hello")\` care returnează șirul formatat \`"{mesaj}, {name}!"\`. Testați funcția apelând \`greet("Bob")\` ca ultima expresie.
Afișează indiciu
Utilizați un parametru implicit message="Hello" și un șir f pentru salutul returnat.
Soluție disponibilă după 3 încercări