For-tsükkel

For-tsüklit kasutatakse siis, kui on vaja jada (Pythonis näiteks sõne, järjend või ennik) kõik elemendid läbi käia ning iga elemendiga midagi oma programmi koodis teha.

For-tsükli süntaks näeb Pythonis välja selline:

nums = "12345" # the string which will be iterated over in the for-loop
for i in nums: # the for-loop definition
    print(i) # the code that's executed for every element in the sequence

Kui see programm tööle panna, kuvatakse konsooli järgmine numbrite jada:

1
2
3
4
5

For-tsüklis käiakse kõik jadas olevad elemendid järjest läbi ning iga elemendi jaoks käivitatakse eraldi for-tsükli sees olev kood (kood, mis on for-tsükli definitsioonist sammu võrra paremale taandega). Just kirjeldatud näites on for-tsükli sees olev kood väga lühike ning ainuke asi, mida iga elemendiga teeme, on selle konsooli kuvamine. Tihti on for-tsükli kasutamisel iga elemendiga läbi tehtav protsess palju pikem ning võib sisaldada tingimuslauseid, uute andmestruktuuride loomist või ka teisi for-tsükleid.

Igal for-tsükli läbimise korral võetakse ette järgmine jada element. For-tsükli sees sellele elemendile viitamiseks kasutatakse tsüklimuutujat (control variable), mis defineeritakse for-tsüklit kirja pannes. Esimeses näites on selleks i (nagu item või iterable või index või increment)- seda tähistust kasutatakse erinevates näidetes ja internetis kohatavates koodijuppides üsna sageli.

Kuigi i on väga populaarne tsüklimuutuja nimi, ei ole tegelikult tsüklimuutujale nime valikul rohkem piiranguid kui tavalise muutuja puhul ning selle võib programmi autor ise vastavalt vajadusele valida. Nagu igasuguste muutujate puhul, on ka tsüklimuutujat nimetades hea valida nimi, mis kirjeldab seda, mida muutuja tähistab.

Näiteks kui for-tsükliga läbikäidav jada on tähestikku sisaldav sõne, sobiks tsüklimuutujaks letter:

alphabet = "abcdefghijklmnopqrstuvwxyz"
for letter in alphabet:
    print(letter)

Sarnaselt esimesele näitele on ka see programm jada elementide printimiseks ning programmi käivitamisel kuvatakse konsooli järjest kõik tähestiku tähed:

a
b
c
d
e
...

Kui for-tsükliga läbi käidav jada on kassinimesid sisaldav järjend, sobiks tsüklimuutujaks cat:

cats = ["Whiskers", "Mittens", "Luna", "Oliver", "Milo", "Bella", "Leo", "Charlie", "Lucy", "Tiger"]
for cat in cats:
    print(cat)

Kuna selles programmis on for-tsüklis läbikäidavaks jadaks järjend, mitte sõne, siis on elementideks, mis saavad tsüklimuutuja väärtusteks, järjendi elementideks olevad sõned, mitte üksikud tähed nagu sõne puhul.

Selle programmi käivitamisel kuvatakse konsooli järjest kõik järjendis olevad kassinimed:

Whiskers
Mittens
Luna
Oliver
Milo
...

Sageli kasutatakse for-tsüklit jadas olevate elementide hulgast mingi omadusega elementide otsimiseks, et nendega for tsükli sees oleva algoritmi alusel edasi toimetada. Seda tehes on oluline tähele panna, kas ja millal on vaja for-tsüklist väljuda.

Vaikimisi käiakse terve jada elementhaaval läbi, kuid kui for-tsükli sees kasutada märksõna return, katkeb jada itereerimine koheselt.

Näiteks kui soovime sõnest eemaldada kõik numbrid, kasutades selleks for-tsüklit, sobiks selleks järgmine programm:

def remove_numbers(string_with_numbers: str): # function definition
    numbers_removed = "" # creating a new empty string to store the letters taken from the input string
    for character in string_with_numbers: # for loop definition
        if character.isalpha(): # conditional to check if the current character is a letter
            numbers_removed += character # add letters to the new string, skipping numbers
    return numbers_removed # return the new string containing only letters
    # the return statement is after the for loop, not in it (same level of indent as the loop), only returning the
    # result once the entire string is processed
print(remove_numbers("sl42dap1")) # function call with the input string in a print statement to see the result in the console

Selles näites käiakse terve sisendina saadud sõne for-tsükliga läbi ning lisatakse leitud tähed uude sõnesse, mis hiljem tagastatakse. return tagastab uue sõne alles pärast for-tsükli täielikku läbimist, return märksõnaga algav koodirida on sama astme taandega nagu for-tsükli definitsioon.

Kui näitena toodud funktsioonis oleks return märksõnaga rida for-tsükli sees (taandega ühe võrra paremal for-tsükli definitsioonis), lõppeks for-tsükli töö funktsiooni väärtuse tagastamisega juba pärast esimese tähemärgi läbivaatamist, sest kogu for-tsükli sees olev kood käivitatakse iga itereeritava elemendi kohta.

For-tsükli varem lõpetamine ja väärtuse kohene tagastamine sobiks hästi näiteks siis kui tegemist on programmiga, mis valideerib sõne sisu ning tagastab tõeväärtuse True või False vastavalt sellele, kas sõne vastab tingimustele või mitte.

Näiteks kui soovime sõne valideerida ning tagastada False kui sõne sisaldab numbreid:

def validate_string(string_to_validate: str): # function definition
    for character in string_to_validate: # for loop definition
        if not character.isalpha(): # conditional to check if the current character is not a letter
            return False # return False whenever the first number is found
    return True # return True at the end of the loop as if False was not returned inside of the loop, all characters
    # must therefore be letters, making the string valid
print(validate_string("sl42dap1")) # function call with the input string in a print statement to see the result in the console

Sellises funktsioonis, mille eesmärk on sõne valideerida, võib tagastada False for-tsükli sees kohe kui esimene number sõnest leitakse, sest olenemata sellest, kas ülejäänud sõnes on tähed või numbrid, ei läbi see sõne juba ühte numbrit sisaldades valideerimist.

Kui for-tsüklis ühtegi numbrit ei ole ning seetõttu tsükli elemente läbi vaadates midagi ei tagastata, käivitub tsükli järel (tsükliga samal tasandil taandega) True. Kui kõik sõnes olevad tähemärgid on läbi vaadatud ning ühegi puhul pole olnud vajadust tagastada False, siis järelikult läbib see sõne valideerimise.

Pythonis saab for-tsüklit kasutada mitmel veidi erineval viisil, mis teevad erinevate olukordade lahendamise lihtsamaks. Seni toodud näidetes on juttu olnud for-each tsüklist, mis on ilmselt kõige tavalisem viis for-tsükli kasutamiseks. For-each tsükli kohta rohkem infot ja näiteid on Pydoci peatükis For-each tsükkel.

Lisaks for-each tsüklile tulevad kursusel kasuks ka range() for-tsüklis ja enumerate() for-tsüklis