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:
- 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 ...)
- 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.
- 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.