map, filter, reduce
Rakentakaa korkeamman asteen apufunktioita.
map, filter, reduce on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.
Kolme tärkeintä
Map, filter ja reduce ovat funktionaalisen listankäsittelyn keskeiset työkalut. Jokainen niistä ottaa listan ja funktion ja palauttaa tuloksen ilman, että teidän tarvitsee kirjoittaa silmukkaa itse.
Lua ei sisällä niitä valmiiksi, mutta ne ovat lyhyitä kirjoittaa ja havainnollistavat korkeamman asteen funktioiden toimintaa.
Map: Muuntakaa jokainen alkio
Map soveltaa funktiota jokaiseen alkioon ja kerää tulokset uudeksi listaksi. Alkuperäinen lista säilyy muuttumattomana.
Välittämänne funktio määrittää muunnoksen, joten yksi map käsittelee kaksinkertaistamisen, neliöimisen ja kaiken muun alkioittain tehtävän muokkauksen.
local function map(t, f)
local out = {}
for i, v in ipairs(t) do
out[i] = f(v)
end
return out
end
local r = map({1, 2, 3}, function(x) return x * x end)
print(table.concat(r, ", "))Map säilyttää pituuden
Map palauttaa aina yhtä monta alkiota sisältävän listan kuin syötteenä saatu lista. Jokainen alkio muunnetaan täsmälleen yhdeksi tulosalkioksi.
Jos alkioita pitää poistaa, siihen käytetään filteriä, ei mapia.
local function map(t, f)
local out = {}
for i, v in ipairs(t) do out[i] = f(v) end
return out
end
local names = {"ada", "lin", "sam"}
local caps = map(names, string.upper)
print(table.concat(caps, " "))
print(#caps)Filter: Säilyttäkää valitut alkiot
Filter säilyttää vain alkiot, joiden predikaatti palauttaa arvon true. Predikaatti on funktiona toteutettu ehto, joka palauttaa totuusarvon.
Tulos on uusi lista, joka voi olla alkuperäistä lyhyempi mutta ei koskaan sitä pidempi.
local function filter(t, pred)
local out = {}
for _, v in ipairs(t) do
if pred(v) then out[#out + 1] = v end
end
return out
end
local evens = filter({1,2,3,4,5,6}, function(x) return x % 2 == 0 end)
print(table.concat(evens, ", "))Filter säilyttää järjestyksen
Filter käy listan läpi järjestyksessä ja lisää jokaisen säilytettävän alkion tulokseen, joten jäljelle jäävät alkiot pysyvät alkuperäisessä järjestyksessä.
Indeksin #out + 1 käyttäminen pitää tuloksen aukottomana taulukkona, jota Lua käsittelee asianmukaisena sekvenssinä.
local function filter(t, pred)
local out = {}
for _, v in ipairs(t) do
if pred(v) then out[#out + 1] = v end
end
return out
end
local long = filter({"hi", "hello", "yo", "howdy"},
function(s) return #s > 2 end)
print(table.concat(long, ", "))Reduce: Yhdistäkää yhdeksi arvoksi
Reduce, josta käytetään myös nimeä fold, tiivistää listan yhdeksi arvoksi. Se ylläpitää kertymäarvoa ja yhdistää sen jokaiseen alkioon antamanne funktion avulla.
Annatte lähtöarvon ja yhdistämisfunktion, ja reduce kuljettaa kertymäarvoa jokaisen alkion läpi.
local function reduce(t, f, acc)
for _, v in ipairs(t) do
acc = f(acc, v)
end
return acc
end
local sum = reduce({1,2,3,4}, function(a, x) return a + x end, 0)
print(sum)Reduce on joustava
Yhdistämisfunktiota ja lähtöarvoa vaihtamalla reduce voi laskea summan tai tulon, etsiä maksimiarvon tai rakentaa merkkijonon.
Tässä kertymäarvo alkaa arvosta 1 ja sitä kerrotaan jokaisella kierroksella, jolloin tuloksena on kertoman kaltainen tulo.
local function reduce(t, f, acc)
for _, v in ipairs(t) do acc = f(acc, v) end
return acc
end
local product = reduce({1,2,3,4,5}, function(a, x) return a * x end, 1)
print(product)Maksimiarvon etsiminen reducella
Reduce ei rajoitu aritmetiikkaan. Yhdistämisfunktio voi vertailla arvoja ja säilyttää joka vaiheessa suuremman arvon.
Kun kertymäarvoksi asetetaan ensimmäinen alkio tai hyvin pieni luku, reduce löytää maksimiarvon selkeästi.
local function reduce(t, f, acc)
for _, v in ipairs(t) do acc = f(acc, v) end
return acc
end
local max = reduce({3, 8, 2, 11, 6},
function(a, x) if x > a then return x else return a end end, -math.huge)
print(max)Yhdistäkää ne ketjuksi
Kolmen työkalun todellinen voima tulee esiin, kun yhdistätte ne ketjuksi. Filter rajaa dataa, map muuntaa sitä ja reduce tiivistää sen.
Jokainen vaihe on pieni ja selkeä, ja yhdessä ne korvaavat sekavan käsin kirjoitetun silmukan.
local function filter(t, p) local o={} for _,v in ipairs(t) do if p(v) then o[#o+1]=v end end return o end
local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local function reduce(t, f, a) for _,v in ipairs(t) do a=f(a,v) end return a end
local nums = {1,2,3,4,5,6}
local r = reduce(map(filter(nums, function(x) return x%2==0 end),
function(x) return x*x end), function(a,x) return a+x end, 0)
print(r)Alkuperäiset säilyvät muuttumattomina
Map ja filter rakentavat aina uudet taulukot eivätkä koskaan muuta syötettä. Tämä tekee käsittelyketjuista ennakoitavia: aiemmat tiedot ovat edelleen käytettävissä jokaisen vaiheen jälkeen.
Myös reduce jättää listan muuttamatta ja palauttaa vain yhdistetyn tuloksen.
Yleiskäyttöinen kaikille listoille
Koska funktio on parametri, nämä työkalut toimivat millä tahansa datalla. Sama map muuttaa merkkijonot isoiksi kirjaimiksi, skaalaa hinnat tai muotoilee tietueet.
Silmukan kirjoittaminen kerran ja eri funktioiden välittäminen on juuri se syy, miksi ensimmäisen luokan funktiot ovat niin hyödyllisiä.
local function map(t, f) local o={} for i,v in ipairs(t) do o[i]=f(v) end return o end
local prices = {10, 20, 30}
local withTax = map(prices, function(p) return p * 1.18 end)
print(table.concat(withTax, ", "))Pikatarkistus
Miettikää, miten nämä operaatiot vaikuttavat listan pituuteen.
Kertaus
Map muuntaa jokaisen alkion ja säilyttää pituuden, filter säilyttää predikaatin läpäisevät alkiot, ja reduce yhdistää listan yhdeksi arvoksi kertymäarvon avulla.
Filterin, mapin ja reducen ketjuttaminen muodostaa selkeitä datan käsittelyketjuja ilman käsin kirjoitettuja silmukoita, ja alkuperäiset taulukot säilyvät muuttumattomina.
Opi Lua tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 40
- Oppitunnit
- 159
Usein kysytyt kysymykset
Onko oppitunti ”map, filter, reduce” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “map, filter, reduce”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”map, filter, reduce”?
Rakentakaa korkeamman asteen apufunktioita. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”map, filter, reduce”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?
Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Funktiot arvoina
- map, filter, reduce
- Osittainen soveltaminen
- Funktioiden koostaminen