Program részének ismételtetése - for ciklus
Utasításokat ismétlünk
Írassuk ki a vászonra az 1, 2, 3, 4 és 5 számokat véletlen helyre.
import tkinter
from random import *
canvas = tkinter.Canvas()
canvas.pack()
canvas.create_text(randrange(400), randrange(300), text='1')
canvas.create_text(randrange(400), randrange(300), text='2')
canvas.create_text(randrange(400), randrange(300), text='3')
canvas.create_text(randrange(400), randrange(300), text='4')
canvas.create_text(randrange(400), randrange(300), text='5')
Figyeljük meg, hogy a random modult ezúttal másképp importáltuk a programunkba. Így a random.randrange() utasítást már rövidebb alakban is felírhatjuk. Elég csak a randrange() utasítást használnunk.
Ha 10-ig szeretnénk kiírni a számokat, akkor elég lenne lemásolnunk a create_text utasítást és átírni a text paraméterét. Képzeljük el, hogy 50, 100 vagy akár sokkal több számot szeretnénk kiíratni. Ha másolgatni fogjuk az utasításokat, akkor nagyon hosszú kódot kapnánk, és a másolgatás is sok időt igényelne. Van egy egyszerűbb megoldás!
Ha egy vagy több utasítást ismételtetni szeretnénk, akkor használhatjuk a for ciklust.
for i in range(1, 6):
canvas.create_text(randrange(400), randrange(300), text=i)
A range(1, 6) utasítás létrehoz egy halmazt a következő elemekkel: 1, 2, 3, 4, 5. Az i változóba fokozatosan hozzárendelődnek ezek az értékek. A ciklus elején az i értéke 1 lesz. Végrehajtódnak azok az utasítások, amelyek ezután egy szinttel beljebb kezdődnek. Az i megkapja a következő értéket a halmazból, vagyis a 2-t. Végrehajtódnak az utasítások. És így tovább...
for i in range(10, 16):
canvas.create_text(randrange(400), randrange(300), text=i)
Kérdések
1. Milyen számokat fog kiírni a fenti program?
2. Mit fog csinálni a program, ha a text = i helyett text = '1' lesz benne?
3. Hogyan kéne megváltoztatni a határokat, hogy
a) 15-től 19-ig írja ki a számokat?
b) 23-től 4 számot írjon ki?
4. Milyen számokat fog kiírni a program, ha a következőképpen adjuk meg a range() utasítást:
a) range(50, 60)
b) range(15, 16)
c) range(10, 10)
d) range(15, 10)
e) range(5)
f) range(3)
g) range(-10, -5)
h) range(-10, 3)
5. Mit fog csinálni a következő program?
for i in range(20, 25):
print(i*10)
Mi a különbség az alábbi két programrészlet között?
for i in range(10, 16):
x = randint(0, 300)
y = randint(0, 300)
canvas.create_rectangle(x-10, y-10, x+10, y+10)
canvas.create_text(x, y, text = i)
----------------------------------------------------------------------------------------
for i in range(10, 16):
x = randint(0, 300)
y = randint(0, 300)
canvas.create_rectangle(x-10, y-10, x+10, y+10)
canvas.create_text(x, y, text = i)
A második program az utolsó utasítást nem ismétli, csak egyszer hajtja végre. Miután kirajzol 5 négyzetet, az utolsóba beleírja a 15-ös számot. Míg az első programnál minden négyzetbe ír egy számot 10-től 15-ig.
Ábrákat rajzolunk for ciklussal
Mit rajzol az alábbi program?
y = 0
for i in range(1, 6):
y = y + 10
canvas.create_line(10, y, 200, y)
Az y változónak kezdőértéket adunk még a ciklus előtt. Ezután a ciklusban fokozatosan növeljük y értékét, ami 10, 20, 30, 40 és 50 lesz. Minden növelés után kirajzolunk egy vonalat. Ugyanezt az ábrát kapjuk az alábbi programmal:
canvas.create_line(10, 10, 200, 10)
canvas.create_line(10, 20, 200, 20)
canvas.create_line(10, 30, 200, 30)
canvas.create_line(10, 40, 200, 40)
canvas.create_line(10, 50, 200, 50)
Az alábbi két programrészlet is hasonló ábrát eredményez. Vizsgáljátok meg őket!
for i in range(1, 6):
canvas.create_line(10, i*10, 200, i*10)
------------------------------------------------------------------------------
for i in range(10, 60, 10):
canvas.create_line(10, i, 200, i)
Ebben a programban a range utasítás 3 számot tartalmaz. A harmadik szám adja meg, milyen lépéssel emelkedjenek az értékek a létrejött halmazban. Ha hiányzik ez a harmadik szám, akkor automatikusan 1-gyel növekszenek az értékek, mint azt eddig is láttuk.
A for ciklus nagyon gyorsan elvégzi egymás után ezeket az utasításokat, így mi már csak a végeredményt látjuk. Ha szeretnénk lelassítani ezt a folyamatot, akkor a canvas.after(1000) utasítással megtehetjük. Ez az utasítás megállítja az utasítások végrehajtását a megadott időre. Az idő itt ezredmásodpercben van megadva, tehát a canvas.after(1000) 1 másodpercet vár. Ehhez az utasításhoz használnunk kell még a canvas.update() utasítást, ami biztosítja, hogy a várakozások között is frissüljön a vászon. Ha ezt kihagynánk, akkor lassabban dolgozna a program - a várakozás miatt - és a ciklus végén rajzolná ki az eredményt. A programunk most így néz ki:
for i in range(1, 6):
canvas.create_line(10, i*10, 200, i*10)
canvas.update()
canvas.after(1000)
