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 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.
Komentarze (0)
Brak komentarzy...