Funkce Python map() vysvětlená na příkladech

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().

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.

  Vysvětlení ASTC 3.0: Televizní vysílání přichází do vašeho telefonu

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.

  Jak zjistit, které Apple Watch máte

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.

  Jak zahájit konverzaci s Firefoxem Dobrý den

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.