While ciklus, elöl tesztelő ciklus
Elől tesztelő ciklus – While. A While ciklus megvizsgálja a belépési feltételt, ha igaz végrehajtja az utasításokat. A ciklusokat ismétlődő feladatok végrahajtására használjuk.
Írassuk ki a számokat 1-től 10-ig! Ez azt jelenti, hogy a feltételnek vagy <11-et adunk, vagy <=10-et. Az i változó értéke mindig 1-el fog növekedni, ahányszor lefut a ciklus. Amikor eléri a 11-et, akkor már ki fog lépni a ciklusból, és az else ág fut le. Az else ág opcionális. Természetesen nem mindegy, hogy a print előtt, vagy után növelhük az i értékét! Próbáld ki!
|
1 2 3 4 5 6 7 8 9 10 |
while i < 11: print(i) i += 1 else: print("i nagyobb, mint 10") # így is 1-10-ig írja ki a számokat... nem árt figyelni a műveleti sorrendre! i = 0 while i < 10: i += 1 print(i) |
A continue utasítást akkor használjuk, ha szeretnénk egy feltételt megvizsgálni, és utána folytatni a ciklust. Például ha i=5, írjuk ki, hogy hoppá! Itt az i értékét nem fogja kiírni, csak a hoppát!
|
1 2 3 4 5 6 7 |
i = 0 while i < 10: i += 1 if i == 5: print("hoppá") continue print(i) |
A break utasítást is használhatjuk feltétel vizsgálatra, de ez megszakítja a ciklus futását! Amikor elérünk péládul 5-ig, akkor ki fog lépni a ciklusból.
i = 0
while i < 10:
i += 1
print(i)
if (i == 5):
break
Példa: Írasd ki 1-100 közötti hárommal osztható számokat!
i = 1
while i < 100:
i += 1
if i % 3 == 0:
print(i)
Gyakorlás:
Írj egy programot, amely [1;12] intervallumon állít elő 20 darab véletlenszámot! A képernyőre kizárólag csak a 3-mal oszthatóakat írja ki, és a végén informálja a felhasználót arról is, hány darab ilyen szám volt.
|
1 2 3 4 5 6 7 8 9 10 |
import random szam = 1 db = 0 while szam <=20: vsz = random.randint(1,12) if vsz % 3 == 0: db += 1 print(vsz,end=" ") szam+=1 print("\n Ennyi hárommal osztható van: ",db) |
For cilus
A Pythonban kicsit eltérően működik a for ciklus, mint más programnyelveken. A Pythonban elsősorban összetett adattípusok (sor, lista, szótár, string, halmaz) elemein tudunk végighaladni a segítségével. Így kicsit előre kell vennünk ezeket a fogalmakat is.
Lista bejárása for ciklussal
A lista elemekből áll, ezeket az elemeket szoktuk kiolvasni, bővíteni, törölni… Majd későbbb még visszatérünk rá. Jelen példában csak szeretném kiíratni az összes elemét. A lista neve: napok. A lista elemeit szögletes zárójelek között felsoroljuk. Utána a for ciklus segítségével kiíratjuk: for x in napok Tehát amíg nem ér a napok elemszámának végére, addig fut a print(x). Az ‘i’ a lista elemet jelöli, ciklus változó, értéke eggyel nő minden lefutáskor. Számozása 0-tól kezdődik és elemszám-1-ig tart. Más porgramozási nyelveken ezt részletesen ki kell fejteni, lásd C#, JS… Itt sokkal egyszerűbb.
|
1 2 3 4 5 6 7 |
napok = ["hétfő", "kedd", "szerda","csütörtök","péntek"] for i in napok: print(i) # ha indexre is szükség van a for ciklusban for i, nap in enumerate(napok): print(f"{i+1}. nap: {nap}") |
Több lista párhuzamos bejárása zip() függvény segítségével
|
1 2 3 4 |
nevek = ["Anna", "Béla"] pontok = [95, 88] for nev, pont in zip(nevek, pontok): print(f"{nev} pontszáma: {pont}") |
String bejárása for ciklussal
Nagyon hasonló, egyszerű, mint a listánál. Ebben az esetben karakterenként tudunk végigmenni egy stringen. A stringekre is visszatérünk még.
for x in "hétköznap": print(x)
A While ciklushoz hasonlóan a FOR ciklusnál is használhatunk break és continue argumentumot. A continue utasítással megállíthatjuk a for ciklus iterációjat, majd folytathatjuk tovább. A break utasítással pedig ki tudunk „ugrani” a ciklusból ott ahol éppen tart.
A for ciklusban is használhatunk else utasítást, ami akkor fut le, amikor végzett az iterációkkal. (break esetén nem fog kiírni semmit, mert megszakítottuk a ciklus futását.)
napok = ["hétfő", "kedd", "szerda","csütörtök","péntek"]
for x in napok:
if x == "szerda":
continue
print(x)
else:
print("Minden elemen végigment!")
#break esetében nem fut tovább:
napok = ["hétfő", "kedd", "szerda","csütörtök","péntek"]
for x in napok:
if x == "szerda":
break
print(x)
Range függvény. Ez hasonlít leginkább a C#-ra, itt megadhatjuk mettől-meddig menjen a for ciklus, és milyen lépésközökkel. A range(1, 51, 2) azt jelenti, hogy 1-től megy 50-ig, és kettesével nő a ciklusváltozó x értéke. Magyarul, csak a páratlan számokat fogja ebben az esetben kiírni. A range-nél a meddig értékéhez tulajdonképpen hozzá kell adni egyet.
A range(start, stop, step) legfőbb ereje abban rejlik, hogy egész számok egy sorozatát állítja elő, anélkül, hogy ténylegesen létrehozná és memóriában tárolná az összes számot (ezért tekintjük generátornak/iterátornak), ami nagy adathalmazok esetén rendkívül erőforrás-hatékony. Mivel a range objektum tudja tárolás nélkül is, hogy mely számokat tartalmazza, rendkívül gyorsan lehet ellenőrizni vele, hogy egy adott szám beletartozik-e a megadott intervallumba.
for x in range(1, 51, 2): print(x)
Természetesen itt is lehet egyszerűsíteni. Ha csak egy paramétert írok: for x in range(6) az azt jelenti, hogy alapból 0-tól kezdve számoz, így 0 – 5-ig növekszik egyesével a ciklusváltozó értéke. Ha két paramétert adok meg, akkor alapból egyesével növeli a ciklusváltozó értékét.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Ebben az esetben az eredmény: 0 1 2 3 4 5 for x in range(6): print(x) # írassuk ki 10-20-ig a számokat! Eredmény: 10 11 ... 18 19 for x in range(10, 20): print(x) # Negatív lépésköz Eredmény: 10 9 8 7 6 5 4 3 2 1 for i in range(10, 0, -1): print(i, end=" ") # Lépésköz 3, Eredmény: 0 3 6 9 12 15 18 for i in range(0, 20, 3): print(i, end=" ") # Nagyon gyorsan adja vissza, mivel nem iterál végig nagy_intervallum = range(1, 100_000_000) print(500 in nagy_intervallum) # True print(100_000_000 in nagy_intervallum) # False (hiszen a 'stop' értékét nem tartalmazza) |
A Python List comprehension (listagenerátor) egy tömör és hatékony módszer a listák létrehozására vagy meglévő listák átalakítására.
|
1 2 3 4 5 6 7 8 9 |
# --hagyományos módon-- szamok_negyzete = [] for x in range(1, 11): if x % 2 == 0: szamok_negyzete.append(x * x) # --List Comprehension-- szamok_negyzete = [x**2 x for x in range(1, 11) if x % 2 == 0] # Eredmény: [4, 16, 36, 64, 100] |
Most akkor FOR vagy WHILE?
A for ciklust akkor érdemes használni, ha előre tudod a ciklus futásainak számát, vagy ha egy ismert adathalmaz (egy ún. iterable – pl. lista, string, tuple, range objektum) összes elemén végig akarsz menni, sorban, az elsőtől az utolsóig.
A while ciklust akkor érdemes használni, ha nem tudod előre a ciklus futásainak pontos számát, de van egy feltétel, aminek teljesülnie kell a ciklus futásához. A ciklus addig fut, amíg ez a feltétel igaz (True). Végtelen ciklus akkor fordul elő, ha a while ciklus feltétele soha nem válik hamissá (False). Ez a program lefagyásához vagy erőforrás pazarláshoz vezet.
Nézzünk néhány egyszerű példát for ciklusra!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# --- Írasd ki 10x, hogy Éljen a Python! Sorszámot is! for i in range (10): print(i+1," Éljen a Python!") # --- Írasd ki a 100 és 0 közötti számokat, tizesével csökkentve! print("\n for ciklussal 100-0-ig, tizesével csökkentve ") for n in range(100,0,-10): print(n, end=' ') # --- Mikor járt erre a Halley üstökös az utóbbi 2000 éveben? Tudjuk, hogy legutóbb 1986-ban, és 76 évenként tér vissza. for n in range(1986,0,-76): print(n, end=' ') # --- Írasd ki 10x az egyjegyű számokat! (1234567890), új sorba!") #ITT már figyelni kell! Maradékos osztással könnyen megoldható. Minden tizzel oszható számnál sortörés. for o in range(1,101): print(o%10, end=' ') if (o%10==0): print() # --- Szorzótábla, a hagyományos 10x10-es formában. A print utasítás alap esetben minden eredmény után sort törne, de a \t-vel tabulátort fog tenni helyette. Ha egy sorral kész, akkor viszont a 2. print utasítás végez sortörést. for i in range(1, 11): for j in range(1, 11): print(i*j,end="\t") print() # --- Szorzótábla. Ehhez már 2db for ciklus kell! Az i az oszlop,a j a sor for i in range(1, 11): for j in range(1, 11): print(str(i) + " * " + str(j) + " = " + str(i * j)) print("\n") # --- Évszám gyakorlása. Mikor adták ki at Aranybullát? Hasonlóan a gondoltam egy számra feladathoz... jó_válasz = 1222 próba = None tipp_db = 0 while próba != jó_válasz: tipp_db += 1 próba = int(input('Melyik évben adták ki az Aranybullát? ')) if próba < jó_válasz: print('A helyes évszám nagyobb...') elif próba > jó_válasz: print('A helyes évszám kisebb...') print('Igen, ez a jó válasz!') if tipp_db <= 3: print('Egészen ügyes vagy!') # --- Adott számú téglából hány darab tornyot tudunk építeni? Az első torony 2 téglából áll, a további tornyok mindig 3 téglával magasabbak. Az utolsó torony a maradék téglából áll. Hány tornyunk lesz? teglak_szama = int(input('Hány tégla van? ')) magasság = 2 tornyok_száma = 0 while teglak_szama > magasság: teglak_szama -= magasság tornyok_száma += 1 print('teszt: torony sorszáma: ', tornyok_száma, '\tmagassága:', magasság) magasság += 3 print('A megépíthető tornyok száma: ', tornyok_száma + 1) print('Az utolsó torony magassága: ', teglak_szama) # --- Armstrong szám Készíts programot, amely valamennyi 3 jegyű Armstrong számot kiírja, ciklusok egymásba ágyazásával! (Armstrong szám: számjegyei harmadik hatványainak összege egyenlő az adott számmal) for száz in range(1, 10): for tiz in range(10): for egy in range(10): szám = 100 * száz + 10 * tiz + egy # print(szám, end=" ") # Első feladatrész hatvány = száz * száz * száz + tiz * tiz * tiz + egy * egy * egy if szám == hatvány: print('Armstrong szám: ', szám, '\tEllenőrzés: ', szám, ' = ', száz * száz * száz, |
Gondoltam egy számot játék
Készíts Gondoltam egy számot játékot! A program 1-100 közötti számot sorsoljon, a játékosnak 5 db próbálkozási lehetősége legyen.
import random
tipp = 0
db = 1 # próbálkozások száma
gep = random.randint(1, 100)
while db <= 5:
print(f"{db}. tipp?")
tipp = int(input())
if tipp == gep:
print("Gratulálok! Eltaláltad")
break
elif tipp > gep:
print("A gondolt szám kisebb!")
else:
print("A gondolt szám nagyobb!")
db += 1
if db > 5:
print("Vesztettél!")
print(f"Gondolt szám {gep}")
Kő, papír, olló játék – számokkal
import random
while True:
gep=random.randint(0,2)
jatekos = int(input("Kő(0), papír(1), olló(2)"))
#kiíratáshoz átalakítás
if jatekos==0: j="kő"
elif jatekos ==1: j="papír"
else: j="olló"
if gep==0: g="kő"
elif gep==1: g="Papír"
else: g="olló"
#eredmény kiértékelése
print(f"Játékos: {j} Gép: {g}")
if (gep==jatekos):
print("Döntetlen")
elif (gep==0 and jatekos ==1 )or(gep==1 and jatekos == 2)or(gep==2 and jatekos == 0):
print("Játékos nyert!")
else:
print("Gép nyert")
#while ciklusból kilépünk-e?
folytatni = input("Játszunk még? (i/n) ")
if folytatni.lower() != "i":
print("Játék vége!")
break
Frissítve: 2025.11.09.
