Siirry sisältöön

Python 3/Korkeamman asteen funktiot

Wikikirjastosta


Korkeamman asteen funktioiksi sanotaan funktioita, jotka joko ottavat argumentteinaan yhden tai useamman funktion tai palauttavat funktion. Korkamman asteen funktioita käytetään paljon funktionaalisessa ohjelmoinnissa. Pythonissa on mahdollista käyttää korkeamman asteen funktioita. Monesti ne tekevät koodista helppolukuisempaa.

Sisäänrakennettu funktio map ottaa argumenteikseen funktion func ja yhden tai useamman iteroitavissa olevan olion kuten listan ja palauttaa arvot, jotka saadaan, kun funktiota func kutsutaan jokaiselle annetun listan arvolle. Huomaa, että map ei palauta listaa, vaan iteraattorin, joka on myös nimeltään map. Iteraattori muutetaan tässä erikseen listaksi list-funktiolla. Lambda on lyhyt nimetön funktio. Niitä käsiteltiin osiossa Funktio » Lambdat. Yhtä hyvin voisi käyttää tavallista funktiota. Iteraattoreita käsitellään olio-ohjelmointia käsittelevässä luvussa.

>>> list(map(lambda x: x**2, [1, 2, 3, 4, 5]))
[1, 4, 9, 16, 25]

Jos listoja tai muita iteroitavia on useampia, annetaan funktiolle func argumenteiksi vastaavat alkiot jokaisesta niistä.

>>> list(map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6]))
[5, 7, 9]

Map-iteraattorin arvoja ei tietenkään tarvitse aina muuttaa listaksi, vaan ne voi myös iteroida lävitse.

for tulos in map(lambda x: x**2, [1, 2, 3, 4, 5]):
    print(tulos)

Tulostaa:

1
4
9
16
25


Tarkasti sanoen map-objekti kutsuu funktiota func vasta siinä vaiheessa, kun arvot luetaan siitä. Esimerkiksi, kun se muutetaan listaksi. Yleensä map-funktiota käytetään vain funktioilla, joilla ei ole sivuvaikutuksia, jolloin tällä ei ole muuta merkitystä kuin, että funktiota ei kutsuta turhaan, jos kaikkia tuloksia ei tarvita.

Sisäänrakennettu funktio filter ottaa parametrikseen funktion func ja iteroitavissa olevan olion esimerkiksi listan, ja palauttaa ne alkio, joille funktio func palauttaa True.

>>> list(filter(lambda x: x % 2 == 1, [1, 2, 3, 4, 5]))
[1, 3, 5]

Kuten map myös filter palauttaa iteraattorin, jolla voi käydä läpi tulokset.

Sisäänrakennettu funktiolle sorted voi antaa valinnaisena parametrina key funktion, joka palauttaa jokaiselle arvolle erikseen kutsuttuna arvon lajitteluavaimen. Sorted vastaa muuten list-tyypin sort-metodia, mutta palauttaa aina uuden listan, kun taas sort järjestää alkuperäisen listan.

Key-parametrille annetaan funktio, joka ottaa argumentikseen yksittäisen listan alkion ja palauttaa sille arvon jota käytetään alkioiden järjestyksen määräämiseen (mutta jota ei käytetä tuloslistassa). Funktio voi esimerkiksi muuttaa annettua arvoa tai hakea sen lajitteluavaimen jostakin. Tässä lajitteluavaimeksi annetaan listan alkio, josta isot kirjaimet muutetaan pieniksi ja josta poistetaan välit ja väliviivat.

>>> termit = [ "paikka-arvo", "paikkavaraus", "paikka paikoin", "Paikkala" ]
>>> sorted(termit, key=lambda x: x.lower().replace(" ", "").replace("-", ""))
['paikka-arvo', 'Paikkala', 'paikka paikoin', 'paikkavaraus']

Lisäksi sorted-funktiolle voi antaa parametrin reverse=True, jos lista halutaan lajitella lopusta alkuun.

>>> sorted(termit, key=lambda x: x.lower().replace(" ", "").replace("-", ""), reverse=True)
['paikkavaraus', 'paikka paikoin', 'Paikkala', 'paikka-arvo']

Pythonin aiemmassa versiossa sisäänrakennettu funktio reduce on Python 3:ssa siirretty functools-moduuliin, jossa on joitakin muitakin funktionaalisen ohjelmoinnin työkaluja.

Reduce ottaa kolme argumenttia: kaksiparametrisen funktion, iteroitavissa olevan olion, kuten listan sekä valinnaisen alkuarvon, ja palauttaa yhden arvon, joka saadaan, kun annettua funktiota kutsutaan edellisellä tuloksella tai alkuarvolla ja listan alkiolla. Esimerkiksi kaikkien listan alkioiden summaus voitaisiin tehdä näin. Tässä acc on edellisen tulos (tai alkuarvo ensimmäisen kohdalla).

>>> from functools import reduce
>>> reduce(lambda acc, x: acc + x, [1, 2, 3, 4, 5], 0)
15

Lauseke vastaa siis lauseketta (((1 + 2) + 3) + 4) + 5.