Arvutiteaduse instituut
  1. Kursused
  2. 2023/24 sügis
  3. Programmeerimine (LTAT.SO.001)
EN
Logi sisse

Programmeerimine 2023/24 sügis

  • Pealeht
  • 1. Sissejuhatus
  • 2. Tingimuslause
  • 3. Tsükkel
  • 4. Järjend ja for-tsükkel
  • 5. Funktsioon
  • 6. Andmevahetus. Lihtne kasutajaliides
  • 7. Kahemõõtmeline järjend. Kahekordne tsükkel
  • 8. Kordamine 1. kontrolltööks?
  • 9. Kontrolltöö?
  • 10. Viitamine ja muteerimine
  • 11. Andmestruktuurid
  • 12. Rekursioon ja andmetöötlus
  • Projekti esitamine ja esitlused
  • 13. Objektorienteeritud programmeerimine
  • 14. Kordamine 2. kontrolltööks?
  • 15. Kontrolltöö 2?
  • Loengud
  • Moodle
  • Lahendus
  • Thonny paigaldamine
  • Thonny logide esitamine
  • Kiireksamist
  • Viited
< eelmine4. nädala sisukordjärgmine >

4.1 Järjend

JÄRJEND

Seni on meil programmides erinevate andmete hoidmiseks olnud eraldi muutujad. Paljude ülesannete puhul on vägagi mõistlik teatud andmeid koos käsitleda – teatud andmestruktuuridena. Erinevates programmeerimiskeeltes on selle jaoks mõnevõrra erinevad vahendid. Ka konkreetses programmeerimiskeeles võib olla mitmeid võimalusi, on Pythoniski. Pythoni üheks põhiliseks andmestruktuuriks on järjend ehk list (ingl list). Siinkohal tuleb märkida, et erinevate programmeerimiskeelte ja isegi erinevate materjalide puhul võib terminoloogia erineda. Meie peame siin järjendit ja listi sünonüümideks, mujal ei pruugi see nii olla.

Järjend koosneb elementidest, mis loetletakse nurksulgudes üksteisest komadega eraldatutena. Näiteks

nädalapäevad = ["esmaspäev", "teisipäev", "kolmapäev", "neljapäev", "reede", "laupäev", "pühapäev"]
temperatuurid = [-4, 2, 6, 4, 4]

Järjendis võib olla korduvaid elemente, näiteks järjendis temperatuurid on 4 kaks korda. Eeltoodud järjendites on esimeses ainult sõned ja teises ainult täisarvud. Tegelikult võivad Pythonis ühe järjendi elemendid olla ka erinevat tüüpi, aga tavaliselt me seda võimalust ei kasuta. Järjendeid võime liigitada nende elementide tüüpide järgi. Muutujas nädalapäevad on meil nüüd siis sõnejärjend ja muutujas temperatuurid täisarvujärjend.

Vaatame, mis tüüpi näitab Python ise muutuja temperatuurid puhul.

temperatuurid = [-4, 2, 6, 4, 4]
print(type(temperatuurid))

Ülesanne

MÕNED OPERATSIOONID. INDEKSID

Järgmise programmis on demonstreeritud mõningaid järjendiga seotud operatsioone.

 
# Järjendi loomine
nädalapäevad = ["esmaspäev", "teisipäev", "kolmapäev", "neljapäev", "reede", "laupäev", "pühapäev"]

# Järjendi saab ekraanil väljastada
print(nädalapäevad)

# Elementide arvu (järjendi pikkuse) leidmine
nädalapäevi = len(nädalapäevad)
print('Järjendis on ' + str(nädalapäevi) + ' elementi')

# Järjendisse kuulumise kontroll
if "palgapäev" in nädalapäevad:
    print("Palgapäev on järjendis")
else:
    print("Palgapäev ei ole järjendis")

# Konkreetse elemendi väärtus indeksi (järjekorranumbri) abil
print(nädalapäevad[1])

Mõnevõrra üllatav võib tunduda see, et nädalapäevad[1] ei anna meile esimest elementi, vaid hoopis teise. Nimelt tavatsetakse programmeerimises nummerdamist alustada nullist. Tõepoolest

print(nädalapäevad[0])

annab (argimõttes) esimese elemendi. Seega tuleb olla väga tähelepanelik, kas jutt on argine või programmeerimisest. Selguse mõttes räägime siis pigem elemendi indeksist, näiteks element indeksiga 1. Nagu juba nägime märgitakse indeks nurksulgudesse.

Tegelikult ei alga ka tavaelus nummerdamine alati ühest. Näiteks on mõnedes rongijaamades platvorm 0 (Londoni King's Cross, Cardiffi keskjaam). (Eks King's Crossi jaamas ole ka muidugi platvorm 9 3/4.)

Kuna loendamine algab nullist, siis viimase elemendi indeks on ühe võrra väiksem järjendi pikkusest, järjendi nädalapäevad puhul siis 6, sest elemente on 7.

Proovigem!

nädalapäevad = ["esmaspäev", "teisipäev", "kolmapäev", "neljapäev", "reede", "laupäev", "pühapäev"]
print(nädalapäevad[6])
print(nädalapäevad[7])

Kui minna "üle piiri", kasutades sellist indeksit, millele vastavat elementi pole, siis ilmub veateade IndexError: list index out of range.

Ülesanne

Pythonis on tõepoolest võimalus kasutada negatiivseid indekseid. Tegelikult me oleme seda juba kasutanud vihjes Leedu perekonnanimede ülesande juures: Viimase tähe kontrollimiseks sobib nimi[-1] == "e".

Tookord oli tegemist sõnega, mida aga saabki käsitleda sümbolite jadana. Nii ongi väga mitmed (siiski mitte kõik) operatsioonid võimalikud nii järjendite kui sõnedega. (Tegelikult veel teistegi andmestruktuuridega, mida selles kursuses üldiselt ei käsitleta.)

VIILUTAMINE

Leedu perenimede ülesande juures oli veel kirjas, et kahe viimase tähe kontrollimiseks saab kasutada näiteks võrdlemist nimi[-2:] == "ne". Tegemist on viilutamisega, mis toimib nii järjendite kui sõnede puhul ja millega saame vastavalt alamjärjendi või alamsõne. Vaatleme viilutamise võimalusi järgmise programmi abil, kus "noa all" on (antud juhul ühesümboliliste) sõnede järjend. Meelega on sama tulemuse saamiseks kasutatud erinevaid võimalusi.

a = ['A', 'B', 'C', 'D', 'E']
print(a[0:2])
print(a[:2])
print(a[2:5])
print(a[2:])
print(a[-2:])

Enne koolonit kirjutatakse indeks, millest alates tuleb elemente kopeerida, ja kooloni järele indeks, mille juures tuleb kopeerimine lõpetada (selle indeksiga element jääb tulemusest välja). Kui algav indeks kirjutamata jätta, siis alustatakse järjendi (sõne) algusest. Kui lõpetav indeks kirjutamata jätta, siis kopeeritakse kuni järjendi (sõne) lõpuni (viimane element kaasaarvatud).

Järgmises näites viilutatakse erinevaid sõnesid – nii neid, mis on muutujale väärtuseks antud, kui ka neid, mis pole.

sõne1 = 'Tartu'
print(sõne1[1:4])
sõne2 = sõne1
print(sõne2[-2:])
print("Väike-Maarja"[4:9])

Ülesanne

Viilutamisel saab kasutada ka teist koolonit, mille järele kirjutatakse kopeerimise samm. Vaikimisi on sammu väärtuseks 1. Negatiivse sammu korral kopeeritakse järjendi elemente paremalt vasakule.

print('abcde'[2:5:2])  #ce
print('abcde'[5:1:-1]) #edc

Järgmised käsud on samaväärsed.

print('abcde'[::])
print('abcde'[:])

VEEL OPERATSIOONIDEST

Toome lõpetuseks tabeli, milles on nii juba mainitud kui mainimata võimalusi.

AvaldisVäärtusKommentaar
len([2, 1, 4, 3, -5])5Elementide arv
min([2, 1, 4, 3])1Minimaalne element
max([2, 1, 4, 3])4Maksimaalne element
sum([2, 1, 4, 3])10Elementide summa
sorted([2, 1, 4, 3])[1, 2, 3, 4]Tagastab järjestatud järjendi
3 in [2, 1, 4, 3]TrueKas on selline element?
[2, 1] + [3, 1][2, 1, 3, 1]Järjendite liitmine
[2, 1, 4, 1].count(1)2Elemendi esinemiste arv
[1, 2, 3] == [2, 1, 3]FalseJärjekord on oluline

Katsetage neid julgesti!

Kontrollülesande 4.1 lahendamiseks pole tegelikult kogu seda arsenali vaja. Edasipidi aga võivad erinevad võimalused kasuks tulla küll.

Tabelis on järjendite liitmise tehe, mille abil saame järjendile ka vaid ühe elemendi lisada. Ühe elemendi lisamiseks saab samuti kasutada funktsiooni append. Järgmises näites ongi kummalegi järjendile üks element lisatud.

a = [5, 8]
a.append(7)
print(a)
b = [5, 8]
b += [7]
print(b)

Vaata ka kokkuvõtvat videot:


< eelmine4. nädala sisukordjärgmine >
  • 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.
Courses’i keskkonna kasutustingimused