Osa 3

Merkkijonojen käsittely

Merkkijono-operaatiot

Merkkijonojen yhdistäminen tapahtuu +-operaattorin avulla:

alku = "esi"
loppu = "merkki"
sana = alku+loppu
print(sana)
Esimerkkitulostus

esimerkki

Myös *-operaattoria voidaan käyttää merkkijonojen yhteydessä. Jos toinen operandi kertolaskussa on merkkijono ja toinen kokonaisluku, saadaan merkkijonoa monistettua annettu määrä. Esimerkiksi:

sana = "apina"
print(sana*3)
Esimerkkitulostus

apinaapinaapina

Silmukan ja merkkijono-operaatioiden avulla voimme tehdä ohjelman, joka piirtää pyramidin:

n = 10 # pyramidin kerrosten määrä
rivi = "*"

while n > 0:
    print(" " * n + rivi)
    rivi += "**"
    n -= 1

Ohjelman tulostus on seuraava:

          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************

Silmukassa oleva print-komento tulostaa rivin, jonka alussa on n välilyöntiä ja sitten muuttujan rivi sisältö. Tämän jälkeen muuttujan rivi loppuun lisätään kaksi tähteä ja muuttujan n arvo vähenee yhdellä.

Merkkijonon pituus ja indeksointi

Funktio len palauttaa kokonaisluvun, joka on merkkijonon pituus merkkeinä. Esimerkiksi len("moi") palauttaa 3, koska merkkijonossa moi on 3 merkkiä.

Seuraava ohjelma tulostaa käyttäjän syöttämän merkkijonon "alleviivattuna" monistamalla merkkiä - syötteen pituuden mukaisen määrän:

mjono = input("Anna merkkijono: ")
print(mjono)
print("-"*len(mjono))
Esimerkkitulostus

Anna merkkijono: Moi kaikki!

Moi kaikki!
-----------

Pituuteen lasketaan mukaan kaikki merkkijonossa olevat merkit, mukaan lukien välilyönnit. Esimerkiksi merkkijonon moi moi pituus on 7.

Yksittäinen merkkijonon merkki voidaan hakea operaattorin [] avulla. Operaattori kirjoitetaan merkkijonon perään, ja hakasulkeiden väliin kirjoitetaan halutun merkin indeksi eli kohta merkkijonossa.

Huomaa, että merkkien indeksointi alkaa nollasta: ensimmäinen merkki on indeksin 0 kohdalla, toinen indeksin 1 kohdalla jne.

3 2 1

Esimerkiksi:


mjono = input("Anna merkkijono: ")
print(mjono[0])
print(mjono[1])
print(mjono[3])

Ohjelma tulostaa:

Esimerkkitulostus

Anna merkkijono: apina a p n

Koska merkkijonon ensimmäinen merkki on indeksin 0 kohdalla, on viimeinen merkki vastaavasti indeksin pituus – 1 kohdalla. Esimerkiksi seuraava ohjelma tulostaa merkkijonon ensimmäisen ja viimeisen merkin:

mjono = input("Anna merkkijono: ")
print("Ensimmäinen: " + mjono[0])
print("Viimeinen: " + mjono[len(mjono) - 1])
Esimerkkitulostus

Anna merkkijono: testi Ensimmäinen: t Viimeinen: i

Seuraava ohjelma puolestaan käy läpi kaikki merkkijonon merkit vasemmalta oikealle silmukan avulla:

mjono = input("Anna merkkijono: ")
kohta = 0
while kohta < len(mjono):
    print(mjono[kohta])
    kohta += 1
Esimerkkitulostus

Anna merkkijono: testi t e s t i

Pythonissa merkkeihin voi viitata myös alkaen merkkijonon lopusta käyttämällä negatiivisia indeksejä. Merkkijonon viimeinen merkki on indeksin -1 kohdalla, toiseksi viimeinen indeksin -2 kohdalla jne. Onkin kätevämpi kirjoittaa mjono[-1] kuin mjono[len(mjono) - 1].

3 2 2

Tämän avulla aiempi ohjelma voidaan toteuttaa paremmin näin:

mjono = input("Anna merkkijono: ")
print("Ensimmäinen: " + mjono[0])
print("Viimeinen: " + mjono[-1])
Esimerkkitulostus

Anna merkkijono: testi Ensimmäinen: t Viimeinen: i

IndexError: string index out of range

Merkkijonon käsittelyssä tulee olla tarkkana indeksien kanssa. Jos viitataan merkkijonon ulkopuolelle, on seurauksena virheilmoitus IndexError: string index out of range:

