Ohjelmoinnin peruskurssien laaja oppimäärä

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 5. Timo Savola. 28. huhtikuuta 2006

815338A Ohjelmointikielten periaatteet

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Korpusten käsittely clt131, P Luento 5

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin peruskurssi Y1

Tutoriaaliläsnäoloista

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin perusteet Y Python

linux: Ympäristömuuttujat

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Hieman linkkejä: lyhyt ohje komentoriviohjelmointiin.

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 4. Timo Savola. 21. huhtikuuta 2006

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ohjelmoinnin peruskurssi Y1

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Korpusten käsittely clt131, P Luento 4

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Muistutus aikatauluista

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Algoritmit 1. Luento 3 Ti Timo Männikkö

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

linux linux: käyttäjän oikeudet + lisää ja - poistaa oikeuksia

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

2 Konekieli, aliohjelmat, keskeytykset

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta 5 Kerta 6 Kerta Toteuta Pythonilla seuraava ohjelma:

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Kieliteknologian ATK-ympäristö Neljäs luento

Ohjelmoinnin peruskurssien laaja oppimäärä

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmoinnin peruskurssi Y1

Tieto- ja tallennusrakenteet

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

linux linux: käyttäjän oikeudet + lisää ja - poistaa oikeuksia

Zeon PDF Driver Trial

Unix-perusteet. Unix/Linux-käyttöjärjestelmä ja sen ominaisuudet

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

linux: Prosessit kill PID lopettaa prosessin PID, jos siihen on oikeudet Ctrl + c lopettaa aktiivisen prosessin L7: linux

Ohjelmoinnin perusteet Y Python

Groovy. Samuli Haverinen, Aki Hänninen. 19. marraskuuta 2015

Ohjelmoinnin peruskurssien laaja oppimäärä

KESKI-SUOMEN MAAKUNNAN JA LÄHIKUNTIEN LUKIOIDEN TIETOTEKNIIKAN II KILPAILU

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin perusteet Y Python

Lyhyt kertaus osoittimista

Ohjelmoinnin peruskurssien laaja oppimäärä

Transkriptio:

Ohjelmoinnin peruskurssien laaja oppimäärä Luento 9: Suorituskyky, skriptausta, listaoperaatiot Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 28. 3. 2012

Sisältö 1 Suorituskyky ja prolointi 2 Skriptikieliä 3 Säännölliset lausekkeet 4 Pythonista: listaoperaatiot ja list comprehension -syntaksi

Suorituskyky Millainen on tehokas tai nopea ohjelma? Ei yksikäsitteistä vastausta. Nopeus Muistinkäyttö Vasteaika (nopea reagointi käyttäjän toimiin) Kuinka näitä voidaan mitata? Profilointi Koodin ja algoritmin analyysi Ο, Θ, Ω Kuinka niihin voi vaikuttaa? Hyvät algoritmit ja tietorakenteet Koodin optimointi 11:08 (ei-laajan kurssin kalvo: luento 11 sivu 3)

Lisää suorituskyvyn mittauksesta ohjelman käyttämää aikaa voi mitata monella tavalla: suoritusaika tai nopeus: tietty toiminto suoritetaan ajassa x vasteaika (response time, latency): syötteeseen vastataan (viimeistään) ajan d kuluttua läpäisy (throughput): järjestelmä pystyy jatkuvasti suorittamaan esim. m tapahtumaa sekunnissa (yhtäaikaisesti tai peräkkäin) joskus yhden näistä optimointi hidastaa toista reaaliajan lisäksi voidaan mitata resurssien kulutusta: toimintoon kuluu esim. x CPU-sekuntia laskenta-aikaa (tai: m tapahtumaa sekunnissa vie y% CPU:sta) ohjelma vie maksimissaan/keskimäärin n tavua muistia tai muita resursseja (levytilaa, energiaa, avoimia tiedostoja, tietokantakyselyitä, toisen järjestelmän käyttöä, jne.) mittaus kannattaa toistaa monta kertaa ja katsoa, muuttuuko se tulokseen vaikuttavat mm. muut käynnissä olevat ohjelmat, välimuisti ja käyttöjärjestelmän levypuskuri

