Shoutbox

Pro přidání zprávy se musíte přihlásit.

27-06-2019 12:54
ESP32 v IDF se dá programovat v PlatformIO Úsměv

28-04-2019 22:48
Hm, nenašel jsem...

26-04-2019 18:00
Nevíte někdo v čem programovat ESP32 - IDF pod Win bez příkazové řádky?

16-04-2019 11:17
Ahoj vespolek, bavím se čtením signálu pro modelářské servo pomocí Microchip PIC s použitím CCP (capture every edge). ... a-ha, text je omezen na malou délku ...

09-04-2019 01:36
Prosim zahlasujte za moje projekty v Hackaday prize 2019 https://hackaday..
..cker/13133
Diky moc Mrknutí

23-02-2019 16:38
Už jsem ho našel Úsměv Ten zelený zákal je sviňa.

Sdílejte nás



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í
Zatím nikdo nekomentoval. Buďte první kdo vloží svůj komentář.

Přidat komentář

Pro přidání komentáře musíte být přihlášený.

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.