Az előző leckében bemutatott „while” ciklus mellett a Python a többi nyelvbőljól ismert „for” folyamatvezérlő utasítást is használja, egy kis csavarral.
A Pythonban a for utasítás használata, működése kissé különbözik attól, amit a C vagy a Pascal nyelvben megszokhattunk. Ahelyett, hogy egy változó mindig a számok aritmetikai növekedésével iterálódna (mint például a Pascal-ban), vagy hogy a felhasználó képes legyen meghatározni mind az iterációs lépést, mind a megállási feltételt (C-nyelv), a Python „for” parancsa bármilyen sorozat (lista vagy akár karakterlánc) elemeit annak sorrendjében tudja „bejárni”. Például:
words = ['macska', 'kutya', 'pirosalma'] for w in words: print(w, len(w))
A program végigmegy a lista elemein, (macska, kutya, pirosalma), egymás után kinyomtatja az elemeket, illetve minden egyes szó mellé kiírja, hogy hány karakterből állnak. Ezt a „len()” függvénnyel oldja meg, ami az utána zárójelben megadott string karakterszámát adja.
>>> len("kutya") 5
A „range()” függvény
Amennyiben az adataink szekvenciálisak, és az iterációt ezen a sorozaton kell végrehajtani, jó szolgálatot tesz a „range()” függvény.
for i in range(5): print(i)
Az adott végpont soha nem része a generált sorozatnak. A (10) tartomány 10 értéket generál, a 10-es érték nem lesz a sorozat eleme. Lehetőség van arra, hogy a tartomány egy másik számtól induljon, vagy akár megadhatunk 1-től eltérő növekményt is, ez akár negatív is lehet! A növekményt sokszor lépés-nek hívjuk.
range(kezdőérték, végérték, lépés)
range(5, 10) 5, 6, 7, 8, 9 range(0, 10, 3) 0, 3, 6, 9 range(-10, -100, -30) -10, -40, -70
A sorozat elemein történő iteráláshoz a következőképpen kombinálhatjuk a „range ()” és a „len ()” függvényeket:
a = ['Mary', 'had', 'a', 'little', 'lamb'] for i in range(len(a)): print(i, a[i])
A futás eredménye:
0 Mary 1 had 2 a 3 little 4 lamb
Beágyazott ciklusok
A beágyazott hurok egy hurok belsejében lévő hurok. A “belső hurok” végrehajtása egyszer történik a “külső hurok” minden egyes iterációja esetén:
type = ["red", "big", "tasty"] fruits = ["apple", "banana", "cherry"] for x in type: for y in fruits: print(x, y)
A futás eredménye:
red apple red banana red cherry big apple big banana big cherry tasty apple tasty banana tasty cherry
Lista alkalmazása a for ciklusban
A Python lista tulajdonképpen elemek, adatok felsorolása vesszővel elválasztva. Mondhatjuk azt is, hogy tulajdonképpen egy adattömb, ezekről a későbbikben lesz szó. A lista elemei lehetnek karakterek, stringek, számok. Egy lista elemeit könnyen ki tudjuk íratni egy „for” ciklus segítségével:
mylist = ["apple", "banana", "cherry"] for x in mylist: print(x)
A futás eredménye:
apple banana cherry
Amennyiben a lista pl. számokat tartalmaz:
mylist = [13, 22, 44, 55] for x in mylist: print(x)
Az futás eredménye:
13 22 44 55
Megfigyelhető, hogy a „for” ciklus és a lista kombinálásával kinyomtatott számsor elemei között nem egyenletes a növekmény.
A lista elemeinek egymás után történő kinyomtatása megoldható a „for” ciklus és a „range()” függvény használatával:
mylist = [13, 22, 44, 55, 65, 92] for x in range(2,5): print(mylist[x])
Az eredmény:
44 55 65
Ezt a megoldást használhatjuk fel például a Raspberry Pi GPIO portjára kötött LED-ek futófény szerű működtetésére. A kimeneti tüskék sorszámai nem egymás után következő értékek, de ha a pin sorszámokat egy listában adjuk meg, akkor könnyen megoldható a feladat:
Kapcsoljunk LED diódákat a Raspberry Pi 7, 11, 13, 15-ös kimeneteire. Ha sorban szeretnénk ki/be kapcsolgatni a kimeneteket, akkor célszerű a kimeneteket egy lista elemeiként definiálni:
gpio_list = [7,11,13,15]
A teljes program ezek után:
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(7,GPIO.OUT) GPIO.setup(11,GPIO.OUT) GPIO.setup(13,GPIO.OUT) GPIO.setup(15,GPIO.OUT) gpio_list = [7,11,13,15] for i in range (0,4): GPIO.output((gpio_list[i]),GPIO.HIGH) time.sleep(0.5) GPIO.output((gpio_list[i]),GPIO.LOW) time.sleep(0.5) GPIO.cleanup()
A fenti program egyszer fut le. Ha azt szeretnénk, hogy a futófény folyamatos legyen, alkalmazhatjuk a „while” ciklust:
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(7,GPIO.OUT) GPIO.setup(11,GPIO.OUT) GPIO.setup(13,GPIO.OUT) GPIO.setup(15,GPIO.OUT) gpio_list = [7,11,13,15] while True: for i in range (0,4): GPIO.output((gpio_list[i]),GPIO.HIGH) time.sleep(0.5) GPIO.output((gpio_list[i]),GPIO.LOW) time.sleep(0.5) GPIO.cleanup()
A forráskódok letölthetőek: