13.01.20214 min

Baijayanta RoyVice President

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>

Powiązane artykuły

Dziel się wiedzą ze 160 tysiącami naszych czytelników

Zostań autorem Readme

Affirm

Software Engineer (Python)

medium

13 600 - 16 100 PLN

Umowa o pracę

Warszawa

Praca zdalna 100%

Ważna do 26.02.2022

Dobrze
PythonReact
Początkująco
AWSKubernetesSpark

Beekeeper

IT Support Engineer (SaaS)

medium

Znamy widełki

Umowa o pracę

Kraków

Ważna do 26.02.2022

Dobrze
PythonGoApple

Sofomo

Python Senior Developer

senior

12 000 - 20 000 PLN

Kontrakt B2B

Wrocław

Praca zdalna 100%

Ważna do 12.03.2022

Bardzo dobrze
PythonDjango
Początkująco
AWSReactMicroservices
Dobrze
Docker

Nokia

Python/C++ Engineer

medium

Brak widełek

Umowa o pracę

Kraków

Praca zdalna 100%

Ważna do 12.03.2022

Bardzo dobrze
C++/Python

Affirm

Staff Backend Developer

senior

23 900 - 28 700 PLN

Umowa o pracę

Warszawa

Praca zdalna 100%

Ważna do 24.02.2022

Bardzo dobrze
Python
Dobrze
AWSSparkReact

Affirm

Staff Backend Software Engineer

senior

23 900 - 28 700 PLN

Umowa o pracę

Warszawa

Praca zdalna 100%

Ważna do 24.02.2022

Bardzo dobrze
Python
Dobrze
JavaGoKotlin

Affirm

Software Engineer (Backend)

medium

13 600 - 16 100 PLN

Umowa o pracę

Warszawa

Praca zdalna 100%

Ważna do 24.02.2022

Bardzo dobrze
Python
Dobrze
FlaskSwaggerAmazon S3

Accenture Polska

Big Data Developer (praca zdalna)

medium

15 000 - 23 000 PLN

Kontrakt B2BUmowa o pracę

Praca zdalna 100%

Ważna do 23.02.2022

Bardzo dobrze
PythonSQL
Dobrze
LinuxScalaSpark
Początkująco
GCPHive

Sii Polska

Junior Python Automation Tester

junior

Brak widełek

Kontrakt B2BUmowa o pracę

Praca zdalna 100%

Ważna do 23.02.2022

Początkująco
Python

ONWELO SA

Python Developer

medium

10 500 - 18 900 PLN

Kontrakt B2BUmowa o pracę

Praca zdalna 100%

Ważna do 23.02.2022

Dobrze
PythonDjango/FlaskPytest
Początkująco
DockerKubernetesAWS/GCP/Azure