Sdílejte chiptron.cz na sociálních sítích



RSS feeds

ESP32 / ESP8266 MicroPython: Použití filtru na seznamyTisk

Cílem tohoto návodu je ukázat, jak lze používat filtry na seznamy. Funkce filtru očekává na vstupu funkci a iterovatelnou proměnnou (v našem případě seznam). Následně použije funkci na každý prvek z dané proměnné. Výstupem filtru je seznam prvků, u kterých námi použitá funkce vrátila true. Ukážeme si to na jednoduchém případě, kdy nás bude zajímat, který prvek je větší než 5. Na vstupu dáme tedy seznam s několika čísly a na výstupu dostaneme seznam čísel, které byly větší než 5.
Nejčastěji se jako vstupní funkce používají lambda funkce nebo funkce anonymní. Jedná se obvykle o kratičké funkce, které jsou definovány přímo při volání funkce. Díky tomu je výsledný kód mnohem přehlednější.
Návod byl vytvářen na deskách ESP32 a ESP8266 v prostředí uPyCraft a MicroPython IDE. O všem jsme již více psali v předchozích návodech.
Lambda:
Nejprve si vytvoříme náš seznam, na který pak budu aplikovat různé operace.
testList = [1,2,3,4,5,6,7,8,9,10]
lambda x: x>5

Nyní můžeme zavolat filtr, který bude mít na vstupu naší proměnnou a lambda výraz. Pro ukázku si vytvoříme jednoduchý výraz, který vrátí logickou hodnotu True/False na základě testu, jestli je proměnná větší než hodnota 5. Jak si můžete z kódu všimnout, není nutné dávat žádnou podmínku, protože výraz x>5 rovnou vrací logický výsledek. Pro ukázku si vypíšeme i typ návratové hodnoty. Jak je možné si všimnout, tak to již není seznam, ale objekt typu filter.
filteredResult = filter(lambda x: x>5 , testList)
print (type(filteredResult))
Velice jednoduše můžeme výsledek proměnit opět v seznam, abychom se nám s ním lépe pracovalo.
finalList = list(filteredResult)
print(finalList)

Na obrázku níže je vidět výstup všech příkazů. Z výsledku je možné si všimnout, že nám funkce filter nevrátila všechny prvky, ale jen ty, které splňují naší podmínku.


Obrázek 1 – Filtrování s lambdou

Stejný výsledek bychom docílili cyklem, který projde všechny prvky a vybere jen ty, které splňují danou podmínku. Tento způsob má nevýhodu v mnohem delším a méně přehledném kódu. Ostatně – zhodnoťte sami.
testList = [1,2,3,4,5,6,7,8,9,10]
finalList = []

filterLambda = lambda x: x>5
for element in testList:
if filterLambda(element):
finalList.append(element)
print (finalList)


Výsledek je ovšem stejný. Viz obr. 2.


Obrázek 2 – Filtrace s cyklem

Vlastní funkce:
Místo lambdy můžeme použít také nějakou vlastní funkci. Pro ukázku vytvoříme kód, který dělá opět stejnou operaci. Projde list a vrátí prvky větší než 5. Nejprve si nadefinujeme funkci isGreater, která zkontroluje vstupní hodnotu a vrátí logickou hodnotu.
def isGreater(x):
return x>5

Nyní použijeme velice podobný přístup, jako u lambda výrazu. Zavoláme filtr, ale na vstup mu tentokrát místo lambdy dáme naší funkci.

testList = [1,2,3,4,5,6,7,8,9,10]

filteredList = list(filter(isGreater,testList))
print(filteredList)



Obrázek 3 – Filtrace s vlastní funkcí

Upozornění

Administrátor těchto stránek ani autor článků neručí za správnost a funkčnost zde uvedených materiálů.
Administrátor těchto stránek se zříká jakékoli odpovědnosti za případné ublížení na zdraví či poškození nebo zničení majetku v důsledku elektrického proudu, chybnosti schémat nebo i teoretické výuky. Je zakázané používat zařízení, která jsou v rozporu s právními předpisy ČR či EU.
Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva.
Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ.
10,013,458 návštěv