Gdy mówimy o listach, nie sposób nie wspomnieć, choć niektórym się udaje, o tzw. list comprehension. Jest to taka "szybka lista", czyli trochę taki skrót na stworzenie listy. Warto też napomknąć, że list comprehension.. no, nie dotyczy tylko list. Mówiąc jaśniej, mamy też do dyspozycji inne kolekcje, gdzie taka metoda tworzenia też działa. Natomiast najczęściej słyszy się o list comprehension. Co sprawia niestety, że inne kolekcje w tym względzie często pomijamy.
Python jest, jak pewnie już zauważyłeś, dość elastycznym językiem. Czasem mi się wydaje, że trochę "jedzie na freestyle". Znaczy to, że po prostu taki luzacki czasem może się wydawać... co może po prostu jest właściwością języków skryptowych. Nie ma tutaj nawiasów klamrowych wyznaczających blok kodu, czy średników - reguły są, ale trochę takie.. inne, nie tak sztywne można by rzecz. Natomiast wróćmy do tematu, bo trochę odpłynąłem.
List comprehenstion wstęp
Jeśli popatrzymy sobie na takie dość standardowe użycie listy, to często listę tworzy się przykładowo iterując, przechodząc przez jakiegoś rodzaju zbiór rzeczy. Podczas takiego przechodzenia przez zbiór, po prostu zbieramy sobie kolejne rzeczy do naszej listy. Trochę to podobne do zbierania jakiegoś rodzaju coinów w grze przygodowej (ktoś pamięta Kangurka Kao?).
Zademonstrujmy sobie takie użycie tej konstrukcji. Trochę naciągane, ale ma pokazać mechanizm.

Powyższy kod, jak możesz się domyślić, tworzy nam listą, a następnie w pętli wypełnia ją wartościami. Jakimi wartościami teraz pytanie, czy się domyślacz? Są to wartości poczynając od zera do n-1 czyli liczby 19, dlaczego? Bo i tak działa funkcja range.

List comprehension - o co chodzi
No i o co chodzi z tym całym list comprehension. Jest to właśnie kodzik, który pozwala Nam osiągnąć to samo co powyżej zobaczyliśmy, ale nie używając "standardowej" składni. Jest to taka właśnie skrócona składnia, którą można zawrzeć w zasadzie w jednej linii kodu.
Możemy szybko wypełnić listę, pewnym zakresem wartości. Weźmy sobie zakres jak poprzednio, w Naszej pętli for. Czyli zakres od 0 do 19 - range(20). Używanie list comprehension to po prostu podanie nazwy listy i w nawiasach kwadratowych specjalnej konstrukcji. Zatem, podajemy w nawiasach najpierw jakąś zmienną do reprezentowania pojedynczej wartości (jak w pętli for). Następnie, po takiej zmiennej, piszemy słówko for, bo tak jakby pętlę wstawiamy do listy, by nam generowała tam wartości. Teraz już standardowo dopisujemy resztę czyli jeszcze raz iterator, a następnie słowo 'in', a później zestaw/ zakres czyli np. range(20). W podstawowej wersji to tyle. Zobaczmy przykład w kodzie.

Taka konstrukcja wygeneruje nam identyczną listę jak poprzednio pętla for. Mamy tutaj właśnie literkę i, która będzie reprezentować pojedyncze wartości z Naszego zakresu, określonego za pomocą funkcji range(20). Możemy sobie wyobrazić, że to pierwsze 'i' jest wstawiane do listy za każdym 'obrotem' pętli for. Jaki jest efekt, każdy widzi 😉

Lista comprehension z warunkiem
Oczywiście nie jest to wszystko, bo może nie chcemy wszystkich wartości po kolei wstawiać. I tutaj możemy oczywiści zmodyfikować nasz zakres, i w funkcji range dodać tzw. 'step' jako trzeci argument tej funkcji. Możemy też, tak jak w zwykłej pętli dodać warunek. I klasycznie, weźmy sobie standardowy warunek.

Masz może pomysł co zwróci nam powyższy kod?
Będzie to oczywiście Nasza lista. Tym razem jednak będzie ona zawierała tylko wartości, które po podzieleniu przez dwa nie zwracają reszty, a mówiąc zwięźlej wartości parzyste. Oczywiście mieszczące się w Naszym zakresie, czyli od 0 do 19. Efekty zatem będą jak na poniższym obrazku.

Widzimy jak bardzo skróciliśmy kod za pomocą list comprehension. To co zajmowało nam kilka linii, wymagało użycia konwencjonalnej pętli for i osobno tworzenia pustej listy, teraz jest zamknięte w jednej, eleganckiej linii kodu. I właśnie tak się prezentuje użycie i efekt działania list comprehension, które tyczy się nie tylko list 😉
