Python - for

ismétléses vezérlés (for ciklus)

Akkor használjuk a for ciklust, amikor egy, vagy több utasítást többször is meg akarunk ismételni és már az ismédlődések kezdete előtt meg tudjuk határozni az ismétlődések számát.

A for ciklusnak van egy fejrésze, amiben megadjuk, hogy min lépkedjen végig a for ciklus és azt milyen ciklusváltozóval tegye.

A kettöspont után entert nyomva a beljebb kezdődő sorokat ciklusmagnak nevezzük. Ezek az utasítások ismétlődnek a ciklusváltozó felhasználásával annyiszor, amennyiszer a ciklusfejben megadott feltételek teljesülnek.

Általános forma: for ciklusvaltozo in adatszerkezet:

Egyszerű (indexelt) számolás range() függvénnyel

1A példa: A program beolvas egy N egész számot, majd 0-tól N-ig kiírja egymás alá az egész számokat.:

         
1N = input("Add meg a számot!")
2N = int(N)
3
4for i in range(N):
5	print(i)
1#include <iostream>
2using namespace std;
3
4int main()
5{
6	int N;
7	cout << "Add meg a számot!";
8	cin >> N;
9
10	for (int i=0;i<N;i++){
11		cout << i << endl;
12		}
13
14	return 0;
15}
1<?php // adatbevitel URL-ből például GET metódussal így: URL?N=8
2echo "Add meg az 'N' számot!<br>";
3
4if (!empty($_GET["N"])){
5	$N=$_GET["N"];
6
7	for($i=0;$i<$N;$i++){
8		echo $i . "<br>";
9		}
10	}
11?>

Ebben a példában a range(N) függvény létrehoz 0-tól (N-1)-ig egy N darab számból álló számsorozatot, majd a for ciklus egyenként végighaladva mindegyik számot kiírja egymás alá

1B példa: A program beolvas egy N-0 egész számot, majd N-ig kiírja egymás alá az 1-nél nagyobb egész számokat.:

         
1N = input("Add meg a számot!")
2N = int(N)
3
4for i in range(2,N):
5	print(i)
1#include <iostream>
2using namespace std;
3
4int main()
5{
6	int N;
7	cout << "Add meg a számot!";
8	cin >> N;
9
10	for (int i=2;i<N;i++){
11		cout << i << endl;
12		}
13
14	return 0;
15}
1<?php // adatbevitel URL-ből például GET metódussal így: URL?N=8
2echo "Add meg az 'N' számot!<br>";
3
4if (!empty($_GET["N"])){
5	$N=$_GET["N"];
6
7	for($i=2;$i<$N;$i++){
8		echo $i . "<br>";
9		}
10	}
11?>

Ebben a példában a range(2,N) függvény létrehoz 2-től (N-1)-ig egy N-2 darab számból álló számsorozatot, majd a for ciklus egyenként végighaladva 2-től kezdve mindegyik számot kiírja egymás alá

Lista elemein végighaladás

2A példa: A programban megadunk egy listát, amelyen elemenként végighaladva a for ciklus kiírja a lista minden elemét:

         
1gyumolcsok = ['alma', 'körte', 'eper', 'szamóca', 'banán', 'narancs']
2
3for elem in gyumolcsok:
4	print(elem)
1#include <iostream>
2#include <string>
3using namespace std;
4
5int main()
6{
7	string gyumolcsok[] = {"alma", "körte", "eper", "szamóca", "banán", "narancs"};
8
9	for (string elem : gyumolcsok){
10		cout << elem << endl;
11		}
12
13	return 0;
14}
1<?php
2$gyumolcsok = ['alma', 'körte', 'eper', 'szamóca', 'banán', 'narancs'];
3
4foreach ($gyumolcsok as $elem){
5	echo $elem . "<br>";
6	}
7?>

Ebben a példában ciklusonként sorban haladva a gyumolcsok lista minden elemét az elem nevű változóba teszi a program és ezt a print(elem) függvény kiírja

2B példa: A programban megadunk egy listát, amelyen elemenként (sorszámozva) végighaladva a for ciklus kiírja a lista minden elem sorszámát is és az elem értékét is:

         
1gyumolcsok = ['alma', 'körte', 'eper', 'szamóca', 'banán', 'narancs']
2
3n = len(gyumolcsok)
4for i in range(n):
5	elem = gyumolcsok[i]
6	print(i, elem)
1#include <iostream>
2#include <string>
3using namespace std;
4
5int main()
6{
7	string gyumolcsok[] = {"alma", "körte", "eper", "szamóca", "banán", "narancs"};
8
9	int n = sizeof(gyumolcsok) / sizeof(gyumolcsok[0]);
10	for (int i=0;i<n;i++){
11		string elem = gyumolcsok[i];
12		cout << i << ", " << elem << endl;
13		}
14
15	return 0;
16}
1<?php
2$gyumolcsok = ['alma', 'körte', 'eper', 'szamóca', 'banán', 'narancs'];
3
4$n = count($gyumolcsok);
5for ($i=0; $i < $n; $i++) {
6	elem = $gyumolcsok[$i];
7    echo $elem . "<br>";
8	}
9?>

Ez a példa szinte ugyanaz, mint a 2A példa, csak ebben a 2. sorban található n = len(gyumolcsok) utasítás megszámolja a lista elemeit, majd a range(n) függvény az 1A példához hasonlóan készít egy 0-tól (N-1)-ig terjedő számsorozatot és a for ciklus ezen a számsorozaton halad végig. Minden ciklusban az elem = gyumolcsok[i] utasítással a soron következő gyümölcsöt beletesszuk az elem változóba a print(i, elem) függvény pedig kiírja az adott gyümölcs sorszámát is és a gyümölcs nevét is.

2C példa: enumerate() függvénnyel index és elem listázása egyszerre

         
1gyumolcsok = ['alma', 'körte', 'eper', 'szamóca', 'banán', 'narancs']
2
3for i, elem in enumerate(gyumolcsok):
4	print(i, elem)
1#include <iostream>
2#include <string>
3using namespace std;
4
5int main()
6{
7	string gyumolcsok[] = {"alma", "körte", "eper", "szamóca", "banán", "narancs"};
8
9	int i = 0;
10	for (string elem : gyumolcsok){
11		cout << i << " " << elem << endl;
12		i++;
13		}
14
15	return 0;
16}
1<?php
2$gyumolcsok = ['alma', 'körte', 'eper', 'szamóca', 'banán', 'narancs'];
3
4foreach ($gyumolcsok as $i => $elem){
5	echo $i . " " . $elem . "<br>";
6	}
7?>

szöveg betűin végighaladás

3A példa: A programban megadunk egy szöveget, amelyen betűnként végighaladva a for ciklus kiírja a szöveg minden betűjét külön sorba:

         
1mondat = "Helló, szia! Ez egy próbaszöveg"
2
3for betu in mondat:
4	print(betu)
1#include <iostream>
2#include <string>
3using namespace std;
4
5int main()
6{
7	string mondat = "Helló, szia! Ez egy próbaszöveg";
8
9	for (char betu : mondat){
10		cout << betu << endl;
11		}
12
13	return 0;
14}
1<?php
2$mondat = "Helló, szia! Ez egy próbaszöveg";
3
4 // ékezetes string-en nem jól működik a foreach
5$betuk = mb_str_split($mondat); // tömbbé alakítás
6foreach ($betuk as $betu){
7	echo $betu . "<br>";
8	}
9?>

Ebben a példában ciklusonként sorban haladva a mondat nevű szöveg minden betűjét/karakterét a betu nevű változóba teszi a program és ezt a print(betu) függvény kiírja

3B példa: A programban megadunk egy szöveget, amelyen betűnként végighaladva a for ciklus kiírja a szöveg minden betűjének sorszámát is és az adott betűt is:

         
1mondat = "Helló, szia! Ez egy próbaszöveg"
2
3n = len(mondat)
4for i in range(n):
5	betu = mondat[i]
6	print(i, betu)
1#include <iostream>
2#include <string>
3using namespace std;
4
5int main()
6{
7	string mondat = "Helló, szia! Ez egy próbaszöveg";
8
9	int n = mondat.length();
10	for (int i=0;i<n;i++){
11		char betu = mondat[i];
12		cout << i << ", " << betu << endl;
13		}
14
15	return 0;
16}
1<?php
2$mondat = "Helló, szia! Ez egy próbaszöveg";
3
4$n = mb_strlen($mondat, "UTF-8");
5for ($i=0;$i<$n;$i++){
6	$betu = $mondat[$i];
7	echo $i . " " . $betu . "<br>";
8	}
9?>

Ez a példa szinte ugyanaz, mint a 3A példa, csak ebben a 2. sorban található n = len(mondat) utasítás megszámolja a szöveg karaktereinek számát, majd a range(n) függvény az 1A példához hasonlóan készít egy 0-tól (N-1)-ig terjedő számsorozatot és a for ciklus ezen a számsorozaton halad végig. Minden ciklusban a betu = mondat[i] utasítással a soron következő betűt beletesszük az batu változóba a print(i, betu) függvény pedig kiírja az adott betű sorszámát is és magát a betűt is.

A 2A és 3A példa, valamint a 2B és 3B példa hasonlósága megmutatja, hogy a szöveget (amelyet egyébként mindig idézőjelbe tesszük) a python programnyelv úgy kezeli, mintha az egy karakterlista lenne. Ezért a lista végigjárása és a szöveg végigjárása lényegében ugyanúgy történik.

3C példa: Ugyanaz, mint a 3B, csak enumerate függvénnyel:

         
1mondat = "Helló, szia! Ez egy próbaszöveg"
2
3for i, betu in enumerate(mondat):
4	print(i, betu)
1#include <iostream>
2#include <string>
3using namespace std;
4
5int main()
6{
7	string mondat = "Helló, szia! Ez egy próbaszöveg";
8
9	int i=0;
10	for (char betu : mondat){
11		cout << i << " " << betu << endl;
12		i++;
13		}
14
15	return 0;
16}
1<?php
2$mondat = "Helló, szia! Ez egy próbaszöveg";
3
4 // ékezetes string-en nem jól működik a foreach
5$betuk = mb_str_split($mondat); // tömbbé alakítás
6foreach ($betuk as $i => $betu){
7	echo $i . " " . $betu . "<br>";
8	}
9?>

Összefoglalás

A for ciklust 3 változatban használhatjuk:

  1. Sorszámozva, indexelve a range() függvénnyel: for i in range(10):

    Az in és a kettőspont közé egy range() függvényt teszünk, a for és az in közé pedig egy indexet/sorszámot jelölő ciklusváltozót. Többnyire i betűt, de ha foglalt, akkor az abc következő betűjét. (i, j, k ...)

  2. Lista elemein elemenként lépdelve (nem indexelve): for gyumolcs in gyumolcsok:

    Az in és a kettőspont közé egy listát teszünk, a for és az in közé pedig egy listaelemet jelölő változót adunk meg. Általános esetben e, elem, de adott esetben a konkrét listára jellemző nevet adunk.

  3. Szöveg karaktereit betűzve (nem indexelve): for betu in szovegvaltozo:

    Az in és a kettőspont közé egy szöveges változót teszünk, a for és az in közé pedig egy karaktert jelölő változót adunk meg. Többnyire betu, b, char, c.