II OSA sisukord |
2.1 JÄRJEND JA TSÜKKEL
Järjend tsüklis
Kui maatriks on esitatud kahemõõtmelise järjendina, siis märkame, et tegelikult maatriksi iga rida on omakorda eraldi järjend, veerg aga ei ole. Tegelikult saame isegi programmikoodis maatriksi ridu paremini välja tuua:
tabel = [ [1, 2, 4], [1, 5, 0] ]
Kui see tabel aga ekraanile väljastada (print(tabel)
), siis ilmub ikkagi halvasti loetavalt [[1, 2, 4], [1, 5, 0]]
. Tabelikujulise väljundi jaoks võime väljastada tsükli abil iga rea eraldi:
for rida in tabel: print(rida)
Nagu ikka, on väga soovitav näiteprogramm oma arvutis tööle panna. 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 aga omavahel kokku panna nii, et iga rea korral väljastataks kõik selle rea elemendid ükshaaval:
for rida in tabel: for element in rida: print(element)
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äitekoodi 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 nii, et 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äivitades 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.
Eelmist 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:
for rida in tabel: for element in rida: print(element, end=" ") print()
Siin on reavahetuse väljastav print
just välimise tsükli sees, kuid mitte sisemise. Nii rakendub see ainult siis, kui sisemine tsükkel on kõik mingi antud rea elemendid väljastanud (tühikutega eraldatult) 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 võite 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. Sarnaselt saaks leida kõigi antud arvude korrutise:
a = [1, 6, 3, 2, 1, 8, 3, 2] korrutis = 1 # 0 jätaks korrutise 0-ks for el in a: korrutis *= el print(korrutis)
Selline viis sobib hästi siis, kui midagi tuleb teha järjendi kõigi elementidega. Sageli on aga vaja tegeleda ainult teatud kohtadel paiknevate elementidega ja sellisel juhul on kasu indeksitest. Järgmine programm on eelmisega samaväärne, aga elementide krabamiseks järjendist kasutatakse indekseid.
a = [1, 6, 3, 2, 1, 8, 3, 2] korrutis = 1 for i in range(len(a)): korrutis *= a[i] print(korrutis)
Funktsiooni range
abil omandab tsüklimuutuja i
järjest väärtusi lõigust 0
kuni len(a) - 1
. Vajadusel tuletage funktsiooni range
meelde eelmise kursuse materjalidest. Antud 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.
Kahekordne tsükkel ja indeksid
Samuti saame indeksite abil läbida kahekordseid järjendeid. Siis võetakse sageli (aga mitte alati) 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.
Vahel on vaja teada, kus täpselt teatud tingimustele vastav element on. Järgmine programm väljastab ekraanile negatiivsete arvude asukohad (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) + ").")
II OSA sisukord |