• Ei tuloksia

Ohjelmoinnin perusteet Y Python

N/A
N/A
Info
Lataa
Protected

Academic year: 2022

Jaa "Ohjelmoinnin perusteet Y Python"

Copied!
24
0
0

Kokoteksti

(1)

Ohjelmoinnin perusteet Y Python

T-106.1208

23.2.2009

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 1 / 44

(2)

Debuggeri

I Tyypillinen tilanne: ohjelma on kirjoitettu, Python-tulkki ei valita virheist¨a, mutta ohjelma kuitenkin toimii jotenkin v¨a¨arin.

I T¨all¨oin ohjelman toimintaa voi tutkia ja virhett¨a yritt¨a¨a etsi¨a debuggerin avulla.

I Debuggeri on ohjelma, jonka avulla ohjelmaa voi ajaa k¨asky kerrallaan ja tutkia samalla ohjelman k¨aytt¨amien muuttujien arvoja.

I Ohjelmaan voi asettaa pys¨ahdyspisteit¨a (breakpoint), joissa ohjelma pys¨ahtyy.

I Eclipseen kuuluu debuggeri, jonka avulla voi ajaa mm.

Python-ohjelmia.

(3)

Debuggerin k¨ ayttt¨ o Eclipsess¨ a

I Ennen debuggerin k¨aynnistymist¨a kannattaa asettaa ensimm¨ainen pys¨ahdyspiste. Valitaan haluttu rivi koodista, painetaan rivin vasemmassa reunassa hiiren oikeaa painiketta ja valintaan esiin tulevasta valikosta Add breakpoint.

I T¨am¨an j¨alkeen debuggerin voi k¨aynnist¨a¨a valitsemallaRun->Debug As->Python Run

I Eclipse ajaa ohjelmaa ensimm¨aiseen pys¨ahdyspisteeseen saakka.

T¨am¨an j¨alkeen ohjelmassa voi edet¨a rivi kerrallaan valitsemalla Run->Step Over.

I Jos rivill¨a on funktion kutsu, ja haluaa siirty¨a funktion sis¨alle, on valittava Run->Step Into.

I Muuttujien arvot n¨akyv¨at joka vaiheessa oikeassa yl¨akulmassa olevalla v¨alilehdell¨a.

I Debuggauksesta p¨a¨asee takaisin ohjelman editointiin oikeassa yl¨akulmassa olevanDebug-painikkeen viereisest¨a nuolesta. (Valitse Pydev)

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 3 / 44

(4)

Merkkijonot

I Merkkijonojen avulla ohjelmassa voi esitt¨a¨a tekstitietoa, esim. nimi¨a, osoitteita ja erilaisia tunnuksia.

I Merkkijonon tyyppi Pythonissa on str.

I Yksitt¨aisi¨a merkkej¨a varten ei ole omaa tyyppi¨a, vaan ne ovat yhden merkin pituisia merkkijonoja.

I Merkkijono esitet¨a¨an yksin- tai kaksinkertaisten lainausmerkkien avulla.

mjono = ’appelsiini’

mjono = "appelsiini"

(5)

Merkkijonojen k¨ asittely

I Merkkijonoja voidaan k¨asitell¨a monessa tapauksessa samalla tavalla kuin listoja, esim.

>>> sana = "sitruuna"

>>> print sana[3]

r

I Olennainen ero: merkkijonon sis¨alt¨o¨a ei voi muuttaa sen j¨alkeen, kun merkkijono on luotu, esim.

>>> sana[3] = ’a’

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: ’str’ object does not support item assignment

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 7 / 44

(6)

Merkkijonon l¨ apik¨ aynti

I Merkkijonon merkit voi k¨ayd¨a l¨api for-k¨askyn avulla samalla tavalla kuin listan alkiot:

>>> mjono = "matti"

>>> for merkki in mjono:

... print merkki

...

m a t t i

(7)

Alimerkkijonot

I Merkkijonosta voi ottaa my¨os alimerkkijonoja samaan tapaan kuin listoista alilistoja:

>>> mjono = "appelsiini"

>>> print mjono[2:5]

pel

>>> print mjono [:4]

appe

