Arvutiteaduse instituut
  1. Kursused
  2. 2017/18 kevad
  3. Programmeerimise alused II (LTAT.TK.001)
EN
Logi sisse

Programmeerimise alused II 2017/18 kevad

  • Kursuse info
  • 1. Kahemõõtmeline järjend
  • 2. Kahekordne tsükkel
  • 3. Andmestruktuurid

3.1 Järjend ja ennik 3.2 Hulk 3.3 Sõnastik 3.4 Andmestruktuuride võrdlus 3.5 Sõne 3.6 Silmaring: Andmebaasid

  • 4. Viitamine ja muteerimine
  • 5. Testimine ja silumine. Rekursioon
  • 6. Rekursioon II
  • Korraldajad
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, siis lst[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 kas True või False.
  • Funktsioonide min ja max 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 on lst 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, siis enn[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 kas True või False.
  • Funktsioonide min ja max 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 on enn 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
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo