Introducere
În această lecție, vom explora în detaliu funcția reduce() și modulul functools în Python. Vom învăța cum să folosim reduce() pentru a efectua operații de reducere pe colecții de date și cum să utilizăm funcțiile adiționale furnizate de modulul functools pentru a îmbunătăți programarea funcțională în Python.
Cuprins
- Recapitulare: Ce este funcția
reduce()în Python - Utilizarea funcției
reduce()cu funcții definite și funcții lambda - Introducere în modulul
functools - Îmbunătățirea funcțiilor cu
functools.partial() - Utilizarea funcției
functools.lru_cache()pentru memoizare - Aplicarea decoratorului
functools.singledispatch()pentru suprascrierea funcțiilor - Încheiere și concluzii
1. Recapitulare: Ce este funcția reduce() în Python
Funcția reduce() este o funcție de înaltă ordine care permite aplicarea unei funcții care acceptă două argumente în mod repetat la elementele unei colecții, până când colecția este redusă la o singură valoare.
Funcția reduce() a fost mutată în modulul functools începând cu Python 3, așa că trebuie să o importăm înainte de a o utiliza:
from functools import reduce
numere = [1, 2, 3, 4, 5]
def adunare(x, y):
return x + y
suma = reduce(adunare, numere)
print(suma) # Output: 15
2. Utilizarea funcției reduce() cu funcții definite și funcții lambda
Funcția reduce() poate fi utilizată cu funcții definite sau funcții lambda. În exemplul de mai sus, am utilizat o funcție definită pentru a aduna numerele dintr-o listă. Putem să facem același lucru folosind o funcție lambda:
from functools import reduce
numere = [1, 2, 3, 4, 5]
suma = reduce(lambda x, y: x + y, numere)
print(suma) # Output: 15
3. Introducere în modulul functools
Modulul functools oferă o serie de funcții de înaltă ordine care sunt utile în programarea funcțională. În această secțiune, vom examina câteva dintre cele mai utilizate funcții din modulul functools, precum partial(), lru_cache() și singledispatch().
4. Îmbunătățirea funcțiilor cu functools.partial()
Funcția functools.partial() permite crearea unei noi funcții cu unul sau mai multe argumente fixe. Acest lucru este util atunci când vrem să avem o funcție cu o semnătură mai simplă sau atunci când vrem să fixăm anumiți parametri pentru o funcție existentă.
De exemplu, să presupunem că avem o funcție care ridică un număr la o anumită putere:
def ridicare_la_putere(baza, exponent):
return baza ** exponent
Putem utiliza functools.partial() pentru a crea o nouă funcție care ridică un număr la pătrat, fixând exponentul la 2:
from functools import partial
ridicare_la_patrat = partial(ridicare_la_putere, exponent=2)
rezultat = ridicare_la_patrat(4)
print(rezultat) # Output: 16
5. Utilizarea funcției functools.lru_cache() pentru memoizare
Memoizarea este o tehnică de programare care stochează rezultateleapelurilor funcției într-un cache, astfel încât apelurile ulterioare cu aceleași argumente să poată returna rezultatul imediat, fără a recalcula acesta.
Funcția functools.lru_cache() este un decorator care adaugă memoizare funcțiilor. LRU înseamnă „Least Recently Used” (Cel mai puțin utilizat recent) și se referă la politica de înlocuire a cache-ului.
De exemplu, să presupunem că avem o funcție recursivă care calculează al n-lea număr Fibonacci:
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n - 1) + fibonacci(n - 2)
Această funcție are o eficiență scăzută pentru valori mari ale lui n din cauza recalculărilor repetate. Putem îmbunătăți performanța funcției folosind memoizare cu functools.lru_cache():
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(100)) # Output: 354224848179261915075
6. Aplicarea decoratorului functools.singledispatch() pentru suprascrierea funcțiilor
Decoratorul functools.singledispatch() permite implementarea suprascrierii funcțiilor în funcție de tipul primului argument. Acesta este util în cazul în care avem comportamente diferite ale funcției în funcție de tipul de intrare.
De exemplu, să presupunem că vrem să implementăm o funcție care calculează lungimea unui obiect, dar care se comportă diferit pentru liste și șiruri de caractere:
from functools import singledispatch
@singledispatch
def lungime(obj):
raise TypeError(f"Tipul '{type(obj).__name__}' nu este suportat")
@lungime.register(list)
def _(obj):
return len(obj)
@lungime.register(str)
def _(obj):
return len(obj.strip())
lista = [1, 2, 3, 4]
sir = " Exemplu de șir "
print(lungime(lista)) # Output: 4
print(lungime(sir)) # Output: 16
7. Încheiere și concluzii
În această lecție, am explorat în detaliu funcția reduce() și modulul functools în Python. Am învățat cum să folosim reduce() pentru a efectua operații de reducere pe colecții de date și cum să utilizăm funcțiile adiționale furnizate de modulul functools pentru a îmbunătăți programarea funcțională în Python.
Acum, ar trebui să aveți o înțelegere solidă a funcției reduce() și a modului în care funcțiile din modulul functools pot fi folosite pentru a simplifica și îmbunătăți codul sursă în Python. Continuați să experimentați și să aplicați aceste concepte în proiectele dvs. pentru a vă îmbunătăți abilitățile de programare funcțională în Python.