Koodin prolointi proloija (proler) mittaa missä kohdissa ohjelma viettää aikaansa mittaa CPU-aikaa joko funktion tai koodirivin tarkkuudella mutta aina kaikki aika ei kulu ohjelmassa itsessään: esim. näytön päivitys voi hoitua toisten ohjelmien avulla toteutus yleensä: pysäytetään ohjelma säännöllisesti hetkeksi ja katsotaan missä se sillä hetkellä on myös käyttöjärjestelmä mittaa aina ohjelman suoritusaikaa sekä reaaliaikaa eli seinäkelloaikaa että laskenta- eli CPU-aikaa laskenta-aika on usein jaettu käyttäjän (user: ohjelman sisällä) ja järjestelmän (system: käyttöjärjestelmän sisällä) ajaksi loppuaika on yleensä muiden ohjelmien tai laitteiden odottelua näihin pääsee myös ohjelmasta (C getrusage, gettimeofday, Python resource- ja time-moduulit) työkaluja: Python: http://docs.python.org/library/profile.html C/C++: mm. gprof, perf Java: jprof

Koodin profilointi import cprofile...... def main(): app = QtGui.QApplication(sys.argv) ex = MyWindow() ex.start() exit_value = app.exec_() sys.exit(exit_value) if name == ' main ': # main() cprofile.run('main()', 'results') 11:08 (ei-laajan kurssin kalvo: luento 11 sivu 7)

Optimoi vasta lopuksi Optimointi monimutkaistaa koodia (ehkä) Luo uusia virheitä Vaikeuttaa ylläpidettävyyttä Vaikeuttaa jatkokehitystä / perintää Aina ei kannata optimoida Jos voitot ovat pieniä, ylläpidettävyys on tärkeämpää Mutta ensin ohjelma toimivaksi Eikä hitaus aina johdu omasta ohjelmasta Taustalla oleva tietokanta voi olla hitauden syynä Ennaltaehkäise: suunnittele hyvin 11:08 (ei-laajan kurssin kalvo: luento 11 sivu 5)

Sisältö 1 Suorituskyky ja prolointi 2 Skriptikieliä 3 Säännölliset lausekkeet 4 Pythonista: listaoperaatiot ja list comprehension -syntaksi

Mikä on skripti? skriptien tyypillisiä piirteitä: lyhyt ohjelma (jopa vain 1 rivi, harvoin yli 500) nopeasti tehty (minuuteista tunteihin) usein vain tekijän itsensä käyttöön tarkoitettu joskus kertakäyttöinen tai vain muutaman kerran käytettävä skripteillä tyypillisimmillään: käsitellään tekstimuotoista dataa esim. muodosta toiseen käytetään muita ohjelmia apuna: skripti käynnistää usein aliohjelmia (harvemmin käyttää vastaavia kirjastoja) tehdään yksittäinen korjaus tiettyyn tilanteeseen esimerkkejä: laajan tehtävistä: MP3-tehtävä, karttatehtävä, kuvaajatehtävä korjataan tiedostojen nimiä tai oikeuksia luetaan tekstitiedosto(i)sta tiettyjä kohtia ja tehdään niistä tiedoista esim. koostetaulukko käynnistetään jokin ohjelma ja alustetaan tilanne sopivaksi sitä varten (esim. /usr/bin/firefox on usein skripti)

Unix shell-skriptit (sh) shell-skriptit ovat Unixin tavallisen komentotulkin kielellä tehtyjä pieniä ohjelmia komentotulkkikieliä on useita, mutta skriptit tehdään lähinnä ns. Bourne/POSIX sh:lla (josta esim. bash on laajennus) käytetään eniten (Unix-)ylläpidossa ja mm. Linux-levitysten käynnistysskripteissä hyvää: sama kieli kuin interaktiivisessa komentotulkissa; helppo ajaa ja yhdistellä komentoja (eli muita ohjelmia); valmiina kaikissa Unixeissa puutteita: ei tietorakenteita; syntaksi menee vaikeaksi monimutkaisissa asioissa (aliohjelmien vuoksi useita syntakseja sisäkkäin); turvattomien merkkijonojen käsittelyssä pitää olla tarkkana; monta toteutusta, vain tietyt ominaisuudet toimivat kaikissa; toimii parhaiten Unixissa esimerkkejä: /usr/bin/firefox, /etc/init.d/x11-common ohje esim. http://tldp.org/ldp/abs/html/

