Introdus în Python 3.8 prin PEP 572, operatorul de atribuire în expresie := (denumit colocvial operatorul Walrus / morsa datorită asemănării cu ochii și colții unei morse) permite atribuirea unei valori unei variabile chiar în mijlocul unei expresii evaluate. Înainte de Python 3.8, atribuirea era strict o instrucțiune (statement) și nu putea apărea într-o condiție if sau o buclă while.
# METODA VECHE: Necesita inițializare înainte de buclă și repetare în interior
with open("date_mari.bin", "rb") as fisier:
bloc = fisier.read(4096)
while bloc:
# proceseaza(bloc)
bloc = fisier.read(4096) # Duplicare de cod!
# METODA MODERNĂ CU OPERATORUL WALRUS:
with open("date_mari.bin", "rb") as fisier:
# Citește blocul, îl atribuie variabilei 'bloc' și verifică dacă nu este gol într-o singură linie:
while (bloc := fisier.read(4096)):
# proceseaza(bloc)
pass
2. Eliminarea Calculelor Redundante în Clauze if
Adesea calculăm o valoare costisitoare (o expresie regulată, lungimea unui răspuns sau o interogare) și dorim să verificăm o condiție asupra ei, iar apoi să folosim valoarea calculată în interiorul blocului:
import re
text_input = "Contactează-ne la suport@dexblog.ro pentru asistență."
# Verifică dacă există potrivire și capturează obiectul 'match' simultan:
if (potrivire := re.search(r'[\w\.-]+@[\w\.-]+\.\w+', text_input)):
print(f"Adresă de email extrasă: {potrivire.group(0)}")
else:
print("Niciun email găsit în text.")
3. Utilizare Avansată în List Comprehensions
Operatorul Walrus este util în list comprehensions pentru a evita apelarea de două ori a unei funcții costisitoare (o dată în clauza if și o dată în expresia returnată):
def calculeaza_scor(user_id):
# simulare calcul
return user_id * 15
utilizatori = [1, 2, 5, 8, 12]
# Fără walrus: calculeaza_scor(u) ar fi fost apelat de două ori pentru fiecare element!
scoruri_mari = [scor for u in utilizatori if (scor := calculeaza_scor(u)) > 50]
print(scoruri_mari) # [75, 120, 180]