Operatorul Walrus în Python (Assignment Expressions :=) în Python

Operatori Python 3.8+

Ghid complet pentru operatorul Walrus (:=) introdus în Python 3.8: atribuirea valorilor în interiorul expresiilor, eliminarea calculelor duplicate și scrierea de bucle compacte.

Sintaxă
if (n := len(date)) > 10:
    print(f'Avem {n} elemente')
while (chunk := fisier.read(1024)):
    proceseaza(chunk)

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.

1. Citirea fluxurilor de date și a fișierelor cu bucla 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:

Capturarea rezultatului regex într-o singură linie
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]