>>> print mjono [:-1]

appelsiin

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 11 / 44

(8)

Merkkijonon pituus ja merkin esiintymisen tutkiminen

I Merkkijonon pituuden saa selville funktiollalen.

>>> mjono = "appelsiini"

>>> print len(mjono) 10

I Operaattorin inavulla voi tutkia, esiintyyk¨o merkki merkkijonossa.

>>> print "i" in mjono True

I Operaattorin inavulla voi my¨os tutkia, esiintyyk¨o pitempi merkkijono osana toista.

>>> print "else" in mjono False

>>> print "elsi" in mjono True

(9)

Merkin esiintymiskohta merkkijonossa

I Metodin indexavulla voidaan hakea parametrina annetun merkin ensimm¨ainen esiintymispaikka merkkijonosta:

>>> mjono = "appelsiini"

>>> print mjono.index("i") 6

I Saman metodin avulla voidaan hakea my¨os pitemp¨a¨a merkkijonoa:

>>> print mjono.index("lsi") 4

I Ohjelma kaatuu, jos haettua merkkijonoa ei l¨oydy :

>>> print mjono.index("lse")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: substring not found

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 15 / 44

(10)

Sijoitus merkkijonomuuttujaan

I Merkkijonon sis¨alt¨o¨a ei voi muuttaa sen j¨alkeen, kun merkkijono on luotu.

I Voidaan kuitenkin tehd¨a uusi merkkijono ja sijoittaa se arvoksi vanhalle muuttujalle:

>>> mjono = "mansikka"

>>> print mjono mansikka

>>> mjono = "mustikka"

>>> print mjono mustikka

(11)

Uusi merkkijono vanhan avulla

I Uusi merkkijono voi kuitenkin riippua jotenkin vanhasta

merkkijonosta. Metodi upperluo uuden merkkijonon, joka sis¨alt¨a¨a muuten samat merkit kuin vanha merkkijono, mutta kaikki pienet kirjaimet on muutettu isoiksi:

>>> mjono = "mustikka"

>>> mjono = mjono.upper()

>>> print mjono MUSTIKKA

I Metodilowerluo uuden merkkijonon, joka sis¨alt¨a¨a muuten samat merkit kuin vanha merkkijono, mutta kaikki pienet kirjaimet on muutettu isoiksi:

>>> print mjono MUSTIKKA

>>> mjono = mjono.lower()

>>> print mjono mustikka

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 19 / 44

(12)

Merkkijonojen liitt¨ amiset

I Useampi merkkijono voidaan liitt¨a¨a per¨akk¨ain +-operaattorilla.

>>> etunimi = "Matti"

>>> sukunimi = "Virtanen"

>>> kokonimi = etunimi + " " + sukunimi

>>> print kokonimi Matti Virtanen

Jos merkkijonoon halutaan liitt¨a¨a muuntyyppisten muuttujien arvoja, pit¨a¨a ensin suorittaa tyypinmuunnosstr-operaattorilla.

>>> tunteja = 50

>>> tuntip = 12.5

>>> palkka = tunteja * tuntip

>>> tulosrivi = str(tunteja) + " h * " + str(tuntip) + \ ... " eur / h = " + str(palkka)

>>> print tulosrivi

50 h * 12.5 eur / h = 625.0

(13)

Merkkijonojen monistaminen

I Operaattorin *avulla voidaan tehd¨a merkkijono, joka sis¨alt¨a¨a pienemm¨an merkkijonon monta kertaa.

I Rivinvaihtomerkin saa tarvittaessa mukaan lis¨a¨am¨all¨a merkkijonoon erikoismerkin"\n":

>>> merkit = "*!*"

>>> rivi = 5 * merkit

>>> print rivi

*!**!**!**!**!*

>>> rivit = 3 * (rivi + "\n")

>>> print rivit

*!**!**!**!**!*

*!**!**!**!**!*

*!**!**!**!**!*

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 23 / 44

(14)

Erikoismerkkej¨ a

I Merkkijonoihin on mahdollista liitt¨a¨a erikoismerkkej¨a (engl. escape characters), jotka aiheuttavat tulostuksessa esimerkiksi rivinvaihdon tai kursorin siirron seuraavaan tabulointikohtaan.

