Funkcja map() Pythona, wyjaśniona przykładami

W tym samouczku dowiesz się, jak używać funkcji map() Pythona, aby zastosować funkcję do wszystkich elementów elementu iteracyjnego.

Python obsługuje paradygmat programowania funkcyjnego, który pozwala programowo definiować zadania jako obliczanie funkcji. Możesz traktować funkcje Pythona jak obiekty: funkcja może przyjąć inną funkcję jako parametr i zwrócić inną funkcję.

Funkcja map() przyjmuje funkcję jako argument i pozwala zastosować ją do wszystkich elementów w sekwencji.

Pod koniec tego samouczka będziesz mógł używać funkcji map() Pythona — do przepisywania pełnych pętli i list składanych. Zakodujesz kilka przykładów, aby zrozumieć różne sposoby użycia funkcji map().

Jak zastosować funkcję do elementów listy Pythona?

Zacznijmy naszą dyskusję od przykładu.👩‍🏫

Tutaj nums to lista liczb.

nums = [2,4,3,7]

Następnie rozważ funkcję self_pow(). Funkcja self_pow() przyjmuje liczbę jako argument i zwraca liczbę podniesioną do potęgi samej liczby: n**n.

W Pythonie operatorem potęgowania jest **. a**b zwraca wartość a podniesioną do potęgi b, ab.

def self_pow(n):
  return n**n

DO ZROBIENIA: Aby utworzyć nową listę nums_pow przez zastosowanie funkcji self_pow() do każdego elementu listy nums.

Korzystanie z pętli

Aby to zrobić, możesz użyć pętli for w Pythonie:

  • Dla każdej liczby na liście nums wywołaj funkcję self_pow() z num jako argumentem.
  • Dołącz wynik wywołania funkcji do nowej listy nums_pow.
nums_pow = []

for num in nums:
  nums_pow.append(self_pow(num))

print(nums_pow)

Na wyjściu każda liczba nums jest podnoszona do siebie. Elementy na liście nums_pow to: 22, 44, 33,77.

Output
[4, 256, 27, 823543]

Korzystanie ze zrozumienia listy

Możesz to zrobić zwięźle, używając rozumienia listy. Z powyższej pętli explicit for możemy zidentyfikować wyrażenie wyjściowe i listę do przejścia.

Następnie możemy zmodyfikować ogólne wyrażenie listowe:

new_list = [<output expression> for item in iterable]

Wyrażenie listowe do generowania listy nums_pow wygląda następująco:

nums_pow = [self_pow(num) for num in nums]
print(nums_pow)

Zgodnie z oczekiwaniami dane wyjściowe są takie same, jak przy użyciu pętli for.

Output
[4, 256, 27, 823543]

Zamiast rozumienia pętli i list, możesz użyć funkcji map() Pythona o zwięzłej składni i pomaga zastosować tę funkcję do wszystkich elementów w iterowalnym. Zacznijmy od poznania składni funkcji map.

Składnia funkcji map() w Pythonie

Ogólna składnia funkcji map() Pythona jest następująca:

map(function, iterable_1,[iterable_2,...,iterable_n])

Funkcja map() przyjmuje co najmniej dwa argumenty, funkcję i iterowalną.

W powyższej składni:

  • function oznacza funkcję Pythona lub ogólnie dowolną wywoływalną funkcję Pythona. Obejmuje to funkcje zdefiniowane przez użytkownika i wbudowane, klasy, instancje i metody klas oraz wiele innych.
  • iterowalny to dowolny poprawny iterowalny Python, taki jak lista, krotka i ciąg znaków.
  • Funkcja map() ma zastosowanie, a funkcja jest używana do każdego elementu w iterable.

Co zwraca funkcja map()?

Zwraca obiekt mapy. Następnie możesz rzutować obiekt map na listę, używając składni: list(map(function,iterable)).

W zależności od przypadku użycia możesz rzutować go na krotkę Pythona.

Teraz, gdy znasz składnię funkcji map() Pythona, zacznijmy kodować przykłady.

Powinieneś mieć Pythona 3.x do naśladowania wraz z tym samouczkiem. W przeciwnym razie możesz uruchomić fragmenty kodu w internetowym edytorze Pythona newsblog.pl.

Jak używać funkcji map() z funkcjami zdefiniowanymi przez użytkownika?

#1. Wcześniej stosowaliśmy funkcję self_pow() do każdej liczby na liście nums. W składni funkcji map() możemy jako argumenty przekazać funkcję self_pow i numery z listy.

Uwaga: Należy określić tylko nazwę funkcji, a nie wywołanie funkcji. Użyj self_pow, a nie self_pow().

Funkcja map() zwraca obiekt mapy.

print(map(self_pow,nums))

<map object at 0x7f7d315c14d0>

Następnie możemy rzutować obiekt mapy na listę za pomocą funkcji list(), jak pokazano poniżej.

nums_pow = list(map(self_pow,nums))
print(nums_pow)