Perl Perl-skriptikielen syntaksi muistuttaa mm. shell-skriptejä ja C:tä yhtenäisempi kieli kuin shell-skriptit (voi tehdä paljon enemmän kielen sisällä ilman apuohjelmia) paljon valmiita kirjastoja (kuten Pythonissakin) monipuolinen myös ohjelmointikielenä (esim. moduulit, oliot, ensimmäisen luokan funktiot, leksikaalinen ja dynaaminen sidonta, jne.), joskin välillä erikoinen erityisen hyvä säännöllisten lausekkeiden käsittelyssä (ja siis skripteissä, jotka käyttävät niitä paljon) puutteita esim: sisäkkäiset tietorakenteet hankalia käyttää, skriptikielenä ei tarkoitettu isoihin ohjelmiin usein shell-skripteistä siirrytään Perliin tai Pythoniin, kun komentotulkki ei enää riitä vanha skriptikieli AWK on vähän Perlin kaltainen, mutta yksinkertaisempi (käytetään yhdessä shell-skriptien kanssa) esimerkkejä: /usr/bin/shasum, gnome-terminal.wrapper ohje: esim. manuaalisivu man perlintro

Skriptaus Pythonilla Python toimii myös skriptikielenä ohjelman ja skriptin välillä ei ole tarkkaa rajaa Python ja Perl ovat skriptikielinä melko samankaltaisia eroja: Pythonissa on mm. parempi tuki tietorakenteille, Perlissä tiivimpää syntaksia mm. säännöllisiin lausekkeisiin ja aliohjelmien käynnistämiseen skriptaukseen sopivia kirjastoja löytyy molemmille paljon Python lienee parhaimmillaan skripteissä, jotka käsittelevät (suurta määrää, varsinkin sisäkkäistä) dataa jos skriptin pitää vain käynnistää muutama komento, shell-skripti tai Perl ovat yleisempiä ratkaisuja (mutta Pythonkin toimii) Python-skriptiä on ehkä muita kahta helpompi laajentaa oikeammaksi ohjelmaksi esim. lisätä graanen käyttöliittymä (tehdään joskus Perlissäkin) Python-skripti tuntuu pysyvän todennäköisemmin helppolukuisena hyvin pienissä skripteissä Python vaatinee vähän enemmän koodia sillä lyhennysmerkintöjä on vähemmän ja esim. yksi rivi ei riitä

Esimerkki Python-skriptistä: koneen yleisimmät prosessit Osa ps -ef -komennon tulostetta UID PID PPID C STIME TTY TIME CMD root 12502 576 0 Aug 29? 0:22 screen irssi root 17117 1612 0 Jul 07? 0:00 /usr/lib/ssh/sshd root 12077 1612 0 16:57:57? 0:00 /usr/lib/ssh/sshd Python-skripti import sys cmds = dict() hdr = sys.stdin.readline() ind = hdr.rfind(" CMD")+1 for l in sys.stdin: cmd = l[ind:].partition(" ")[0].strip() if cmd in cmds: cmds[cmd] += 1 else: cmds[cmd] = 1 Ajoesimerkki 500x ssh-agent 418x /bin/tcsh 416x screen 308x irssi 307x /usr/lib/ssh/ssh 123x -tcsh 96x ssh 65x /c/bin/zsh 40x pine 17x /c/bin/bash scmds = sorted(cmds.items(), key=lambda x: x[1], reverse=true) for c,v in scmds[:10]: print str(v)+"x "+c

Sisältö 1 Suorituskyky ja prolointi 2 Skriptikieliä 3 Säännölliset lausekkeet 4 Pythonista: listaoperaatiot ja list comprehension -syntaksi

Säännölliset lausekkeet säännöllinen lauseke (regular expression) on tapa kuvata hahmo, joka sopii tietynlaisiin merkkijonoihin esim. ab*c sopii merkkijonoihin ac, abc, abbc, jne. näitä käytetään tekstimuotoisen datan käsittelyssä esim. tunnistamaan tietynlaisia rivejä tai jakamaan rivi osiin niille on tukea melkein kaikissa ohjelmointikielissä skriptikielissä (varsinkin Perl) niille on lyhyempi syntaksi ja niitä käytetään enemmän valitettavasti lausekkeiden syntaksi vaihtelee hieman eri kielissä samoin monissa (ohjelmointi-)editoreissa sekä ohjelmien konguraatiotiedostoissa ja mm. grep-komentorivityökalussa editoreissa haku- ja korvaustoimintojen lisäksi mm. syntaksin väritys tehdään useimmiten säännöllisillä lausekkeilla säännöllisillä lausekkeilla ei voi tunnistaa kaikkea yleensä ei rekursiivisia rakenteita esim. ohjelmointikielistä avainsanoja mutta ei sisäkkäisyyttä

