26 For-tsükkel. Funktsioon range

Selles peatükis uurime for-tsüklit, mis on mõneti sarnane varasemalt õpitud while-tsükliga. Tutvume funktsiooniga range, mida tihti for-tsüklites kasutatakse.

Järjendi üksiku elemendi kasutamine

Tegutseme nüüd järjendi konkreetse elemendiga. Võtame näiteks järjendi a = [12, 23, 34, 45, 56] elemendi, mille indeks on 3. Näeme, et a[3] väärtus on 45. Me võime elementi  a[3] (ja samalaadselt kõiki teisi elemente) kasutada küllaltki iseseisvana. Näiteks saame neid kasutada avaldistes või muuta nende väärtusi:

a = [12, 23, 34, 45, 56]
print(a[3])
print(type(a[3]))
print(a[3] - 32)
a[3] = 1
print(a[3])

Enesekontroll (1 küsimus)

Me näeme, et indeksi võib leida ka arvutuse tulemusena. Oluline on vaid tagada, et indeks ei jääks järjendi piiridest väljapoole.

Järjend ja while-tsükkel

Järjendi struktuurist on eriti kasu juhul, kui me tahame selle elemente (või mingit osa neist) üheskoos kasutada.

Olgu meil ülesandeks trükkida järjendi kõik elemendid järjestikustele ridadele. Selgelt on see tsükliline tegevus, milleks saame kasutada while-tsüklit:

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 on selline tsükli tingimus sobiv.

Olgu meil uus ülesanne: nullida kõik elemendid, mille väärtus on suurem kui 30:

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

Sageli on meil vaja järjendit just elementhaaval töödelda. Selle jaoks on sobiv for-tsükkel, mis võtab igal sammul fookusesse järjendi ühe elemendi.

a = [12, 23, 34, 45, 56]
for el in a:        #el asemel on ka teised nimed lubatud 
    print(el)
Joonis 1. For-tsükliga elementide väljastamine

Muutuja el saab igal tsükli sammul väärtuseks järjendi a järgmise elemendi. Olemuselt 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)
Joonis 2. For-tsükkel, mis ei muuda järjendit

Mitmetes programmeerimiskeeltes on for-tsükkel teistsugune ja Pythoni for-tsüklile sarnast nimetatakse hoopis for-each-tsükliks.

Range

Sageli on meil vaja selliseid tsükleid, kus tsüklimuutuja väärtus teatud reeglite järgi muutub. Meil endalgi on olnud 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 vastava järjendi moodustada käsuga list(range(4)), aga for-tsükli jaoks seda vaja pole:

for i in range(4):
    print(i)

Kui argumendiks on mittepositiivne arv, siis ühtegi arvu vahemikus pole:

for i in range(-4):
    print(i)

Vahel pole tsüklimuutuja väärtus oluline, kui meid huvitab vaid korduste arv. Siis peab tsüklimuutuja ikkagi kirjas olema, kuid selle väärtust ei pea kasutama:

from turtle import *
for i in range(4):
    forward(100)
    left(90)
exitonclick()

Kui funktsioonile range anda kaks argumenti, siis esimene näitab seda, millisest arvust alustatakse ja teine seda, millise arvu juures lõpetatakse (seda ennast mitte kaasates).

for i in range(1, 4):
    print(i)

Kui teine argument ei ole esimesest suurem, siis ühtegi arvu vahemikus pole.

Kui funktsioonile on antud kolmas 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.

Enesekontroll (1 küsimus)

Muidugi saab erinevates kohtades kasutada muutujaid. Olgu meil ülesandeks teha programm, 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). Lisaks arvutatakse kõigi väljastatud arvude korrutis.

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.

Näiteprogramm. Arvude väljastamine ja korrutamine

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))

Palun kommenteeri seda materjali Google’i küsimustikus.

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Programmeerimine on loodud Eno Tõnisson, Tauno Palts, Merilin Säde, Kaarel Tõnisson jt poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut