Tsükkel (loop)

Programmikoodi ühe või mitme rea (lause) mitmekordseks täitmiseks kasutatakse korduslaused 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 kas:
  • ühte või mitut lauset kindel arv kordi korrata või
  • kui soovitakse teadaolev pikkusega jada (nt järjendi) kõik elemendid läbikäija.

For-tsükkel on koodis seotud kindla muutujaga, mis igal 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 (kordudamise) järel 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.

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:

list = [3, 2, 10]
for i in range(len(list)):

    # Printing elements from the list using i as index

    print("Element: {}, index: {}".format(list[i], i))

#  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äbi kä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.

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üklide arv on antud korral ennustamatu ja erineb iga kord, kui programmi uuesti käivitatakse.


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.

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

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