Merkkijonojen käsittely
Merkkijono-operaatiot
Merkkijonojen yhdistäminen tapahtuu +
-operaattorin avulla:
alku = "esi"
loppu = "merkki"
sana = alku+loppu
print(sana)
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)
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))
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.
Esimerkiksi:
mjono = input("Anna merkkijono: ")
print(mjono[0])
print(mjono[1])
print(mjono[3])
Ohjelma tulostaa:
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])
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
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]
.
Tämän avulla aiempi ohjelma voidaan toteuttaa paremmin näin:
mjono = input("Anna merkkijono: ")
print("Ensimmäinen: " + mjono[0])
print("Viimeinen: " + mjono[-1])
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])
Anna merkkijono: ohjelmoinnin perusteet Kymmenes merkki: n
Anna merkkijono: python
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:
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:])
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)
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")
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:
Esimerkkejä metodin käyttämisestä:
mjono = "testi"
print(mjono.find("t"))
print(mjono.find("x"))
print(mjono.find("est"))
print(mjono.find("ets"))
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")
Mitä etsit? kaup Löytyi kohdasta 7 Mitä etsit? abc Ei löytynyt Mitä etsit? ippu Löytyi kohdasta 2 ...
Log in to view the quiz