V tomto tutoriálu se naučíte, jak používat funkci Python map() k aplikaci funkce na všechny položky iterovatelného.
Python podporuje funkční programovací paradigma, které vám umožňuje definovat úlohy jako výpočet funkcí programově. S funkcemi Pythonu můžete zacházet jako s objekty: funkce může mít jinou funkci jako parametr a vracet jinou funkci.
Funkce map() přebírá funkci jako argument a umožňuje vám ji aplikovat na všechny položky v sekvenci.
Na konci tohoto tutoriálu budete moci používat funkci Python map() – k přepisování podrobných smyček a seznamů porozumění. Nakódujete několik příkladů, abyste pochopili různé způsoby použití funkce map().
Table of Contents
Jak aplikovat funkci na prvky seznamu Python
Začněme naši diskuzi příkladem.👩🏫
Zde nums je seznam čísel.
nums = [2,4,3,7]
Dále zvažte funkci self_pow(). Funkce self_pow() bere jako argument číslo a vrací číslo umocněné na mocninu samotného čísla: n**n.
V Pythonu je ** operátor umocňování. a**b vrátí hodnotu a umocněnou b, ab.
def self_pow(n): return n**n
Úkol: Vytvoření nového seznamu nums_pow použitím funkce self_pow() na každý prvek v seznamu nums.
Použití pro smyčku
Chcete-li to provést, můžete použít pro smyčky v Pythonu:
- Pro každé číslo v seznamu num zavolejte funkci self_pow() s argumentem num.
- Připojte výsledek volání funkce do nového seznamu nums_pow.
nums_pow = [] for num in nums: nums_pow.append(self_pow(num)) print(nums_pow)
Ve výstupu je každé číslo num zvýšeno samo na sebe. Prvky v seznamu nums_pow jsou následující: 22, 44, 33,77.
Output [4, 256, 27, 823543]
Používání funkce List Comprehension
Můžete to udělat stručné pomocí porozumění seznamu. Z explicitní smyčky for výše můžeme identifikovat výstupní výraz a seznam, který se má procházet.
Poté můžeme upravit obecný výraz pro porozumění seznamu:
new_list = [<output expression> for item in iterable]
Výraz pro pochopení seznamu pro generování seznamu nums_pow je následující:
nums_pow = [self_pow(num) for num in nums] print(nums_pow)
Výstup je podle očekávání stejný jako při použití smyček for.
Output [4, 256, 27, 823543]
Namísto porozumění cyklům a seznamům můžete použít funkci Python map() se stručnou syntaxí a pomůže vám tuto funkci aplikovat na všechny položky v iterovatelné. Začněme tím, že se naučíme syntaxi mapové funkce.
Python map() Syntaxe funkce
Obecná syntaxe pro použití funkce Python map() je následující:
map(function, iterable_1,[iterable_2,...,iterable_n])
Funkce map() přijímá alespoň dva argumenty, funkci a iterovatelnou.
Ve výše uvedené syntaxi:
- funkce označuje funkci Pythonu nebo obecně jakoukoli volatelnou funkci Pythonu. To zahrnuje uživatelem definované a vestavěné funkce, třídy, metody instancí a tříd a další.
- iterable je jakákoli platná iterovatelná Python, jako je seznam, n-tice a řetězec.
- Použije se funkce map() a tato funkce se použije pro každý prvek v iterovatelné.
Co vrací funkce map()?
Vrací objekt mapy. Potom můžete přetypovat objekt mapy na seznam pomocí syntaxe: seznam(map(funkce,iterovatelný)).
V závislosti na případu použití jej můžete přenést do n-tice Pythonu.
Nyní, když jste se naučili syntaxi funkce Python map(), začněme s kódováním příkladů.
Měli byste mít Python 3.x, abyste mohli sledovat tento tutoriál. Jinak můžete úryvky kódu spustit v online editoru Python etechblog.cz.
Jak používat funkci map() s uživatelsky definovanými funkcemi
#1. Dříve jsme aplikovali funkci self_pow() na každé číslo v seznamu čísel. V syntaxi funkce map() můžeme jako argumenty předat funkci self_pow a seznam nums.
Poznámka: Měli byste zadat pouze název funkce, nikoli volání funkce. Použijte self_pow a ne self_pow().
Funkce map() vrací objekt mapy.
print(map(self_pow,nums)) <map object at 0x7f7d315c14d0>
Poté můžeme objekt mapy přetypovat do seznamu pomocí funkce list(), jak je uvedeno níže.
nums_pow = list(map(self_pow,nums)) print(nums_pow)
Zde je výstup, kde je každé číslo num v nums mapováno na numnum v seznamu nums_pow.
Output [4, 256, 27, 823543]
#2. Zvažte následující funkci inch_to_cm(), která převádí palce na centimetry. 1 palec = 2,54 cm.
def inch_to_cm(inch): return inch*2.54
Chcete-li převést hodnoty v palcích v seznamu palců na centimetry, můžete použít funkci map(), jak je znázorněno v buňce kódu níže.
inches = [5.54,3.4,1,25,8.2] cms = list(map(inch_to_cm,inches)) print(cms)
Seznam cms obsahuje hodnoty v palcích vyjádřené v centimetrech.
Output [14.0716, 8.636, 2.54, 63.5, 20.828]
Jak používat funkci map() s vestavěnými funkcemi
V této části se naučíme, jak používat map() s vestavěnými funkcemi v Pythonu.
#1. Řetězce seznamu je seznam programovacích jazyků. Chtěli byste vytvořit nový seznam strings_upper, který obsahuje řetězce programovacího jazyka psané velkými písmeny.
strings = ['JavaScript','Rust','Python','Go']
Vestavěná řetězcová metoda .upper() působí na řetězec a vrací kopii naformátovanou velkými písmeny.
strings_upper = list(map(str.upper,strings)) print(strings_upper)
Seznam strings_upper obsahuje řetězce v seznamu řetězce formátované velkými písmeny.
Output ['JAVASCRIPT', 'RUST', 'PYTHON', 'GO']
#2. Vestavěná funkce len() v Pythonu bere sekvenci jako argument a vrací její délku. Chcete-li zjistit délku každého z řetězců v seznamu řetězců, můžeme použít funkci map() a aplikovat funkci délky na každý řetězec, jak je znázorněno níže.
strings_len = list(map(len,strings)) print(strings_len)
Output [10, 4, 6, 2]
#3. Funkci map() můžete použít s jinými kolekcemi, jako jsou n-tice.
Následující příklad obsahuje n-tici obsahující informace o počtu ložnic, oblasti a městě, ve kterém se dům nachází.
V Pythonu funkce type() vrací datový typ libovolného objektu Pythonu. Chcete-li získat datový typ všech položek v této n-tice, můžete použít funkci map() k volání funkce type u každé položky n-tice.
house = (2,758.5,'Bangalore') house_elt_type = tuple(map(type,house)) print(house_elt_type)
Uvrhli jsme objekt mapy do n-tice. Můžete také přenést do seznamu nebo jiné sbírky.
Ve výstupu níže vidíme, že datové typy 2, 758.5 a Bangalore byly odvozeny jako ‚int‘, ‚float‘ a ‚str‘.
Output (<class 'int'>, <class 'float'>, <class 'str'>)
#4. V Pythonu můžete importovat vestavěné moduly a používat funkce definované v modulech.
Chcete-li vypočítat druhou odmocninu každého čísla v seznamu čísel, můžete použít funkci sqrt z matematického modulu.
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]
Výše uvedený výstup je obtížné analyzovat a sledovat. Možná budete chtít zaokrouhlit každou druhou odmocninu na dvě desetinná místa.
Jak zaokrouhlit číslo s plovoucí desetinnou čárkou v Pythonu
Pojďme definovat funkci round_2(), která vezme hodnotu s plovoucí desetinnou čárkou a zaokrouhlí ji na dvě desetinná místa.
def round_2(num): return round(num,2)
Nyní můžete použít funkci map() se seznamem round_2 a 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]
Můžete také použít vnořené funkce map(), kde se funkce vnitřní mapy používá k výpočtu odmocniny seznamu nums_sqrt a funkce vnější mapy provádí operaci zaokrouhlení.
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]
Výstupy jsou v obou výše uvedených přístupech totožné. Měli byste však zajistit, aby byl kód čitelný a udržovatelný při vnořování funkcí, jak je uvedeno výše.
Jak používat funkci map() s funkcemi Lambda
V předchozích částech jste se naučili používat funkci Python map() s vestavěnými a uživatelem definovanými funkcemi. Nyní se naučíte, jak používat funkci map() s funkcemi lambda, které jsou v Pythonu anonymní.
Někdy budete mít funkci, jejíž tělo obsahuje pouze jeden řádek kódu, a možná budete muset funkci použít pouze jednou a neodkazovat na ni jinde v programu. Takové funkce můžete definovat jako lambda funkce v Pythonu.
Poznámka: lambda args: expression je obecná syntaxe pro použití funkce lambda Pythonu.
#1. Zvažte následující řetězce seznamu. Předpokládejme, že chcete získat seznam strings_rev – obsahující obrácenou kopii každého z řetězců.
strings = ['JavaScript','Rust','Python','Go']
Řetězec Pythonu můžeme obrátit pomocí krájení řetězce.
Poznámka: Toto je zobecnění výrazu krájení řetězců str[start:stop:step].
– Bez počáteční a koncové hodnoty začíná řez na začátku řetězce a sahá až ke konci řetězce.
– Záporné hodnoty kroku dávají řezy začínající od konce řetězce.
– Proto str[::-1] vrátí obrácenou kopii str.
Můžete použít tuto funkci lambda: lambda x:x[::-1]Uvnitř funkce mapy, jak je znázorněno níže.
strings_rev = list(map(lambda x:x[::-1],strings)) print(strings_rev)
Stejně jako v jiných příkladech přetypujeme objekt mapy do seznamu. Ve výstupu vidíme, že každý z řetězců v seznamu byl obrácen.
Output ['tpircSavaJ', 'tsuR', 'nohtyP', 'oG']
#2. V předchozí části jsme vypočítali druhou odmocninu každého čísla v seznamu čísel a poté každou hodnotu zaokrouhlili na dvě desetinná místa.
K tomu jsme použili funkci round_2(). Přepišme funkci round_2() jako lambda funkci a použijme ji s níže popsanou funkcí map().
nums_sqrt_round_l =list(map(lambda num:round(num,2),nums_sqrt)) print(nums_sqrt_round_l)
Jak je vidět níže, výstup je identický s tím, co jsme získali při použití funkce round_2().
Output [5.48, 9.49, 5.83, 6.71, 9.85]
Jak používat funkci map() s více iterovatelnými
V příkladech, které jsme viděli, jsme aplikovali funkci na všechny položky právě jedné iterovatelné.
Někdy můžeme mít funkce, které přebírají dva nebo více argumentů. V tomto případě je každý argument uložen v seznamu nebo podobné kolekci.
Můžeme také použít funkci Python map() s více seznamy.
#1. Zvažte následující funkci area(), která přijímá délku a šířku jako vstup a vrací oblast, délka*šířka.
def area(length,breadth): return length*breadth
Délka a šířka různých obdélníků jsou uloženy ve dvou samostatných seznamech, délky a šířky.
lengths = [4,8,10,18] breadths = [9,4,6,11]
Můžeme použít funkci map() k aplikaci funkce area na výše uvedené seznamy předáním seznamů délek i šířek.
areas = list(map(area,lengths,breadths)) print(areas)
Protože funkční oblast přijímá dva argumenty, hodnoty délky a šířky jsou použity ze seznamů délek a šířek.
Output [36, 32, 60, 198]
#2. Matematický modul Pythonu má funkci log, která nám pomáhá vypočítat logaritmus čísla k libovolnému základu.
Poznámka: log(x, základ) vrací hodnotu log x na základ určený hodnotou základ, log základ x. Pokud není zadán základ, výchozí hodnota základu je e (log počítá přirozený logaritmus).
V tomto příkladu:
- Seznam x odpovídá hodnotám, pro které chcete vypočítat logaritmus.
- Základní seznam obsahuje všechny základní hodnoty, které mají být použity při výpočtu logaritmu.
x = [2,6,12,10] base = [2,3,2,5]
Můžeme použít funkci Python map() s math.log, seznamy, x a základem, abychom získali nový seznam log_x následovně.
log_x = list(map(math.log,x,base)) print(log_x)
Zde je výstup.
Output [1.0, 1.6309297535714573, 3.5849625007211565, 1.4306765580733933]
Závěr
Zde je shrnutí toho, co jste se v tomto tutoriálu naučili:
- Funkce map() v Pythonu má alespoň dva argumenty: funkci a iterovatelnou, se syntaxí map(funkce, iterovatelné(s)).
- Funkce může být jakákoli platná volatelná Python.
- Když funkce převezme k argumentů, použijte funkci map() s funkcí a každým z argumentů k v iterovatelné.
Dále se naučte pracovat se sadami v Pythonu.