III OSA sisukord |
3.1 JÄRJEND JA ENNIK
Järjend
Erinevates programmeerimiskeeltes on mõnevõrra erinevad andmestruktuurid üht tüüpi muutujate/väärtuste koos käsitlemiseks. Paljudes keeltes on kõige elementaarsem andmestruktuur massiiv (ingl array), mis on sisuliselt fikseeritud pikkusega nimekiri sama tüüpi väärtustest. Pythonis massiivi selle mõiste klassikalises tähenduses pole, vaid sama rolli täidab dünaamilisem ja sõbralikum järjend (ingl list). Järjend on muutuva pikkusega ja selles saab hoida ka eri tüüpi väärtuseid. Järjendiga oleme juba palju tegelenud ja tema kohta teame nii mõndagi:
- Järjendi tähistamiseks või tekitamiseks kasutatakse nurksulge
[
ja]
. - Järjendi elementide järjestus on oluline:
[1, 2]
ei ole võrdne järjendiga[2, 1]
. - Järjendi elementide poole saab pöörduda indeksite abil: kui
lst
on järjend, siislst[2]
on selle järjendi kolmas element. - Järjendi pikkuse saame teada funktsiooniga
len
. - Mingi elemendi järjendisse kuulumist saame kontrollida võtmesõna
in
abil:3 in lst
väärtuseks on kasTrue
võiFalse
. - Funktsioonide
min
jamax
abil saame leida järjendist vastavalt minimaalse või maksimaalse elemendi (eeldusel, et elemendid on mingil moel järjestatavad, nt arvud). - Järjendit saab viilutada:
lst[1:5]
annab alamjärjendi, milles onlst
elemendid indeksitega 1, 2, 3 ja 4.
Ennik
Lisaks järjendile on Pythonis olemas sarnane andmestruktuur, mille nimi on ennik (ingl tuple). Naljakas eestikeelne nimi on tuletatud sellest, et kolme elemendiga kogumit nimetatakse kolmikuks, nelja elemendiga nelikuks, viiega viisikuks jne. Kui sellises struktuuris on suvaline arv n elementi, siis võiks saadut nimetada nimega n-ik ehk eestipärasemalt ennik.
Enniku tähistamiseks kasutatakse nurksulgude asemel ümarsulgusid (
ja )
. Näiteks kolmeelemendilise enniku ehk kolmiku saame tekitada nii:
kolmik = (1, 4, 6)
Üheelemendilise enniku (üksiku) tekitamine on pisut ebaintuitiivsem:
yksik = (1,)
Koma ainukese elemendi järel ütleb Pythonile, et tegemist on ennikuga, mitte aritmeetilise avaldisega, kus ümarsulud omavad teist tähendust.
Tuleb välja, et kõik eelnevalt loetletud järjendi omadused (peale esimese) kehtivad ka enniku puhul:
- Ennikus on elementide järjestus oluline:
(1, 2)
ei ole võrdne ennikuga(2, 1)
. - Enniku elementide poole saab pöörduda indeksite abil: kui
enn
on ennik, siisenn[2]
on selle enniku kolmas element. - Enniku pikkuse saame teada funktsiooni
len
abil. - Mingi elemendi ennikusse kuulumist saame kontrollida võtmesõna
in
abil:3 in enn
väärtuseks on kasTrue
võiFalse
. - Funktsioonide
min
jamax
abil saame leida ennikust vastavalt minimaalse või maksimaalse elemendi (eeldusel, et elemendid on mingil moel järjestatavad, nt arvud). - Ennikut saab viilutada:
enn[1:5]
annab alamenniku, milles onenn
elemendid indeksitega 1, 2, 3 ja 4.
Siiski pole järjend ja ennik funktsionaalsuse mõttes võrdsed. Enniku kõige olulisem erinevus peitub selles, et see ei ole muudetav (täpsemalt muteeritav, ingl mutable). Ennikusse ei ole pärast selle tekitamist võimalik elemente lisada, neid eemaldada ega muuta, seega pole ennikul näiteks järjendite tuntud käske append
, remove
, pop
, insert
, reverse
ega extend
. Sellest tuleneb, et ennik on ka alati fikseeritud pikkusega.
Ennikud kasutatakse sageli just siis, kui struktuuri pole vaja programmi käivitamise ajal muuta. Näiteks kui programmis on vaja tähistada objekte, millel on mitu omadust, kuid mida pole vaja programmi töötamise ajal muuta, siis on mõistlik nende esitamiseks kasutada ennikuid. Samuti kasutatakse ennikuid tihti siis, kui funktsioonist on vaja tagastada mitu väärtust.
Näiteks see funktsioon leiab kahest järjendist elemendid, mille korrutis on suurim ja tagastab need elemendid paarina:
def suurim_korrutis(lst1, lst2): suurimad = (0, 0) for el1 in lst1: for el2 in lst2: if el1 * el2 > suurimad[0] * suurimad[1]: suurimad = (el1, el2) return suurimad
Kui aga ühe funktsiooni asemel, mis tagastab enniku tulemustest, on võimalik teha mitu funktsiooni, millest igaüks leiab ühe üksiku (väiksema) osa tulemustest, siis on parem stiil valida just see mitme funktsiooniga variant. Mida väiksemad ülesanded saate eri funktsioonide vahel ära jaotada, seda lihtsam on tavaliselt koodist aru saada, sealt vigu otsida ja seda hallata.
III OSA sisukord |