Ohjelmoinnin peruskurssi Y1

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Pythonilla. Teemu Sirkiä, 2015

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

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

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmoinnin perusteet Y Python

Python-ohjelmointi Harjoitus 2

Merkkijonon tutkiminen matches-metodilla

Algoritmit 2. Luento 3 Ti Timo Männikkö

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Luento 3 Ti Timo Männikkö

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op)

Luento 5. Timo Savola. 28. huhtikuuta 2006

Java-kielen perusteet

Algoritmit 2. Luento 6 Ke Timo Männikkö

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Ohjelmoinnin peruskurssi Y1

Sisältö. 22. Taulukot. Yleistä. Yleistä

7. Näytölle tulostaminen 7.1

Johdatus Ohjelmointiin

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Transkriptio:

Ohjelmoinnin peruskurssi Y1 CS-A1111 11.10.2017 CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 1 / 34

Mahdollisuus antaa luentopalautetta Luennon aikana voit kirjoittaa kommentteja ja kysymyksiä sivulle presemo.aalto.fi/opey1luento6 Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute. Tätä kautta on mahdollisuus antaa nimettömänä palautetta luennosta. Myös harjoitustehtävistä voi antaa palautetta palautuksen yhteydessä, mutta tämä palaute ei ole nimetöntä. CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 2 / 34

Oppimistavoitteet: tämän luennon jälkeen Tunnet lisää erilaisia tapoja käyttää listoja Python-ohjelmissa. Tunnet erilaisia tapoja käsitellä merkkijonoja. Osaat esimerkiksi vertailla merkkijonojen sisältöjä. Osaat tehdä ohjelmia, jotka käsittelevät tehokkaasti tilanteita, joissa tarvitaan avain arvo-pareja (esim. opiskelijarekisteri, puhelinluettelo) Lisää näihin aiheisiin liittyviä asioita esitellään opetusmonisteessa. Nämä luentokalvot eivät sisällä läheskään kaikkia kurssin asioita. CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 3 / 34

Alilistat Listasta voi ottaa helposti alilistoja (alkuperäisen listan osia): lista = [2, 4, 6, 8, 10, 12, 14, 16] alilista = lista[2:5] print(alilista) [6, 8, 10] Ensimmäinen tai viimeinen indeksi voidaan myös jättää pois: print(lista[:5]) [2, 4, 6, 8, 10] print(lista[5:]) [12, 14, 16] CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 4 / 34

Alkoita listan lopusta Negatiiviset indeksit tarkoittavat alkioita listan lopusta lähtien: lista = [2, 4, 6, 8, 10, 12, 14, 16] print(lista[-1]) 16 print(lista[:-1]) [2, 4, 6, 8, 10, 12, 14] CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 5 / 34

Listan järjestäminen ja kääntäminen Metodi sort järjestää listan: lista = [4, 6, 10, 16, 14, 2, -3, -5] lista.sort() print(lista) [-5, -3, 2, 4, 6, 10, 14, 16] Metodi reverse kääntää listan järjestyksen päinvastaiseksi. lista.reverse() print(lista) [16, 14, 10, 6, 4, 2, -3, -5] CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 6 / 34

Listasta järjestetty kopio Funktio sorted tekee listasta kopion ja järjestää tämän kopion. Alkuperäinen lista jää entiselleen: lista1 = [4, 6, 10, 16, 14, 2, -3, -5] lista2 = sorted(lista1) print("uusi lista:", lista2) print("alkuperainen lista:", lista1) Uusi lista: [-5, -3, 2, 4, 6, 10, 14, 16] Alkuperainen lista: [4, 6, 10, 16, 14, 2, -3, -5] CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 7 / 34

Listojen yhdistäminen Kaksi listaa voidaan yhdistää käyttämällä operaattoria +: lista1 = [1, 2, 3] lista2 = [4, 5, 6] yhteislista = lista1 + lista2 print(yhteislista) [1, 2, 3, 4, 5, 6] CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 8 / 34

Välitehtävä 1 Mitä seuraava ohjelma tulostaa? lista1 = [1, 2, 3] lista2 = [4, 5, 6] lista3 = lista2 + lista1 lista4 = lista3[1:4] lista4.sort() print(lista4[1]) CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 9 / 34

