Można żyć z Pythonem w zgodnie nie znając comprehension statement, ale… może jednak warto, bo dzięki temu jest krócej, prościej, czytelniej, o ile tylko… rozumie się co to comprehension statement.
Cel jest prosty. Chcemy skrócić pętle – najlepiej do jednej linijki. No to popatrzmy na pętlę, której celem jest wygenerowanie kwadratów liczb parzystych z pewnej zadanej listy:
numbers = [1, 2, 3, 4, 5]
squares = []
for n in numbers:
if n % 2 == 0: # tylko liczby parzyste
squares.append(n**2)
print(squares) # Wynik: [4, 16]
Trzeba oczywiście zadeklarować listę numbers, potem pustą listę squares, a potem napisać for, badać parzystość przy użyciu if, podnosić do kwadratu i dodawać do listy no i na końcu wyświetlić wynik. Jest trochę długie, ale inaczej się nie da…. no właśnie stop! Comprehension skraca ten zapis do:
numbers = [1, 2, 3, 4, 5]
squares = [n**2 for n in numbers if n % 2 == 0]
print(squares) # Wynik: [4, 16]
Ojej – ale co tu się dzieje? Oczywiście pomijamy pierwszą i ostatnią linijkę, bo one są oczywiste.
No to tak:
- Wynikiem ma być lista, a listę oznacza się w pythonie nawiasami kwadratowymi, więc mamy squares = [ coś tam ]
- Na liście mają się znaleźć kwadraty liczb, więc piszemy n**2, tylko co to jest to n?
- No właśnie n to liczby, które pochodzą z listy numbers, dodajemy więc: for n in numbers
- Ale ale! Przecież mieliśmy podnosić do kwadratu tylko liczby parzyste. No tak – dlatego dopisujemy if n % 2 == 0
W tym jednym zapisie jest cały ciąg operacji budujących pętlę for. Jest „for n in numbers”, jest „if n %2 == 0”, jest podnoszenie do kwadratu, czego ewentualnie nie ma to instrukcji append, ale ten append „dzieje się sam”, bo przecież tworząc zmienną squares napisaliśmy squares = [ …. ] czyli jest to jakiś rodzaj listy.
Comprehension można też użyć tworzyć zbiory danych, np tutaj do zbioru {} zostaną włożone wszystkie elementy z listy, a więc w efekcie nawet jeśli na liście były elementy się powtarzające, to w zbiorze będą już tylko unikalne
words = ["kot", "pies", "kot", "ryba"]
unique_lengths = {len(w) for w in words}
# Wynik: {3, 4}
To może na koniec, takie niebanalne zadanie:
Napisz pętlę, która wyświetli napis „Pan XX” lub „Pani XX” w oparciu o listę imiona. W liście imiona są zapisane imiona. Napis ma być Pan, jeśli imię kończy się spółgłoską lub Pani jeśli imię kończy się samogłoską. Skorzystaj z comprehension
imiona = ["Ala", "Ola", "Marek", "Jan", "Ewa"]
Rozwiązanie jest poniżej – scrolluj w dół:
i jeszcze
i jeszcze
i jeszcze
i jeszcze
i jeszcze
i jeszcze
i jeszcze
i jeszcze
tutaj:
wyniki = [
("Pani " + imie if imie[-1].lower() in "aeiouy" else "Pan " + imie)
for imie in imiona
]
print(wyniki)
# Wynik: ['Pani Ala', 'Pani Ola', 'Pan Marek', 'Pan Jan', 'Pani Ewa']





























