Ciklusok megszakítása: break, continue
Szeretnél az ünnepek alatt is gyakorolni? Vár az Easter Bug Hunt játékunk! Csatlakozz, és keresd meg az összes hibát - akár még jutalom is ütheti a markod!
Irány a játékAnnak meghatározására, hogy egy ciklus pontosan hány alkalommal / meddig kerüljön megismétlésre, alapvetően a ciklus feltételét használjuk. Vannak azonban olyan speciális esetek, amikor valamilyen ok miatt mégis szeretnénk egy ciklust megszakítani, annak ellenére, hogy a feltétel egyébként továbbra is igaz lenne. Erre az esetre hasznos kulcsszó a break, amely lehetővé teszi a ciklusmag belsejéből a ciklus megszakítását.
Érdemes megjegyezni, hogy a break kulcsszót sosem muszáj alkalmazni, az minden esetben kiváltható a ciklus átalakításával. Ennek ellenére azonban sok esetben átláthatóbb maradhat egy-egy kódrészletünk, vagy megspórolhatunk némi extra kódbűvészkedést, ha egyszerűen használjuk amikor szükséges. Nézzünk egy gyakorlati példát a break használatára! Az alábbi kódrészlet bekér 5 darab osztályzatot a felhasználótól. Amennyiben a felhasználó nem egy érvényes jegyet ír be, úgy a program hibaüzenetet dob, és leállítja a ciklust:
for i in range(5):
jegy = int(input("Adj meg egy osztályzatot: "))
if jegy<1 or jegy>5:
print("Hibás adatot adtál meg!")
break
Az egyik legjellemzőbb felhasználása a break kulcsszónak a van-e legalább egy olyan, ami... típusú feltételek vizsgálata listákon. Ha azt szeretnénk eldönteni, hogy a szamok listának van-e legalább egy olyan eleme, ami 10-nél nagyobb, akkor onnantól, hogy találtunk legalább egy ilyet, tovább már nem érdemes vizsgálódni, hisz akkor már biztos, hogy a feltétel teljesül. Ha viszont nem találunk egyet sem, akkor muszájak vagyunk végigolvasni a teljes listát, hogy megbizonyosodjunk róla, hogy nem bújt-e meg esetleg az utolsó helyen mégis egy nagyobb érték.
Ez esetben tehát használhatjuk a break-et arra, hogy megállítsuk a ciklust abban az esetben, ha a válaszban már biztosak vagyunk. Ez persze nem szükséges feltétlenül, viszont segíthet abban, hogy a kód "ne dolgozzon feleslegesen", így a programunk gyorsabb és hatékonyabb lesz!
szamok = [3 , 4 , 12 , 9, 5, 1]
van = False
for elem in szamok:
if elem > 10:
van = True
break
print("Van ilyen szám" if van else "Nincs ilyen szám")
[
{ "steps": [0], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"} ], "hint": "Letároljuk az adatokat a szamok listában."},
{ "steps": [4], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"} ], "hint": "A van változó értékét hamisra állítjuk."},
{ "steps": [5,1], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"}, {"name":"elem","value":"3"} ], "hint": "A for ciklus elkezd végiglépegetni a lista elemein, az elem változóba bekerül az első listaelem."},
{ "steps": [6,1], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"}, {"name":"elem","value":"3"} ], "hint": "Megvizsgáljuk, hogy az elem változóra (értéke: 3) teljesül-e a feltétel."},
{ "steps": [6,1], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"}, {"name":"elem","value":"3"} ], "hint": "Mivel 3 nem nagyobb mint 10, az if belseje nem fut le, hiszen a feltétel nem teljesült."},
{ "steps": [5,2], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"}, {"name":"elem","value":"4"} ], "hint": "A for ciklus lép a következő elemre, az elem változóba bekerül a második listaelem."},
{ "steps": [6,2], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"}, {"name":"elem","value":"4"} ], "hint": "Megvizsgáljuk, hogy az elem változóra (értéke: 4) teljesül-e a feltétel."},
{ "steps": [6,2], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"}, {"name":"elem","value":"4"} ], "hint": "Mivel 4 nem nagyobb mint 10, az if belseje nem fut le, hiszen a feltétel nem teljesült."},
{ "steps": [5,3], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"}, {"name":"elem","value":"12"} ], "hint": "A for ciklus lép a következő elemre, az elem változóba bekerül a harmadik listaelem."},
{ "steps": [6,3], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"False"}, {"name":"elem","value":"12"} ], "hint": "Megvizsgáljuk, hogy az elem változóra (értéke: 12) teljesül-e a feltétel."},
{ "steps": [7,3], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"True"}, {"name":"elem","value":"12"} ], "hint": "Mivel a feltétel teljesül, a ciklus belseje lefut. A van változót True (igaz) értékre állítjuk."},
{ "steps": [8,3], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"True"}, {"name":"elem","value":"12"} ], "hint": "Mivel már találtunk egy elemet ami megfelel a feltételnek, így a break kulcsszóval leállítjuk a ciklust - hisz a többi elemet felesleges megvizsgálni."},
{ "steps": [9], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"True"}], "hint": "A ciklus a break utasítás miatt véget ért, következik a kiírás."},
{ "steps": [11], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"True"}], "hint": "A ternary operátor megvizsgálja a van változó értékét. Mivel az igaz, így az if előtti rész kerül megjelenítésre a konzolon."},
{ "steps": [10], "variables": [{"name":"szamok","value":"[3, 4, 12, 9, 5, 1]"}, {"name":"van","value":"True"}], "hint": "Kiíródik a felirat.","console":"Van ilyen szám"}
]
Ciklusmag megszakítása: a continue kulcsszó
Előfordul azonban olyan eshetőség is, hogy nem szeretnénk az egész ciklust leállítani - egyszerűen csak ugrani szeretnénk a következő iterációra (ha van még), mert rájöttünk, hogy ebben a körben már felesleges tovább dolgoznunk. Példaként nézzünk egy ciklust, amely összeadja az adatok listában található számokat, de kihagy minden olyan elemet, ami nem egész szám adattípusú:
adatok = [3, 8, "alma", 5, 2, "körte", 4]
osszeg = 0
for elem in adatok:
if type(elem) != int:
continue
osszeg += elem
Próbáld ki magad is! Nézd át a cikkünkhöz tartozó mintakódot - szerkeszd és futtasd közvetlenül a böngésződben, az info9
LineFlame fejlesztőeszközével!