9. diel - Cyklus for v Pythone

V predchádzajúcom cvičení, Riešené úlohy k 7.-8. lekcii Pythona, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

Teraz prejdeme k cyklom. Po dnešnom Python tutoriále už budeme mať takmer kompletnú výbavu základných konštrukcií a budeme schopní v Pythone programovať rozumné aplikácie.

Cykly

Ako už slovo cyklus napovedá, niečo sa bude opakovať. Keď chceme v programe niečo urobiť stokrát, určite nebudeme stokrát písať pod seba ten istý kód. Namiesto toho ho vložíme do cyklu. Cyklov máme viac druhov. Samozrejme si vysvetlíme, kedy ktorý použiť, a ukážeme si praktické príklady.

Cyklus for

Ak chceme pracovať so všetkými prvkami v sekvencii, použijeme cyklus for. Tento cyklus vždy obsahuje pevný počet opakovaní, ktorý sa rovná počtu prvkov v sekvencii. Syntax (zápis) cyklu for je nasledovná:

for item in sequence:
    # block of commands

Sekvencie v Pythone sú kontajnerové dátové štruktúry, tj sú to premenné, ktoré môžu obsahovať viac položiek. S kontajnerovou štruktúrou (reťazcami) sme sa už stretli.

Funkcia range()

Pre cyklus for máme k dispozícii funkciu range(). Funkcia nám vracia vygenerované čísla, napríklad vo forme rozsahu (intervalu).

Funkcia má tri parametre, jej syntax je range(start, end, step):

  • Parameter start určuje, na ktorom indexe sa začína. Predvolená hodnota je 0. Ide o nepovinný parameter.
  • Parameter end určuje, na ktorom indexe sa končí. Pozor, tento index už však zahrnutý nie je. V dokumentácii sa popisuje ako n-1 a jedná sa o povinný parameter.
  • Parameter step špecifikuje spôsob inkrementácie (môžeme zvyšovať ľubovoľne: po dvoch, po desiatich…). Predvolená hodnota je 1 a jedná sa o nepovinný parameter.

Funkciu range() teda môžeme mať s jedným až troma parametrami:

  • range(n) – Vráti čísla od nuly do n-1 (do n, ktoré už zahrnuté nie je).
  • range(m, n) – Vráti čísla od m do n-1.
  • range(m, n, i) – Vráti čísla od m a každé ďalšie i-té číslo do n-1.

Príklady použitia cyklu for

Poďme si urobiť niekoľko jednoduchých príkladov na precvičenie for cyklu.

Klepanie na dvere

Väčšina z nás určite pozná Sheldona z The Big Bang Theory. Pre tých, ktorí ho nepoznajú, budeme simulovať situáciu, keď Sheldon klope na dvere svojej susedky. Vždy trikrát zaklope a potom zavolá: "Penny!". Náš kód by bez cyklov vyzeral takto:

