map(function, iterable, ...)
Zastosuj funkcję do każdego elementu iterowalnego i zwróć listę wyników. Jeśli przekazane zostaną dodatkowe iterowalne argumenty, funkcja musi przyjąć tyle argumentów i zostanie zastosowana do elementów ze wszystkich iteracyjnych równolegle.
Jeśli jeden iterowalny jest krótszy od drugiego, zakłada się, że zostanie przedłużony o Brak elementów.
Jeśli funkcja jest None
, to zakłada się funkcję tożsamości; jeśli istnieje wiele argumentów, map()
zwraca listę składającą się z krotek zawierających odpowiednie elementy ze wszystkich iteracji (rodzaj operacji transpozycji).
Argumenty iterowalne mogą być sekwencją lub dowolnym obiektem iterowalnym; wynikiem jest zawsze lista.
Jaką rolę odgrywa to w tworzeniu produktu kartezjańskiego?
content = map(tuple, array)
Jaki efekt ma umieszczenie krotki w dowolnym miejscu? Zauważyłem również, że bez funkcji mapy wyjście jest, abc
a wraz z nim jest a, b, c
.
Chcę w pełni zrozumieć tę funkcję. Definicje referencyjne są również trudne do zrozumienia. Za dużo fantazyjnego puchu.
źródło
map
?map(None, a, b, c)
okazujezip(a, b, c)
. Ale bardzo rzadko widzisz to w praktyce, właśnie dlatego, żezip
połączenie jest równoważne.tuple
jest funkcją (cóż, jest bardziej dopracowana, ale zachowuje się jak funkcja), która wymaga iteracji i daje krotkę z tymi samymi elementami - więctuple([1, 2, 3])
jest to równoważne z(1, 2, 3)
. Zamap(tuple, array)
,array
byłoby iterable z iterables (myślę listę list), a to daje kopię każdej listy wewnętrzną zamienił krotki.Odpowiedzi:
map
nie jest szczególnie pytoniczny. Poleciłbym zamiast tego używać wyrażeń listowych:jest w zasadzie równoważny z:
map
sam w sobie nie może zrobić produktu kartezjańskiego, ponieważ długość jego listy wyników jest zawsze taka sama jak listy danych wejściowych. Możesz trywialnie zrobić kartezjański produkt z listą ze zrozumieniem:Składnia jest nieco myląca - co w zasadzie odpowiada:
źródło
map
dużo mniej szczegółowych słów niż listy, przynajmniej w przypadku, który demonstrujesz.map
ekwiwalent[v.__name__ for v in (object, str)]
?map(lambda v: v.__name__, list)
?map
było szybsze niż rozumienie, a czasem nie, właśnie z powodu narzutu wywołania funkcji? W szczególności, heurystyka, której się nauczyłem, polega na tym, że kiedy używanie wymaga wprowadzenia dodatkowego wywołania funkcji, rozumienie jest szybsze? Np. Doprowadzono mnie do przekonania, że jest wolniejszy niż , a nawet wolniejszy niż , właśnie z powodu wywołania dodatkowej funkcji.map
map(lambda foo: foo.bar, my_list)
foo.bar for foo in my_list
map(operator.add, my_list_of_pairs)
x + y for x, y in my_list_of_pairs
map
wcale nie odnosi się do produktu kartezjańskiego, chociaż wyobrażam sobie, że ktoś dobrze zorientowany w programowaniu funkcjonalnym mógłby wymyślić jakiś niemożliwy do zrozumienia sposób wygenerowania takiegomap
.map
w Pythonie 3 jest równoważne z tym:a jedyną różnicą w Pythonie 2 jest to, że utworzy pełną listę wyników, które zostaną zwrócone naraz zamiast
yield
ing.Chociaż konwencja Python zwykle preferuje wyrażenia listowe (lub wyrażenia generatora), aby uzyskać ten sam wynik, co wywołanie
map
, szczególnie jeśli używasz wyrażenia lambda jako pierwszego argumentu:Jako przykład tego, o co prosiłeś w komentarzach do pytania - „zamień ciąg znaków na tablicę”, przez „tablicę” prawdopodobnie potrzebujesz krotki lub listy (oba zachowują się trochę jak tablice z innych języków) -
Zastosowanie
map
tu będzie, jeśli zaczniesz z listy ciągów zamiast pojedynczego łańcucha -map
może listify wszystkie z nich z osobna:Zauważ, że
map(list, a)
jest to równoważne w Pythonie 2, ale w Pythonie 3 potrzebujeszlist
wywołania, jeśli chcesz zrobić coś innego niż nakarmić go wfor
pętli (lub takiej funkcji przetwarzania,sum
która potrzebuje tylko iterowalnej, a nie sekwencji). Ale jeszcze raz zauważ, że zwykle preferowane jest zrozumienie listy:źródło
map
tworzy nową listę poprzez zastosowanie funkcji do każdego elementu źródła:n-ary
map
jest równoważne skompresowaniu iterujących danych wejściowych razem, a następnie zastosowaniu funkcji transformacji na każdym elemencie tej pośredniej spakowanej listy. To nie jest produkt kartezjański:Użyłem
zip
tutaj, alemap
zachowanie faktycznie różni się nieznacznie, gdy iteratory nie są tego samego rozmiaru - jak zauważono w jego dokumentacji, rozszerza iterabie, aby zawierałyNone
.źródło
[2,4,6]
zrozumienia listy i jawnych pętli, ale mapa zwraca obiekt mapy - na przykład otrzymuję to:<map at 0x123a49978>
co następnie muszę przymusić do listy.Upraszczając trochę, możesz sobie wyobrazić
map()
zrobienie czegoś takiego:Jak widać, pobiera funkcję i listę i zwraca nową listę, w wyniku czego zastosowanie funkcji do każdego elementu na liście danych wejściowych. Powiedziałem „trochę upraszczając”, ponieważ w rzeczywistości
map()
można przetworzyć więcej niż jeden iterowalny:Druga część pytania: Jaką rolę odgrywa to w tworzeniu produktu kartezjańskiego? cóż,
map()
można go użyć do wygenerowania kartezjańskiego produktu z listy takiej jak ta:... Ale prawdę mówiąc, używanie
product()
jest znacznie prostszym i naturalnym sposobem rozwiązania problemu:Tak czy inaczej, wynikiem jest iloczyn kartezjański
lst
zdefiniowany powyżej:źródło
Ta
map()
funkcja służy do zastosowania tej samej procedury do każdego elementu w iterowalnej strukturze danych, takiej jak listy, generatory, ciągi i inne rzeczy.Spójrzmy na przykład:
map()
można iterować każdy element na liście i zastosować funkcję do każdego elementu, niż zwróci (zwróci) nową listę.Wyobraź sobie, że masz funkcję, która pobiera liczbę, dodaje 1 do tej liczby i zwraca:
Masz również listę liczb:
jeśli chcesz zwiększyć liczbę na liście, możesz wykonać następujące czynności:
Uwaga: Przynajmniej
map()
potrzebuje dwóch argumentów. Najpierw nazwa funkcji, a po drugie coś w rodzaju listy.Zobaczmy inne fajne rzeczy, które
map()
można zrobić.map()
może pobierać wiele iteracyjnych (list, ciągów itp.) i przekazywać element z każdej iterowalnej funkcji jako argument.Mamy trzy listy:
map()
może uczynić cię nową listą, która zawiera dodawanie elementów o określonym indeksie.Teraz pamiętaj
map()
, potrzebuje funkcji. Tym razem użyjemy wbudowanejsum()
funkcji. Uruchomieniemap()
daje następujący wynik:PAMIĘTAJ:
W Pythonie 2
map()
, będzie iterował (przechodził przez elementy list) zgodnie z najdłuższą listą i przejdzieNone
do funkcji dla krótszych list, więc twoja funkcja powinna je wyszukaćNone
i obsłużyć, w przeciwnym razie wystąpią błędy. W Python 3map()
zatrzyma się po zakończeniu najkrótszej listy. Ponadto w Pythonie 3map()
zwraca iterator, a nie listę.źródło
Python3 - mapa (func, iterable)
Jedną rzeczą, o której nie wspomniano całkowicie (chociaż wspomniał o tym @BlooB) jest to, że mapa zwraca obiekt mapy NIE listę. Jest to duża różnica, jeśli chodzi o wydajność czasu podczas inicjalizacji i iteracji. Rozważ te dwa testy.
Jak widać, inicjalizacja funkcji mapy nie zajmuje prawie wcale czasu. Jednak iteracja przez obiekt mapy trwa dłużej niż zwykła iteracja przez iterowalny. Oznacza to, że funkcja przekazana do map () nie jest stosowana do każdego elementu, dopóki element nie zostanie osiągnięty w iteracji. Jeśli chcesz listę, skorzystaj ze zrozumienia listy. Jeśli planujesz iterować w pętli for i w pewnym momencie pęknie, użyj mapy.
źródło