Python: Comprehension statement – co to jest?

2-gru-2025

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']

Komentarze są wyłączone

Autor: Rafał Kraik