Funcția ca tip, parametru și rezultat al altei funcții
Funcția ca tip
În Python, funcția reprezintă de fapt un tip distinct. Astfel, putem atribui unei variabile o funcție și apoi, folosind variabila, să apelăm funcția respectivă. De exemplu:
def spune_salut(): print("Salut")
def spune_la_revedere(): print("La revedere")
mesaj = spune_salut
mesaj() # Salut
mesaj = spune_la_revedere
mesaj() # La revedere
În acest caz, variabilei mesaj i se atribuie una dintre funcții. Mai întâi, i se atribuie funcția spune_salut():
mesaj = spune_salut
După aceasta, variabila mesaj va indica spre funcția respectivă, adică va reprezenta de fapt funcția spune_salut. Asta înseamnă că putem apela variabila mesaj ca pe o funcție obișnuită:
mesaj() # Salut
Acest lucru va duce la executarea funcției spune_salut, iar în consolă va fi afișat șirul "Salut". Apoi, într-un mod similar, putem atribui variabilei mesaj o altă funcție și să o apelăm.
În mod similar, putem apela o funcție cu parametri și să returnăm rezultatul acesteia:
def suma(a, b): return a + b
def inmulteste(a, b): return a * b
operație = sumă
rezultat = operatie(5, 6)
print(rezultat) # 11
operație = inmulteste
print(operatie(5, 6)) # 30
Funcția ca parametru al unei funcții
Deoarece o funcție în Python poate reprezenta o valoare la fel ca un șir de caractere sau un număr, o putem transmite ca parametru unei alte funcții. De exemplu, să definim o funcție care afișează în consolă rezultatul unei operații:
def executa_operatie(a, b, operatie):
rezultat = operație(a, b)
print(f"rezultat = {rezultat}")
def suma(a, b): return a + b
def inmulteste(a, b): return a * b
executa_operetie(5, 4, suma) # rezultat = 9
executa_operatie(5, 4, inmulteste) # rezultat = 20
În acest caz, funcția execută_operație are trei parametri, dintre care al treilea parametru, conform presupunerii, va reprezenta o funcție care acceptă doi parametri și returnează un rezultat. Cu alte cuvinte, al treilea parametru - operație reprezintă o operație, dar la momentul definirii funcției execută_operație nu știm exact ce va fi această operație. Știm doar că primește doi parametri și returnează un rezultat, care apoi este afișat în consolă.
La apelarea funcției execută_operație, putem transmite ca al treilea parametru o altă funcție, de exemplu, funcția sumă:
executa_operatie(5, 4, suma)
Astfel, în acest caz, parametrul operație va reprezenta funcția sumă și va returna suma a două numere.
Apoi, în mod similar, la apelul funcției execută_operație, putem transmite al treilea parametru o altă funcție - înmulțește, care va efectua înmulțirea numerelor:
executa_operatie(5, 4, inmulteste) # rezultat = 20
Astfel, obținem funcții mai flexibile care acceptă alte funcții prin intermediul parametrilor.
Funcția ca rezultat al altei funcții
De asemenea, o funcție în Python poate returna o altă funcție. De exemplu, să definim o funcție care, în funcție de valoarea unui parametru, returnează una dintre mai multe operații:
def suma(a, b): return a + b
def scade(a, b): return a - b
def inmulteste(a, b): return a * b
def selecteaza_operatie(alegere):
daca alegere == 1:
return suma
elif alegere == 2:
return scade
else:
return inmulteste
operatie = selecteaza_operatie(1) # operatie = suma
print(operatie(10, 6)) # 16
operatie = selecteaza_operatie(2) # operatie = scade
print(operatie(10, 6)) # 4
operatie = selecteaza_operatie(3) # operatie = inmulteste
print(operatie(10, 6)) # 60
În acest caz, funcția selecteaza_operatie, în funcție de valoarea parametrului alegere, returnează una dintre cele trei funcții - sumă, scade și înmulțește. Apoi, putem obține rezultatul funcției selecteaza_operatie în variabila operație:
operație = selecteaza_operatie(1)
Astfel, în acest caz, funcției selecteaza_operatie i se transmite numărul 1, ceea ce înseamnă că va returna funcția sumă. Prin urmare, variabila operație va indica de fapt funcția sumă, care efectuează adunarea a două numere:
print(operatie(10, 6)) # 16 - de fapt este echivalent cu suma(10, 6)
În mod similar, putem obține și executa și alte funcții.