Tsükkel (loop)

Programmikoodi ühe või mitme rea (lause) mitmekordseks täitmiseks kasutatakse korduslauseid ehk tsükleid. Pythonis on tsükleid kahte tüüpi: For- ning While-tsüklid.

For-tsükkel

For-tsüklit kasutatakse tüüpiliselt siis, kui soovitakse:
  • ühte või mitut lauset kindel arv kordi korrata

  • kui soovitakse teadaolev pikkusega jada (nt järjendi) kõik elemendid läbi käia.

For-tsükkel on koodis seotud kindla muutujaga, mis iga iteratsiooniga (kordusega) saab endale uue väärtuse. Antud for-tsükli muutujat nimetatakse tsükli- või juhtmuutujaks (control variable). For-tsükli kirjeldamisel saab kasutaja määrata, millises vahemikus ja millise sammuga tsüklimuutuja endale väärtusi saab. Igal juhul iga iteratsiooni (kordamise) järel on tsükli muutujal uus väärtus.

Tihti kasutakse tsüklimuutuja jooksvat väärtust indeksina, selleks, et pöörduda mingi jada/järjendi elemendi poole.

for control_variable in range(statement):
    # Your code

Pärast iga iteratsiooni suurendatakse tsüklimuutuja väärtust etteantud sammu (või ka vaikesammu) võrra nii kaua, kuni ta on piirväärtuseni jõudnud. Siis tsüklit rohkem ei käivitata. Vaata ka alljärgnevat videot range() funktsiooni kohta:

For-tsükkel alustab vaikimisi lugemist 0-st ning loeb kuni kaasaantud väärtuseni (mitte kaasa arvatud).

For-tsükkel, mis on seotud muutujaga i ning täidab 3 iteratsiooni:

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

Antud tsükkel väljastaks väärtused 0, 1 ja 2.

For-tsükkel, mis käib läbi kõik järjendi väärtused ning väljastab need:

# no pec list = [3, 2, 10] for i in range(len(list)): print("Element: {}, index: {}".format(list[i], i)) # Printing elements from the list using i as index # Element: 3, index: 0 # Element: 2, index: 1 # Element: 10, index: 2

Vajadusel saab tsükli vahemikku täpsemalt määrata. Nii muutuks süntaks selliseks:

for variablename in range (start_point, end_point, step):
    # Code

For-tsükkel, mis loeb 0-st 10-ni (mitte kaasa arvatud), suurendades muutujat i iga kord 2 võrra:

for i in range(0, 10, 2):
    print(i)

Käesolev tsükkel väljastaks väärtused 0, 2, 4, 6 ja 8.

Pythonis on kindlate objektide läbikäimiseks võimalik kasutada ka for-each tsüklit. For-each võimaldab iteratsiooni objekti sisu järgi. Näiteks juhul, kui meil on vaja koostada tsükkel, mis itereeriks järjendi järgi, on paremaks lahenduseks for-each:

some_list = [3, 2, 10]
for element in some_list:

    # Now we can access the elements directly, without using index
    print(element)

# 3
# 2
# 10

Ka siin on tsükkel koodis kindla muutujaga seotud (antud juhul on selleks muutujaks element) ning tsükli niimoodi kirja panemine teeb järjendi elementide kasutamise lihtsamaks.

Stringide puhul võimaldab for-each tsükkel kõik selle tähed eraldi läbi käia:

for element in "hello":

    # Now we can access the elements directly, without using index
    print(element)

# h
# e
# l
# l
# o

Sõnastikkude puhul saab itereerida võtmete ja väärtuste järgi:

some_dict = {"one": 1, "two": 2}
for key in some_dict:

    # By default iteration goes by keys
    print(key, end=" ")  # --> one two

# But we can also iterate by values
for val in some_dict.values():

    print(val, end=" ")  # --> 1 2

# And even by both keys and vals simultaneously
for key, value in some_dict.items():
    print(key, value)

# one 1
# two 2

Objekti, mille järgi saab itereerida, nimetatakse iteratiivseks objektiks.

For-Else kasutamine

for tsükli lõppu võib lisada eraldi else ploki. See käivitub juhul, kui tsüklit ei lõpetata break korraldusega.

