Blog JSystems - z miłości do programowania

Funkcje map i filter



Funkcja map


Funkcja "map" służy do stosowania funkcji na każdym z elementów listy. Poniższy kod powoduje przetworzenie listy "liczby" w taki sposób, by do listy "parzyste" trafiły wartości z listy "liczby" pomnożone przez 2.


liczby=[i for i in range(1,11)]
parzyste=list(map(lambda x:x*2,liczby))
print(parzyste)


Wynik działania funkcji:


[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]


W zasadzie interesować nas będzie tylko jedna linia z kodu:


parzyste=list(map(lambda x:x*2,liczby))


Element list(.......) powoduje oczywiście powstanie listy. Samo wywołanie funkcji map to:


map(lambda x:x*2,liczby)


Do tej funkcji trafiają dwa parametry - funkcja do wykonania (zaraz do tego wrócę) i lista źródłowa. Co oznacza ten tajemniczy zapis?:


lambda x:x*2


Jest to tak zwane wyrażenie lambda. Polega to w skrócie na tym, że możesz podać dynamicznie treść funkcji która ma zostać wykonana. W tym przypadku musimy podać treść funkcji która zostanie wykonana na każdym z elementów listy źródłowej. Zapis "x:" oznacza że ta dynamiczna funkcja przyjmuje jeden parametr, a wewnątrze tej funkcji będę go nazywał "x". Fragment "x*2" określa sposób przetworzenia tego elementu podanego przez parametr, zanim zostanie on zwrócony.


Zasadniczo zapis:


lambda x:x*2


Byłby odpowiednikiem


def funkcja(x):
    return x*2


Czyli na każdym elemencie z listy źródłowej zadziała taka funkcja, a element po przetworzeniu trafi do listy docelowej.  W zasadzie ten zapis:


parzyste=list(map(lambda x:x*2,liczby))


Jest równoznaczny ze znaną nam już konstrukcją list składanych :


parzyste=[i*2 for i in liczby]


Jeśli przyszło Ci to na myśl, to bardzo dobrze - oznacza to że rozumiesz obie techniki. Owszem - wynik będzie ten sam, natomiast różne są wewnętrzne metody jego osiągnięcia. W zależności od stosowanego przeliczenia i zawartości listy mogą charakteryzować się różną wydajnością.


Co do samych wyrażeń lambda, na razie nie będziemy ich bardziej zgłębiać bo ten poziom zaznajomienia w kontekście list nam w zupełności wystarczy. Przyjrzymy się wyrażeniom lambda w rozdziale w którym omawiam funkcje.


 


Funkcja filter


Funkcja filter jak sama nazwa wskazuje, służy do filtrowania zawartości list. Tradycyjnie zaczniemy od przykładu kodu:


liczby=[i for i in range(1,21)]
parzyste=list(filter(lambda x: x%2==0 ,liczby))
print(parzyste)


I równie tradycyjnie sprawdźmy co nam ten kod wydrukował:


[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]


Istotny jest w zasadzie tylko element:


parzyste=list(filter(lambda x: x%2==0 ,liczby))


Ponieważ po ostatnim niespodziewanym porównaniu funkcji "map" do list składanych Twoja podejrzliwość zapewne nieco wzrosła, to tym razem od razu wyłożę karty na stół:


parzyste=[x for x in liczby if x%2==0]


Tym razem w wyrażeniu lambda oczekuje się od nas warunku logicznego stwierdzającego "prawda" lub "fałsz" dla każdego z filtrowanych elementów. Robi to fragment "x%2==0" dla którego jesteśmy w stanie stwierdzić dla każdego elementu czy podane wyrażenie będzie prawdziwe czy nie. Będzie prawdziwe oczywiście tylko dla liczb parzystych, więc tylko takie trafią do listy docelowej.


 

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!