Säännöllisten lausekkeiden syntaksi useimmiten säännöllisiä lausekkeita käytetään hakemiseen lauseke kuvaa osaa etsittävästä tekstistä (usein rivistä) kirjaimet jne. tavalliset merkit sopivat itseensä esim. ab sopii vain merkkijonoon ab Yleisimmät erikoismerkinnät. mikä tahansa yksi merkki [a-f] yksi kirjaimista a,b,c,d,e,f [^a-f] mikä tahansa paitsi a,b,c,d,e,f * edellinen lausekkeen osa 0 kertaa + edellinen lausekkeen osa 1 kertaa? edellinen lausekkeen osa 0 tai 1 kertaa \? merkki? (samoin \*, \. jne.) ^ tämä kohta on rivin alussa $ tämä kohta on rivin lopussa {2,4} edellinen lausekkeen osa 24 kertaa (foo bar) joko hahmo foo tai bar (tämän syntaksi vaihtelee hieman)

Esimerkkejä syntaksista Esimerkkilausekkeita [a-z]*=[0-9]* sopii esim. width=42 ^[a-za-z]+ *= *[0-9]+$ myös width = 42 ^def *[a-za-z]+\(object\): def Box(object): (data/)?[a-z]+\.txt data/koe.txt ja koe.txt syntaksi vaihtelee hieman eri toteutuksissa huom. säännöllinen lauseke on eri asia kuin komentotulkin tiedostonimihahmot! (eli ns. glob-hahmot) siellä? = mikä tahansa merkki, * = 0 mitä tahansa merkkiä esim. foo/*.txt eikä foo/.*\.txt

Tekstin korvaaminen skripteissä säännöllisiä lausekkeita käytetään usein tekstin korvaamiseen tai osien irrottamiseen korvaavassa tekstissä voi viitata suluilla merkittyihin säännöllisen lausekkeen osiin (usein \1 on ensimmäinen osa jne.) esim. hahmossa ^([a-za-z]+) *= *([0-9]+)$ ja tekstissä width = 42 ensimmäinen osa on width ja toinen 42 esim. Perlissä width = 42:n voisi muuttaa muotoon set width to 42 Perl-lausekkeella s/^([a-za-z]+) *= *([0-9]+)$/set \1 to \2/ (syntaksi on s/ säännöllinen lauseke / korvaava teksti /) korvaamisen sijaan suluilla merkityt osat voi ottaa talteen muuttujiin

Säännölliset lausekkeet Pythonissa Pythonin re-paketissa on säännöllisten lausekkeiden käsittelyä: säännöllisiä lausekkeita voi hakea merkkijonoista funktioilla re.match (sopiiko alkuun), re.search (etsii mistä tahansa), re.findall ja re.finditer (löytävät kaikki esiintymät) re.split jakaa merkkijonon osiin, re.sub korvaa tekstiä toisella jos käyttää saamaa säännöllistä lauseketta paljon, re.compile:lla voi kääntää sen tehokkaampaan muotoon ohje: http://docs.python.org/howto/regex.html Esimerkkejä Python-tulkissa >>> import re >>> re.search("[a-z]*=[0-9]*", "abcde") # palauttaa None >>> re.search("[a-z]*=[0-9]*", " width=42asdf").group() 'width=42' >>> re.search("([a-z]*)=([0-9]*)", "width=42").group(2) '42' >>> re.split("[,.]? *", "Foo, bar ja baz.") ['Foo', 'bar', 'ja', 'baz', ''] >>> re.sub("^([a-za-z]+) *= *([0-9]+)$", "set \\1 to \\2", "width =42") 'set width to 42'

Sisältö 1 Suorituskyky ja prolointi 2 Skriptikieliä 3 Säännölliset lausekkeet 4 Pythonista: listaoperaatiot ja list comprehension -syntaksi

map def increment(value): return value + 1 def decrement(value): return value - 1 test_list = [1,2,3,4,5] print map(increment, test_list) print map(decrement, test_list) Soveltaa annettua funktiota jokaiseen läpikäytävän olion alkioon ja palauttaa tuloksena listan [2, 3, 4, 5, 6] Parametrina voi antaa useammankin läpikäytävän, jolloin funktion pitää hyväksyä yhtä monta parametria ja jokaisesta läpikäytävästä otetaan vastaava alkio. zip liittää yhteen parametrina saamiensa sarja- tai iteroitavatyyppisten läpikäytävien alkiot monikoiksi listaan l1 = [1, 2, 3] l2 = [4, 5, 6] print zip(l1, l2) [(1, 4), (2, 5), (3, 6)] def fahrenheit(t): return ((float(9) / 5) * T + 32) def celsius(t): return (float(5) / 9) * (T - 32) temp = (36.5, 37, 37.5,39) F = map(fahrenheit, temp) C = map(celsius, F) for f, c in zip(f, C): print f, c 14:45 (ei-laajan kurssin kalvo: luento 13 sivu 10)

filter Nimensä mukaisesti suodatin. Annettua funktiota sovelletaan jokaiseen annetun läpikäytävän alkioon alkio päätyy tuloslistaan, jos funktio palauttaa True. limit = 20 def is_prime(number): if number in [0, 1]: return False if number == 2: return True for divider in range(2, number): if number % divider == 0: return False return True primes = filter(is_prime, range(limit)) print primes [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,..., 19] [2, 3, 5, 7, 11, 13, 17, 19] False False True True 14:45 (ei-laajan kurssin kalvo: luento 13 sivu 11)

reduce Supistaa läpikäytävän yhdeksi arvoksi soveltamalla annettua funktiota jokaiseen alkion. Funktion täytyy ottaa 2 parametria. Hakee suurimman: f = lambda a,b: a if (a > b) else b print reduce(f, [47,11,42,102,13]) 102 Ehdollinen lauseke 47-11 47-42 47-102 102-13 print reduce(lambda a,d: 10*a+d, [1,2,3,4,5,6,7,8]) 12345678 10*1 + 2 10*12 + 3 10*123 + 4 10*1234 + 5 14:45 10*1234567 + 8 (ei-laajan kurssin kalvo: luento 13 sivu 12)

List comprehension Luo listan annettua sääntöä noudattaen result_list = [x**2 for x in range(10)] print result_list Tuottaa listan, jossa on lukujen neliöitä. Luvut saadaan forsilmukassa käymällä läpi range:n tuottama lista [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] result_list = [(x, y) for x in [1,2,3] for y in [3,1,4] if x!= y] print result_list [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] Sama kuin: result_list = [] for x in [1,2,3]: for y in [3,1,4]: if x!= y: result_list.append((x, y)) 14:45 (ei-laajan kurssin kalvo: luento 13 sivu 4)

Muistutus: accumulate:n variaatiot (syksyn luennolta 3) accumulate:sta eli fold-right:sta on peilikuva fold-left: (fold-right + 0 (list 1 2 3 4)) (+ 1 (+ 2 (+ 3 (+ 4 0)))) 10 (fold-left + 0 (list 1 2 3 4)) (+ (+ (+ (+ 0 1) 2) 3) 4) 10 ks. SICP-kirjan tehtävä 2.38 molemmista on vielä versiot, joissa ei ole init -alkiota, vaan sellaisena käytetään listan ensimmäistä tai viimeistä alkiota (reduce-right + (list 1 2 3 4)) (+ 1 (+ 2 (+ 3 4))) 10 (reduce-left + (list 1 2 3 4)) (+ (+ (+ 1 2) 3) 4) 10 Pythonin reduce on reduce-left

List comprehension -esimerkki Esimerkki: parittomien lukujen neliöiden summa (accumulate + 0 (map (lambda (x) (* x x)) (filter odd? (enumerate-interval 1 100)))) 166650 ;; Sama Pythonilla: reduce(lambda x,y: x+y, map(lambda x: x*x, filter(lambda x: x%2==1, range(1, 100)))) 166650

List comprehension -esimerkki Esimerkki: parittomien lukujen neliöiden summa (accumulate + 0 (map (lambda (x) (* x x)) (filter odd? (enumerate-interval 1 100)))) 166650 ;; Sama Pythonilla: reduce(lambda x,y: x+y, map(lambda x: x*x, filter(lambda x: x%2==1, range(1, 100)))) 166650 sum([ x*x for x in range(1, 100) if x%2==1 ]) 166650 list comprehension on lyhennysmerkintä useimmille map- ja filter-ketjuille Pythonin lisäksi esim. Haskell- ja Scala-kielissä, ei Schemessä lyhennysmerkintä ei auta reduce:en; yllä käytetty sum on vain Pythonin valmis funktio joka tekee saman kuin juuri tämä reduce