mjono = input("Anna merkkijono: ")
print("Kymmenes merkki: " + mjono[9])
Esimerkkitulostus

Anna merkkijono: ohjelmoinnin perusteet Kymmenes merkki: n

Esimerkkitulostus

Anna merkkijono: python

Traceback (most recent call last): File "", line 1, in IndexError: string index out of range

Joskus virhetilanne johtuu ohjelmointivirheestä. Esimerkiksi merkkijonon viimeistä merkkiä tarkasteltaessa on yleistä indeksoida vahingossa yhtä liian pitkälle:

mjono = input("Anna merkkijono: ")
print("Viimeinen merkki: " + mjono[len(mjono)])

Koska merkkijonojen indeksit alkavat nollasta, niin viimeinen merkki on indeksissä len(mjono) - 1 eikä len(mjono).

On myös tilanteita, joissa ohjelman on syytä varautua siihen, että virheen lähde on käyttäjän antama syöte:

mjono = input("Anna merkkijono: ")
if len(mjono) > 0:
    print("Ensimmäinen merkki: " + mjono[0])
else:
    print("Merkkijono on tyhjä eli ensimmäistä merkkiä ei ole")

Tässä koodissa tyhjä syöte (käyttäjä painaa ainoastaan Enter) aiheuttaisi virheen, ellei koodari olisi lisännyt tarkastusta tilanteen varalta.

Osajonot

Merkkijonon osajono muodostuu peräkkäisistä merkeistä, jotka ovat merkkijonon osana. Esimerkiksi merkkijonon esimerkki osajonoja ovat esi, imer ja merkki.

Voimme erottaa halutussa kohdassa olevan osajonon syntaksilla [a:b], mikä tarkoittaa, että osajono alkaa kohdasta a ja päättyy juuri ennen kohtaa b. Voimme ajatella alku- ja loppukohdan merkkien vasemmalle puolelle piirretyiksi viivoiksi alla olevan kuvan mukaisesti:

3 2 3

Seuraava esimerkki esittelee osajonojen hakemista:

mjono = "saippuakauppias"

print(mjono[0:3])
print(mjono[4:10])

# jos alkukohta puuttuu, se on oletuksena 0
print(mjono[:3])

# jos loppukohta puuttuu, se on oletuksena merkkijonon pituus
print(mjono[4:])
Esimerkkitulostus

sai puakau sai puakauppias

Osajonon etsiminen

Voimme tutkia in-operaattorin avulla, onko merkkijonossa tiettyä osajonoa. Lauseke a in b on tosi, jos merkkijonossa b on osajono a.

Esimerkiksi

mjono = "testi"

print("t" in mjono)
print("x" in mjono)
print("est" in mjono)
print("ets" in mjono)
Esimerkkitulostus

True False True False

Seuraava ohjelma antaa käyttäjän etsiä merkkijonon osajonoja:

mjono = "saippuakauppias"

while True:
    osa = input("Mitä etsit? ")
    if osa in mjono:
        print("Löytyi")
    else:
        print("Ei löytynyt")
Esimerkkitulostus

Mitä etsit? kaup Löytyi Mitä etsit? abc Ei löytynyt Mitä etsit? ippu Löytyi ...

Operaattori in palauttaa tiedon osajonon esiintymisestä, muttei tietoa siitä, mistä se löytyy. Tätä varten löytyy Pythonin merkkijonojen metodi find, joka saa parametrikseen etsittävän osajonon ja palauttaa joko ensimmäisen indeksin, josta osajono löytyy, tai -1, jos osajonoa ei löydy merkkijonosta.

Metodia käytetään seuraavasti:

3 2 4

Esimerkkejä metodin käyttämisestä:

mjono = "testi"

print(mjono.find("t"))
print(mjono.find("x"))
print(mjono.find("est"))
print(mjono.find("ets"))
Esimerkkitulostus

0 -1 1 -1

Voimme myös laajentaa hakuohjelmaa näin:

mjono = "saippuakauppias"

while True:
    osa = input("Mitä etsit? ")
    kohta = mjono.find(osa)
    if kohta >= 0:
        print(f"Löytyi kohdasta {kohta}")
    else:
        print("Ei löytynyt")
Esimerkkitulostus

Mitä etsit? kaup Löytyi kohdasta 7 Mitä etsit? abc Ei löytynyt Mitä etsit? ippu Löytyi kohdasta 2 ...

Loading...
:
Loading...

Log in to view the quiz

Seuraava osa: