La list comprehension è apparsa già nelle prime versioni di Python. Questa sintassi è stata ispirata dai linguaggi funzionali. Rende il codice più compatto e a volte persino un po' più veloce rispetto a un ciclo for tradizionale.
Molti sviluppatori inesperti utilizzano le list comprehension senza comprenderne le peculiarità, il che porta a una lettura ridotta del codice o a effetti indesiderati. È anche difficile per i nuovi sviluppatori distinguere tra l'uso della list comprehension e le funzioni map/filter/lambda.
La list comprehension è un modo per creare rapidamente una nuova lista applicando un'espressione a ogni elemento della sequenza originale:
nums = [1, 2, 3, 4] squares = [x*x for x in nums if x % 2 == 0] # [4, 16]
Caratteristiche principali:
Ritorna una list comprehension un generatore?
No, restituisce effettivamente una lista. Un generatore viene creato con le parentesi tonde:
# Questo è un generatore: (x*x for x in range(10)) # Questa è una lista: [x*x for x in range(10)]
È possibile assegnare valori a variabili all'interno di una list comprehension?
Nella sintassi standard no. Solo tramite l'espressione "walrus" (:=) con Python 3.8+:
[x for x in (y := range(5))] # Errore! [x for x in [(y := i*i) for i in range(5)]] # y è visibile solo in questa lista
Si possono modificare variabili esterne all'interno di una list comprehension?
La variabile dichiarata all'interno della list comprehension è locale, non sarà visibile dall'esterno. Questo confonde spesso i principianti in costrutti annidati.
** Caso negativo Uno sviluppatore utilizza list comprehension annidate per una complessa trasformazione dei dati in una sola riga. Vantaggi: Il codice è compatto, c'è l'effetto "so Python!" Svantaggi: Difficile da leggere, ne risentono i nuovi colleghi, il debug diventa un tormento. ** Caso positivo Uno sviluppatore utilizza semplici list comprehension per filtrare e trasformare brevi liste, mentre per operazioni complesse scrive funzioni esplicite e cicli. Vantaggi: Il codice è facile da leggere, mantenere e ampliare. Svantaggi: In alcuni casi, il codice è un po' più lungo e vengono utilizzate variabili aggiuntive.