I T¨arkeimpi¨a erikoismerkkej¨a:

\n rivinvaihto

\t tabulaattori

\’ yksinkertainen lainausmerkki

\" kaksinkertainen lainausmerkki

\\ yksi kenoviiva

(15)

Tyhjien merkkien poisto sy¨ otteen alusta ja lopusta

I Usein halutaan poistaa k¨aytt¨aj¨an sy¨otteest¨a k¨aytt¨aj¨an mahdollisesti vahingossa alkuun tai loppuun kirjoittamat ns. tyhj¨at merkit (v¨alily¨onnit, tabuloinnit, rivinvaihdot).

I T¨am¨a on helppo tehd¨a metodin stripavulla:

>>> syote = raw_input("Anna tekstia.\n") Anna tekstia.

kirjoitetaan jotain

>>> print "*%s*" % (syote)

* kirjoitetaan jotain *

>>> muutettu_syote = syote.strip()

>>> print "*%s*" % (muutettu_syote)

*kirjoitetaan jotain*

I Jos tyhj¨at merkit halutaan poistaan vain merkkijonon alusta tai lopusta, voidaan k¨aytt¨a¨a metodeitalstriptairstrip.

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 27 / 44

(16)

Merkkijonon jakaminen

I Monesti on tarve jakaa merkkijono osiin jonkun merkin (esimerkiksi v¨alily¨onnin kohdata).

I Esimerkki: halutaan erottaa samalla rivill¨a annettu etunimi ja sukunimi tai sana ja sen k¨a¨ann¨os toiselle kielelle toisistaan.

I Merkkijono voidaan jakaa metodilla split. Se palauttaa listan, joka sis¨alt¨a¨a jaetun merkkijonon eri osat.

I Oletusarvoisesti split-metodi jakaa merkkijonon v¨alily¨onnin kohdalta, mutta metodille voidaan antaa parametrina joku muu merkki, jonka kohdasta jako tehd¨a¨an.

I Jaossa k¨aytetty merkki ei tule mukaan mihink¨a¨an osaan.

(17)

Merkkijonon jakaminen, esimerkkej¨ a

>>> teksti = "Pitempi teksti, joka sisaltaa monta eri sanaa."

>>> osat = teksti.split()

>>> print osat

[’Pitempi’, ’teksti,’, ’joka’, ’sisaltaa’, ’monta’, ’eri’,

’sanaa.’]

>>> sanarivi = "kirja=book"

>>> kaannokset = sanarivi.split("=")

>>> print kaannokset [’kirja’, ’book’]

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 31 / 44

(18)

Merkkijonojen vertailu

I Merkkijonojen sis¨alt¨oj¨a voi verrata toisiinsa vertailuoperaattoreilla==,

!=,<=,>=,<ja>.

I Kun katsotaan, onko toinen merkkijono suurempi kuin toinen, verrataan merkkej¨a kesken¨a¨an merkkijonojen alusta l¨ahtien.

I J¨arjestyksen m¨a¨ar¨a¨a kirjainten arvo k¨aytetyss¨a

merkkikoodausj¨arjestelm¨ass¨a – mit¨a lukuarvoa kukin kirjain vastaa.

I K¨ayt¨ann¨oss¨a koodit noudattavat muuten aakkosj¨arjestyst¨a, mutta isot kirjaimet ovat ennen pieni¨a ja skandinaaviset aakkoset eiv¨at ole kesken¨a¨an oikeassa j¨arjestyksess¨a.

(19)

Esimerkkej¨ a merkkijonojen vertailuista

>>> nimi1 = "matti"

>>> nimi2 = "teppo"

>>> nimi1 == nimi2 False

>>>

>>> nimi1 < nimi2 True

>>>

>>> nimi3 = "Teppo"

>>> nimi2 == nimi3 False

>>>

>>> nimi3 < nimi2 True

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 35 / 44

(20)

Esimerkkej¨ a merkkijonojen vertailuista, jatkoa

>>> nimi1 = "matti"

>>> nimi4 = "matilda"

>>> nimi1 < nimi4 False