Oto wynik, w którym każdy num w nums jest mapowany na numnum z listy nums_pow.

Output
[4, 256, 27, 823543]

#2. Rozważmy następującą funkcję inch_to_cm(), która konwertuje cale na centymetry. 1 cal = 2,54 cm.

def inch_to_cm(inch):
  return inch*2.54

Aby przekonwertować wartości cali na liście cali na centymetry, możesz użyć funkcji map(), jak pokazano w komórce kodu poniżej.

inches = [5.54,3.4,1,25,8.2]
cms = list(map(inch_to_cm,inches))
print(cms)

Lista cms zawiera wartości w calach wyrażone w centymetrach.

Output
[14.0716, 8.636, 2.54, 63.5, 20.828]

Jak używać funkcji map() z wbudowanymi funkcjami?

W tej sekcji dowiemy się, jak używać map() z wbudowanymi funkcjami w Pythonie.

#1. List strings to lista języków programowania. Chcesz utworzyć nową listę strings_upper zawierającą ciągi języka programowania pisane wielkimi literami.

strings = ['JavaScript','Rust','Python','Go']

Wbudowana metoda łańcuchowa .upper() działa na łańcuchu i zwraca kopię sformatowaną wielkimi literami.

strings_upper = list(map(str.upper,strings)) 
print(strings_upper)

Lista strings_upper zawiera ciągi w ciągach list sformatowanych wielkimi literami.

Output
['JAVASCRIPT', 'RUST', 'PYTHON', 'GO']

#2. Wbudowana funkcja len() w Pythonie przyjmuje sekwencję jako argument i zwraca jej długość. Aby znaleźć długość każdego z ciągów na liście ciągów, możemy użyć funkcji map() i zastosować funkcję length do każdego ciągu, jak pokazano poniżej.

strings_len = list(map(len,strings))
print(strings_len)
Output
[10, 4, 6, 2]

#3. Możesz użyć funkcji map() z innymi kolekcjami, takimi jak krotki.

Poniższy przykład zawiera krotkę zawierającą informacje o liczbie sypialni, powierzchni i mieście, w którym znajduje się dom.

W Pythonie funkcja type() zwraca typ danych dowolnego obiektu Pythona. Aby uzyskać typ danych wszystkich elementów w tej krotce, możesz użyć funkcji map(), aby wywołać funkcję type na każdym elemencie krotki.

house = (2,758.5,'Bangalore')
house_elt_type = tuple(map(type,house))
print(house_elt_type)

Wrzuciliśmy obiekt mapy do krotki. Możesz także przesyłać na listę lub dowolną inną kolekcję.

W poniższym wyniku widzimy, że typy danych 2, 758,5 i Bangalore zostały wywnioskowane jako odpowiednio 'int’, 'float’ i 'str’.

Output
(<class 'int'>, <class 'float'>, <class 'str'>)

#4. W Pythonie możesz importować wbudowane moduły i używać funkcji zdefiniowanych w modułach.

Aby obliczyć pierwiastek kwadratowy z każdej liczby na liście nums, możesz użyć funkcji pierwiastka kwadratowego sqrt z modułu math.

import math
nums = [30,90,34,45,97]
nums_sqrt = list(map(math.sqrt,nums))
print(nums_sqrt)
Output
[5.477225575051661, 9.486832980505138, 5.830951894845301, 6.708203932499369, 9.848857801796104]

Powyższe dane wyjściowe są trudne do przeanalizowania i śledzenia. Możesz chcieć zaokrąglić każdą wartość pierwiastka kwadratowego, aby powiedzieć dwa miejsca po przecinku.

Jak zaokrąglić liczbę zmiennoprzecinkową w Pythonie?

Zdefiniujmy funkcję round_2(), która pobiera wartość zmiennoprzecinkową i zaokrągla ją do dwóch miejsc po przecinku.

def round_2(num):
  return round(num,2)

Teraz możesz użyć funkcji map() z listą round_2 i nums_sqrt.

nums_sqrt_round = list(map(round_2,nums_sqrt))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Można również użyć zagnieżdżonych funkcji map(), w których wewnętrzna funkcja map jest używana do obliczania listy pierwiastków kwadratowych nums_sqrt, a zewnętrzna funkcja map wykonuje operację zaokrąglania.

nums_sqrt_round = list(map(round_2,list(map(math.sqrt,nums))))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Wyniki są identyczne w obu powyższych podejściach. Należy jednak upewnić się, że kod jest czytelny i możliwy do utrzymania podczas zagnieżdżania funkcji, jak pokazano powyżej.

Jak używać funkcji map() z funkcjami lambda

W poprzednich rozdziałach nauczyłeś się używać funkcji map() Pythona z funkcjami wbudowanymi i zdefiniowanymi przez użytkownika. Dowiesz się teraz, jak używać funkcji map() z funkcjami lambda, które w Pythonie są anonimowe.

