List comprehension pojawił się już w wczesnych wersjach Pythona. Ta składnia została zapożyczona z języków funkcyjnych. Ułatwia kod, a czasami nawet działa szybciej niż tradycyjna pętla for.
Wielu niedoświadczonych programistów używa list comprehensions bez zrozumienia ich specyfiki, co prowadzi do pogorszenia czytelności lub wystąpienia nieoczekiwanych efektów w kodzie. Nowym programistom trudno jest odróżnić wykorzystanie list comprehensions od funkcji map/filter/lambda.
List comprehension to sposób na szybkie utworzenie nowej listy, stosując wyrażenie do każdego elementu oryginalnej sekwencji:
nums = [1, 2, 3, 4] squares = [x*x for x in nums if x % 2 == 0] # [4, 16]
Kluczowe cechy:
Czy list comprehension zwraca generator?
Nie, zwraca dokładnie listę. Generator tworzy się za pomocą okrągłych nawiasów:
# To jest generator: (x*x for x in range(10)) # To jest lista: [x*x for x in range(10)]
Czy można przypisywać wartości zmiennym wewnątrz list comprehension?
W standardowej składni nie można. Tylko za pomocą wyrażenia „walrus” (:=) od Pythona 3.8+:
[x for x in (y := range(5))] # Błąd! [x for x in [(y := i*i) for i in range(5)]] # y jest widoczne tylko w tej liście
Czy można zmieniać zewnętrzne zmienne wewnątrz list comprehension?
Zmienna zadeklarowana wewnątrz list comprehension jest lokalna i nie będzie widoczna na zewnątrz. To często myli nowicjuszy przy zagnieżdżonych konstrukcjach.
** Negatywny przypadek Programista używa zagnieżdżonych list comprehensions do złożonej transformacji danych w jednej linii. Zalety: Kod jest zwięzły, efekt „znam Pythona!” Wady: Trudno się czyta, cierpią nowi koledzy, debugowanie staje się uciążliwe ** Pozytywny przypadek Programista używa prostych list comprehensions do filtrowania i przekształcania krótkich list, a dla złożonych operacji pisze wyraźne funkcje i pętle. Zalety: Kod jest łatwy do przeczytania, utrzymania i rozszerzania Wady: W niektórych przypadkach kod jest trochę dłuższy i używane są dodatkowe zmienne