Ohjelmoinnin peruskurssi Y1
CSE-A1111
5.10.2015
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 1 / 36
Mahdollisuus antaa luentopalautetta
I Goblinissa vasemmassa reunassa olevassa valikossa on valinta”Luentopalaute”. Tata kautta on mahdollisuus antaa nimettomanapalautetta luennosta.
I Jos jokin asia on jaanyt palautteen perusteella epaselvaksi, palataansiihen mahdollisuuksien mukaan seuraavalla luennolla.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 2 / 36
Oppimistavoitteet: taman luennon jalkeen
I Tunnet lisaa erilaisia tapoja kayttaa listoja Python-ohjelmissa.
I Osaat kayttaa totuusarvoja sisaltavia listoja.
I Tunnet erilaisia tapoja kasitella merkkijonoja. Osaat esimerkiksikasitella kayttajan antamaa syotetta monipuolisemmin kuinaikaisemmin.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 3 / 36
AlilistatI Listasta voi ottaa helposti alilistoja (alkuperaisen listan osia):
>>> lista = [2, 4, 6, 8, 10, 12, 14, 16]
>>> alilista = lista[2:5]
>>> print(alilista)
[6, 8, 10]
Kaksoispisteen jalkeen annettua indeksia ei enaa oteta mukaan.I Ensimmainen tai viimeinen indeksi voidaan myos jattaa
merkitsematta, jolloin alilistaan otetaan alkiot listan alusta lahtien tailistaan loppuun asti:
>>> lista[:5]
[2, 4, 6, 8, 10]
>>> lista[5:]
[12, 14, 16]
I Negatiiviset indeksit tarkoittavat alkioita listan lopusta lahtien:
>>> lista[:-1]
[2, 4, 6, 8, 10, 12, 14]
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 4 / 36
Lisays listaanI Listan loppuun voi lisata uuden alkion append-metodilla:
>>> lista = [2, 4, 6, 8, 10, 12, 14, 16]
>>> lista.append(-3)
>>> print(lista)
[2, 4, 6, 8, 10, 12, 14, 16, -3]
I Sijoituskasky ei lisaa listaan uutta alkota, vaan se korvaa vanhanalkion uudella:
>>> lista[3] = -5
>>> print(lista)
[2, 4, 6, -5, 10, 12, 14, 16, -3]
I Sen sijaan metodilla insert voi lisata halutulle indeksille uudenalkion. Lisayspaikan jalkeen tulevia alkioita siirretaan listan loppuunpain:
>>> lista.insert(3, 22)
>>> print(lista)
[2, 4, 6, 22, -5, 10, 12, 14, 16, -3]
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 5 / 36
Alkion poistaminen listasta
I Metodi remove poistaa ensimmaisen alkion, jolla on parametrinaannettu arvo:
>>> print(lista)
[2, 4, 6, 22, -5, 10, 12, 14, 16, -3]
>>> lista.remove(22)
>>> print(lista)
[2, 4, 6, -5, 10, 12, 14, 16, -3]
I Operaattori del poistaa alkion halutulta indeksilta:
>>> print(lista)
[2, 4, 6, -5, 10, 12, 14, 16, -3]
>>> del lista[5]
>>> print(lista)
[2, 4, 6, -5, 10, 14, 16, -3]
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 6 / 36
Listan jarjestaminen ja kaantaminen
I Metodi sort jarjestaa listan:
>>> lista.sort()
>>> print(lista)
[-5, -3, 2, 4, 6, 10, 14, 16]
I Metodi reverse kaantaa listan jarjestyksen painvastaiseksi.
>>> lista.reverse()
>>> print(lista)
[16, 14, 10, 6, 4, 2, -3, -5]
I Funktio sorted tekee listasta kopion ja jarjestaa taman kopion.Alkuperainen lista jaa entiselleen:
>>> lista2 = sorted(lista)
>>> print(lista2)
[-5, -3, 2, 4, 6, 10, 14, 16]
>>> print(lista)
[16, 14, 10, 6, 4, 2, -3, -5]
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 7 / 36
Listojen yhdistaminen
I Kaksi listaa voidaan yhdistaa kayttamalla operaattoria +:
>>> lista1 = [1, 2, 3]
>>> lista2 = [4, 5, 6]
>>> yhteislista = lista1 + lista2
>>> print(yhteislista)
[1, 2, 3, 4, 5, 6]
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 8 / 36
Totuusarvoja sisaltava lista
I Lista voi sisaltaa myos bool-tyyppisia arvoja eli arvoja True ja False
I Seuraavassa esimerkkiohjelmassa on kaytetty tallaista listaakuvaamaan jonkin salin (esim. elokuvateatteri, teatteri taikonserttisali) varaustilannetta.
I Oletetaan, etta paikat on numeroitu nollasta alkaen.
I Listassa on indeksilla i arvo True, jos paikka on varattu, ja arvoFalse, jos paikka on vapaa.
I Ohjelmassa on funktiot halutun paikan varaamiseen, senselvittamiseen, onko maaratty paikka vapaa, kaikkien vapaidenpaikkojen selvittamiseen seka varattujen paikkojen maaranselvittamiseen.
I Ohjelmassa on vain lyhyt esimerkkipaaohjelma nayttamaan sita,miten eri funktioita voidaan kutsua. Jotta jarjestelmaa voisi oikeastikayttaa, tarvittaisiin selvasti pitempi kayttoliittymaohjelma.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 9 / 36
Paikanvarausohjelma
def varaa_paikka(varatut, paikka):
if 0 <= paikka < len(varatut) and not varatut[paikka]:
varatut[paikka] = True
return True
else:
return False
def onko_vapaa(paikkalista, nro):
if 0 <= nro < len(paikkalista):
return not paikkalista[nro]
else:
return False
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 10 / 36
Paikanvarausohjelma, jatkoa
def kerro_vapaat_paikat(varauslista):
vapaiden_lista = []
for i in range(len(varauslista)):
if not varauslista[i]:
vapaiden_lista.append(i)
return vapaiden_lista
def montako_varattu(varaukset):
varattuja = 0
for alkio in varaukset:
if alkio:
varattuja += 1
return varattuja
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 11 / 36
Paikanvarausohjelma, jatkoa
def main():
PAIKKAMAARA = 10
paikka_varattu = [False] * PAIKKAMAARA
for i in range(5):
paikkanro = int(input("Mika paikka varataan? "))
if varaa_paikka(paikka_varattu, paikkanro):
print("Paikan varaus onnistui!")
else:
print("Varaus ei onnistunut.")
tutkittava = int(input("Anna paikan numero: "))
if onko_vapaa(paikka_varattu, tutkittava):
print("Paikka", tutkittava, "on vapaa.")
else:
print("Paikka", tutkittava, "ei ole vapaa.")
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 12 / 36
Paikanvarausohjelma, jatkoa
print("Vapaat paikat:")
print(kerro_vapaat_paikat(paikka_varattu))
print("Paikkoja on varattu {:d} / {:d}.".format(
montako_varattu(paikka_varattu),
len(paikka_varattu)))
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 13 / 36
Valitehtava
I Lisaa edella esitettyyn paikanvarausohjelmaan funktiovaraa_ensimmainen_vapaa, joka varaa ensimmaisen vapaan paikan.Funktio palauttaa varatun paikan numeron tai arvon -1, jos kaikkipaikat on jo varattu.
I Jos aikaa jaa, mieti, miten funktiota voi kutsua paaohjelmassa niin,etta siella joko tulostetaan varatun paikan numero tai vaihtoehtoisestitieto siita, etta vapaita paikkoja ei enaa ole.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 14 / 36
Merkkijonot
I Merkkijonojen avulla ohjelmassa voi esittaa tekstitietoa, esim. nimia,osoitteita ja erilaisia tunnuksia.
I Merkkijonon tyyppi Pythonissa on str.
I Yksittaisia merkkeja varten ei ole omaa tyyppia, vaan ne ovat yhdenmerkin pituisia merkkijonoja.
I Merkkijono esitetaan yksin- tai kaksinkertaisten lainausmerkkienavulla.
mjono = ’appelsiini’
mjono = "appelsiini"
I Useammalle riville jatkuva merkkijono kirjoitetaan kolmenlainausmerkin sisaan.
pitkajono = """Tama merkkijono sisaltaa
useamman kuin yhden
rivin"""
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 15 / 36
Merkkijonojen kasittely
I Merkkijonoja voidaan kasitella monessa tapauksessa samalla tavallakuin listoja, esim.
>>> sana = "sitruuna"
>>> print(sana[3])
r
I Olennainen ero: merkkijonon sisaltoa ei voi muuttaa sen jalkeen, kunmerkkijono 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
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 16 / 36
Merkkijonon lapikaynti
I Merkkijonon merkit voi kayda lapi for-kaskyn avulla samalla tavallakuin listan alkiot:
>>> mjono = "matti"
>>> for merkki in mjono:
... print(merkki)
...
m
a
t
t
i
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 17 / 36
Alimerkkijonot
I Merkkijonosta voi ottaa myos alimerkkijonoja samaan tapaan kuinlistoista alilistoja:
>>> mjono = "appelsiini"
>>> print(mjono[2:5])
pel
>>> print(mjono [:4])
appe
>>> print(mjono [:-1])
appelsiin
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 18 / 36
Merkkijonon pituus ja merkin esiintymisen tutkiminen
I Merkkijonon pituuden saa selville funktiolla len.
>>> mjono = "appelsiini"
>>> print(len(mjono))
10
I Operaattorin in avulla voi tutkia, esiintyyko merkki merkkijonossa.
>>> print("i" in mjono)
True
I Operaattorin in avulla voi myos tutkia, esiintyyko pitempi merkkijonoosana toista.
>>> print("else" in mjono)
False
>>> print("elsi" in mjono)
True
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 19 / 36
Merkin esiintymiskohta merkkijonossa
I Metodin index avulla voidaan hakea parametrina annetun merkinensimmainen esiintymispaikka merkkijonosta:
>>> mjono = "appelsiini"
>>> print(mjono.index("i"))
6
I Saman metodin avulla voidaan hakea myos pitempaa merkkijonoa:
>>> print(mjono.index("lsi"))
4
I Ohjelma kaatuu, jos haettua merkkijonoa ei loydy :
>>> print(mjono.index("lse"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 20 / 36
Sijoitus merkkijonomuuttujaan
I Merkkijonon sisaltoa ei voi muuttaa sen jalkeen, kun merkkijono onluotu.
I Voidaan kuitenkin tehda uusi merkkijono ja sijoittaa se arvoksivanhalle muuttujalle:
>>> mjono = "mansikka"
>>> print(mjono)
mansikka
>>> mjono = "mustikka"
>>> print(mjono)
mustikka
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 21 / 36
Uusi merkkijono vanhan avullaI Uusi merkkijono voi kuitenkin riippua jotenkin vanhasta
merkkijonosta. Metodi upper luo uuden merkkijonon, joka sisaltaamuuten samat merkit kuin vanha merkkijono, mutta kaikki pienetkirjaimet on muutettu isoiksi:
>>> mjono = "mustikka"
>>> mjono = mjono.upper()
>>> print(mjono)
MUSTIKKA
I Metodi lower luo uuden merkkijonon, joka sisaltaa muuten samatmerkit kuin vanha merkkijono, mutta kaikki isot kirjaimet onmuutettu pieniksi:
>>> print(mjono)
MUSTIKKA
>>> mjono = mjono.lower()
>>> print(mjono)
mustikka
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 22 / 36
Merkkijonojen liittamiset
I Useampi merkkijono voidaan liittaa perakkain +-operaattorilla.
>>> etunimi = "Matti"
>>> sukunimi = "Virtanen"
>>> kokonimi = etunimi + " " + sukunimi
>>> print(kokonimi)
Matti Virtanen
Jos merkkijonoon halutaan liittaa muuntyyppisten muuttujien arvoja,pitaa ensin suorittaa tyypinmuunnos str-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
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 23 / 36
Merkkijonojen monistaminen
I Operaattorin * avulla voidaan tehda merkkijono, joka sisaltaapienemman merkkijonon monta kertaa.
I Rivinvaihtomerkin saa tarvittaessa mukaan lisaamalla merkkijonoonerikoismerkin "\n":
>>> merkit = "*!*"
>>> rivi = 5 * merkit
>>> print(rivi)
*!**!**!**!**!*
>>> rivit = 3 * (rivi + "\n")
>>> print(rivit)
*!**!**!**!**!*
*!**!**!**!**!*
*!**!**!**!**!*
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 24 / 36
Erikoismerkkeja
I Merkkijonoihin on mahdollista liittaa erikoismerkkeja (engl. escapecharacters), jotka aiheuttavat tulostuksessa esimerkiksi rivinvaihdontai kursorin siirron seuraavaan tabulointikohtaan.
I Tarkeimpia erikoismerkkeja:\n rivinvaihto\t tabulaattori\’ yksinkertainen lainausmerkki\" kaksinkertainen lainausmerkki\\ yksi kenoviiva
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 25 / 36
Tyhjien merkkien poisto syotteen alusta ja lopusta
I Usein halutaan poistaa kayttajan syotteesta kayttajan mahdollisestivahingossa alkuun tai loppuun kirjoittamat ns. tyhjat merkit(valilyonnit, tabuloinnit, rivinvaihdot).
I Tama on helppo tehda metodin strip avulla:
>>> syote = input("Anna tekstia.\n")
Anna tekstia.
kirjoitetaan jotain
>>> print("*{:s}*".format(syote))
* kirjoitetaan jotain *
>>> muutettu_syote = syote.strip()
>>> print("*{:s}*".format(muutettu_syote))
*kirjoitetaan jotain*
I Jos tyhjat merkit halutaan poistaan vain merkkijonon alusta tailopusta, voidaan kayttaa metodeita lstrip tai rstrip.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 26 / 36
Merkkijonon jakaminen
I Monesti on tarve jakaa merkkijono osiin jonkun merkin (esimerkiksivalilyonnin kohdalta).
I Esimerkki: halutaan erottaa samalla rivilla annettu etunimi jasukunimi tai sana ja sen kaannos toiselle kielelle toisistaan.
I Merkkijono voidaan jakaa metodilla split. Se palauttaa listan, jokasisaltaa jaetun merkkijonon eri osat.
I Oletusarvoisesti split-metodi jakaa merkkijonon valilyonninkohdalta, mutta metodille voidaan antaa parametrina joku muumerkki, jonka kohdasta jako tehdaan.
I Jaossa kaytetty merkki ei tule mukaan mihinkaan osaan.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 27 / 36
Merkkijonon jakaminen, esimerkkeja
>>> teksti = "Pitka teksti, joka sisaltaa monta eri sanaa."
>>> osat = teksti.split()
>>> print(osat)
[’Pitka’, ’teksti,’, ’joka’, ’sisaltaa’, ’monta’, ’eri’,
’sanaa.’]
>>> sanarivi = "kirja=book"
>>> kaannokset = sanarivi.split("=")
>>> print(kaannokset)
[’kirja’, ’book’]
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 28 / 36
Valitehtava
I Kayttajalta luetaan merkkijono, joka sisaltaa yhden kilpailijan nimenseka taman kilpailijan pisteet kahdelta eri kilpailukierrokselta. Eritiedot on erotettu toisistaan kauttaviivalla /.
I Kirjoita ohjelman osa, joka laskee kilpailijan yhteispisteet (molempienkierrosten pisteet yhteensa). Taman jalkeen ohjelman pitaa tulostaakilpailijan nimi ja hanen yhteispisteensa.
I Esimerkki kayttajan antamasta rivista:
Teemu Teekkari/25/15
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 29 / 36
Merkkijonojen vertailu
I Merkkijonojen sisaltoja voi verrata toisiinsa vertailuoperaattoreilla ==,!=, <=, >=, < ja >.
I Kun katsotaan, onko toinen merkkijono suurempi kuin toinen,verrataan merkkeja keskenaan merkkijonojen alusta lahtien.
I Jarjestyksen maaraa kirjainten arvo kaytetyssamerkkikoodausjarjestelmassa – mita lukuarvoa kukin kirjain vastaa.
I Kaytannossa koodit noudattavat muuten aakkosjarjestysta, mutta isotkirjaimet ovat ennen pienia ja skandinaaviset aakkoset eivat olekeskenaan oikeassa jarjestyksessa.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 30 / 36
Esimerkkeja merkkijonojen vertailuista
>>> nimi1 = "matti"
>>> nimi2 = "teppo"
>>> nimi1 == nimi2
False
>>>
>>> nimi1 < nimi2
True
>>>
>>> nimi3 = "Teppo"
>>> nimi2 == nimi3
False
>>>
>>> nimi3 < nimi2
True
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 31 / 36
Esimerkkeja merkkijonojen vertailuista, jatkoa
>>> nimi1 = "matti"
>>> nimi4 = "matilda"
>>> nimi1 < nimi4
False
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 32 / 36
Esimerkki: lampotilamuunnos
I Seuraava esimerkkiohjelma muuttaa kayttajan antamia lampotilojafahrenheit-asteista celsius-asteiksi tai painvastoin kayttajan valinnanmukaan.
I Merkkijonojen vertailulla selvitetaan, kumpaan suuntaan kayttajahaluaa tehda muunnoksen ja sen mukaan kutsutaan oikeaa funktiota.
I Lisaksi vertailun avulla selvitetaan, haluaako kayttaja tehda uudenmuunnoksen.
I Kayttajan syotteet muutetaan kokonaan isoiksi tai pieniksi kirjaimiksi,jotta niiden ero ei vaikuttaisi vertailun tulokseen.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 33 / 36
Lampotilamuunnos: koodi
def muunna_celsiuksiksi(fahr_asteet):
celsius_asteet = (fahr_asteet - 32) * 5.0 / 9.0
return celsius_asteet
def muunna_fahrenheiteiksi(cel_asteet):
fahrenheit_asteet = 9.0/5.0 * cel_asteet + 32
return fahrenheit_asteet
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 34 / 36
Lampotilamuunnos: koodi jatkuu
def main():
jatko = "kylla"
while jatko != "ei":
rivi = input("Anna lampotilan yksikko (C/F): ")
yksikko = rivi.upper()
if yksikko == "C":
asteet = float(input("Lampo celsiuksina: "))
fahrenheit = muunna_fahrenheiteiksi(asteet)
print(asteet, "C on", fahrenheit, "F.")
elif yksikko == "F":
asteet = float(input("Lampo fahrenheiteina: "))
celsius = muunna_celsiuksiksi(asteet)
print(asteet, "F on", celsius, "C.")
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 35 / 36
Lampotilamuunnos: koodi jatkuu
else:
print("Virheellinen yksikko, oikea on C tai F")
rivi = input("Haluatko jatkaa (kylla/ei)? ")
jatko = rivi.lower()
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2015 36 / 36