Conținut curs
Gestionarea erorilor și excepțiilor
0/1
Python Intermediar
Despre lecție

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

  1. Recapitulare: Ce este funcția reduce() în Python
  2. Utilizarea funcției reduce() cu funcții definite și funcții lambda
  3. Introducere în modulul functools
  4. Îmbunătățirea funcțiilor cu functools.partial()
  5. Utilizarea funcției functools.lru_cache() pentru memoizare
  6. Aplicarea decoratorului functools.singledispatch() pentru suprascrierea funcțiilor
  7. Î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:

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

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

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

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

python
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():

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

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