U ovom uputstvu ćete otkriti kako da iskoristite Python-ovu funkciju map()
za primenu određene operacije na sve članove neke iterabilne strukture podataka.
Python podržava funkcionalnu programsku paradigmu, koja omogućava definisanje zadataka kroz izračunavanja pomoću funkcija. Python funkcije se mogu tretirati kao objekti: funkcija može primiti drugu funkciju kao argument i vratiti drugu funkciju.
Funkcija map()
prima funkciju kao ulazni parametar i omogućava njenu primenu na sve elemente u nizu.
Nakon ovog uputstva, bićete u stanju da efikasno koristite Python-ovu funkciju map()
, zamenjujući opširne petlje i razumevanja listi. Proći ćemo kroz nekoliko praktičnih primera kako bismo ilustrovali različite načine upotrebe funkcije map()
.
Kako primeniti funkciju na elemente Python liste
Krenimo sa konkretnim primerom. 👩🏫
Imamo listu brojeva nazvanu nums
.
nums = [2,4,3,7]
Zatim, posmatrajmo funkciju self_pow()
. Ova funkcija prima broj kao argument i vraća taj broj podignut na stepen samog sebe: nn.
U Python-u, **
je operator stepenovanja. Dakle, a**b
vraća vrednost a podignutu na stepen b, odnosno ab.
def self_pow(n):
return n**n
Zadatak: Kreirati novu listu, nums_pow
, tako da se funkcija self_pow()
primeni na svaki element u listi nums
.
Korišćenje for petlje
Ovo se može postići pomoću for petlje u Python-u:
- Za svaki broj u listi
nums
, pozovite funkcijuself_pow()
sa tim brojem kao argumentom. - Dodajte rezultat poziva funkcije u novu listu
nums_pow
.
nums_pow = []
for num in nums:
nums_pow.append(self_pow(num))
print(nums_pow)
U izlazu, svaki broj iz nums
je podignut na stepen samog sebe. Elementi u listi nums_pow
su: 22, 44, 33, 77.
Izlaz
[4, 256, 27, 823543]
Korišćenje razumevanja listi
Ovo se može postići kraće korišćenjem razumevanja listi. Iz prethodne for petlje, možemo da identifikujemo izlazni izraz i listu kroz koju se prolazi.
Zatim, možemo modifikovati opšti izraz za razumevanje liste:
nova_lista = [<izlazni_izraz> for stavka in iterabilna_struktura]
Izraz razumevanja liste za generisanje liste nums_pow
je:
nums_pow = [self_pow(num) for num in nums]
print(nums_pow)
Izlaz je isti kao kod korišćenja for petlje, što se i očekuje.
Izlaz
[4, 256, 27, 823543]
Umesto petlji i razumevanja listi, možemo koristiti Python-ovu funkciju map()
koja ima sažetu sintaksu i pomaže u primeni funkcije na sve elemente neke iterabilne strukture. Započnimo sa proučavanjem sintakse funkcije map()
.
Sintaksa funkcije Python map()
Opšta sintaksa za korišćenje funkcije Python map()
je:
map(funkcija, iterabilna_struktura_1,[iterabilna_struktura_2,...,iterabilna_struktura_n])
Funkcija map()
prima najmanje dva argumenta, funkciju i iterabilnu strukturu.
U gornjoj sintaksi:
funkcija
označava Python funkciju ili bilo koju Python funkciju koja se može pozvati. To uključuje korisnički definisane i ugrađene funkcije, klase, metode instanci i klase i još mnogo toga.iterabilna_struktura
je bilo koja važeća Python iterabilna struktura, kao što su lista, torka ili string.- Funkcija
map()
se primenjuje, i funkcija se koristi za svaki element u iterabilnoj strukturi.
Šta vraća funkcija map()
?
Vraća objekat mape. Taj objekat mape zatim možete da konvertujete u listu koristeći sintaksu: list(map(funkcija,iterabilna_struktura))
.
Zavisno od potrebe, možete ga konvertovati u Python torku.
Sada kada ste naučili sintaksu funkcije Python map()
, započnimo sa praktičnim primerima.
Trebalo bi da imate Python 3.x da biste pratili ovo uputstvo. U suprotnom, možete pokrenuti isječke koda u nekom online Python editoru.
Kako koristiti funkciju map()
sa korisnički definisanim funkcijama
#1. Ranije smo primenili funkciju self_pow()
na svaki broj u listi brojeva. U sintaksi funkcije map()
, možemo proslediti funkciju self_pow
i listu brojeva kao argumente.
Napomena: Trebalo bi da navedete samo ime funkcije, ne i njen poziv. Koristite self_pow
umesto self_pow()
.
Funkcija map()
vraća objekat mape.
print(map(self_pow,nums))
<map object at 0x7f7d315c14d0>
Zatim, objekat mape možemo konvertovati u listu pomoću funkcije list()
, kao što je prikazano ispod.
nums_pow = list(map(self_pow,nums))
print(nums_pow)
Evo izlaza, gde je svaki element liste nums
mapiran na nn u listi nums_pow
.
Izlaz
[4, 256, 27, 823543]
#2. Razmotrite sledeću funkciju inch_to_cm()
koja pretvara inče u centimetre. 1 inč = 2.54 cm.
def inch_to_cm(inch):
return inch*2.54
Za konverziju vrednosti inča iz liste inches
u centimetre, možemo koristiti funkciju map()
kao što je prikazano u kodu ispod.
inches = [5.54,3.4,1,25,8.2]
cms = list(map(inch_to_cm,inches))
print(cms)
Lista cms
sadrži vrednosti inča izražene u centimetrima.
Izlaz
[14.0716, 8.636, 2.54, 63.5, 20.828]
Kako koristiti funkciju map()
sa ugrađenim funkcijama
U ovom odeljku ćemo naučiti kako da koristimo funkciju map()
sa ugrađenim funkcijama u Python-u.
#1. Lista strings
sadrži stringove koji predstavljaju programske jezike. Želimo da kreiramo novu listu strings_upper
koja sadrži te stringove ispisane velikim slovima.
strings = ['JavaScript','Rust','Python','Go']
Ugrađena metoda stringova .upper()
deluje na string i vraća kopiju formatiranu velikim slovima.
strings_upper = list(map(str.upper,strings))
print(strings_upper)
Lista strings_upper
sadrži stringove iz liste strings
formatirane velikim slovima.
Izlaz
['JAVASCRIPT', 'RUST', 'PYTHON', 'GO']
#2. Ugrađena funkcija len()
u Python-u prima string kao argument i vraća njegovu dužinu. Da bismo pronašli dužinu svakog stringa u listi strings
, možemo koristiti funkciju map()
i primeniti funkciju len
na svaki string, kao što je prikazano ispod.
strings_len = list(map(len,strings))
print(strings_len)
Izlaz
[10, 4, 6, 2]
#3. Funkciju map()
možete koristiti sa drugim kolekcijama, kao što su torke.
Sledeći primer sadrži torku koja sadrži informacije o broju spavaćih soba, površini i gradu u kome se kuća nalazi.
U Python-u, funkcija type()
vraća tip podataka bilo kog Python objekta. Da bismo dobili tip podataka svih elemenata u ovoj torci, možemo koristiti funkciju map()
da pozovemo funkciju type
za svaki element torke.
house = (2,758.5,'Bangalore')
house_elt_type = tuple(map(type,house))
print(house_elt_type)
Konvertovali smo objekat mape u torku. Takođe možete konvertovati u listu ili bilo koju drugu kolekciju.
U donjem izlazu vidimo da su tipovi podataka 2, 758.5 i Bangalore izvedeni kao 'int'
, 'float'
i 'str'
, redom.
Izlaz
(<class 'int'>, <class 'float'>, <class 'str'>)
#4. U Python-u možete uvesti ugrađene module i koristiti funkcije definisane u njima.
Da biste izračunali kvadratni koren svakog broja u listi brojeva, možete koristiti funkciju kvadratnog korena sqrt
iz matematičkog modula.
import math
nums = [30,90,34,45,97]
nums_sqrt = list(map(math.sqrt,nums))
print(nums_sqrt)
Izlaz
[5.477225575051661, 9.486832980505138, 5.830951894845301, 6.708203932499369, 9.848857801796104]
Gornji izlaz je teško čitljiv i pratiti. Možda želite da zaokružite svaku vrednost kvadratnog korena na dve decimale.
Kako zaokružiti broj sa pokretnim zarezom u Python-u
Hajde da definišemo funkciju round_2()
koja prima vrednost sa pokretnim zarezom i zaokružuje je na dve decimale.
def round_2(num):
return round(num,2)
Sada možete koristiti funkciju map()
sa listom round_2
i nums_sqrt
.
nums_sqrt_round = list(map(round_2,nums_sqrt))
print(nums_sqrt_round)
Izlaz
[5.48, 9.49, 5.83, 6.71, 9.85]
Takođe možete koristiti ugnježđene funkcije map()
gde se funkcija unutrašnje mape koristi za izračunavanje liste kvadratnih korena, nums_sqrt
, a funkcija spoljne mape obavlja operaciju zaokruživanja.
nums_sqrt_round = list(map(round_2,list(map(math.sqrt,nums))))
print(nums_sqrt_round)
Izlaz
[5.48, 9.49, 5.83, 6.71, 9.85]
Rezultati su identični u oba gornja pristupa. Međutim, kod ugnježdenih funkcija treba voditi računa da kod bude čitljiv i održiv.
Kako koristiti funkciju map()
sa Lambda funkcijama
U prethodnim odeljcima, naučili ste kako da koristite Python-ovu funkciju map()
sa ugrađenim i korisnički definisanim funkcijama. Sada ćete naučiti kako da koristite funkciju map()
sa lambda funkcijama, koje su anonimne u Python-u.
Ponekad ćete imati funkciju čije telo sadrži samo jednu liniju koda, i možda ćete morati da koristite funkciju samo jednom i da je ne referencirate na nekom drugom mestu u programu. Takve funkcije možete definisati kao lambda funkciju u Python-u.
Napomena: lambda argumenti: izraz
je opšta sintaksa za korišćenje Python lambda funkcije.
#1. Razmotrite sledeću listu stringova. Pretpostavimo da želite da dobijete listu strings_rev
– koja sadrži obrnutu kopiju svakog od stringova.
strings = ['JavaScript','Rust','Python','Go']
Python string možemo preokrenuti koristeći string sečenje.
Napomena: Ovo je generalizacija izraza za sečenje stringova str[start:stop:step]
.
– Bez početne i stop vrednosti, sečenje počinje na početku niza i proteže se do kraja niza.
– Negativne vrednosti koraka daju sečenja koja počinju od kraja niza.
– Dakle, str[::-1]
vraća obrnutu kopiju stringa str
.
Možete koristiti ovu lambda funkciju: lambda x: x[::-1]
unutar funkcije map()
, kao što je prikazano ispod.
strings_rev = list(map(lambda x:x[::-1],strings))
print(strings_rev)
Kao i u drugim primerima, objekat mape konvertujemo u listu. U izlazu vidimo da je svaki od stringova u listi strings
obrnut.
Izlaz
['tpircSavaJ', 'tsuR', 'nohtyP', 'oG']
#2. U prethodnom odeljku, izračunali smo kvadratni koren svakog broja u listi brojeva, a zatim zaokružili svaku vrednost kvadratnog korena na dve decimale.
Za ovo smo koristili funkciju round_2()
. Hajde da prepišemo funkciju round_2()
kao lambda funkciju i koristimo je sa funkcijom map()
opisanom ispod.
nums_sqrt_round_l =list(map(lambda num:round(num,2),nums_sqrt))
print(nums_sqrt_round_l)
Kao što se vidi ispod, izlaz je identičan onome što smo dobili korišćenjem funkcije round_2()
.
Izlaz
[5.48, 9.49, 5.83, 6.71, 9.85]
Kako koristiti funkciju map()
sa više iterabilnih struktura
U primerima koje smo videli, primenili smo funkciju na sve elemente tačno jedne iterabilne strukture.
Ponekad, možemo imati funkcije koje primaju dva ili više argumenata. U tom slučaju, svaki argument se čuva u listi ili sličnoj kolekciji.
Takođe, možemo koristiti funkciju Python map()
sa više lista.
#1. Razmotrite sledeću funkciju area()
koja prima dužinu i širinu kao ulazne vrednosti i vraća površinu, odnosno dužina*širina
.
def area(length,breadth):
return length*breadth
Dužine i širine različitih pravougaonika čuvaju se u dve odvojene liste, lengths
i breadths
, redom.
lengths = [4,8,10,18]
breadths = [9,4,6,11]
Možemo da koristimo funkciju map()
da primenimo funkciju area
na gorenavedene liste tako što ćemo proslediti liste lengths
i breadths
.
areas = list(map(area,lengths,breadths))
print(areas)
Pošto funkcija area
prima dva argumenta, vrednosti dužine i širine se koriste iz listi lengths
i breadths
, redom.
Izlaz
[36, 32, 60, 198]
#2. Python matematički modul ima funkciju log
koja nam pomaže da izračunamo logaritam broja u odnosu na bilo koju osnovu.
Napomena: log(x, base)
vraća vrednost logaritma x
u odnosu na navedenu osnovu base
, logbase x
. Ako osnova nije navedena, podrazumevana osnovna vrednost je e
(log izračunava prirodni logaritam).
U ovom primeru:
- Lista
x
odgovara vrednostima za koje želimo da izračunamo logaritam. - Lista
base
sadrži sve osnovne vrednosti koje će se koristiti u izračunavanju logaritma.
x = [2,6,12,10]
base = [2,3,2,5]
Možemo koristiti funkciju Python map()
sa math.log
, listama x
i base
da bismo dobili novu listu log_x
, kao što sledi.
log_x = list(map(math.log,x,base))
print(log_x)
Evo izlaza.
Izlaz
[1.0, 1.6309297535714573, 3.5849625007211565, 1.4306765580733933]
Zaključak
Evo rezimea onoga što ste naučili u ovom uputstvu:
- Python-ova funkcija
map()
prima najmanje dva argumenta: funkciju i iterabilnu strukturu, sa sintaksommap(funkcija, iterabilna_struktura(e))
. - Funkcija može biti bilo koja važeća Python funkcija koja se može pozvati.
- Kada funkcija prima
x
argumenata, koristite funkcijumap()
sa funkcijom i svakim odx
argumenata u iterabilnim strukturama.
Sledeće, naučite kako da radite sa skupovima u Python-u.