Merkkijonot Merkkijonojen avulla ohjelmassa voi esittää tekstitietoa, esim. nimiä, osoitteita ja erilaisia tunnuksia. Merkkijonon tyyppi Pythonissa on str. Yksittäisiä merkkejä varten ei ole omaa tyyppiä, vaan ne ovat yhden merkin pituisia merkkijonoja. Merkkijono esitetään yksin- tai kaksinkertaisten lainausmerkkien avulla. mjono = appelsiini mjono = "appelsiini" Useammalle riville jatkuva merkkijono kirjoitetaan kolmen lainausmerkin sisään. pitkajono = """Tama merkkijono sisaltaa useamman kuin yhden rivin""" CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 10 / 34

Merkkijonojen käsittely Merkkijonoja voidaan käsitellä monessa tapauksessa samalla tavalla kuin listoja: sana = "sitruuna" print(sana[3]) r Olennainen ero: merkkijonon sisältöä ei voi muuttaa sen jälkeen, kun merkkijono on luotu: sana[3] = a Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: str object does not support item assignment CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 11 / 34

Merkkijonon läpikäynti Merkkijonon merkit voi käydä läpi for-käskyn avulla samalla tavalla kuin listan alkiot: mjono = "matti" for merkki in mjono: print(merkki) m a t t i CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 12 / 34

Sijoitus merkkijonomuuttujaan Merkkijonon sisältöä ei voi muuttaa sen jälkeen, kun merkkijono on luotu. Voidaan kuitenkin tehdä uusi merkkijono ja sijoittaa se arvoksi vanhalle muuttujalle: mjono = "mansikka" print(mjono) mansikka "mansikka" mjono CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 13 / 34

Sijoitus merkkijonomuuttujaan Merkkijonon sisältöä ei voi muuttaa sen jälkeen, kun merkkijono on luotu. Voidaan kuitenkin tehdä uusi merkkijono ja sijoittaa se arvoksi vanhalle muuttujalle: mjono = "mansikka" print(mjono) mansikka mjono = "mustikka" print(mjono) mustikka "mansikka" mjono "mustikka" CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 13 / 34

Uusi merkkijono vanhan avulla Metodi upper luo uuden merkkijonon, jossa kaikki vanhan merkkijonon pienet kirjaimet on muutettu isoiksi: mjono = "Mustikka" mjono = mjono.upper() print(mjono) MUSTIKKA Metodi lower luo uuden merkkijonon, jossa kaikki vanhan merkkijonon isot kirjaimet on muutettu pieniksi: mjono = "MUSTIKKA" mjono = mjono.lower() print(mjono) mustikka CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 14 / 34

Merkkijonojen liittämiset Useampi merkkijono voidaan liittää peräkkäin +-operaattorilla. etunimi = "Matti" sukunimi = "Virtanen" kokonimi = etunimi + " " + sukunimi print(kokonimi) Matti Virtanen Jos merkkijonoon halutaan liittää muuntyyppisten muuttujien arvoja, pitää ensin suorittaa tyypinmuunnos str-operaattorilla. tunteja = 50 tuntip = 12.5 rivi = str(tunteja) + " h * " + str(tuntip) + " eur / h" print(rivi) 50 h * 12.5 eur / h CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 15 / 34

Merkkijonojen monistaminen Operaattorin * avulla voidaan tehdä merkkijono, joka sisältää pienemmän merkkijonon monta kertaa. merkit = "*!*" rivi = 5 * merkit print(rivi) *!**!**!**!**!* Rivinvaihdon saa mukaan erikoismerkillä "\n": rivit = 3 * (rivi + "\n") print(rivit) *!**!**!**!**!* *!**!**!**!**!* *!**!**!**!**!* CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 16 / 34

Erikoismerkkejä Merkkijonoihin on mahdollista liittää erikoismerkkejä (engl. escape characters), jotka aiheuttavat tulostuksessa esimerkiksi rivinvaihdon tai kursorin siirron seuraavaan tabulointikohtaan. Tärkeimpiä erikoismerkkejä: \n rivinvaihto \t tabulaattori \ yksinkertainen lainausmerkki \" kaksinkertainen lainausmerkki \\ yksi kenoviiva CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 17 / 34

Tyhjien merkkien poisto merkkijonon alusta ja lopusta Halutaan poistaa merkkijonon alusta ja lopusta ns. tyhjät merkit (välilyönnit, tabuloinnit, rivinvaihdot). Tämä on helppo tehdä metodin strip avulla: teksti = " \tjotain kirjoitusta " riisuttu_teksti = teksti.strip() print("alkuperainen: *{:s}*".format(teksti)) print("riisuttu: *{:s}*".format(riisuttu_teksti)) Alkuperainen: * jotain kirjoitusta * Riisuttu: *jotain kirjoitusta* Jos tyhjät merkit halutaan poistaan vain merkkijonon alusta tai lopusta, voidaan käyttää metodeita lstrip tai rstrip. CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 18 / 34

Merkkijonon jakaminen Halutaan jakaa merkkijono osiin jonkun merkin (esimerkiksi välilyönnin) kohdalta. Esimerkki: halutaan erottaa samalla rivillä annettu etunimi ja sukunimi tai sana ja sen käännös toiselle kielelle toisistaan. Merkkijono voidaan jakaa metodilla split. Se palauttaa listan, joka sisältää jaetun merkkijonon eri osat. Oletusarvoisesti split-metodi jakaa merkkijonon välilyönnin kohdalta, mutta metodin parametrilla voidaan määrätä merkki, jonka kohdasta jako tehdään. Jaossa käytetty merkki ei tule mukaan mihinkään osaan. CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 19 / 34

Merkkijonon jakaminen, esimerkkejä teksti = "Pitka teksti, joka sisaltaa monta sanaa." osat = teksti.split() print(osat) [ Pitka, teksti,, joka, sisaltaa, monta, sanaa. ] sanarivi = "kirja=book" kaannokset = sanarivi.split("=") print(kaannokset) [ kirja, book ] CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 20 / 34

Välitehtävä 2 Käyttäjältä luetaan merkkijono, joka sisältää yhden kilpailijan nimen sekä tämän kilpailijan pisteet kahdelta eri kilpailukierrokselta. Eri tiedot on erotettu toisistaan kauttaviivalla /. Kirjoita ohjelman osa, joka laskee kilpailijan yhteispisteet (molempien kierrosten pisteet yhteensä). Tämän jälkeen ohjelman pitää tulostaa kilpailijan nimi ja hänen yhteispisteensä. Esimerkki käyttäjän antamasta rivistä: Teemu Teekkari/25/15 CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 21 / 34

Merkkijonojen vertailu Merkkijonojen sisältöjä voi verrata toisiinsa vertailuoperaattoreilla ==,!=, <=, >=, < ja >. Tällöin verrataan merkkejä keskenään merkkijonojen alusta lähtien. Järjestyksen määrää kirjainten arvo käytetyssä merkkikoodausjärjestelmässä mitä lukuarvoa kukin kirjain vastaa. Käytännössä koodit noudattavat muuten aakkosjärjestystä, mutta isot kirjaimet ovat ennen pieniä ja skandinaaviset aakkoset eivät ole keskenään oikeassa järjestyksessä. CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 22 / 34

Esimerkkejä merkkijonojen vertailuista nimi1 = "matti" nimi2 = "teppo" print(nimi1 == nimi2) False print(nimi1 < nimi2) True nimi3 = "Teppo" print(nimi2 == nimi3) False CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 23 / 34

Esimerkkejä merkkijonojen vertailuista, jatkoa print(nimi3 < nimi2) True nimi1 = "matti" nimi4 = "matilda" print(nimi1 < nimi4) False CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 24 / 34

Sanakirja Halutaan tallentaan avain arvo-pareja. Myöhemmin rakenteesta pitää voida etsiä tiettyyn avaimeen liittyyvää arvoa. Esimerkkejä: puhelinluettelo, opiskelijarekisteri, yrityksen asiakasrekisteri, autorekisteri. Halutaan, että lisäys, poisto ja arvon muuttaminen ovat helppoja. Yksinkertainen ratkaisu: käytetään listaa, jonka alkoina on avain arvo-pareja. Ongelmia: Hidas haku Jos avaimia pidetään järjestyksessä, haku nopeutuu, mutta lisäys ja poisto hankaloituvat. Pythonissa on valmis rakenne, sanakirja (engl. dictionary), jossa sekä haut, lisäykset että poistot pystytään tekemään tehokkaasti. CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 25 / 34

Sanakirjan luonti ja käyttö Tyhjän sanakirjan voi luoda aaltosulkujen avulla: puh_luettelo = {} Sanakirjaa luodessa voi samalla jo antaa siihen liitettäviä avain arvo-pareja: puhelinluettelo = {"Teekkari Teemu" : "050-12345", \ "Fyysikko Tiina" : "045-234567", "Kemisti Kalle" : \ "040-765432"} Haluttuun avaimeen liittyvän arvon saa selville ilmauksella sanakirja[avain], esimerkiksi print(puhelinluettelo["fyysikko Tiina"]) 045-234567 CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 26 / 34

Sanakirja: avaimen haku ja olemassaolo Ohjelma voi kaatua, jos haettua avainta ei löydy sanakirjasta: print(puhelinluettelo["virtanen Maija"]) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: Virtanen Maija Operaattorin in avulla voi tutkia, onko haettava avain sanakirjassa: nimi = "Virtanen Maija" if nimi in puhelinluettelo: print(puhelinluettelo[nimi]) else: print("nimea ei loydy luettelosta") Nimea ei loydy luettelosta CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 27 / 34

Sanakirja: avainten lisääminen ja arvon muuttaminen Sijoituskäskyn avulla sanakirjaan voi lisätä uusia avain arvo-pareja ja muuttaa sanakirjassa jo oleviin avaimiin liittyviä arvoja. puhelinluettelo["rakentaja Niina"] = "0400-123" puhelinluettelo["kemisti Kalle"] = "041-56789" print(puhelinluettelo) { Fyysikko Tiina : 045-234567, Rakentaja Niina : 0400-123, Teekkari Teemu : 050-12345, Kemisti Kalle : 041-56789 } CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 28 / 34

Sanakirja: avainten läpikäynti Sanakirjan avaimet voi käydä läpi for-käskyn avulla. for nimi in puhelinluettelo: print(nimi) Teekkari Teemu Rakentaja Niina Kemisti Kalle Fyysikko Tiina for nimi in puhelinluettelo: print("{:16s} {:12s}".format( nimi, puhelinluettelo[nimi])) Teekkari Teemu 050-12345 Rakentaja Niina 0400-123 Kemisti Kalle 041-56789 Fyysikko Tiina 045-234567 CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 29 / 34

Sanakirja: avaimet järjestyksessä Sanakirjassa avain arvo-parit eivät ole avainten mukaan järjestyksessä, vaan järjestys perustuu taustalla olevan rakenteen toteutukseen. Funktio sorted palautttaa kuitenkin listan, joka sisältää parametrina annetun sanakirjan avaimet järjestyksessä. Itse sanakirja jää ennalleen. nimet_jarjestyksessa = sorted(puhelinluettelo) for nimi in nimet_jarjestyksessa: print("{:16s} {:12s}".format( nimi, puhelinluettelo[nimi])) Fyysikko Tiina 045-234567 Kemisti Kalle 041-56789 Rakentaja Niina 0400-123 Teekkari Teemu 050-12345 CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 30 / 34

Sanakirja: avaimen poistaminen Sanakirjasta voi poistaa avaimen ja siihen liittyvän arvon del-operaattorilla: del puhelinluettelo["kemisti Kalle"] print(puhelinluettelo) { Rakentaja Niina : 0400-123, Fyysikko Tiina : 045-234567, Teekkari Teemu : 050-12345 } CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 31 / 34

Esimerkki: puhelinluettelo Seuraavassa esimerkkiohjelmassa käyttäjä syöttää ensin haluamansa määrän nimiä ja puhelinnumeroita sanakirjarakenteen avulla toteutettuun puhelinluetteloon. Tämän jälkeen käyttäjä voi hakea luettelosta viiteen nimeen liittyvät puhelinnumerot. Käytännössä puhelinluettelon tiedot kannattaisi lukea tiedostosta, niin ne olisivat käytössä ohjelman suorituskerrasta toiseen. Opetusmonisteessa on vähän laajempi versio samasta esimerkistä. CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 32 / 34

Puhelinluettelo, koodi def lue_puhelinnumerot(): print("anna lisattavat nimet ja numerot.") print("nimi ja puhelinnumero samalla rivilla,") print("valissa kaksoispiste.") print("lopeta tyhjalla rivilla.") puhelinluettelo = {} rivi = input() while len(rivi) > 0: tiedot = rivi.split(":") nimi = tiedot[0] numero = tiedot[1] puhelinluettelo[nimi] = numero rivi = input() return puhelinluettelo CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 33 / 34

Puhelinluettelo, koodi jatkuu def etsi_numero(puhelintiedot): etsitty = input("kenen numero haetaan? ") if etsitty in puhelintiedot: print("numero on", puhelintiedot[etsitty]) else: print("nimea ei loydy luettelosta.") def main(): luettelo = lue_puhelinnumerot() for i in range(5): etsi_numero(luettelo) main() CS-A1111 Ohjelmoinnin peruskurssi Y1 11.10.2017 34 / 34