Vaatame näidet, kus kontrollime, kas järjend sisaldab paarisarve või mitte:

numbers = [1, 3, 5, 7]
for nr in numbers:
    if nr % 2 == 0:
        print("Found even number", nr)
        break
else:
    print("There are no even numbers")

Kui antud tsükli jooksul leitakse üks arv, mis on paaris (jagamisel arvuga 2 annab jäägiks 0), siis prinditakse vastav teade ja lõpetatakse tsükkel ära. Kui see juhtub, siis else osa käima ei panda. Kui aga tsükkel jõuab lõpuni (ilma, et tingimuslause oleks tõene ning tsüklist ei väljuta break-iga), siis käivtub else osa. Ehk siis natud näite puhul saame öelda, et järelikult ühtegi paarisarvu ei leitud.

While

While tsükkel erineb for tsüklist selle poolest, et tema korral ei ole käivitamise arv rangelt määratud. Kui iga for-tsükli kohta saab täpselt öelda, mitu korda seda käivitatakse, ei saa seda tihti while-tsükli puhul nii täpselt määrata. While tsüklile antakse kaasa boolean väide, mida enne igat iteratsiooni kontrollitakse. While tsükkel kestab, kuni kaasaantud väide on tõene, ning võib ka käia lõpmatuseni või mitte kordagi.

while boolean statement is true:
    # Code

While-tsükkel, mis käib läbi kõik järjendi väärtused ning väljastab need:

i = 0
list = [3, 2, 10]
while i != len(list):
    print(list[i])
    i += 1

Tsükkel, mis käib lõpmatuseni:

while True:

While on asendamatu siis, kui esineb mingi määramatus - näiteks juhuslike väärtuste või kasutaja sisendiga töötamisel.

import random as r

# The number we want to get
check = 10
random_choose = 0
# While the random chosen number is not the one we want (!= 10)
while random_choose != check:
    # Choose the next random number (0-10) and print it
    random_choose = r.choice(range(11))
    print(random_choose)

Vajalike tsüklite arv on antud korral ennustamatu ja erineb iga kord, kui programmi uuesti käivitatakse.

While-Else kasutamine

Saranaselt for tsüklile võimaldab while tsükkel kasutada eraldi else plokki. Toimimismehhanism on sama: kui tsükli sees ei toimu väljumist break korraldusega, pannakse tsükli lõpus else osa käima.

Järgmises näites vaadatakse läbi kõik sõned järjendis. Kui leitakse nende hulgast mõni arv (sõnena), siis lõpetatakse tsükkel ära. Kui aga ühtegi arvu ei leita (ja jõutakse tsükli lõppu ehk järjendis kõik elemendid on läbi vaadatud), siis liigub kood else osasse ja antakse vastav teade, et ühtegi arvu ei leitud.

i = 0
words = ["ale", "book", "phone", "a"]
while i < len(words):
    if words[i].isdigit():
        break
    i += 1
else:
    print("No numbers in the list")

Tsükleid võib ka kasutada üksteise sees, kuid tsüklite lugemine käib ikkagi loogilises järjekorras - kui ühe tsükli sisse teine teha, jääb esimese tsükli lugemine kuni teise lõppemiseni pooleli.

# no pec some_list = ["cycles", "are", "easy"] for i in range(3): for word in some_list: print(word, end=" ") print() # cycles are easy # cycles are easy # cycles are easy

Break ja Continue

Tsüklite sees saab kasutada ka käske break ning continue. break käsk lõpetab tsükli käigu ning naaseb üldkoodi juurde ilma edasist tsükli koodi täitmata. continue käsk jätab käiva iteratsiooni pooleli ning hüppab järgmisesse iteratsiooni.

Mõned näited:

some_list = ["cycles", "are", "easy"]
for word in some_list:
    if word == "are":
        continue
    else:
        print(word, end=" ")

    # Output: 'cycles easy'
while True:
    # Ask for user input
    user_input = input("Please type a number: ")

    # If user input is 3, 7 or 9
    if int(user_input) in [3, 7, 9]:

        # Print the message and exit the loop
        print("Bye!")
        break

    # If not, ask for input again and continue forever until the number is 3, 7 or 9
    print("Try again!")