Historia pytania
Funkcja map() istnieje w Pythonie od najwcześniejszych wersji jako odzwierciedlenie programowania funkcyjnego. Jest stosowana do stosowania funkcji do każdego elementu obiektu iterowalnego.
Problem
Nie wszyscy początkujący programiści rozumieją różnicę między map, generatorami a wyrażeniami listowymi. Powstają pytania dotyczące wydajności, czytelności i zgodności z leniwym przetwarzaniem danych.
Rozwiązanie
Funkcja map() przyjmuje funkcję i jeden lub więcej obiektów iterowalnych, zwracając leniwy iterator, w którym do każdego elementu kolejno stosowana jest funkcja. Jest to efektywne pod względem pamięci i pozwala na przetwarzanie dużych zbiorów danych bez tworzenia pośrednich list.
Przykład kodu:
# Zwracanie kwadratów liczb za pomocą map numbers = [1, 2, 3, 4] squares = map(lambda x: x**2, numbers) print(list(squares)) # [1, 4, 9, 16]
Kluczowe cechy:
Czy funkcja map() może działać z dwoma lub więcej sekwencjami jednocześnie? Jak to zrobić?
Tak, można przekazać kilka sekwencji, jeśli funkcja przyjmuje tyle samo argumentów. Iteracja zakończy się, gdy tylko najkrótszy obiekt iterowalny się skończy.
Przykład kodu:
a = [1, 2, 3] b = [4, 5, 6] res = list(map(lambda x, y: x + y, a, b)) print(res) # [5, 7, 9]
Co zwróci map(), jeśli przekażesz funkcję, która zwraca None?
Każdy element map będzie None. Jeśli funkcja nie zwraca wartości jawnie, wynikiem zawsze będzie lista None:
def print_val(x): print(x) # brak return list(map(print_val, [1,2,3])) # [None, None, None] i trzy wyjścia w konsoli
Jaka jest różnica między map() a wyrażeniem listowym pod względem zużycia pamięci?
map nie tworzy całego wyniku w pamięci od razu, lecz oblicza na żądanie; wyrażenie listowe [...] tworzy pełną listę. Dla dużych zbiorów danych użycie map jest preferowane, jeśli nie potrzebujesz od razu całego wyniku.
W projekcie używano map do przeszukiwania listy z funkcją zapisującą do pliku, zapomniano o zwróceniu wartości. Oczekiwano pojawienia się danych, ale map zwróciła iterator z None.
Zalety:
Wady:
Używano map do przetwarzania i filtrowania dużej listy logów, pisząc czystą funkcję, która zwraca wynik. Iterator map kolejno przekazywał wartości do zapisu w pliku bez przepełnienia pamięci.
Zalety:
Wady: