530 likes | 545 Views
Tekninen viestintä 12.02.2013. Ohjelmointia teknisille viestijöille. TAPAHTUI VIIME JAKSOSSA. while -silmukka on yksi Pythonin sisäänrakennetuista silmukkarakenteista while -silmukka toistaa jotain tiettyä tehtävää, kunnes silmukasta poistumiseen vaadittava ehto täyttyy.
E N D
Tekninen viestintä12.02.2013 Ohjelmointia teknisille viestijöille
TAPAHTUI VIIME JAKSOSSA • while-silmukka on yksi Pythonin sisäänrakennetuista silmukkarakenteista • while-silmukka toistaa jotain tiettyä tehtävää, kunnes silmukasta poistumiseen vaadittava ehto täyttyy nimi = input("Kerro nimesi: ").strip() while nimi == "": nimi = input("Nimi ei voi olla tyhjä. Kerro nimesi: ").strip()
TAPAHTUI VIIME JAKSOSSA • Silmukan ehtona voi olla myös käyttäjältä kerättävien tietojen määrä: kurssit = [] print("Kerro kurssi, jolle haluat osallistua. Sinun tulee syöttää yhteensä viisi kurssia.") kurssi = input("Syötä kurssi: ") kurssit.append(kurssi) whilelen(kurssit) < 5: kurssi = input("Syötä kurssi: ").strip() kurssit.append(kurssi)
TAPAHTUI VIIME JAKSOSSA • Silmukan ehtoja voi tarkentaa tarvittaessa loogisten operaattoreiden avulla: • salasana = "idkfa" • arvaus = input("Syötä salasana: ").strip() • yritykset = 0 • while arvaus != salasana and yritykset < 5: • arvaus = input("Syötä salasana: ").strip() • yritykset = yritykset + 1
Tekninen viestintä12.02.2013 for-silmukka
FOR-SILMUKKA • for-silmukka on toinen Pythonin silmukkarakenteista • For-silmukka rakentuu muuttujasta ja sarjasta • For-silmukkaa käytetään tavallisesti silloin kun ohjelmassa halutaan tarkastella jonkun sarjan jokaista elementtiä ja suorittaa kullekin elementille joku toiminto.
FOR-SILMUKKA • Kun for-silmukkaa suoritetaan, ensimmäisellä suorituskerralla for-silmukan muuttuja saa arvokseen sarjan ensimmäisen arvon ja seuraavilla suorituskerroilla sarjan seuraavana vuorossa olevan arvon • For-silmukan suorituskertoja on helppo hallita silmukassa käytettävän sarjan pituutta muokkaamalla
FOR-SILMUKKA • Jos haluat tulostaa luvut 1-10, voit tehdä sen tulostamalla numerot peräkkäisillä print-komennoilla... print(1) print(2) print(3) . . . print(9) print(10)
FOR-SILMUKKA • ...tai voit luoda sarjan, jossa on numerot 1-10 ja luoda sen avulla for-silmukan for i in range(1,11): print(i)
FOR-SILMUKKA • for-silmukan määrittävä lause for i in range(1,11) antaa Pythonille seuraavat ohjeet: • Luo range-funktiolla sarja, joka sisältää numerot 1, 2, 3, 4, 5, 6, 7, 8, 9 ja 10 • Tallenna aluksi sarjan ensimmäinen luku, 1, muuttujaan i • Suorita silmukkaan liittyvä sisennetty ohjelmalohko • Kun sisennetty ohjelmalohko on suoritettu, tallenna sarjan seuraava luku muuttujaan i
FOR-SILMUKKA • Kun muuttujaan i on tallennettu sarjan senhetkinen arvo, arvoa voi käyttää sisennetyssä ohjelmalohkossa for i in range(1,11): print(i) for i in range(1,11): print(i * 5)
FOR-SILMUKKA • Jos haluat vain toistaa tietyn tehtävän esim. kymmenen kertaa, voit käyttää range()-funktiossa vain yhtä parametria • Jos range()-funktioon syöttää vain pääteparametrin, funktio palauttaa sarjan joka alkaa nollasta ja päättyy ennen pääteparametria for i in range(10): print(i) >>> 0 >>> 1 >>> 2 >>> 3 >>> 4 >>> 5 >>> 6 >>> 7 >>> 8 >>> 9
FOR-SILMUKKA • Toiston avulla voidaan suorittaa esim. laskutoimituksia, joissa arvo kasvaa tasaisesti jyvat = 1 yhteensa = 0 for ruutu in range(1, 65): print("Ruudussa {} on {} jyvää".format(ruutu, jyvat)) yhteensa += jyvat #TAI yhteensa = yhteensa + jyvat jyvat = jyvat * 2 print ("Jyvia kertyi yhteensa {}".format(yhteensa))
FOR-SILMUKKA • Sarjaa määritettäessä käytettävän muuttujan nimen voi valita vapaasti • Myös sarja voi olla mikä tahansa Pythonin sarjatyypeistä • Koska merkkijonot ovat sarjoja, myös niitä voi käydä läpi merkki kerrallaan for-silmukan avulla for kirjain in "abcd": print (kirjain) for ostos in ("Maito", "Juusto", "Pekoni", "Nuudelit"): print(ostos)
FOR-SILMUKKA • Sanakirjoja voi myös tarkastella for-silmukassa • Tällöin apuna täytyy käyttää sanakirjan keys()-funktiota, jolla sanakirjan avaimet saa muokattua sarjaksi sankarit = { "Marvel": ["Wolverine","Hawkeye","Musta Leski","Deadpool"], "DC": ["Batman", "Ihmenainen", "Flash", "Robin"]} for key in sankarit.keys(): print (sankarit[key])
FOR-SILMUKKA • Jos sanakirjaan on tallennettu listoja (eli sarjoja), näiden sisältöä voi tarkastella laatimalla sisäkkäisen for-silmukan sankarit = { "Marvel":["Wolverine","Hawkeye","Musta Leski","Deadpool"], "DC": ["Batman", "Ihmenainen", "Flash", "Robin"], "Dark Horse":["Hellboy","Abe Sapien", "Miyamoto Usagi"]} for key in sankarit.keys(): print("{}-sankarit:".format(key)) for sankari in sankarit[key]: print(sankari) print("")
FOR-SILMUKKA • Sisäkkäisissä for-silmukoissa sisempi silmukka suoritetaan kokonaan aina kun ulommassa silmukassa siirrytään yksi askel eteenpäin key: "Marvel" sankari: "Wolverine" sankari: "Hawkeye" sankari: "Musta Leski" sankari: "Deadpool" key: "DC" sankari: "Batman" sankari: "Ihmenainen" sankari: "Robin" sankari: "Flash" key: "Dark Horse" sankari: "Hellboy" sankari: "Abe Sapien" sankari: "Miyamoto Usagi"
FOR-SILMUKKA • for-silmukoissa voi käyttää myös ehtolauseita käsiteltävän sarjan tarkastelun apuna # De-vokalisaattori VOKAALIT = "aieouyäö" # vakiot merkitään isoilla kirjaimilla alkuSana = input("Syötä sana, josta haluat poistaa vokaalit: ") uusiSana = "" for kirjain in alkuSana: if kirjain not in VOKAALIT: uusiSana = uusiSana + kirjain # tai uusiSana += kirjain print (uusiSana)
Miniprojekti: konttikääntäjä • Johtaja Mahamies haluaa oppia puhumaan kontinkieltä voidakseen loistaa pikkujouluissa • Jotta homma onnistuisi, johtaja tarvitsee ohjelman, joka kääntää lauseita kontinkielelle • Laaditaan ohjelma split()-funktiota apuna käyttäen • sanat = "Tässä on muutaman sanan lause" • sanalista = sanat.split() • ["Tässä", "on", "muutaman", "sanan", "lause"]
HARJOITUS: FOR-SILMUKKA • Laadi ohjelma, joka: • pyytää käyttäjää syöttämään tekstin • pyytää käyttäjää kertomaan kuinka monta kertaa teksti tulisi tulostaa • tulostaa tekstin niin monta kertaa kuin käyttäjä tahtoi
HARJOITUS: FOR-SILMUKKA • Laadi ohjelma, joka: • pyytää käyttäjää syöttämään viisi ostoslistalle lisättävää ostosta • tallentaa käyttäjän syöttämät ostokset ostoslistalle • järjestelee ostoslistan aakkosjärjestykseen • tulostaa numeroidun ostoslistan • Esim: >>> 1. Maitoa >>> 2. Strutsi >>> 3. Kumiankka >>> ...
HARJOITUS: FOR-SILMUKKA • Laadi FizzBuzz-ohjelma, eli ohjelma joka tulostaa luvut 1-50, mutta: • Tulostaa tekstin "Fizz", jos luku on jaollinen kolmella • Tulostaa tekstin "Buzz", jos luku on jaollinen viidellä • Tulostaa tekstin "FizzBuzz", jos luku on jaollinen kolmella ja viidellä
Tekninen viestintä12.02.2013 Tiedostojen tutkailu
OS-MODUULI • os-moduuli on Python-moduuli, jonka avulla ohjelmissa voi käyttää käyttöjärjestelmän komentoja • os-moduulissa on aliohjelmia, joiden avulla ohjelmasi voi esim. luoda ja poistaa hakemistoja, ja lukea hakemistojen sisältöjä • Tämän lisäksi os-moduuli sisältää path-moduulin, jossa on hakemistopolkujen käsittelyyn liittyviä aliohjelmia
OS-MODUULI • Tietyssä hakemistossa olevien tiedostojen listaaminen onnistuu listdir()-funktion avulla • listdir()-funktio palauttaa käyttäjälle listan parametrina annetun hakemiston tiedostoista ja alihakemistoista import os hakemisto = os.listdir(".") for tiedosto in hakemisto: print(tiedosto)
OS-MODUULI • listdir()-aliohjelman parametrina voit käyttää joko absoluuttista tai suhteellista polkua ABSOLUUTTINEN POLKU: C:\Python34\test.py X:\TECHS5\Harjoitukset\teht4c.py SUHTEELLINEN POLKU: . - tämänhetkinenhakemisto .. - Jos ohjelmasuoritetaanhakemistossa c:\test\python, tarkoittaahakemistoa c:\test sub1\sub2 - tarkoittaatämänhetkisenhakemistonalihakemistonsub1 alihakemistoasub2 ..\sub1 - Jos ohjelmasuoritetaanhakemistossa C:\test\python, tarkoittaahakemistoa c:\test\sub1
OS-MODUULI • Python sallii tiedostoihin viittaamisen suoraan merkkijonon avulla: • Jotta ohjelma olisi helpompi siirtää käyttöjärjestelmästä toiseen, tämä tapa ei kuitenkaan ole suositeltava. • Windows-järjestelmissä kenoviiva on hakemistopolkujen erotin, mutta *nix-järjestelmissä hakemistopolkujen erottimena käytetään vinoviivaa tiedosto = open ("c:\\hakemisto\\tiedosto.txt")
OS-MODUULI • os-moduulin os.sep-komponentti tuottaa haluttuun kohtaan käyttöjärjestelmäkohtaisen hakemistopolun erottimen • Hakemistopolun saa määritettyä myös os.path-moduulin join() –aliohjelman avulla import os polku = "C:" + os.sep + "Python34" + os.sep + "test.py" import os,os.path polku = os.path.join("C:",os.sep,"Python34", "test.py")
TIEDOSTOJEN LUKEMINEN • Tekstitiedostoja voi avata open()-funktiolla • Oletuksena tiedosto avataan vain luku-tilassa • Tilan, jossa tiedosto avataan, voi määrittää lisäparametrin avulla: tiedostonimi = os.path.join("c:",os.sep,"jokuteksti.txt") tiedosto = open (tiedostonimi) tiedostonimi = os.path.join("c:",os.sep,"jokuteksti.txt") tiedosto = open (tiedostonimi, "r") - Vain luku tiedosto = open (tiedostonimi, "w") - Kirjoitus tiedosto = open (tiedostonimi, "a") - Lisäys
TIEDOSTOJEN LUKEMINEN • Jos avaat kirjoitustilassa tiedoston, jossa on jo jotain sisältöä, Python kirjoittaa määrittämäsi tekstirivit olemassaolevan sisällön päälle • Jos haluat säästää aiemman sisällön, muista avata tiedosto lisäystilassa.
TIEDOSTOJEN LUKEMINEN • Pythonin näkökulmasta open()-funkiolla avattu ja muuttujaan tallennettu tiedosto on sarja - sen voi siis lukea for-silmukan avulla • Sarjan elementtejä ovat esim. tekstitiedoston yksittäiset rivit: tiedostoNimi = os.path.join("c:",os.sep,"jokuTiedosto.txt") munTiedosto = open(tiedostoNimi, "r") for rivi in munTiedosto: print (rivi)
TIEDOSTOON KIRJOITTAMINEN • write() on perusfunktio, jolla voit kirjoittaa tekstiä tiedostoon. • write()-funktio vaatii, että tiedosto, johon kirjoitetaan on avattu kirjoitus- tai lisäystilassa • write()-funktiota käytettäessä tulee rivinvaihto lisätä \n -erikoismerkillä filename = os.path.join("c:",os.sep,"docs","gradu.txt") newFile = open(filename, "w") newFile.write("Smort sentence with original thoughts.\n") newFile.write("Anothersmort sentence.\n") newFile.close()
TIEDOSTOON KIRJOITTAMINEN • Kun tiedosto on kirjoitettu tai luettu, eikä sitä enää tarvita, tulee tiedosto sulkea close()-aliohjelmalla, jottei tiedosto jää turhaan muistiin: • Jos tiedostoa ei suljeta, Python ei välttämättä kirjoita kaikkea tekstiä tiedostoon filename = os.path.join("c:",os.sep,"docs","gradu.txt") newFile = open(filename, "w") newFile.write("Smort stuff\n") newFile.close()
TIEDOSTOJEN POISTAMINEN • Tiedostojen poistaminen onnistuu remove()-funktion avulla: import os,os.path tiedosto = os.path.join("c:", os.sep, "Python34", "tiedosto.txt") os.remove(tiedosto)
VIRHEIDEN VÄISTELY • Jos yrität lukea sisältöä tiedostosta, jota ei ole olemassa, Python muistaa sinua virheilmoituksella • Tiedoston olemassaolon voi Pythonissa tarkistaa os.path-moduulista löytyvän exists()-funktion avulla: import os, os.path tiedosto = os.path.join("c:", os.sep, "temp", "tiedosto.txt") ifos.path.exists(tiedosto): file = open(tiedosto)
VIRHEIDEN VÄISTELY • Luku-operaatio voi myös epäonnistua jos luettavaksi määritetty kohde ei ole tiedosto vaan hakemisto • Jos ohjelmalla halutaan tarkastaa onko käyttäjän syöttämän nimen takana tiedosto vai hakemisto, voidaan apuna käyttää os.path-moduulin isdir()- ja isfile()-funktioita: haku = input("Syötä tiedoston/hakemiston nimi: ") if os.path.isdir(haku): print ("{} on hakemisto".format(haku)) elif os.path.isfile(haku): print ("{} on tiedosto".format(haku))
VIRHEIDEN VÄISTELY • Yhdistämällä isdir()- ja isfile()-funktiot while-silmukkaan, ohjelmassa voi varmistaa että käsiteltäväksi poimitaan oikean tyyppisiä kohteita: haku = input("Syötä tiedoston nimi: ") while not(os.path.isfile(haku)) or not(os.path.exists(haku)): haku = input("{} ei ole tiedosto tai se puuttuu. Syötä nimi: ".format(haku))
VIRHEIDEN VÄISTELY import os haku = input ("Minkä tiedoston haluat poistaa? ") while not(os.path.isfile(haku)) or not(os.path.exists(haku)): if not(os.path.isfile(haku)): haku = input("{} ei ole tiedosto. Syötä tiedostonimi: ".format(haku)) else: haku = input("Tiedostoa {} ei löydy. Syötä tiedostonimi: ".format(haku)) vahvistus = input("Tiedosto {} löytyi. Poistetaanko se (K/E)?".format(haku)).strip().lower() while vahvistus != "k" and vahvistus != "e": vahvistus = input("Haluatko poista tiedoston {} (K/E) ".format(haku)).strip().lower() if vahvistus == "k": os.remove(haku) print("Tiedosto {} poistettiin".format(haku)) else: print("Ohjelma päättyi. Tiedostoa {} ei poistettu.".format(haku))
HARJOITUS: TIEDOSTOT • Kirjoita ohjelma, joka: • lukee tiedoston harkka1.txt sisällön • tulostaa sisällön rivi kerrallaan ruudulle
HARJOITUS: TIEDOSTOT • Kirjoita ohjelma, joka: • lukee tiedoston harkka2.txt sisällön • järjestää sisällön aakkosjärjestykseen • tulostaa sisällön rivi kerrallaan ruudulle • poistaa lopuksi tiedoston harkka2.txt
HARJOITUS: TIEDOSTOT • Kirjoita ToDo-listaohjelma, joka: • kysyy käyttäjältä viittä ToDo-listalle lisättävää asiaa • tallentaa listan tiedostoon harkka3.txt niin, että jokainen listan kohta on numeroitu ja omalla rivillään
Tekninen viestintä12.02.2013 Tiedostojen tutkailu, osa 2
TIEDOSTOJEN LUKEMINEN • Silmukoita ja ehtoja käyttämällä voit tarkastella useita tiedostoja kerrallaan • Ehdot auttavat kohdistamaan tiedonhaun tietyntyyppisiin tiedostoihin – apuna tässä voi myös käyttää os.path-moduulin splitext()-funktiota • splitext()-funktio pilkkoo tiedostonimen ja tiedostopäätteen listaksi; listan ensimmäinen jäsen on tiedostonimi ja toinen tiedostopääte
TIEDOSTOJEN LUKEMINEN • Silmukoita ja ehtoja käyttämällä voit tarkastella useita tiedostoja kerrallaan • Ehdot auttavat kohdistamaan tiedonhaun tietyntyyppisiin tiedostoihin – apuna tässä voi myös käyttää os.path-moduulin splitext()-funktiota • splitext()-funktio pilkkoo tiedostonimen ja tiedostopäätteen listaksi; listan ensimmäinen jäsen on tiedostonimi ja toinen tiedostopääte
TIEDOSTOJEN LUKEMINEN import os # Poimitaan tiedostolistaus listamuotoon hakemisto = os.listdir(".") # Käydään tiedostolistaus läpi tiedosto kerrallaan for tiedosto in hakemisto: # Tutkitaan millainen tiedosto on vuorossa tiedot = os.path.splitext(tiedosto) paate = tiedot[1] if paate == ".dita": ...
TIEDOSTOJEN LUKEMINEN • Kun tiedostolistausta käydään läpi for-silmukassa, ja silmukasta löytyy tiedosto, jota halutaan tarkastella, voidaan tiedoston sisältöä lukea sisäkkäisessä for-silmukassa if paate == ".dita": lukuTiedosto = open(tiedosto) # Tulostetaan tiedosto rivi kerrallaan ruudulle for rivi in lukuTiedosto: print(rivi) lukuTiedosto.close()
TIEDOSTOJEN LUKEMINEN import os hakemisto = os.listdir(".") for tiedosto in hakemisto: # Poimitaan tiedostopääte hiukan tehokkaammin paate = os.path.splitext(tiedosto)[1] # Tarkastellaan vain dita-tiedostoja if paate == ".dita": lukuTiedosto = open(tiedosto) # Tulostetaan tiedosto rivi kerrallaan ruudulle for rivi in lukuTiedosto: print(rivi) lukuTiedosto.close()
TIEDOSTOJEN LUKEMINEN • Jos tarkasteluun halutaan poimia tiettyjä rivejä tekstitiedostosta, voi tarkastelun apuna käyttää tiedostojen käsittelyyn käytettävää readlines()-funktiota • readlines() lukee tiedoston kaikki rivit ja palauttaa ne lista-muodossa – nyt yksittäisiin riveihin pääsee kätevästi käsiksi
TIEDOSTOJEN LUKEMINEN import os hakemisto = os.listdir(".") for tiedosto in hakemisto: paate = os.path.splitext(tiedosto)[1] if paate == ".dita": lukuTiedosto = open(tiedosto) # Luetaan rivit listamuotoon tiedostoRivit = lukuTiedosto.readlines() # Tulostetaan tiedoston kolmas rivi print (tiedostoRivit[2]) lukuTiedosto.close()
MINIPROJEKTI: TEKSTITUTKAILIJA • Tekstitiedostoista voi silmukoiden avulla poimia perustietoja tutkittavaksi • Kuinka tekstitiedostosta flatland.txt saisi kaivettua seuraavat tiedot: • Tiedoston kokonaissanamäärä • Tiedoston lausemäärä • Keskimääräinen lausepituus • split(".")