Salt la conținutul principal
Modulul 5 · Lecția 2 din 418/36 în curs~12 min
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

Python
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ă:

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

Argumente ale cuvintelor cheie

Puteți transmite argumente după nume, în orice ordine, făcând apelul mai mult lizibil:

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

Regula de aur: într-un apel, argumentele poziționale apar ÎNAINTE de argumentele cuvintelor cheie.

Python
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.

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]

Modelul corect: folosește None ca santinelă și creează-l în interior:

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

Pericolul 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:

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

Încearcă

Exercițiu#python.m5.l2.e1
Încercări: 0Se încarcă…

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)`.

Se încarcă editorul...
Afișează indiciu

întoarcere bază ** exponent

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#python.m5.l2.e2
Încercări: 0Se încarcă…

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'])`.

Se încarcă editorul...
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ă

Exercițiu#python.m5.l2.e3
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
Afișează indiciu

Utilizați un parametru implicit message="Hello" și un șir f pentru salutul returnat.

Soluție disponibilă după 3 încercări