Return Values
În lecția despre funcții, toate funcțiile noastre făceau același lucru: afișau ceva pe ecran. Dar funcțiile pot face ceva mult mai puternic, ne pot da înapoi o valoare pe care o putem folosi mai târziu
Imaginează-ți: îl întreb pe un prieten „cât face 2 + 3?". Vreau să-mi răspundă cu 5, nu să strige răspunsul la perete. Vreau să iau acel 5 și să-l folosesc pentru altceva
Asta face return într-o funcție
def adauga(a, b):
return a + b
rezultat = adauga(2, 3)
print(rezultat)
Output 5
Ce s-a întâmplat? Funcția add a luat două numere, a calculat suma lor și a returnat rezultatul. Am prins acel rezultat în variabila rezultat, apoi l-am afișat
Compară asta cu stilul vechi pe care îl foloseam
def adauga_si_afiseaza(a, b):
print(a + b)
adauga_si_afiseaza(2, 3)
Asta doar afișează. Nu dă nimic înapoi. Dacă aș vrea să iau rezultatul și să-l înmulțesc cu 10, n-aș putea. Funcția și-a făcut treaba și valoarea s-a dus
Cu return, putem înlănțui funcții împreună
def adauga(a, b):
return a + b
rezultat = adauga(2, 3) * 10
print(rezultat)
Output 50. add(2, 3) ne-a dat 5, apoi am înmulțit cu 10. Încearcă să faci asta cu o funcție care doar afișează, nu poți
Adevăratul rost al unei funcții e că scrii logica o singură dată și apoi o folosești de câte ori vrei, cu argumente diferite. Nu mai repeți codul din corp
Imaginează-ți că avem trei senzori care ne dau temperatura în Celsius, dar noi o vrem în Fahrenheit. Fără funcție, am repeta aceeași formulă de fiecare dată
senzor1 = 20 * 9 / 5 + 32
senzor2 = 37 * 9 / 5 + 32
senzor3 = 100 * 9 / 5 + 32
print(senzor1)
print(senzor2)
print(senzor3)
Aceeași formulă, scrisă de trei ori. Dacă greșim ceva la ea, trebuie s-o corectăm în toate locurile. Și dacă am avea o sută de senzori?
Cu o funcție, scriem formula o singură dată în corpul ei și apoi o apelăm cu argumente diferite
def in_fahrenheit(c):
return c * 9 / 5 + 32
print(in_fahrenheit(20))
print(in_fahrenheit(37))
print(in_fahrenheit(100))
Ieșire
68.0
98.6
212.0
Corpul funcției, formula, e scris o singură dată. Îl refolosim de trei ori, schimbând doar argumentul. Asta e, până la urmă, ce ne dă o funcție: scrii codul o dată și nu-l mai repeți
O funcție poate returna orice, nu doar numere. Șiruri de caractere, booleeni, liste, orice
def saluta(nume):
return f"Salut, {nume}!"
mesaj = saluta("Cortez")
print(mesaj)
Output Salut, Cortez!
def este_adult(varsta):
return varsta >= 18
print(este_adult(20)) # True
print(este_adult(15)) # False
Această funcție returnează un boolean. Observă că putem folosi is_adult(20) direct în interiorul print(), fără să fie nevoie de o variabilă separată. Python rulează mai întâi funcția, apoi print() afișează valoarea returnată
Putem chiar să o folosim în interiorul unui if
def este_adult(varsta):
return varsta >= 18
varsta = 25
if este_adult(varsta):
print("Bun venit")
else:
print("Imi pare rau, prea tanar")
Mai curat decât să scrii if varsta >= 18 peste tot, mai ales dacă condiția noastră se complică
Important: imediat ce Python vede return, funcția iese imediat. Orice e scris după return NU se execută
def f():
return 1
print("nu se afiseaza niciodata") # asta nu ruleaza niciodata
print(f())
Output este doar 1. print-ul din interiorul funcției este cod mort, nu rulează niciodată
Putem folosi asta ca să ieșim devreme dintr-o funcție
def imparte(a, b):
if b == 0:
return "nu se poate imparti la zero"
return a / b
print(imparte(10, 2)) # 5.0
print(imparte(10, 0)) # nu se poate imparti la zero
Apropo, o funcție care nu are return tot funcționează, doar că dă înapoi o valoare specială numită None
def f():
print("salut")
rezultat = f()
print(rezultat)
Ieșire
salut
None
None este modul lui Python de a spune „nimic". Nu trebuie să-ți faci griji pentru asta acum, doar să știi că există :)
Misiune: Atlasul Galaxiilor
În editor ai deja cinci galaxii, variabilele de la galaxie1 la galaxie5, fiecare o listă cu zece nume de stele.
Scrie o singură funcție numită cea_mai_lunga_stea care primește o galaxie (lista) și returnează numele stelei cu cele mai multe litere din acea galaxie.
Apoi apeleaz-o de cinci ori, o dată pentru fiecare galaxie, și afișează ce returnează. Scrii funcția o dată, dar o folosești pentru toate cele cinci liste, fără să repeți codul din corp.
Ieșire
Cinci linii, câte un nume pe linie: cea mai lungă stea din fiecare galaxie, în ordine.
Exemplu
Dacă o galaxie ar fi ["rigel", "vega", "betelgeuse", "spica"], funcția ar returna betelgeuse.
Pentru galaxiile din editor, programul ar trebui să afișeze
betelgeuse
bellatrix
fomalhaut
rasalhague
vindemiatrix