Czasami będziesz mieć funkcję, której ciało zawiera tylko jeden wiersz kodu i możesz potrzebować użyć funkcji tylko raz i nie odwoływać się do niej w innym miejscu programu. Możesz zdefiniować takie funkcje jako funkcję lambda w Pythonie.

Uwaga: argumenty lambda: wyrażenie to ogólna składnia do użycia funkcji lambda Pythona.

#1. Rozważ następujące ciągi listy. Załóżmy, że chcesz uzyskać listę strings_rev – zawierającą odwróconą kopię każdego z ciągów.

strings = ['JavaScript','Rust','Python','Go']

Możemy odwrócić napis w Pythonie za pomocą krojenia napisów.

Uwaga: jest to uogólnienie wyrażenia wycinającego ciąg str[start:stop:step].

– Bez wartości początkowej i końcowej wycinek zaczyna się na początku ciągu i rozciąga się do końca ciągu.
– Ujemne wartości kroku dają plastry zaczynając od końca ciągu.
– Dlatego str[::-1] zwraca odwróconą kopię str.

Możesz użyć tej funkcji lambda: lambda x:x[::-1]Wewnątrz funkcji mapy, jak pokazano poniżej.

strings_rev = list(map(lambda x:x[::-1],strings))
print(strings_rev)

Podobnie jak w innych przykładach, rzutujemy obiekt mapy na listę. Na wyjściu widzimy, że każdy z ciągów w ciągach listy został odwrócony.

Output
['tpircSavaJ', 'tsuR', 'nohtyP', 'oG']

#2. W poprzedniej sekcji obliczyliśmy pierwiastek kwadratowy z każdej liczby na liście liczb, a następnie zaokrągliliśmy każdą wartość pierwiastka kwadratowego do dwóch miejsc po przecinku.

W tym celu użyliśmy funkcji round_2(). Przepiszmy funkcję round_2() jako funkcję lambda i użyjmy jej z funkcją map() opisaną poniżej.

nums_sqrt_round_l =list(map(lambda num:round(num,2),nums_sqrt))
print(nums_sqrt_round_l)

Jak widać poniżej, dane wyjściowe są identyczne z tymi, które uzyskaliśmy za pomocą funkcji round_2().

Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Jak używać funkcji map() z wieloma elementami iteracyjnymi?

W przykładach, które widzieliśmy, zastosowaliśmy funkcję na wszystkich elementach dokładnie jednej iteracji.

Czasami możemy mieć funkcje, które przyjmują dwa lub więcej argumentów. W takim przypadku każdy argument jest przechowywany na liście lub w dowolnej podobnej kolekcji.

Możemy również użyć funkcji map() Pythona z wieloma listami.

#1. Rozważmy następującą funkcję area(), która przyjmuje długość i szerokość jako dane wejściowe i zwraca pole, długość*szerokość.

def area(length,breadth):
  return length*breadth

Długość i szerokość różnych prostokątów są przechowywane na dwóch oddzielnych listach, odpowiednio długości i szerokości.

lengths = [4,8,10,18]
breadths = [9,4,6,11]

Możemy użyć funkcji map(), aby zastosować funkcję area na powyższych listach, przekazując zarówno listy długości, jak i szerokości.

areas = list(map(area,lengths,breadths))
print(areas)

Ponieważ obszar funkcji przyjmuje dwa argumenty, wartości długości i szerokości są używane odpowiednio z list długości i szerokości.

Output
[36, 32, 60, 198]

#2. Moduł matematyczny Pythona ma funkcję log, która pomaga nam obliczyć logarytm liczby do dowolnej podstawy.

Uwaga: log(x, podstawa) zwraca wartość log x do podstawy określonej przez podstawę wartości logarytm o podstawie x. Jeśli podstawa nie jest określona, ​​domyślną wartością podstawy jest e (log oblicza logarytm naturalny).

W tym przykładzie:

  • Lista x odpowiada wartościom, dla których chcesz obliczyć logarytm.
  • Lista bazowa zawiera wszystkie wartości bazowe, które mają być użyte w obliczeniach logarytmicznych.
x = [2,6,12,10]
base = [2,3,2,5]

Możemy użyć funkcji map() Pythona z math.log, listami, x i base, aby uzyskać nową listę log_x w następujący sposób.

log_x = list(map(math.log,x,base))
print(log_x)

Oto wynik.

Output
[1.0, 1.6309297535714573, 3.5849625007211565, 1.4306765580733933]

Wniosek

Oto podsumowanie tego, czego nauczyłeś się w tym samouczku:

  • Funkcja map() Pythona przyjmuje co najmniej dwa argumenty: funkcję i iterowalną, ze składnią map(function, iterable(s)).
  • Funkcja może być dowolną poprawną wywoływalną w Pythonie.
  • Gdy funkcja przyjmuje k argumentów, użyj funkcji map() z funkcją i każdym k argumentów w iteracji.

Następnie naucz się pracować z zestawami w Pythonie.