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:

Folytatása következik…