Python az iskolában Wiki
Advertisement

Elöltesztelő ciklus[]

while <feltétel>:
    utasítások
else:
    "végül" utasítások

A feltételvizsgálatot lásd a Szintaktikai összefoglaló cikkben, az opcionális else ágat pedig lentebb.

Hátultesztelő és középen tesztelő ciklus[]

Külön kulcsszóval jelzett hátultesztelő ciklus a Pythonban nincs. A következő szerkezettel szokták megvalósítani:

while True:
    utasítások
    if <kilépési feltétel>:
        break
    (további utasítások)

Első ránézésre, különösen a strukturált programozás híveinek, ez a felépítés furcsa lehet. Viszont nagyon pythonos. Tulajdonképpen egy végtelennek látszó ciklust indítunk el, majd az általában nem túl strukturáltnak tartott break utasítással lépünk ki. Ha azonban csak egyszerű szintaktikai megoldásnak tekintjük arra, hogy külön kulcsszó nélkül készítsü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. (Elöl is, de annak nincs sok értelme.)

Míg a Pascalban, amelyben az EOF jelet figyeljük, vagy a C-ben, ahol a

while (line = readline(f)) {
    // do something with line
}

szerkezettel olvasunk, a szöveges állományok beolvasása klasszikus példája az elöltesztelő ciklusnak, addig a Pythonban ez Hivatalos dokumentáció középen tesztelővé válik:

while True:
    line = f.readline()
    if not line:
        break
    # Itt kezdődnek a sort feldolgozó utasítások:


(Aki nagyon hiányolja a dedikált hátultesztelő ciklust, gondoljon arra, hány évig tanítottunk Pascalban, amelyik még a for ciklust sem tudja megvalósítani, ha nem 1 a lépésköz.)

A Python for ciklusa[]

(Megírandó, hamarosan elkészül.)



A for a Pythonban egy olyan ciklust jelöl, amelyet például a Perl vagy a C# foreach néven ismer. Jelentése kb. „csináld végig egy sokaság összes elemével”, és a ciklusváltozó itt nem egyszerű számláló, hanem maga a soron következő elem. Ez sokkal természetesebb és közelebb áll a beszélt nyelvhez. (Kézenfekvőbb azt mondani, hogy „minden gyerek vegye fel a kabátját”, mint azt, amit a programozási nyelvek többségében mondanánk, hogy „i=1-től N-ig az i. gyerek vegye fel az i. gyerek kabátját”.) Ennek a ciklusnak a legfőbb jellemzője – szemben a magas szintű nyelvek klasszikus tömbfeldolgozásával – a ciklusszámláló hiánya. Ha jobban meggondoljuk, a C, Pascal, BASIC stb. programjainkban legtöbbször nem azért használjuk a ciklusváltozót, mert valóban szükségünk van rá, hanem mert az vezérli a ciklust.

A klasszikus számlálós ciklus[]

A számlálós ciklust a Pythonban viszonylag ritkán használjuk. Ha mégis kell, egyszerűen szimulálható a range() függvény segítségével. Ne feledjük, hogy a range elöl zárt, hátul nyílt intervallumot ad vissza! Ezt idővel megszokjuk. Az „elöl zárt” kifejezést azért használom a „balról zárt” helyett, mert az első argumentumnál lesz zárt – függetlenül attól, hogy növekvő vagy csökkenő lépésközt használunk.

Egy argumentummal (csak végérték)
for i in range(10):
    print (i)
0
1
2
3
4
5
6
7
8
9
Két argumentummal (kezdő- és végérték)
for i in range(5,10):
    print (i)
5
6
7
8
9

for i in range(5,1):
    print (i)

(Ez természetesen nem ír ki semmit.)

for i in range(5,5):
    print (i)

Kevésbé természetes, de a félig nyílt intervallum miatt ez sem ír ki semmit.

Három argumentummal (kezdő- és végérték, lépésköz)
for i in range(25,10,-5):
    print (i)
25
20
15

for i in range(25,10,-2.5):
    print (i)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'float' object cannot be interpreted as an integer

Úgy látszik, ezt nem szerette. :-)

Négy argumentummal

Nem tudom, mi ez, de hogy hibaüzenet lesz belőle, az tuti. Én szóltam…

Az else használata[]

Akár a while, akár a for ciklushoz mellékelhetünk else ágat is, amelyre az utolsó áthaladás után kerül a vezérlés, illetve akkor is, ha a ciklus egyszer sem fut le. Elkerüli viszont az else ágat a vezérlés, ha a break utasítással hagyjuk el a ciklust.

Aki például azt látta a fenti ciklusocska futtatása után, hogy nem lát semmit, az most megoldhatja, hogy a program ezt meg is erősítse – így biztos lehet benne, hogy helyesen fut.

for i in range(5,5):
    print (i)
else:
    print ("Nincs itt semmi látnivaló, oszoljunk, kérem!")

A következő lista ezúttal veremként szolgál csakúgy, mint a telkes feladatban. (A sor elején a shell promptját látjuk.) A kiírást kétszer egymás után futtatjuk le:

>>> verem=[4,5,'mogyorós perec']
>>> def veremkiírás():
...   print('A verem tartalma:')
...   while len(verem):
...     print(verem.pop())
...   else:
...     print('Ez bizony üres.')
...
>>> veremkiírás()
A verem tartalma:
mogyorós perec
5
4
Ez bizony üres.
>>> veremkiírás()
A verem tartalma:
Ez bizony üres.

Hasonló példát láthatunk az SMS-szavak 7. feladatának megoldásában is, ahol nem biztosan talál szavakat a program az adott kódhoz.

Vezérlésátadás[]

Az alábbi utasítások for és while ciklusokban egyaránt használhatók (jellemzően elágazásba ágyazva, mert különben mi értelmük?). A Valószínűségszámítási szimulációk szócikk beállítások() függvényében együtt láthatjuk munkában mind a hármat. (A break ott kissé implicit módon van elágazásba ágyazva.)

  • break
Kiugrik az őt közvetlenül körülvevő ciklusból (tehát beágyazás esetén nem az összesből). Lásd a fenti példát.
  • continue
Átugorja a ciklusmag hátralevő részét, és visszaadja a vezérlést a ciklusfejre. A ciklus a következő iterációval folytatódik.

Nem szorosan kapcsolódik ide, de ciklusokban is jól használható a helykitöltő utasítás:

  • pass
Például akkor használhatjuk, ha egy helyen mindenképpen kell lennie utasításnak, de éppen nem akarunk semmit csinálni, vagy majd később írjuk meg azt a kódrészletet. Segítségével létrehozhatjuk a legegyszerűbb végtelen ciklust is:
while True:
    pass

(Valójában a felhasználó szemszögéből ez a ciklus nem végtelen, hanem a ctrl C megnyomására vár, és használhatjuk szándékosan is.)

Ennél praktikusabb felhasználást láthatunk a Valószínűségszámítási szimulációk szócikkben, ahol a pass utasítást arra használjuk, hogy a felhasználó adatbevitel közben az enter megnyomásával fogadhassa el a felkínált alapértéket.

Ez a szócikk forráskódot tartalmaz, amely egy WikiMedia-kiegészítés segítségével olyan színesen jeleníthető meg, mint például ebben a Wikipédia-cikkben. A kiegészítést a Wikia-stáb ígérete szerint 2010 végéig frissítik, addig türelmet kérünk a fapados kinézet miatt.

Advertisement