(21)

Esimerkki: l¨ amp¨ otilamuunnos

I Seuraava esimerkkiohjelma muuttaa k¨aytt¨aj¨an antamia l¨amp¨otiloja fahrenheit-asteista celsius-asteiksi tai p¨ainvastoin k¨aytt¨aj¨an valinnan mukaan.

I Merkkijonojen vertailulla selvitet¨a¨an, kumpaan suuntaan k¨aytt¨aj¨a haluaa tehd¨a muunnoksen ja sen mukaan kutsutaan oikeaa funktiota.

I Lis¨aksi vertailun avulla selvitet¨a¨an, haluaako k¨aytt¨aj¨a tehd¨a uuden muunnoksen.

I K¨aytt¨aj¨an sy¨otteet muutetaan kokonaan isoiksi tai pieniksi kirjaimiksi, jotta niiden ero ei vaikuttaisi vertailun tulokseen.

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 38 / 44

(22)

L¨ amp¨ otilamuunnos: koodi

def muunna_celsiuksiksi(F_asteet):

celsius_asteet = (F_asteet - 32) * 5.0 / 9.0 return celsius_asteet

def muunna_fahrenheiteiksi(C_asteet):

fahrenheit_asteet = 9.0/5.0 * C_asteet + 32 return fahrenheit_asteet

(23)

L¨ amp¨ otilamuunnos: koodi jatkuu

def main():

jatko = "kylla"

while jatko != "ei":

rivi = raw_input("Anna lampotilan yksikko (C/F): ") yksikko = rivi.upper()

if yksikko == "C":

rivi = raw_input("Lampotila celsius-asteina: ") asteet = float(rivi)

fahrenheit = muunna_fahrenheiteiksi(asteet) print asteet, "C on", fahrenheit, "F."

elif yksikko == "F":

rivi = raw_input("Lampotila fahrenheiteina: ") asteet = float(rivi)

celsius = muunna_celsiuksiksi(asteet) print asteet, "F on", celsius, "C."

T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 42 / 44

(24)

L¨ amp¨ otilamuunnos: koodi jatkuu

else:

print "Virheellinen yksikko, oikea on C tai F"

rivi = raw_input("Haluatko jatkaa (kylla/ei)? ") jatko = rivi.lower()

main()

Viittaukset

LIITTYVÄT TIEDOSTOT

I Yleens¨ a halutaan varautua k¨ aytt¨ aj¨ alt¨ a sy¨ otett¨ a lukiessa siihen, ett¨ a k¨ aytt¨ aj¨ a antaa virheellisen sy¨ otteen.. I Jos k¨ aytt¨ aj¨ an antama sy¨ ote

I K¨ asittelytapojen ero: &#34;w&#34; kirjoittaa olemassaolevan tiedoston p¨ a¨ alle (vanha sis¨ alt¨ o h¨ avi¨ a¨ a kokonaan), &#34;a&#34; kirjoittaa olemassaolevan

I Funktion suorituksen alussa parametri lista viittaa samaan listaan kuin p¨ a¨ aohjelman muuttuja lukulista.

I Funktion suorituksen alussa parametri lista viittaa samaan listaan kuin p¨ a¨ aohjelman muuttuja lukulista.

I Funktion suorituksen alussa parametri lista viittaa samaan listaan kuin p¨ a¨ aohjelman muuttuja lukulista.

Jos haettava alkio on pienempi, jatketaan kohdasta 2 niin, ett¨ a hakualueena on alkuper¨ aisen hakualueen alkupuolisko. Jos haettava alkio on suurempi, jatketaan kohdasta 2 niin,

Metodi upper luo uuden merkkijonon, joka sis¨ alt¨ a¨ a muuten samat merkit kuin vanha merkkijono, mutta kaikki pienet kirjaimet on muutettu isoiksi:.. &gt;&gt;&gt; mjono

I Merkkijonoja sis¨ alt¨ av¨ at listat ovat k¨ atevi¨ a esimerkiksi silloin, kun k¨ aytt¨ aj¨ alle halutaan tulostaa erilaisia valintavaihtoehtoja ja k¨ asitell¨ a k¨ aytt¨