Comprehensions în Python
Ce sunt Comprehensions?
Comprehensions sunt o sintaxă concisă pentru a crea colecții noi bazate pe iterabile existente.
List Comprehension
Forma de bază
# Metoda clasică
patrate = []
for x in range(5):
patrate.append(x ** 2)
# [0, 1, 4, 9, 16]
# Cu list comprehension
patrate = [x ** 2 for x in range(5)]
# [0, 1, 4, 9, 16]
Cu condiție (filtru)
# Doar numerele pare
pare = [x for x in range(10) if x % 2 == 0]
# [0, 2, 4, 6, 8]
# Pătratele numerelor pare
patrate_pare = [x ** 2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]
Cu expresie condițională
# Diferit de filtru - se aplică pe rezultat
rezultat = [x if x % 2 == 0 else -x for x in range(5)]
# [0, -1, 2, -3, 4]
Comprehension imbricat
# Matrice transpusă
matrice = [[1, 2, 3], [4, 5, 6]]
transpusa = [[row[i] for row in matrice] for i in range(3)]
# [[1, 4], [2, 5], [3, 6]]
# Aplatizare matrice
plat = [x for row in matrice for x in row]
# [1, 2, 3, 4, 5, 6]
Dictionary Comprehension
# Pătrate ca dicționar
patrate = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# Inversare cheie-valoare
original = {"a": 1, "b": 2, "c": 3}
inversat = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}
# Cu condiție
d = {x: x**2 for x in range(10) if x % 2 == 0}
# {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
Set Comprehension
# Caractere unice dintr-un șir
caractere = {c.lower() for c in "Hello World"}
# {'h', 'e', 'l', 'o', ' ', 'w', 'r', 'd'}
# Lungimi unice
cuvinte = ["ana", "ion", "maria", "dan"]
lungimi = {len(c) for c in cuvinte}
# {3, 5}
Generator Expression
Similar cu list comprehension, dar generează valori la cerere (lazy evaluation):
# List comprehension - creează lista imediat
lista = [x**2 for x in range(1000000)] # Folosește memorie!
# Generator expression - generează pe măsură ce e nevoie
gen = (x**2 for x in range(1000000)) # Aproape zero memorie
print(next(gen)) # 0
print(next(gen)) # 1
# Folosit în funcții
suma = sum(x**2 for x in range(100)) # Fără [] pentru generator
Exemple Practice
Filtrare și transformare
note = [3, 7, 9, 4, 10, 6, 8]
# Notele de promovare, rotunjite
promovate = [round(n, 0) for n in note if n >= 5]
# [7, 9, 10, 6, 8]
Procesare șiruri
cuvinte = [" Hello ", "WORLD", "python"]
procesate = [c.strip().lower() for c in cuvinte]
# ['hello', 'world', 'python']
Crearea dicționarelor
chei = ["a", "b", "c"]
valori = [1, 2, 3]
dictionar = {k: v for k, v in zip(chei, valori)}
# {'a': 1, 'b': 2, 'c': 3}
De Reținut
Comprehensions sunt mai citibile și mai rapide decât buclele echivalente pentru operații simple. Pentru logică complexă, preferă buclele tradiționale.
Întrebări de Verificare
- Ce returnează
[x**2 for x in range(5)]? - Care este diferența dintre
[x for x if ...]și[x if ... else ... for x]? - Când folosești generator expression în loc de list comprehension?
- Cum creezi un dicționar cu comprehension?