Sytuacja kobiet w IT w 2024 roku
13.01.20214 min
Baijayanta Roy

Baijayanta RoyVice PresidentCiti

Jak używać wyrażeń listowych w Pythonie

Sprawdź, jak poprawnie używać wyrażeń listowych w Pythonie, opierając się na konkretnych przypadkach użycia.

Jak używać wyrażeń listowych w Pythonie

Python to język, którego ekspresywność objawia się w zwięzłym kodzie. Kod ten jest często elegancki i łatwy do zrozumienia, a wyrażenia listowe to jeden z elementów tego języka, który zapewnia prosty i elegancki sposób na tworzenie list. Wyrażenia listowe to bardzo “pythonowy” i przystępny sposób na tworzenie list. Pozwalają one na wykonywanie złożonych operacji przy użyciu jednej linijki kodu. 

Czym są wyrażenia listowe?

Wyrażenia listowe zapewniają prosty sposób na tworzenie list w oparciu o jakąś sekwencję lub inną listę, którą można przeiterować. W terminologii Pythona wszystko, co może być pętlą, nazywa się iterable. 

Głównym elementem wyrażeń listowych jest pętla for - każde takie wyrażenie może zostać przedstawione jako ta właśnie pętla. Jeśli zaprezentujemy dane wyrażenie jego odpowiednikiem w pojedynczej linijce, to będzie ono wyglądało całkiem unikatowo. 

Oto najważniejsze elementy wyrażeń listowych:

  1. Sekwencja danych, po której można iterować (może to być lista, zakres lub jakaś sekwencja). Iterujemy po niej, korzystając z nazwy zmiennej. 
  2. Wyrażenie wyjściowe
  3. Opcjonalny warunek dla zmiennej do filtrowania, mapowania albo do innej logicznej akcji.


Jeśli chcemy, na przykład, stworzyć listę kwadratów z listy zmiennych od 1 do 5, to możemy tego oczywiście dokonać przy użyciu pętli for. Ale gdy użyjemy wyrażenia listowego, to staje się ona lekka i zwięzła. 


Waga z Pixabay


Jeśli podzielimy wyrażenie listowe na części, oto co zobaczymy:


Powyżej widzimy wyjaśnienie prostego wyrażenia listowego, które wyświetla kwadrat każdej zmiennej wejściowej.

Tutaj iterowalny jest zakres (1,6), a x jest zmienną reprezentującą każdą wartość w tym zakresie. Dla każdego x (1,2,3,4,5) wyrażenie wyjściowe x*x oblicza odpowiadające mu wyjście (1,4,9,16,25), które ostatecznie staje się listą wyników (powyższy diagram).

A oto kilka sposobów użycia innych niż podstawowa konstrukcja.

1) Filtrowanie według warunku

Wyrażenia listowe umożliwiają sprawdzenie warunków i odfiltrowanie z listy wejściowej elementów, których nie potrzebujemy do wyjścia.

Filtrowanie to ma miejsce, zanim zostanie obliczone wyrażenie wyjściowe. Spójrz na poniższy przykład, w którym obliczamy kwadrat tylko dla tych zmiennych, które są podzielne przez 2.


Wyrażenie listowe z filtrowaniem

2) Warunek zagnieżdżony 

Wyrażenie listowe może służyć do sprawdzania warunków zagnieżdżonych. Spójrz na poniższy przykład, w którym chcemy dowiedzieć się, które zmienne na liście wejściowej są podzielne przez 2, 4 i 5.


3) if.. else w wyrażeniach listowych

Możemy użyć „if-else” w wyrażeniu listowym w Pythonie. Sprawdź poniższy kod, który znajduje listę liczb nieparzystych i parzystych. Musimy określić, jakie dane wyjściowe są pierwsze po warunku „if”, a następnie po „else”, po którym następuje jego wynik.


Uwaga: nie możemy bezpośrednio wydrukować wartości wejściowej bez użycia przecinka i nawiasów.

4) Spłaszczanie wielowymiarowej listy

Załóżmy, że musimy spłaszczyć listę 2D. Możemy to z łatwością zrobić, używając wyrażenia listowego, wykorzystującego podlisty.


Jak możemy spłaszczyć listę 3D? Staje się to nieco skomplikowane, gdy najpierw spłaszczamy 3D do 2D, a następnie 2D do 1D. W poniższym przykładzie część podkreślona na niebiesko jest krokiem, który powoduje spłaszczenie listy 2D z 3D, a następnie spłaszczenie zewnętrznej części do 1D.

5) Zagnieżdżone wyrażenie "for"

Wyrażeń listowych możemy używać dla wielu zagnieżdżonych pętli for. Musimy jednak uważać, jeśli chodzi o kolejność wykonywania.

Załóżmy, że mamy macierz 3 x 3 i chcemy z niej utworzyć taką macierz, gdzie po przekątnej zwrócimy kwadraty liczb, a inne wartości muszą być zerami. Tutaj wynik jest 1-wymiarowy, a my potrzebujemy dodatkowej logiki do konwersji do formy 2D.

Użyłem tutaj „kolumny” i „wiersza” dla uproszczenia, ale można ich użyć bezpośrednio w pętli for bez zmiennych pośrednich (jak dokonano tego w poniższym wyrażeniu listowym).

matrix = [[ 1, 2, 3],
          [ 4, 5, 6],
          [ 7, 8, 9]]
row = len(matrix)
column = len(matrix[0])
output = []
for i in range(row):
    for j in range(column):
        if i == j:
            output.append(matrix[i][j] * matrix[i][j])
        else:
            output.append(0)
            
output
[1, 0, 0, 0, 25, 0, 0, 0, 81]


Teraz widzimy odpowiadające sobie zagnieżdżone wyrażenia listowe (tylko jeden linijka, ale dla lepszego zrozumienia zrobiłem to w trzech).

[[matrix[i][j]*matrix[i][j] if i == j else 0 
              for i in range(len(matrix))] 
                  for j in range(len(matrix[0]))]


Postarajmy się to zrozumieć, przedstawiając sposób działania każdej pętli. Kolejność wykonania pętli to od góry do dołu (pogrubiona zielona strzałka). Pętle wewnętrzne (ciemnozielone) wykonywane są w pierwszej kolejności, a następnie sterowanie wraca do pętli zewnętrznej (na niebiesko).

Tutaj wyrażenie listowe ma długość jednej linijki. Możemy też uzyskać macierzową postać wyniku bezpośrednio, umieszczając nawiasy po pierwszej pętli for.

Zalety wyrażeń listowych

  1. Piszesz mniej kodu
  2. Kod jest łatwiejszy do zrozumienia
  3. Wyrażenia listowe są szybsze od pętli for, gdy dodajemy do listy jakieś elementy
  4. Jest to świetna alternatywa dla wbudowanych funkcji map i filter

Inne wyrażenia

W Pythonie mamy również wyrażenia słownikowe i zbiory wyrażeń. Działają one podobnie do wyrażeń listowych, z tymże są przeznaczone dla słownika i zbioru.

Python ma również wyrażenia generujące, które używają nawiasu okrągłego.

Podsumowanie

Kiedy zaczynałem swoją przygodę z Pythonem, ciężko było mi zrozumieć, o co chodzi w wyrażeniach listowych.

Kiedy jednak dostrzegłem ich przydatność, nigdy nie przyszło mi do głowy, aby przestać ich używać. Na początku wydają się onieśmielające, ale przy odrobinie praktyki każdy miłośnik Pythona może się w nich zakochać.


Oryginał tekstu w język angielskim możesz przeczytać tutaj

<p>Loading...</p>