Lekcje modułu (1/4)
List comprehension
Wyrażenie listowe (list comprehension) to konstrukcja, która buduje nową listę poprzez
zastosowanie przekształcenia (i opcjonalnie filtra) do każdego elementu obiektu iterowalnego.
Jest to pythonowy sposób na zapisanie konstrukcji for + append w jednej linii.
# styl imperatywny (rozwlekły)
quadrati = []
for n in range(5):
quadrati.append(n * n)
# styl pythonowy
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]Pełna składnia
[espressione for elemento in iterabile if condizione]- expression: co ma zostać wstawione do wynikowej listy
- for element in iterable: pętla źródłowa
- if condition (opcjonalnie): zachowuje tylko te elementy, które spełniają warunek
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]
maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']
lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']if/else wewnątrz wyrażenia (operator warunkowy)
Aby dokonać warunkowej transformacji (zamiast filtrowania), umieść wyrażenie
warunkowe PRZED słowem kluczowym for:
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]Wielokrotne pętle for: iloczyn kartezjański
Wewnątrz wyrażenia możesz zagnieżdżać pętle for:
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]Kolejność pętli for to "od zewnętrznej do wewnętrznej", dokładnie tak jak w tradycyjnie
zagnieżdżonych pętlach.
Kiedy NIE używać wyrażenia listowego
- Złożona logika z wieloma zagnieżdżonymi warunkami
if/else→ użyj tradycyjnej pętli. - Efekty uboczne (wypisywanie na ekran, zapis do pliku) → zwykła pętla, nie wyrażenie listowe.
- Więcej niż 2 poziomy zagnieżdżenia → tradycyjna pętla z jasną nazwą jest niemal zawsze czytelniejsza.
Zagnieżdżone wyrażenia listowe
Możesz łączyć wiele pętli for wewnątrz jednego wyrażenia listowego. Na przykład, aby spłaszczyć macierz (listę list) do pojedynczej płaskiej listy, możesz napisać:
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]Kolejność pętli odzwierciedla dokładnie kolejność zagnieżdżania tradycyjnych pętli for.
Spróbuj sam
Mając daną listę `nums = [1, 2, 3, 4, 5, 6]`, utwórz listę `even_squares` zawierającą kwadraty tylko parzystych liczb. Oceń `even_squares`.
Pokaż wskazówkę
Warunek if n % 2 == 0 na końcu.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Mając daną listę `words = ['Ciao', 'Mondo', 'Python', 'Java']`, utwórz listę `lengths` zawierającą długości KAŻDEGO słowa oraz listę `short_words` zawierającą tylko słowa krótsze niż 5 znaków. Oceń krotkę `(lengths, short_words)`.
Pokaż wskazówkę
Zastosuj dwa osobne wyrażenia listowe.
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Użyj wyrażenia listowego do obliczenia kwadratów tylko parzystych liczb całkowitych z przedziału od 1 do 10 włącznie. Zapisz wynikową listę w zmiennej `even_squares` i ją oceń.
Pokaż wskazówkę
Użyj range(1, 11) do iteracji, if x % 2 == 0 do filtrowania, a x**2 jako wyrażenia.
Rozwiązanie dostępne po 3 próbach