Python 3/Merkkijonot
Merkkijono voidaan määritellä ympäröimällä heittomerkeillä ('), lainausmerkeillä ({{") tai kolmella heitto- tai lainausmerkillä (''', """). Näitä merkkejä ei saa sekoittaa ("kissa').
'kissa'
tai"kissa"
'''kissa'''
tai"""kissa"""
Kolminkeraisia heitto- tai lainausmerkkejä käytetään monirivisten merkkijonojen merkitsemiseen.
'''
Kissa
kiipesi
puuhun.
'''
Merkkijono voidaan jakaa usealle riville myös \-merkillä
'kissa \
kiipesi \
puuhun. \
'
tai
'kissa '\
'kiipesi '\
'puuhun.'
Yhdisteleminen
[muokkaa | muokkaa wikitekstiä]Pythonissa on useita eri tapoja yhdistellä ja muotoilla merkkijonoja.
Yhdisteleminen +-operaattorilla
[muokkaa | muokkaa wikitekstiä]>>> print ('[[' + 'kissa' + ']]')
[[kissa]]
Numerot pitää muuttaa merkkijonoiksi ennen kuin +-operaattoria voi käyttää.
>>> nro = 2
>>> print ('[[' + 'kissa nro ' + nro + ']]') # Aiheuttaa virheen TypeError: can only concatenate str (not "int") to str
>>> print ('[[' + 'kissa nro ' + str(nro) + ']]')
[[kissa nro 2]]
Yhdistäminen str.join()-metodilla
[muokkaa | muokkaa wikitekstiä]Kokonaisen listan merkkijonoja voi yhdstää helposti str-tyypin join-metodilla. Pitkien merkkijonojen luomiseksi tämä on usein tehokkaampi tapa kuin +-operaattorilla toistuvasti yhdistäminen, koska välivaiheita ei ole.
>>> pätkät = [ "Kokonaisen", "listan", "merkkijonoja", "voi", "yhdstää", "join-metodilla." ]
>>> erotin = " "
>>> erotin.join(pätkät)
'Kokonaisen listan merkkijonoja voi yhdstää join-metodilla.'
Merkkijonon ei tarvitse olla tallennettuna muuttujaan, vaan merkkijonovakion metodeita voi kutsua suoraankin.
>>> " ".join(pätkät)
'Kokonaisen listan merkkijonoja voi yhdstää join-metodilla.'
Lisää yhdistämistapoja käsitellään myöhemmin Merkkijonojen muotoilu -osiossa.
Merkin tai merkkijonon toistaminen
[muokkaa | muokkaa wikitekstiä]Merkkijonoa voi toistaa *-operaattorilla.
>>> print('.' * 20)
....................
>>> print('~”~„' * 20)
~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„~”~„
Viipalointi
[muokkaa | muokkaa wikitekstiä]Indeksointi tarkoittaa yksittäisen alkion paikan osoittamista taulukosta. Pythonissa merkkijono toimii hyvin samalla lailla kuin taulukko. Viipaloinnilla tarkoitetaan usean merkin alimerkkijonon osoittamista. Merkkijonojen tapauksessa on syytä huomata, että merkki ei ole aivan yksiselitteinen käsite eri kirjoitusjärjestelmissä ja Unicodessa.
Pythonissa indeksointi alkaa aina nollasta. Ensimmäisen merkin indeksi on siis 0 ja viimeisen (merkkijonon pituus − 1).
Merkki | k | i | s | s | a |
---|---|---|---|---|---|
Indeksi | 0 | 1 | 2 | 3 | 4 |
Negatiivinen indeksi | −5 | −4 | −3 | −2 | −1 |
Indeksointi ja viipalointi tehdään []-operaattorilla.
>>> string = 'kissa'
>>> print(string[1])
'i'
Negatiivinen indeksi aloittaa lopusta. Viimeisen merkin negatiivinen indeksi on −1 ja ensimmäisen (−merkkijonon pituus). Myös tämä tulostaa i:n joka on neljänneksi viimeinen merkki merkkijonossa.
>>> string = 'kissa'
>>> print(string[-4])
'i'
Kokonaisen alimerkkijonon voi hakea viipalointioperaattorilla.
>>> string = 'kissa'
>>> print(string[1:4])
'iss'
Merkkijonon merkkejä ei voi muuttaa suoraan viipalointioperattorilla, sillä merkkijonot ovat Pythonissa muuttamattomia.
Erityismerkinnät
[muokkaa | muokkaa wikitekstiä]Kaikkia merkkejä ei voi kirjoittaa sellaisenaan merkkijonoon. Näitä varten pitää käyttää erityismerkintää.
\n | rivinvaihto |
\t | sarkain eli tabulaattori, jota käytetään taulukoinnissa tai sisennyksissä |
\" | lainausmerkki (") |
\' | puolilainausmerkki/heittomerkki (') |
\\ | kenoviiva (\) |
Lainausmerkin tai heittomerkin voi myös kirjoittaa merkkijonoon käyttämällä merkkijonon merkintään toista.
"O'Malley"
'Tila: "odottaa".'
Rivinvaihdon voi kirjoittaa myös käyttämällä merkkijonon merkintään kolminkertaisia lainaus- tai puolilainausmerkkejä.
Näppäimistöltä löytymättömiä merkkejä voi myös kirjoittaa numeroarvoina.
\xhh | Merkki, jonka koodipaikka heksadesimaalimuodossa on hh |
\uhhhh | Unicode-merkki, jonka koodipaikka heksadesimaalimuodossa on hhhh |
\Uhhhhhhhh | Unicode-merkki, jonka koodipaikka heksadesimaalimuodossa on hhhhhhhh |
\N{NIMI} | Unicode-merkki, jonka nimi on NIMI |
>>> '\xe4'
'ä'
>>> '\u72ac'
'犬'
>>> '\U0001d195'
'𝆕'
>>> '\N{GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE}'
'🤪'
Käänteisesti merkin koodipaikan heksadesimaalimuodossa saa selville kirjoittamalla hex(ord(merkki))
.
Alimerkkijonon haku
[muokkaa | muokkaa wikitekstiä]Alimerkkijonon alkukohdan voi etsiä find
- ja rfind
sekä index
- ja rindex
-metodeilla sekä.
Find- ja index-metodien ainoa ero on, että find-metodit palauttavat -1, jos alimerkkijonoa ei löydy, kun taas index-metodit heittävät virheen.
find
palauttaa ensimmäisen alimerkkijonon alkukohdan. Muista, että indeksointi alkaa aina nollasta.
>>> mj = "Kokko kokoo kokko"
>>> mj.find("okko")
1
Metodi palauttaa -1, jos alimerkkijonoa ei löydy.
>>> mj.find("tokko")
-1
Isot ja pienet kirjaimet ovat eriarvoisia.
>>> mj.find("kokko")
12
Valinnaisesti voi antaa alkukohdan, josta etsintä aloitetaan tai alku- ja loppukohdan. Huomaa, että loppukohta merkitään yksi merkki viimeisen kohdan yli ja koko alimerkkijonon pitää mahtua päätepisteiden väliin.
>>> mj = "Kokko kokoo kokko"
>>> mj.find("okko", 2)
13
>>> mj.find("okko", 2, 13)
-1
>>> mj.find("okko", 2, 17)
13
rfind
toimii muuten kuin find
, mutta etsii lopusta alkuun päin.
>>> mj.rfind("okko")
13
>>> mj.rfind("okko", 0, 13)
1
Indeksit voi merkitä myös lopusta lukien negatiivisena, kuten viipaloinnissa.
>>> mj.rfind("okko", 0, -5)
1
Alimerkkijonon korvaus toisella
[muokkaa | muokkaa wikitekstiä]Alimerkkijonon voi vaihtaa toiseksi metodilla replace
. Metodi palauttaa uuden merkkijonon, jossa annettu alimerkkijono on vaihdettu annettuun korvaajaan. Alkuperäinen merkkijono pysyy muuttumattomana.
>>> mj.replace("okko", "ukka")
'Kukka kokoo kukka'
Huomaa, että replace
korvaa oletuksena kaikki alimerkkijonon esiintymät. Määrää voi tarvittaessa rajoittaa antamalla valinnaisena kolmantena parametrina korvausten määrän.
>>> mj.replace("okko", "ukka", 1)
'Kukka kokoo kokko'
Myös replace
käsittelee pieniä ja suuria kirjaimia eri merkkeinä.
>>> mj.replace("kokko", "kukka")
'Kokko kokoo kukka'
Yhteenveto str-tyypin metodeista
[muokkaa | muokkaa wikitekstiä]capitalize | Muuttaa tekstin ensimmäisen kirjaimen isoksi. |
casefold | |
center | |
count | Laskee annettujen alimerkkijonojen määrän. |
encode | Palauttaa tekstin annetussa koodauksessa. |
expandtabs | |
find(mj) | Palauttaa indeksin, josta alimerkkijono mj alkaa tai -1, jos sitä ei löydy. |
format | |
format_map | |
index | Sama kuin find, mutta heittää virheen, jos merkkijonoa ei löydy. |
join | |
ljust | |
lower | Muuttaa kaikki kirjaimet pieniksi. |
lstrip | |
maketrans | |
partition | |
replace | |
rfind | |
rindex | |
rjust | |
rpartition | |
rsplit | |
rstrip | |
split(erotin) | Jakaa merkkijonon taulukoksi alimerkkijonojen erotin kohdalta. |
splitlines | |
strip | Poistaa tyhjät merkit alusta ja lopusta. |
swapcase | |
title | |
translate | |
upper | Muuttaa kaikki kirjaimet suuriksi. |
zfill |
Merkkijonon ominaisuuksia voi testata seuraavilla metodeilla. Ne palauttavat True
, jos ehto täyttyy, muuten False
.
endswith(loppu) | päättyy tekstiin loppu |
isalnum | koostuu pelkästään aakkos-numeerisista merkeistä |
isalpha | koostuu pelkästään aakkosmerkeistä. |
isascii | koostuu pelkästään ASCII-merkeistä. |
isdecimal | |
isdigit | koostuu pelkästään numeroista |
isidentifier | |
islower | koostuu pelkästään pienistä kirjaimista (voi sisältää muitakin merkkejä) |
isnumeric | |
isprintable | |
isspace | koostuu pelkästään tyhjistä merkeistä (esim. " \t\n") |
istitle | jokainen sana alkaa isolla kirjaimella, mutta on muuten pienellä |
isupper | kaikki kirjaimet ovat isoja (voi sisältää muitakin merkkejä) |
startswith(alku) | alkaa tekstillä alku |
Merkkijonojen muotoilu
[muokkaa | muokkaa wikitekstiä]F-merkkijonot
[muokkaa | muokkaa wikitekstiä]F-merkkijonoihin (f-strings) voi kirjoittaa Python-koodin suoraan merkkijonoon. F-merkkijonot erotetaan tavallisista merkkijoista kirjoittamalla f-kirjain ennen ensimmäistä lainausmerkkiä. Tekstin kohtaan kirjoitettavat muuttujat tai lausekkeet kirjoitetaan aaltosulkujen {} sisään.
>>> nimi = 'Olavi'
>>> ika = 78
>>> print(f'Nimi: {nimi}, ikä: {ika}')
Nimi: Olavi, ikä: 78
Aaltosulkujen väliin voi kirjoittaa kokonaisia Python-lauseita, ei pelkästään muuttujia.
>>> lista = [ 'eka', 'toka', 'kolkki' ]
>>> indeksi = 0
>>> print(f'Valittu alkio numero {indeksi + 1} {len(lista)}:sta: {lista[indeksi]}')
Valittu alkio numero 1 3:sta: eka
Tulostuksen voi muotoilla tarkemmin antamalla muotoilumerkkijonon :-merkin jälkeen. Muotoilukoodi on täydellisenä seuraavanlainen
- <täyttömerkki><tasaus><etumerkki>[#][0]<kentän leveys><ryhmitys><.tarkkuus><esitysmuoto>
Näistä voi antaa tarvittavat ja jättää muut pois.
Täyttömerkki on merkki, jolla kenttä täytetään leveyteen.
Tasaus on jokin seuraavista:
- < tasaus vasemmalle
- > tasaus oikealle
- ^ keskitys
- = täyttömerkit tulevat etumerkin ja luvun väliin.
>>> print(f"Nimi: {nimi:.<15} Ikä: {ikä: 5} Maksettava: {232:x>5} €")
Nimi: Olavi.......... Ikä: 78 Maksettava: xx232 €
Etumerkki on jokin seuraavista
- - etumerkki näytetään vain negatiivisille luvuille (oletus)
- + myös positiivisille luvuille käytetään etumerkkiä
- (välilyönti) positiivisten lukujen etumerkin paikalle tulostetaan välilyönti,
#
0
Kentän leveys on merkkimäärä jonka kokoiseen tilaan luku muotoillaan.
>>> print(f"{13: 5}{9: 5}{232: 5}")
13 9 232
Ryhmitys
Tarkkuus on desimaaliluvun desimaalien määrä. Tarkkuuden eteen kirjoitetaan piste.
>>> print(f"{13.434332:.2f}")
13.43
Esitysmuoto on muoto, jolla arvo esitetään.
Kokonaislukujen esitysmuodost ovat seuraavat.
b | Luku muotoillaan binäärimuotoon. |
c | Luku muutetaan Unicde-merkiksi. |
d | Luku muotoillaan kymmenjärjestelmän muotoon. (oletus) |
o | Luku muotoillaan oktaalimuotoon. |
x | Luku muotoillaan heksadesimaalimuotoon. |
n | Luku muotoillaan tuhaterottimilla (nykyisen lokaalin mukaan. |
Liukulukujen esitysmuodost ovat seuraavat.
e, E | Tieteellinen esitysmuoto, joko isolla tai pienellä E:llä. |
f, F | |
g, G | |
n | Luku muotoillaan tuhaterottimilla (nykyisen lokaalin mukaan. |
% | Luku muotoillaan prosenttiluvuksi. Esim. 0.12 → ”12%”. |
(ei mitään) |
Merkkijonon muotoilu string.format-metodilla
[muokkaa | muokkaa wikitekstiä]Merkkijonon muotoilu %-operaattorilla
[muokkaa | muokkaa wikitekstiä]Myös vanhaa C:n printf-tyylistä muotoilua voi edelleen käyttää.
Operaattorin vasen operandi on muotoilumerkkijono ja oikea monikko, jossa on alkio jokaiselle muotoilumerkille.
>>> eläin1 = 'kissa'
>>> print ('[[%s]]' % (eläin1))
[[kissa]]
>>> eläin2 = 'koira'
>>> print ('[[%s]], [[%s]]' % (eläin1, eläin2))
[[kissa]], [[koira]]
Alla on lueteltu tärkeimmät muotoilukoodit.
%c | yksittäinen merkki; Merkin voi antaa merkkijonona ("A") tai lukuna (65). |
%d | kokonaisluku |
%f | liukuluku |
%s | merkkijono |
%% | Korvataan yksittäisellä %-merkillä. |
Muotoilukoodiin voi lisätä myös muita muotoiluohjeita. Muotoiluohjeen täydellinen muoto on
- %(<nimi>)<lippu><kentän koko><.tarkkuus><tyyppi>
jossa
- nimi on parametrin nimi, jonka arvoa käytetään, jos parametrit on annettu dictinä,
- lippu on kentän muotoilua säätävä merkki
- kentän koko on leveys, jonka kokoiseen kenttään tulos kirjoitetaan; jos *, luetaan koko seuraavasta parametrista
- tarkkuus on kokonaisluvun desimaalien määrä ja; jos *, luetaan tarkkuus seuraavasta parametrista
- tyyppi on tulostettavan arvon tyyppi.
Näistä voi antaa tarvittavat ja jättää muut pois.
Lippu voi olla jokin seuraavista.
# | |
0 | Luku täytetään 0:lla kentän leveyteen. |
(välilyönti) | Luku täytetään välilyönnillä leveyteen. |
- | Luku tasataan kentän vasempaan laitaan. |
+ | Lukuun merkitään +-merkki, jos se on positiivinen. |
Esimerkkejä
[muokkaa | muokkaa wikitekstiä]Liukuluvun desimaalien määrän voi antaa pisteellä ja sen jälkeisellä luvulla.
>>> keskiarvo = 5.283852
>>> print('Keskiarvo: %.2f' % keskiarvo)
Keskiarvo: 5.28
Tulostus määräkokoisiin kenttiin.
>>> print("%10.2f %10d %10.2f" % (0.24566, 99, 1.2345))
0.25 99 1.23
Kentän täyttäminen 0:lla tai välilyönnillä.
>>> print("Tili: %07d" % (99))
Tili: 0000099
Aiheesta muualla
[muokkaa | muokkaa wikitekstiä]- Python-kielisen_ohjelmoinnin_perusteet (Wikiopiston opintopiirin opiskeluohjeita)
Johdanto: | |
---|---|
Tietotyypit ja tietorakenteet: |
Luvut - Merkkijonot - Lista - Monikko (tuple) - Sanakirja - Joukko (set) |
Ohjausrakenteet | |
Muut kielen rakenteet: |
Moduuli - Luokka - Funktio - Virheidenhallinta - Tiedosto |
Graafinen käyttöliittymä: | |
Harjoitustehtäviä: | |
Lisätiedot ja lähteet: |