Ciklusszervezés (iteráció)
Az algoritmusok vezérlőszerkezetei közé tartozik az iteráció, más néven ciklus: egy vagy több utasítás ismételt végrehajtása. Akkor van rá szükség, ha egy adatcsoport valamennyi elemén ugyanazt a műveletet kell elvégezni. Ciklus használatánál a műveletet ciklikusan kell megismételni az összes adattal. A ciklikus műveletek végét valamilyen feltétel határozza meg. A ciklus kezdete előtt állhatnak műveletek, amelyeket csak egyszer kell ugyan végrehajtani, de a ciklushoz kapcsolódnak: a változók értékeinek beállítása. A műveletsorozatot, amelyet ismételten végrehajtunk, ciklusmagnak nevezzük. A ciklus folytatásával vagy befejezésével kapcsolatos vizsgálatot ciklusfeltétel-vizsgálatnak hívjuk. Az az adat, amelynek értéke meghatározza a ciklus folytatását, vagy befejezését, a ciklus változója. A ciklusműveletek addig hajtódnak végre, amíg a végrehajtási feltétel teljesül (van olyan ciklus, ahol a fordítottja igaz). Fontos, hogy a feltétel ne teljesüljön mindig, mert akkor a végrehajtások száma végtelen lesz.
Típusai:
– előírt lépésszámú (növekményes) ciklus (FOR)
Az ismétlések száma a ciklusba való belépés előtt már ismeretes, vagy kiszámítható. Egy utasítás ismételt végrehajtását írja elő, miközben egy változó monoton növekvő vagy csökkenő értéket vesz fel. A ciklusváltozó az ismétléseket számolja az első kifejezés által megadott értéktől kezdve a második kifejezés által megadott értékig. A ciklusváltozó sorszámozott típusú (de tömb eleme nem lehet), a két kifejezésnek pedig azonos típusúnak kell lennie és kompatibilisnek a
ciklusváltozó típusával.
A for
ciklus feje két részből tevődik össze:
- A
for
ésin
között szerepel annak a változónak (vagy változóknak!) a neve, amin keresztül el akarjuk érni az aktuális elemet (ez a példában aname
nevet kapta). Itt nem szerepelhet másféle kifejezés. - Az
in
után következik az objektum neve (vagy tetszőleges kifejezés), amit iterálunk (a példában ez apeople
változó)
Iteráljunk egy olyan list
-et, ami list
-eket tartalmaz.
A képernyőn kis két elemű tömbök jelennek meg, tehát a for
nem mászik bele a belső tömbökbe.
A Pythonban lehetőség van rá, hogy egy tömb elemeit egy sornyi változóba kicsomagoljuk, ez az unpacking. A módszer a következő:
Így az első iterációban a [1990, 'Barbara']
-ból az 1990
-et a year
, az 'Barbara'
-t pedig a name
változóba vezethetjük, és így tovább a későbbi iterációk során.
– feltételes ciklus:
– elöltesztelő ciklus (WHILE)
while <feltétel>: utasítások else: "végül" utasítások
A feltételvizsgálat a ciklusmag végrehajtása előtt történik meg. A ciklusmagot mindaddig végre kell hajtani, amíg a végrehajtási feltétel fennáll, ezt belépési feltételnek hívjuk. Ha a feltétel már nem teljesül, akkor a ciklus befejeződik és a vezérlés a ciklus utáni következő utasításra kerül.
Az 1. sorban deklaráltuk a counter
változót 1
értékkel.
A 2. sor az érdekes: a while
melletti feltételétől függ, hogy meddig kell a while
blokkját ismételtetni. Ezt magyarul bentmaradási feltételnek szokták hívni.
Nézzük lépésenként hogy mi történik innentől:
- A program futása a
while counter <= 10
-re került. Itt acounter
értéke1
, így a kifejezés egyenlő a1 <= 10
-el, amiTrue
-ra értékelődik ki. Így belépünk a blokkba. - Kiírjuk a
counter
értékét. - A
counter
változ értékét növeljük 1-el. Ez nagyon fontos. - Véget ért a blokk, vissza ugrunk a
while
sorára. - A
counter
értéke most már2
, így a kifejezés egyenlő a2 <= 10
-el, amiTrue
-ra értékelődik ki. Így újra belépünk a blokkba.
Ez a fenti játék egészen addig fut, amíg a counter
el nem éri a 11-et, akkor ugyanis:
- A
counter
értéke 11, így a kifejezés egyenlő11 <= 10
-el, amiFalse
-ra értékelődik ki, így nem lépünk be a blokkba. - A blokkon kívüli forráskóddal folytatódik a program.
Látható volt, hogy a while
kifejezése még ez előtt kiértékelődött mielőtt beléptünk volna
A fenti példát így is megoldhatnánk:
Elemek kiíratása:
– hátultesztelő ciklus (WHILE) Külön kulcsszóval jelzett hátultesztelő ciklus a Pythonban nincs. Az alábbi egyszerű szintaktikai megoldással, külön kulcsszó nélkül készíthetünk hátultesztelő ciklust, talán nem olyan barátságtalan a dolog. Különösen, hogy ezzel a szerkezettel középen is tesztelhetünk.
while True: utasítások if <kilépési feltétel>: break (további utasítások)
– végtelen ciklus
A megszakítási feltétel a törzsben található, ezáltal a vezérlőszerkezet
nem tartalmaz közvetlen információt a befejeződés feltételéről.