Niekedy potrebuješ zopakovať činnosť, ktorá sama o sebe obsahuje opakovanie. Napríklad pri vykresľovaní šachovnice musíš pre každý riadok prejsť cez každý stĺpec. Na to slúžia vnorené cykly.
Ako funguje vnorený cyklus?
Vonkajší cyklus sa vykoná raz a počas tohto jedného opakovania sa vnútorný cyklus vykoná celý — od začiatku do konca. Potom vonkajší cyklus postúpi na ďalšie opakovanie a vnútorný cyklus začne odznova.
for riadok in range(3): # vonkajší cyklus — 3 opakovania
for stlpec in range(4): # vnútorný cyklus — 4 opakovania
print(f"({riadok},{stlpec})", end=" ")
print() # nový riadok po každom riadku
Výstup:
(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)
Celkový počet vykonání tela vnútorného cyklu je súčin počtov opakovaní oboch cyklov. Tu: 3 × 4 = 12.
Príklad — násobilka
for i in range(1, 6):
for j in range(1, 6):
vysledok = i * j
print(f"{vysledok:3}", end="") # :3 zarovná číslo na 3 znaky
print()
Výstup (časť násobilky 1–5):
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
Príklad — vzor hviezdičiek
pocet_riadkov = 5
for riadok in range(1, pocet_riadkov + 1):
for hviezda in range(riadok):
print("*", end="")
print()
Výstup:
*
**
***
****
*****
Pri vnorených cykloch pomenúvaj premenné zmysluplne (napr. riadok, stlpec namiesto i, j), keď to zodpovedá kontextu. Kód bude čitateľnejší.
Práca s dvojrozmerným zoznamom
Vnorené cykly sú prirodzené pri práci s tabuľkami (zoznamy zoznamov):
tabulka = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
for riadok in tabulka:
for bunka in riadok:
print(bunka, end=" ")
print()
Výstup:
1 2 3
4 5 6
7 8 9
Výkon vnorených cyklov
Vnorené cykly môžu byť pomalé pri veľkých dátach. Ak vonkajší cyklus beží N-krát a vnútorný tiež N-krát, celkový počet operácií je N². Pre N = 1 000 to znamená 1 000 000 operácií.
Vnorené cykly s veľkým počtom opakovaní môžu spomaliť program. Vždy sa zamysli, či je vnorenie skutočne potrebné alebo či existuje efektívnejší spôsob riešenia.
Prerušenie vnorených cyklov
break ukončí len najbližší cyklus, nie všetky:
for i in range(3):
for j in range(3):
if j == 1:
break # ukončí len vnútorný cyklus
print(f"({i},{j})")
# Vypíše: (0,0) (1,0) (2,0)
Cvičné príklady
Koľkokrát sa vypíše slovo 'ahoj' pri tomto kóde? for a in range(4): for b in range(3): print('ahoj')
Zobraziť odpoveď
Napíš vnorený cyklus, ktorý vypíše všetky dvojice (x, y) kde x je z rozsahu 1–3 a y z rozsahu 1–2.