Ciklusok – a for
A for kulcsszó működésének tekintetében a Python nyelv jelentősen eltér a többi programnyelvtől. Míg a legtöbb nyelvben a for a számlálásos ciklust jelöli, addig a Python for kulcsszava más nyelvek foreach ciklusához hasonlítható: listák, szótárak, és egyéb iterálható objektumok elemeinek a végigjárására szolgál.
Mire való a for a Python nyelvben?
Tegyük fel, hogy rendelkezünk egy adatokból álló listával (a listákról bővebben a Listák tananyagunkban olvashatsz), amelynek minden elemére szeretnénk végrehajtani ugyanazt a műveletsort (pl. szeretnénk minden elemet összeadni, vagy szeretnénk minden elemet megvizsgálni valamilyen szempont szerint). A for ciklus szintaxisa az alábbi:
for változó in lista:
# utasítások
Ahol a lista helyére kell elhelyeznünk azt a listát (vagy más bejárható objektumot), aminek az elemein végig szeretnénk menni, a változó helyén pedig megadhatjuk, hogy milyen néven szeretnénk elérni azt a listaelemet, amelyiknél a ciklus éppen tart. Egy példán keresztül szemléltetve a dolog működését, az alábbi for ciklus például kiírja a listában szereplő összes nevet a konzolra:
lista = ["Peti" , "Andris" , "Marci" , "Rebeka" , "Dóri" ]
for elem in lista:
print(elem)
[
{ "steps": [0], "variables": [ {"name":"lista","value":"[...]"} ], "hint": "Létrehozunk egy lista nevű változót, ami tartalmazza az 5 nevet."},
{ "steps": [6,1], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Peti"}], "hint": "Megkezdjük a lista bejárását. Létrejön egy elem nevű változó, amibe bekerül a lista első eleme."},
{ "steps": [7,1], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Peti"}], "hint": "Végrehajtjuk a ciklusban található utasítást, azaz kiírjuk az elem változót, vagyis Peti nevét a konzolra."},
{ "steps": [6,2], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Andris"}], "hint": "Miután az első elemmel végeztünk, a második elem kerül a változóba."},
{ "steps": [7,2], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Andris"}], "hint": "Ismét végrehajtjuk a ciklusban található utasítást, kiírjuk az elem változót, vagyis Andris nevét a konzolra."},
{ "steps": [6,3], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Marci"}], "hint": "Miután ezzel is végeztünk, a következő elem kerül a változóba."},
{ "steps": [7,3], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Marci"}], "hint": "Majd végrehajtjuk a ciklusban található utasítást, kiírjuk az elem változót, vagyis Marci nevét is a konzolra."},
{ "steps": [6,4], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Rebeka"}], "hint": "Miután ezzel is végeztünk, a következő elem kerül a változóba."},
{ "steps": [7,4], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Rebeka"}], "hint": "Végrehajtjuk a ciklusban található utasítást, kiírjuk az elem változót, tehát Rebeka nevét is a konzolra."},
{ "steps": [6,5], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Dóri"}], "hint": "Miután ezzel is végeztünk, a következő (utolsó) elem kerül a változóba."},
{ "steps": [7,5], "variables": [ {"name":"lista","value":"[...]"}, {"name":"elem","value":"Dóri"}], "hint": "Erre is végrehajtjuk a ciklusban található utasítást, kiírjuk az elem változót, azaz Dóri nevét is a konzolra."},
{ "steps": [], "variables": [ {"name":"lista","value":"[...]"}], "hint": "A lista utolsó eleme után a for ciklus véget ér (ezzel az elem változó is elveszik). A programnak vége."}
]
Ennek a programnak a kimenete tehát:
Peti
Andris
Marci
Rebeka
Dóri
A ciklus tehát a lista minden egyes elemére le fogja futtatni a ciklusban található utasításokat úgy, hogy az aktuális elemet mindig belehelyezi az elem változóba, így a cikluson belül kényelmesen elérjük, és fel tudjuk azt dolgozni. Ez remekül alkalmazható a listaelemek vizsgálatára, összegzésére, vagy bármilyen olyan feladatra, ahol ugyanazokat az utasításokat szeretnénk minden elemre végrehajtani. Az alábbi példában például egy listában található számok összegét határozzuk meg for ciklus segítségével:
szamok = [3, 5, 6, 8, 1, -5]
osszeg = 0
for elem in szamok:
osszeg = osszeg + elem
print("Az elemek összege:", osszeg)
A kód elején létrehozunk egy osszeg nevű változót, ebben fogjuk tárolni azoknak a számoknak az összegét, amiket már bejártunk. Ezt követően egy for ciklus segítségével végiglépkedünk a lista minden elemén, és mindegyiket hozzáadjuk az osszeg változó jelenlegi értékéhez. Fontos megjegyezni, hogy az osszeg értékét nem beállítjuk az adott elemre, hanem megnöveljük vele, (erre használhatnánk akár a += operátort is) ezzel biztosítva, hogy az eddigi elemek összege se vesszen el.
Mire a lista végére érünk, minden elemet hozzáadtunk az osszeg változóhoz, így abban megtalálható lesz minden elem összege.
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!
A for és a range
A for ciklust nem csak listák bejárására használhatjuk, hanem arra is, hogy egy adott utasítást több egymást követő számra végrehajtsunk. Ez bár hasonlít más programnyelvek for ciklusaira (azaz a számlálásos ciklusra), a működése azonban mégis némileg eltérő. A range utasítás több paraméterezéssel is rendelkezik:
- range(meddig): magában foglalja az egész számokat 0-tól a meddig változóban megaodtt számig (a meddig változóban lévő szám már nincs benne a tartományban)
- range(mettől, meddig): magában foglalja az egész számokat a mettől tulajdonságban megadott számtól a meddig tulajdonságban megadott számig (a meddig változóban lévő szám már nincs benne a tartományban)
- range(mettől, meddig, lépés): magában foglalja azokat a számokat, amelyek a mettől tulajdonságtól elindulva minden lépés-edik egész számot a meddig paraméterig
A range egyik fontos gyakorlati felhasználása, hogy lehetővé teszi számunkra listák bejárását index (azaz az elem sorszáma) alapján. Ez azért fontos, mert ha nem csak az elemet, hanem annak a sorszámát is ismerjük, akkor könnyedén összehasonlíthatunk például két egymást követő elemet, ezzel megoldhatunk bonyolultabb problémákat. Ha egy feladat megoldásakor hasznos volna az elem sorszámának ismerete, érdemes mindig index alapján bejárni a listát, pl. az alábbi módon:
gyerekek = ["Gábor" , "Norbert" , "Péter" , "Dániel" ]
for i in range(len(gyerekek)):
print("A(z)", i, ". gyerek neve:", gyerekek[i])
[
{ "steps": [0], "variables": [ {"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} ], "hint": "Létrehozunk egy gyerekek nevű listát, ami tartalmazza a 4 nevet."},
{ "steps": [5], "variables": [ {"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} , {"name":"i","value":"0"} ], "hint": "Az i változóba bekerül a range által meghatározott tartomány első száma, a nulla."},
{ "steps": [6,1], "variables": [{"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} , {"name":"i","value":"0"}, {"name":"gyerekek[i]","value":"Gábor"}], "hint": "Kiírjuk sorszámot (i), valamint a gyermek nevét (gyerekek[i])."},
{ "steps": [5], "variables": [ {"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} , {"name":"i","value":"1"} ], "hint": "Miután a ciklusmag lefutott, az i változó átváltozik a range által megadott tartomány következő elemére (1)."},
{ "steps": [6,2], "variables": [{"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} , {"name":"i","value":"1"}, {"name":"gyerekek[i]","value":"Norbert"}], "hint": "Kiírjuk sorszámot (i), valamint a gyermek nevét (gyerekek[i])."},
{ "steps": [5], "variables": [ {"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} , {"name":"i","value":"2"} ], "hint": "Miután a ciklusmag lefutott, az i változó átváltozik a range által megadott tartomány következő elemére (2)."},
{ "steps": [6,3], "variables": [{"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} , {"name":"i","value":"2"}, {"name":"gyerekek[i]","value":"Péter"}], "hint": "Kiírjuk sorszámot (i), valamint a gyermek nevét (gyerekek[i])."},
{ "steps": [5], "variables": [ {"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} , {"name":"i","value":"3"} ], "hint": "Miután a ciklusmag lefutott, az i változó átváltozik a range által megadott tartomány következő elemére (3)."},
{ "steps": [6,4], "variables": [{"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"} , {"name":"i","value":"3"}, {"name":"gyerekek[i]","value":"Dániel"}], "hint": "Kiírjuk sorszámot (i), valamint a gyermek nevét (gyerekek[i])."},
{ "steps": [], "variables": [{"name":"gyerekek","value":"[...]"}, {"name":"len(gyerekek)","value":"4"}], "hint": "Mivel a len(gyerekek) értéke 4, így a range elérte a legnagyobb értékét, a 3-mat, ennél nagyobb számok már nincsenek ebben a range-ben, így a ciklus véget ér, és az i változó megszűnik."}
]
Melynek kimenete:
A(z) 0 . gyerek neve: Gábor
A(z) 1 . gyerek neve: Norbert
A(z) 2 . gyerek neve: Péter
A(z) 3 . gyerek neve: Dániel
Fontos, hogy ebben az esetben a változó (jelen kódrészletben i) az elem sorszámát tartalmazza. A konkrét elem eléréséhez tehát a lista nevét, és a szögletes zárójelet kell használnunk, ahogy a Listák anyagból már ismerős lehet. Persze a for ciklus ezen változata listák nélküli feladatok megoldására is kiválóan alkalmas, íme egy másik példa, amelyben a 7-es szorzótáblát szeretnénk kiírni, és a szorzón való végiglépegetéshez használjuk a range-et:
for szorzo in range(1,11):
print("7 x", szorzo, "=", 7*szorzo)
A for és a range együtt tehát nagyon széles körben használható, akár listákkal, szótárakkal, egyéb nagyobb adatszerkezetekkel való munkára, akár önmagában számsorokkal való műveletekre, vagy csak utasítások valahányszor történő megismétlésére.
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!
Gyakorló feladatok
1. Feladat: Készíts programot, amely kiírja 15 és 35 között (ezeket is beleértve) az 5-tel osztható számokat! (Extra kihívás: meg tudod oldani ezt a feladatot if nélkül is? Használd a range megfelelő tulajdonságát)
2. Feladat: Készíts programot, amely a for ciklus használatával meghatározza az alábbi lista átlagát!
szamok = [2, 5, 3, 3, 8, 12]
3. Feladat: Készíts programot, amely eldönti, hogy a lista nevű lista csak páratlan számokat tartalmaz-e vagy sem! Íme néhány lista, amikkel kipróbálhatod a programodat:
lista = [3, 5, 8, 3, 3, 7, 9]
# erre NEMet kellene kiírnia, hisz van benne 8-as
lista = [1, 7, 9, 11, 3, 3, 5]
# erre IGENt kellene kiírnia, hisz ebben csak páratlan számok vannak
4. Feladat: Írd ki az alábbi listából csak azokat a számokat, amelyek oszthatók 7-tel!
szamsor = [3, 7, 10, 13, 14, 16, 19, 21, 26, 28]
5. Feladat: Készíts programot, amely az alábbi adatok listából készít két új listát fiuk és lanyok néven, amelyek az adatok közül csak a páratlan, illetve páros sorszámú elemeket tartalmazzák! Ha jól dolgozol, a keletkező fiuk listában csak fiúk, a lanyok listában csak lányok kellene hogy legyenek.
adatok = ["Péter", "Anna", "Csongor", "Gréta", "Tamás", "Dóra", "Kálmán", "Barbara"]