Materjalid koostas ja kursuse viib läbi
Tartu Ülikooli arvutiteaduse instituudi programmeerimise õpetamise töörühm
< eelmine | 5. nädala sisukord | järgmine > |
5.2 For-tsükkel. Funktsioon range
ÜKSIK ELEMENT TEISTE SEAS
Jätkame järjendi teemaga vaadeldes nüüd järjendi ühte konkreetset elementi. Võtame näiteks järjendi a = [12, 23, 34, 45, 56]
elemendi, mille indeks on 3. Näeme, et a[3]
(või teisiti a[-2]
) väärtus on 45. Tegelikult võime a[3]
(ja muidugi ka teisi elemente) küllaltki iseseisvatena käsitleda. Näiteks saame seda kasutada avaldistes või anda sellele uue väärtuse.
a = [12, 23, 34, 45, 56] print(a[3]) print(type(a[3])) print(a[3] - 32) a[3] = 1 print(a[3])
Ülesanne
Nagu näeme, siis on indeksit võimalik arvutades leida. Oluline on vaid, et indeks oleks lubatud vahemikus.
Järjendi idee on siiski kõiki (või vähemalt mingeid) elemente koos käsitleda. Proovime järjendi elemendid järjestikustel ridadel ekraanile saada. Tegemist on selgelt tsüklilise tegevusega, mida saamegi while-tsüklina realiseerida.
a = [12, 23, 34, 45, 56] i = 0 while i < len(a): print(a[i]) i += 1
Kuna viimase elemendi indeks on ühe võrra väiksem kui järjendi pikkus, siis tõesti selline tsükli tingimus on sobiv. Väljastamise asemel võime ka näiteks kõik need elemendid, mille väärtus on suurem kui 30, nullida.
a = [12, 23, 34, 45, 56] i = 0 while i < len(a): if a[i] > 30: a[i] = 0 i += 1 print(a)
FOR-TSÜKKEL
Kuna väga sageli on vaja järjendiga just elementhaaval midagi ette võtta, on kasutusele võetud eriline tsükkel. For-tsükkel võtabki järjest igal sammul fookusesse järjendi ühe elemendi.
Elementide väljastamise saame realiseerida nüüd lühemalt.
a = [12, 23, 34, 45, 56] for el in a: #el asemel võib ka mingi teine nimi olla print(el)
Muutuja el
saab igal tsükli sammul väärtuseks järjendi a
järgmise elemendi. Laias laastus on for-tsükkel while-tsükliga sarnane. Esimesel real on päis, mis määrab, millal tsükkel lõpetatakse. Järgneb taandreaga määratud keha (ehk sisu), mida igal sammul täidetakse.
Tsüklit korratakse niipalju kordi, kui järjendis on elemente.
Muutuja el
kaudu ei saa muuta järjendi elementide väärtusi. Kui püüda teha ülaltoodud teisele while-tsüklile analoogi, siis nii jääb a
muutmata.
a = [12, 23, 34, 45, 56] for el in a: if el > 30: el = 0 print(a)
Mitmetes programmeerimiskeeltes on for-tsükkel teistsugune ja Pythoni for-tsüklile sarnast nimetatakse hoopis for-each-tsükliks.
RANGE
Üsna sageli on vaja selliseid tsükleid, kus tsükli muutuja väärtus teatud reeglite järgi muutub. Meil endalgi oli vaja, et näiteks i
omandaks järjest väärtusi 0, 1, 2, 3 jne. Siin tuleb appi funktsioon range
, mis genereerib järjendit meenutava väärtuse. Näiteks range(4)
annab vahemiku, milles on 0, 1, 2 ja 3. Vajadusel võime ka vastava järjendi saada list(range(4))
, aga for-tsükli jaoks seda vaja pole.
for i in range(4): print(i)
Muutuja i
saab järjest väärtused 0, 1, 2 ja 3.
Kui argumendiks on mittepositiivne arv, siis ühtegi arvu vahemikus pole.
for i in range(-4): print(i)
Vahel meil tegelikult tsükli muutuja väärtust teada pole vajagi, huvitab vaid korduste arv. Paneme näiteks kilpkonna jälle ruutu joonistama
from turtle import * for i in range(4): forward(100) left(90) exitonclick()
Kuigi muutuja i väärtust vaja ei olnud, pidi see muutuja ikka kirjas olema.
Funktsiooni range
saab kasutada ka 2 või 3 argumendiga. Kui on kaks argumenti, siis esimene näitab, millisest arvust alustatakse ja teine, millise arvu juures lõpetatakse (seda ennast mitte kaasates).
for i in range(1, 4): print(i)
Ülesanne
Kui teine argument ei ole esimesest suurem, siis ühtegi arvu vahemikus pole.
Kui on kolmaski argument, siis see näitab sammu, mis võib olla ka negatiivne. Nii annab range(0, 13, 2)
arvud 0, 2, 4, 6, 8, 10, 12 ja range(4, -5, -3)
arvud 4, 1, -2.
Muidugi saab ka erinevates kohtades muutujaid kasutada. Näiteks teeme programmi, mis küsib kasutajalt kaks täisarvu. Seejärel kirjutab ekraanile alates esimesest arvust üle ühe kõik täisarvud kuni teise arvuni (seda mitte kaasates). Ühtlasi leiab ka kõigi väljastatud arvude korrutise.
Näiteks, kui sisestatakse 4 ja 12, siis ekraanile väljastatakse: 4 6 8 10 Korrutis on 1920
Üks võimalik lahendus on selline. Korrutise puhul ei sobi algväärtuseks 0, sest korrutamine seda ei muudaks,
algus = int(input("Sisestage esimene arv ")) lõpp = int(input("Sisestage teine arv ")) korrutis = 1 for i in range(algus, lõpp, 2): print(i) korrutis *= i print("Korrutis on " + str(korrutis))
Kontrollülesande 5.2 lahendamisel võib sellest näitest kasu olla.
< eelmine | 5. nädala sisukord | järgmine > |