Klikni pre editáciu
  • print("Knock")
    print("Knock")
    print("Knock")
    print("Penny!")
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    My už ale nič otrocky opisovať nemusíme:

    Klikni pre editáciu
    • for i in range(3):
          print("Knock")
      print("Penny!")
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      Výstup programu:

      Output of the for loop:
      Knock
      Knock
      Knock
      Penny!

      Cyklus prebehne trikrát vďaka parametru 3 vo funkcii range(). Teraz môžeme skúsiť napísať do parametra funkcie range() v cykle namiesto trojky jedenástku. Príkaz sa spustí jedenásťkrát bez toho, aby sme napísali niečo navyše. Vidíme, že cykly sú mocným nástrojom.

      Rad

      Vypíšme si teraz čísla od jednej do desať a za každým medzeru:

      Klikni pre editáciu
      • for i in range(1, 11):
            print(i, end = ' ')
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        Vidíme, že premenná má naozaj v každej iterácii (priebehu) inú hodnotu:

        Loop output:
        1 2 3 4 5 6 7 8 9 10

        Parameter end=' ' zaistí, že program po vypísaní každého čísla nevloží nový riadok, ale namiesto toho medzeru.

        Nepárne čísla

        Pomocou funkcie range() môžeme tiež určiť hranice intervalu, ktorý chceme iterovať, a to vrátane kroku:

        Klikni pre editáciu
        • for i in range(1, 11, 2):
              print(i, end = ' ')
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          Kód iteruje cez čísla v rozmedzí od 1 do 10 (vrátane 1 a vylúčene 11) s krokom 2. Bude teda vypisovať nepárne čísla:

          Loop output:
          1 3 5 7 9
          Sekvencia znakov

          Už sme si povedali, že cyklus for prejde všetky prvky v sekvencii. Iterovateľná sekvencia je aj reťazec a prvok je potom jednotlivý znak v reťazci. V každej iterácii sa aktuálny prvok sekvencie skopíruje do premennej item a vykonajú sa príkazy v cykle. Vyskúšajme si to na reťazcovej sekvencii, kedy si každý znak vypíšeme na jednotlivý riadok:

          Klikni pre editáciu
          • word = "hello"
            for character in word:
               print(character)
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            Výstupom je:

            Loop output:
            h
            e
            l
            l
            o
            Malá násobilka

            Teraz si vypíšeme malú násobilku (násobky čísel 1 až 10, vždy do desiatich). Aby sme zadanie splnili, napíšeme si cyklus, ktorý prejde čísla od 1 do 10 a premennú vždy vynásobí daným číslom. Kód by mohol vyzerať asi takto:

            Klikni pre editáciu
            • for i in range(1, 11):
                  print(i, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 2, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 3, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 4, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 5, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 6, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 7, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 8, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 9, end = " ")
              print()
              for i in range(1, 11):
                  print(i * 10, end = " ")
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              Výstup v konzole:

              Loops output:
              1 2 3 4 5 6 7 8 9 10
              2 4 6 8 10 12 14 16 18 20
              3 6 9 12 15 18 21 24 27 30
              4 8 12 16 20 24 28 32 36 40
              5 10 15 20 25 30 35 40 45 50
              6 12 18 24 30 36 42 48 54 60
              7 14 21 28 35 42 49 56 63 70
              8 16 24 32 40 48 56 64 72 80
              9 18 27 36 45 54 63 72 81 90
              10 20 30 40 50 60 70 80 90 100

              Za pozornosť stojí prázdna funkcia print(), ktorá tu plní funkciu odriadkovania na konci každého riadku. Program funguje pekne, ale stále sme toho museli dosť napísať. Pokiaľ vás napadlo, že v podstate robíme desaťkrát to isté a iba zvyšujeme číslo, ktorým násobíme, máte pravdu. Nič nám nebráni v tom, aby sme vložili dva cykly do seba:

              Klikni pre editáciu
              • print("Multiplication with nested loops:")
                for j in range(1, 11):
                    for i in range(1, 11):
                        print(i * j, end = " ")
                    print()
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                Pomerne zásadný rozdiel, že? Pochopiteľne nemôžeme použiť u oboch cyklov premennú i, pretože sú vložené do seba. Premenná j nadobúda vo vonkajšom cykle hodnoty 110. V každej iterácii (rozumajme priebehu) cyklu je potom spustený ďalší cyklus s premennou i. Tento cyklus je nám už známy, vypíše násobky, v tomto prípade násobíme premennú j. Po každom behu vnútorného cyklu potom dôjde ešte k odriadkovaniu zavolaním prázdnej funkcie print().

                Mocnina čísla

                Urobme si ešte jeden program, na ktorom si ukážeme prácu s vonkajšou premennou. Aplikácia bude vedieť spočítať ľubovoľnú mocninu ľubovoľného čísla:

                Klikni pre editáciu
                • print("Exponent calculator")
                  print("==========")
                  a = int(input("Enter the base: "))
                  n = int(input("Enter the exponent: "))
                  result = a
                  for i in range(n - 1):
                      result = result * a
                  
                  print(f"Result: {result}")
                  print("Thank you for using our exponent calculator")
                  • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                  Výstup programu:

                  Konzolová aplikácia
                  Exponent calculator
                  ==========
                  Enter the base:
                  2
                  Enter the exponent:
                  3
                  Result: 8
                  Thank you for using our exponent calculator

                  Asi všetci tušíme, ako funguje mocnina. Pre istotu pripomenieme, že napríklad 23 = 2 * 2 * 2. Mocninu an teda spočítame tak, že n-1 krát vynásobíme číslo a číslom a. Výsledok si samozrejme musíme ukladať do premennej. Spočiatku bude mať hodnotu premennej a a postupne sa bude v cykle prenásobovať. Pokiaľ k mocninám potrebujete viac informácií, máme tu samozrejme lekciu s algoritmom výpočtu ľubovoľnej mocniny.

                  Teraz už teda vieme, na čo sa for cyklus využíva. Zapamätajme si, že počet opakovaní je pevne daný.

                  V budúcej lekcii, Cyklus while v Pythone, sa ešte budeme venovať cyklom. Naučíme sa používať while cyklus a vylepšíme našu kalkulačku.


                   

                  Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

                  Stiahnuť

                  Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

                  Stiahnuté 1x (1.55 kB)
                  Aplikácia je vrátane zdrojových kódov v jazyku Python

                   

                  Ako sa ti páči článok?
                  Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
                  Predchádzajúci článok
                  Riešené úlohy k 7.-8. lekcii Pythona
                  Všetky články v sekcii
                  Základné konštrukcie jazyka Python
                  Preskočiť článok
                  (neodporúčame)
                  Cyklus while v Pythone
                  Článok pre vás napísal Vašek Doškář
                  Avatar
                  Užívateľské hodnotenie:
                  21 hlasov
                  Autor pracuje jako pedagog v oblasti elektroniky, elektrotechniky a programování. Rád tvoří appky všeho druhu. Má přehled v jazycích C#, Java, Kotlin, Javascript, Python a Rust
                  Aktivity