5 Järjend ja tsükkel

Järjend tsüklis

Kui maatriks on esitatud kahemõõtmelise järjendina, siis märkame, et maatriksi iga rida on omakorda eraldi järjend, veerg aga ei ole. Tegelikult saame isegi programmikoodis maatriksi ridu loetavalt välja tuua:

tabel = [
    [1, 2, 4],
    [1, 5, 0]
]

Kui see tabel ekraanile väljastada (print(tabel)), siis ilmub tabel ühele reale pressituna:

[[1, 2, 4], [1, 5, 0]]

Tabelikujulise väljundi jaoks võime väljastada tsükli abil iga rea eraldi:

Näiteprogramm. Kahemõõtmelise järjendi sisemiste järjendite printimine

tabel = [ [1, 2, 4], [1, 5, 0] ]
for rida in tabel:
    print(rida)

See programm väljastab:

[1, 2, 4]
[1, 5, 0]

Tsükli igal sammul väljastatakse üks rida järjendina ekraanile. Varasemast teame, et kui tahame iga elemendi ükshaaval järjendist väljastada, siis seda saab teha tsükli abil nii:

for element in rida:
    print(element)

Need konstruktsioonid saab omavahel kokku panna nii, et iga rea korral väljastatakse kõik selle rea elemendid ükshaaval:

Näiteprogramm. Kahemõõtmelise järjendi sisemiste elementide printimine

tabel = [ [1, 2, 4], [1, 5, 0] ]
for rida in tabel:
    for element in rida:
        print(element)

See programm väljastab:

1
2
4
1
5
0

Siin teeb sisemine tsükkel kogu oma töö ära igal välimise tsükli sammul. Niimoodi kokku pandud tsükleid võib nimetada kahekordseks tsükliks.

Eelmise näiteprogrammi abil saame tõesti kõik elemendid maatriksist (või kahekordsest järjendist) väljastada, kuid tegelikult ei ilmu nad ekraanile siiski tabelina. Põhjus on selles, et funktsioon print väljastab pärast igat väljakutset lisaks elemendile ka reavahetuse. Seda käitumist saab muuta, kui anda print funktsioonile nimelise argumendina nimega end ette sõne, mis tuleb alati lõpuks väljastada.

for rida in tabel:
    for element in rida:
        print(element, end=" ")

Selle programmijupi käivitamisel ilmuvad elementide vahele reavahetuste asemel tühikud. Samuti võiks me end=" " asemel kirjutada näiteks end="", et elementide vahele pandaks tühjad sõned (ehk ei pandaks mitte midagi) või hoopis midagi muud – kõik sõned on sinna lubatud. Huvi korral saate rohkem lugeda funktsiooni print võimaluste kohta Pythoni dokumentatsioonist.

Sellist programmi käivitades ilmuvad elemendid küll ilusate vahedega, kuid erinevate ridade elemendid väljastatakse ikkagi samale reale. Selle parandamiseks saame väljastada tavalise print funktsiooniga ühe reavahetuse iga kord, kui minnakse elementide vaatamisel järgmise rea juurde:

Näiteprogramm. Kahemõõtmelise järjendi ilus printimine
tabel = [ [1, 2, 4], [1, 5, 0] ]
for rida in tabel:
    for element in rida:
        print(element, end=" ")
    print()

See programm väljastab:

1 2 4 
1 5 0

Siin on reavahetust väljastav print just välimise tsükli sees, mitte sisemise. Nii rakendub see ainult siis, kui sisemine tsükkel on kõik mingi rea elemendid (tühikutega eraldatult) väljastanud ja välimisel tsüklil on aeg minna järgmise rea (välimise tsükli uue sammu) juurde.

Kui tahame arvestada ka asjaolu, et elemendid võivad tabelis olla erineva pikkusega, siis võib tühiku asemel kasutada tabulatsioonimärki "\t" või huvi korral uurida käsu rjust kohta.

Tsükkel ja indeksid

Eespool kasutasime Pythoni mugavaid for-tsükli võimalusi, et järjendit elementhaaval läbida ilma indeksite peale mõtlemata. Sageli on aga vaja tegeleda ainult teatud kohtadel paiknevate elementidega ja sellisel juhul on kasu indeksitest. Järgmises programmis kasutame indekseid, et järjendist elemente kätte saada:

Näiteprogramm. Järjendi läbimine indeksi põhjal

a = [1, 6, 3, 2, 1, 8, 3, 2]

for i in range(len(a)):
    print(i)

Funktsiooni range abil omandab tsüklimuutuja i järjest väärtusi lõigust 0 kuni len(a) - 1.  Sellisel juhul saab muutuja i väärtuseks järjest 0, 1, 2, 3, 4, 5, 6 ja 7.

Väga oluline on siin vahet teha indeksil i ja vastaval elemendil a[i]. Järgmistes enenekontrolliküsimustes tuleb tähelepanelikult vaadata, milliseid väärtusi i omandab.

Enesekontroll (2 ülesannet)

Kahekordne tsükkel ja indeksid

Samuti saame indeksite abil läbida kahekordseid järjendeid. Siis võetakse sageli (aga mitte kohustuslikult) tsüklimuutujateks i ja j. Tabeli väljastamise saaksime indeksite abiga teha nii:

for i in range(len(tabel)):
    for j in range(len(tabel[i])):
        print(tabel[i][j], end=" ")
    print()

Välimine tsükkel käib ikka ridahaaval, i saab väärtusi lõigust 0 kuni len(tabel)-1. Sisemine tsükkel võtab tol hetkel vaadeldava rea (tabel[i]) elemente (tabel[i][j]) vastavalt j väärtustele, järjest 0 kuni len(tabel[i])-1. See programm töötab ka siis, kui read ei ole ühepikkused – iga rea korral muutub j just vastavalt konkreetse rea pikkusele.

Enesekontroll (1 ülesanne)

Vahel on vaja teada, kus teatud tingimustele vastav element paikneb. Järgmine programm väljastab ekraanile negatiivsete arvude asukohad (indeksid):

Näiteprogramm. Negatiivsete arvude indeksid

tabel = [[1, -4, 5], [-4, 6, 7], [5, 6, -7]]
for i in range(len(tabel)): # ridade kaupa
    for j in range(len(tabel[i])): # selle rea elementide kaupa
        if tabel[i][j] < 0:
            print("Negatiivne arv " + str(tabel[i][j]) +
                  " on kohal (" + str(i) + "; " + str(j) + ").")

Enesekontroll (2 ülesannet)

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Tarkvaraarendus. 2. trükk on loodud Eno Tõnisson, Tauno Palts, Kaarel Tõnisson, Heidi Meier, Merilin Säde, Ago Luberg, Birgy Lorenz, Einar Kivisalu, Meelis Antoi, ja Säde Mai Krusberg poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut