ESP32 / ESP8266 MicroPython: Použití filtru na seznamy
- August 04 2019
- Zdroje, měniče
- 653x Přečteno
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í