Ciklusok (iteráció) – A while ciklus

Az iteráció röviden azt jelenti, hogy a program ugyanazt a kódblokkot újra és újra végrehajtja, a feladattól függő számban, vagy egy logikai feltétel bekövetkeztéig. Az iterációt végrehajtó programozási struktúrát ciklusnak, huroknak nevezzük. A programozásban az iterációnak kétféle típusa van: határozatlan és határozott.

Határozatlan iteráció: a ciklus végrehajtásának száma nincs pontosan előre megadva. A kijelölt blokkot a program többször végrehajtja, mindaddig, amíg bizonyos feltétel(ek) teljesülnek.

Határozott iteráció: a kijelölt programblokk végrehajtásának száma egyértelműen meghatározott már akkor, amikor a ciklus elindul.

A while ciklus

A Python „while” ciklus felépítése nagyon egyszerű:

while <expr>:
<statement(s)>

A „statements” rész tulajdonképpen a létrehozott ciklus magja, az a programblokk, ami meghatározott számban lefut, az „expr” részben szabjuk meg, hogy ez hányszor történjen meg.

Nézzünk egy egyszerű példaprogramot:

n = 5
while n > 0:
    n -= 1
print (n)

Mi történik ebben a példában:

Az n értéke kezdetben 5. A 2. sorban a while állítás vizsgálatána eredménye(n> 0), ami igaz, tehát a ciklusmag lefut. A 3. sorban a ciklusmagban n-t 1-el csökkentjük, majd az eredményt kinyomtatjuk.

Amikor a ciklusmaglefutott, a program végrehajtása visszatér a hurok tetejére a 2. sorba, és a kifejezést újra kiértékeljük. Még mindig igaz, tehát a ciklusmag újra végrehajtja a feladatot, és az eredmény nyomtatásra kerül.

Ez addig folytatódik, amíg n nullává nem válik. Ezen a ponton, amikor a kifejezést teszteljük, az eredmény hamis, így a hurok véget ér.

Fontos, hogy a while hurok a vezérlő logikai kifejezést előbb teszteli, mielőtt bármi más megtörténik. Ha hamis a kiértékelés eredménye, akkor a ciklusmag egyszer sem fut le.

A ciklusmagban szereplő n -= 1 kifejezés jelentése: n értékét csökkentsed eggyel.

n = 0
while n > 0:
    n -= 1
print (n)

A fenti program az előzőek értelmében egyszer sem fut le, mert a kiindulási feltétel (n > 0) hamis.

Nézzünk egy példát „felfelé” számlálásra, amikor a ciklusváltozó értékét egyesével növeljük!

count = 0
while (count < 9):
print ('The count is:', count)
count = count + 1

print ("Good bye!")

Az első sorban a count változó értékét nullára állítjuk, a while állítás vizsgálatát pedig úgy állítjuk be, hogy a vizsgálat mindaddig igaz legyen, míg a változó kisebb mint 9.

Az eredmény a következő lesz:

The count is: 0
The count is: 1
The count is: 2
The count is: 3
The count is: 4
The count is: 5
The count is: 6
The count is: 7
The count is: 8
Good bye!

A végtelen ciklus

A ciklus végtelen ciklussá válik, ha avizsgálati részben beállított feltétel soha nem válik hamissá(FALSE). Ezzel a megoldással azonban óvatosan kell eljárni a ciklusok programozása során, mert olyan ciklust állíthatunk elő, amiből a programunk nem tud kilépni.Az ilyen ciklust végtelen ciklusnak hívják.

var = 1
while var == 1 :  # This constructs an infinite loop
   num = int(input("Enter a number  :"))
   print ("You entered: ", num)

print ("Good bye!")

A második sorban beállított logikai feltétel állandóan igaz értéket ad, így a ciklus végtelenné válik. A ciklusból való kilépés egyetlen módja a Ctrl + c billentyűkombináció alkalmazása.

Elegánsabb megoldás, ha figyeljük a bevitt értékeket, és egy előre megadott szám bevitelekor (pl. 0) a „break” paranccsal kilépünk a ciklusból:

while True:  # This constructs an infinite loop
   num = int(input("Enter a number  :"))
   print ("You entered: ", num)
   if num == 0:
        break    # break here

print ("Good bye!")

Hasonló megoldást eredményez a cikluson belül elhelyezett felhasználói döntést kérő vezérlésátadó utasítás, aminek segítségével elegánsan tudunk kilépni a programból:

import random

while True:
   input("Press enter to roll the dice")

   # get a number between 1 to 6
   num = random.randint(1,6)
   print("You got",num)
   option = input("Roll again?(y/n) ")

   # condition
   if option == 'n':
       break

A példa kockadobást szimulál. A program első sora importálja a véletlenszám generáláshoz szükséges library-t, ennek a segítségével állítjuk elő az 1-6 közé eső egész számot, ami egy „whileTrue” típusú végtelen cikluson belül mindaddig fut, amíg az „új dobás?” (Roll again?) kérdésre y(es) a válasz. Nem válasz esetén kilépünk a ciklusból.

Az utolsó példaprogram Raspberry Pi-n futtatható, aminek a GPIO portjára három darab LED diódát kapcsolunk, sorban a 11-es, a 13-as, valamint a 15-ös lábra.

A program első két sorában a szükséges library-k importálása történik, az első az időzítés, a második a GPIO port kezelése miatt. A következő négy sorban beállítjuk a tüskesor számozásának módját (BOARD – panel szerint), valamint a három kimeneti tüske (11,13,15) adatirányát (OUT).

A következő három sor inicializálj, alaphelyzetbe állítja a kimeneteket, azaz kikapcsolja az ide kötött LED-eket.

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)

GPIO.output(11, False)
GPIO.output(13, False)
GPIO.output(15, False)

while True:
        GPIO.output(11, GPIO.HIGH)
        time.sleep(3)
        GPIO.output(13, GPIO.HIGH)
        time.sleep(3)
        GPIO.output(11, GPIO.LOW)
        GPIO.output(13, GPIO.LOW)
        GPIO.output(15, GPIO.HIGH)
        time.sleep(5)
        GPIO.output(15, GPIO.LOW)
        GPIO.output(13, GPIO.HIGH)
        time.sleep(3)
        GPIO.output(13, GPIO.LOW)

A forráskódok letölthetőek: