Kihagyás

03. gyakorlat

Szerkesztés alatt!

Az oldal további része szerkesztés alatt áll, a tartalma minden további értesítés nélkül többször, gyakran, jelentősen megváltozhat!

Ciklusok

while ciklus

A while ciklus addig fut, amíg a megadott feltétel igaz. A feltétel minden iteráció előtt ellenőrzésre kerül, és ha hamissá válik, a ciklus leáll. Minden ciklus törzsét egy szinttel (indenation) beljebb kell húzni egyéb esetben hibát kaphatunk (lásd az az alábbi példát).

Szintaxis:

1
2
while <<feltétel>>:
    # a ciklus törzse

Példa: Számok kiírása 0-tól 4-ig

1
2
3
4
i = 0
while i < 5:
    print(i)
    i += 1

Kimenet:

1
2
3
4
5
0
1
2
3
4

for ciklus a range() függvénnyel

A for ciklus általában iterál egy sorozaton. A range() függvényt gyakran használjuk a számsorozatok létrehozásához. A range() háromféle paraméterezése révén különböző viselkedést tudunk elérni.

  • start: kezdő érték (alapértelmezett 0)
  • stop: a ciklus addig fut, amíg el nem éri ezt az értéket (de ezt már nem tartalmazza)
  • step: lépésköz (alapértelmezett 1)

Szintaxis:

1
2
for változó in range(start, stop, step):
    # a ciklus törzse

range() paraméterezése

Csak egy paraméter megadása:

Ha a range-nek egy paramétert adunk meg, akkor a megadott érték - 1 -ig adja vissza a számokat.

Példa:

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

Kimenet:

1
2
3
4
5
0
1
2
3
4

Start és stop megadása:

Itt megadjuk a kezdő és a befejező értéket is. Az iterálás a start értékkel indul, és a stop-1 értéknél fejeződik be.

Példa:

1
2
for i in range(2, 7):
    print(i)

Kimenet:

1
2
3
4
5
2
3
4
5
6

Start, stop és step megadása:

A harmadik paraméter a step, ami az iterációk közötti lépésközt határozza meg.

Példa:

1
2
for i in range(1, 10, 2):
    print(i)

Kimenet:

1
2
3
4
5
1
3
5
7
9

Break és Continue utasítások

break utasítás

A break utasítással az aktuális ciklus azonnal megszakad, és a program folytatja a végrehajtást a ciklus utáni kódrésznél. Hasznos akkor, ha valamilyen feltétel teljesülése esetén azonnal meg akarjuk állítani a ciklust.

Példa:

1
2
3
4
for i in range(10):
    if i == 4:
        break
    print(i)

Kimenet:

1
2
3
4
0
1
2
3

A ciklus a 4 elérésekor megszakad, így az utána következő értékek nem kerülnek kiírásra.

continue utasítás

A continue utasítással átugorhatjuk a ciklus aktuális iterációjának hátralévő részét, és a következő iterációval folytathatjuk a ciklus futását.

Példa:

1
2
3
4
for i in range(6):
    if i == 3:
        continue  # ugorjuk át a 3-at
    print(i)

Kimenet:

1
2
3
4
5
0
1
2
4
5

Amikor a ciklus eléri a 3-at, a continue utasítás miatt az iteráció azonnal folytatódik a következő értékkel, így a 3 kimarad a kimenetből.

Ciklusok else ága

A for és a while ciklusoknak van egy opcionális else ága, amely akkor fut le, ha a ciklus nem szakadt meg break utasítással. Ez akkor hasznos, ha szeretnénk külön kezelni azt az esetet, amikor a ciklus normál módon végződik, és azt, amikor valamilyen esemény miatt megszakítjuk.

Mire jó az else ág?

Az else ág különösen hasznos akkor, ha például azt akarjuk ellenőrizni, hogy a ciklus nem futott-e bele egy adott feltételbe (break utasítás nélkül ért véget).

Példa for ciklusban:

1
2
3
4
for i in range(5):
    print(i)
else:
    print("A ciklus végigfutott.")

Kimenet:

1
2
3
4
5
6
0
1
2
3
4
A ciklus végigfutott.

Példa while ciklusban:

1
2
3
4
5
6
i = 0
while i < 3:
    print(i)
    i += 1
else:
    print("A while ciklus végigfutott.")

Kimenet:

1
2
3
4
0
1
2
A while ciklus végigfutott.

Hogyan lehet kilépni az else ág futásából?

Az else ág csak akkor fut le, ha a ciklus normál módon fejeződik be (nem break utasítással). Ha a ciklus futása során egy break utasítás végrehajtódik, az else ág nem fog lefutni.

Példa break használatával:

1
2
3
4
5
6
for i in range(5):
    if i == 3:
        break
    print(i)
else:
    print("A ciklus végigfutott.")

Kimenet:

1
2
3
0
1
2

Megjegyzés: Az else ág nem fut le, mivel a ciklus break utasítással szakadt meg.

for _ in range()

A Pythonban használható egy speciális változónév: az aláhúzás (_). Ez egy konvenció, amit akkor alkalmazunk, amikor a ciklus változóját nem használjuk a ciklus törzsében. Például ha a for ciklusban csak azt akarjuk elérni, hogy a művelet egy bizonyos számú alkalommal fusson le, de a ciklus változójára nincs szükségünk, akkor az aláhúzás jelet (_) használjuk.

Mire jó a for _ in range()?

A for _ in range() akkor hasznos, ha nem érdekel minket az adott ciklus aktuális iterációs száma, csak azt szeretnénk, hogy egy adott számú művelet fusson le. Ez gyakori, amikor egy feladatot meghatározott számú alkalommal kell végrehajtani, de nincs szükségünk arra, hogy a ciklusindexet (az aktuális számot) felhasználjuk a ciklus törzsében.

Példa - Egyszerű ismétlés ciklussal

Írjunk egy programot, amely egy szöveget háromszor kiír, de nem használja a ciklus változóját:

1
2
for _ in range(3):
    print("Hello, világ!")

Kimenet:

1
2
3
Hello, világ!
Hello, világ!
Hello, világ!

Ebben a példában a range(3) meghatározza, hogy a ciklus háromszor fusson le. Az aláhúzás (_) jelzi, hogy az iterációs változót nem használjuk, mivel csak annyi a cél, hogy háromszor végrehajtsuk a print() függvényt.

Összefoglalás:

  • Az aláhúzás nem csak azt jelzi, hogy a ciklus változóját nem használjuk, hanem egy átláthatóbb és tisztább kódot is eredményez. Ezzel a módszerrel a programozó kifejezi, hogy a ciklus iterációs változója lényegtelen a művelet szempontjából, és a figyelem inkább a végrehajtandó műveletekre koncentrálódik.
  • Az aláhúzás használata egy programozási szokás, amit akkor használunk, ha a változó értéke irreleváns vagy nem használatos.

Kiegészítő anyag: Turtle grafika

A Python turtle modulja egyszerű grafikai elemek rajzolására használható. Az alábbiakban bemutatom a modul használatának alapjait, beleértve néhány alapvető műveletet és példákat.

A turtle importálása

1
from turtle import *

Alapvető parancsok

Mozgás előre és hátra:

1
2
    forward(100)  # 100 lépés előre
    backward(50)  # 50 lépés hátra

Elfordulás:

python right(90) # 90 fok jobbra left(45) # 45 fok balra

Rajzolás

Négyzet rajzolása

1
2
3
4
5
6
7
from turtle import *

for _ in range(4):
    forward(100)  # 100 lépés előre
    right(90)     # 90 fokos elfordulás jobbra

done()  # A rajz lezárása

Kör rajzolása

A circle() függvénnyel egyszerűen rajzolhatunk kört.

Kör rajzolása

1
2
3
4
5
from turtle import *

circle(50)  # 50-es sugarú kör rajzolása

done()

Turtle ablak bezárása

A turtle ablak automatikusan bezáródik a következő utasítással:

1
done()

Feladatok

1. feladat: Négyszög rajzolása

Feladat: Írjunk függvényt, ami négyszöget rajzol a paraméterben megadott oldalhosszal.

1
2
3
4
5
6
from turtle import *

def negyzet(meret):
    for _ in range(4):
        forward(meret)
        right(90)

2. feladat: Sokszög rajzolás

Feladat: Írjon függvényt, aminek két paramétere van, egy n egész szám és egy valós oldalhossz, és nem ad vissza semmit. A függvény rajzoljon szabályos n-szöget, a megadott oldalhosszúsággal.

1
2
3
4
5
6
from turtle import *

def sokszog(n, oldalhossz):
    for _ in range(n):
        forward(oldalhossz)
        right(360 / n)

3. feladat: Csigavonal

Feladat: Írjon függvényt, aminek két paramétere van, egy n egész szám, és egy szög, és nem ad vissza semmit. A függvény rajzoljon egy vonalat, majd forduljon el jobbra az adott szöggel, és rajzoljon egy kicsit hosszabb vonalat. Ezt n-szer ismételje meg.

1
2
3
4
5
6
from turtle import *

def csigavonal(n, szog):
    for i in range(5,n,5):
        forward(i)
        right(szog)

4. feladat: Tüskecsiga

Feladat: Írjon függvényt, aminek két paramétere van, egy n egész szám, és egy szög, és nem ad vissza semmit. A függvény rajzoljon egy vonalat, majd lépjen vissza ugyanennyit, majd forduljon jobbra az adott szöggel. Ezt n-szer ismételje meg, mindig egy kicsit hosszabb vonalat rajzolva.

1
2
3
4
5
6
7
8
9
from turtle import *

def tuskecsiga(n, szog):
    hossz = 5  # Kezdő hossz
    for _ in range(n):
        forward(hossz)
        backward(hossz)  # Lépj vissza ugyanannyit
        right(szog)
        hossz += 5  # Minden lépésnél növeljük a hosszúságot

5. feladat: Színes csigavonal

Feladat: Valósítsa meg az előző csigavonal függvényt úgy, hogy az egymást követő szakaszok felváltva két színnel legyenek megrajzolva.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from turtle import *

def szines_csiga(n, szog):
    hossz = 5  # Kezdő hossz
    szinek = ['red', 'blue']  # Két szín
    for i in range(n):
        color(szinek[i % 2])  # Váltsunk színt felváltva
        forward(hossz)
        right(szog)
        hossz += 5

6. feladat: Színes tüskecsiga

Feladat: Valósítsa meg az előző tüskecsiga függvényt, hogy az egymás után következő tüskék felváltva három színnel legyenek megrajzolva.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from turtle import *

def szines_tuskecsiga(n, szog):
    hossz = 5  # Kezdő hossz
    szinek = ['red', 'green', 'blue']  # Három szín
    for i in range(n):
        color(szinek[i % 3])  # Váltsunk színt felváltva
        forward(hossz)
        backward(hossz)  # Lépj vissza ugyanannyit
        right(szog)
        hossz += 5

7. feladat: Kör

Feladat: Írjon függvényt, ami kört rajzol!

Igazából ha a sokszög függvényt elég nagy n-nel hívjuk meg, akkor az kicsit hunyorogva egészen körnek látszik...

1
2
3
4
5
6
from turtle import *

def kozepszeru_kor(n, oldalhossz):
    for _ in range(n):
        forward(oldalhossz)
        right(360 / n)

Úgy is lehet kört rajzolni, hogy haladunk egy nagyon picit, aztán fordulunk egy nagyon picit, és mindezt addig ismételjük, míg visszaérünk a kiindulóponthoz.

1
2
3
4
5
6
from turtle import *

def kicsi_fordulas_kor():
    for _ in range(360):
        forward(1)
        right(1)

A kör koordinátageometriából ismert képletét használva rajzoljunk kört!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from turtle import *
import math

def koordinata_kor(sugar):
    penup()  # Kezdjük tollal felemelve
    goto(sugar, 0)  # Menjünk a kör peremére
    pendown()  # Engedjük le a tollat
    for fok in range(360):
        x = sugar * math.cos(math.radians(fok))
        y = sugar * math.sin(math.radians(fok))
        goto(x, y)

8. feladat: Toll pozíciójának ellenőrzése

Feladat: Írjon függvényt, ami nem vár bemeneti paramétert, és True-et ad vissza, ha a toll még belül van az ablakon, és False-t ad vissza minden egyéb esetben.

1
2
3
4
from turtle import *

def toll_belul_van():
    return window_width() // 2 > xcor() and xcor() > -window_width() // 2 and window_height() // 2 > ycor() and ycor() > -window_height() // 2