Tento cyklus sa na rozdieľ od cyklu FOR opakuje v vázislosti od nejakej podmienky. Kým je podmienka splnená, vykonáva sa. (V cykle FOR sme vždy vopred špecifikovali koľkokrát sa cyklus zopakuje, prípadne aké hodnoty bude nadobúdať iteračná premenná, tu iteračná premenná neexistuje.)
while x < 5:
print("hello")
Všimnite si podobnosť s konštrukciou IF. Cyklus definujeme použitím kľúčového slova while, za ktorým špecifikujeme podmienku nasledovanú dvojbodkou. Podmienka je v úplne rovnakom formáte ako v podmienenom príkaze IF a tiež sa rovnako vyhodnocuje. V podmienke používame čísla, text, premenné, a hlavne logické operátory <, >, <=, >=, ==, !=, ale aj logické spojky or a and, ktoré fungujú ako disjunkcia a konjunkcia výrokov ktoré dôverne poznáte z matematiky :).
Ak sa v kóde nachádza cyklus WHILE, Python spraví nasledovné:
Čo sa dá napísať s použitím cyklu FOR, dá sa prepísať bez FOR, iba s WHILE.
Napríklad vypísanie čísel od 1 po 20 a ich druhých mocnín môžeme zapísať nasledovne:
for i in range(1, 21):
print(i, "na druhu je", i*i)
Ten istý program s použitím WHILE:
i = 1
while i < 21:
print(i, "na druhu je", i*i)
i = i + 1
Pozor! V cykle while sme museli definovať podmienku - chceme len čísla menšie ako 20. Premennú reprezentujúcu mocnené číslo sme museli najprv pred cyklom nastaviť (i = 1) a potom vnútri cyklu zvyšovať tak, aby postupne nadobúdala hodnoty vždy o 1 vačšie ako v predošlej iterácii (i = i + 1). Túto réžiu za nás v cykle FOR robil sám cyklus a príkaz range().
V ukážke vyššie (s mocninami čísel) sa zdá, že nám while len komplikuje prácu - to, čo za nás robil FOR a range() musíme teraz robiť pracne sami. Nie vždy sa nám hodí práve cyklus WHILE a v ukážke hore je vážne jednoduchšie a prehľadnejšie použiť FOR. Skutočná krása cyklu WHILE je v tom, že v kóde nemusíme definovať presný počet jeho vykonaní (iterácií), čo nám umožňuje lepšie reagovať na meniace sa hodnoty (napríklad vstup od používateľa).
Napríklad
Aj taký sa môže hodiť a viac o ňom si povieme nabudúce, do vtedy naň však pozor! :P Ak podmienku v cykle WHILE nastavíme na stále platnú (niečo čo vždy platí matematici označujú tiež ako "tautológia"), tak sa cyklus nikdy nezastaví. Príklady tautológií: 3 < 5; 0 == 0; "Janko" != "Hrasko"; atd. V Pythone môžete tiež použiť konštantu pravdivostnej hodnoty True alebo False
i = 0
while i < 10:
i -= 1
Ak nekonečný cyklus spustíte, môžete vykonávanie programu zastaviť stlačením Ctrl + C
Pozor! V tejto ukážke sa vo veľkej miere vyskytuje matematika, ak vám z nej býva nevoľno, radšej si pozrite druhú ukážku...
Načítame číslo a chceme vypísať jeho odmocninu. Postupne mocníme čísla 1, 2, 3... a zisťujeme či sme náhodou neprekrečoli načítané číslo.
cislo = int(input('zadaj číslo:'))
x = 0
while x**2 < cislo:
x += 1
print('odmocnina z', cislo, 'je', x)
Toto riešenie nie je idálne, pre mocniny celých čísel síce funguje, ale pre 26 napríklad vypíše ako odpoveď 6. Vylepšením by mohlo byť použitie desatinných čísel a postupné zvyšovanie x o napríklad jednu tisícinu. Ak chceme povoliť desatinné číslo aj ako vstup, namiesto funkcie int() musíme použiť float().
cislo = float(input('zadaj číslo:'))
x = 0
while x**2 < cislo:
x += 0.001
print('odmocnina', cislo, 'je', x)
Na odmocnenie máme v Pythone samozrejme funkciu a nerobíme zakaždým takýto while, vypočíta ju math.sqrt(cislo) alebo aj mocnenie správnym číslom (viete z matematiky :)
Pre fajnšmekrov: Tento spôsob hľadania odmocniny je stále ďaleko od ideálneho. Predstavte si, že by mal Python takto hľadať odmocninu z čísla 1 000 000, pričom musí postupne zvyšovať hodnotu v x o 0.001. Koľkokrát musí zvýšiť x a koľkokrát vyhodnotiť podmienku? Skúste vyhľadávanie prepísať s použitím myšlienky binárneho vyhľadávania.
Tento program je špeciálne vytvorený pre bačov, ktorí večer počítajú ovečky, či sa všetky vrátili s celodennej vychádzky. Bača pred tým, ako otvorí košiar, aby doň vpustil 🐑🐑🐑, spustí aj tento kód. Program postupne načítava povely od baču - tie môžu byť dva, bača buď napíše "ovecka" (keď chce zaznamenať, že do košiara sa úspešne vrátila ďalšia ovečka) alebo napíše "koniec" (vtedy program končí a vypiše, koľko ovečiek sa vrátilo). Ostatné povely program ignoruje.
pocitadlo_oveciek = 0 # na začiatku je 0 ovečiek
povel = input("čo hovoríš, bača?") # bačove povely sú text
while povel != "koniec": # ak sme nenačítali slovo 'koniec', skúsime spracovať povel
if povel == 'ovecka': # povel 'ovecka' zvýši počítadlo ovečiek
pocitadlo_oveciek += 1
else: # iné povely ako "ovecka" ignorujeme
print("bača, neblázni, príkazy sú len ovecka a koniec")
povel = input("čo hovoríš, bača?") # vypýtame si ďalší povel
# na to, aby sa vykonávanie programu dostalo až sem, musel skončiť WHILE
# teda sa musela porušiť podmienka a teda bača zadal 'koniec'
# vypíšme teda informáciu o stave ovečiek
print(f"V košiari je {pocitadlo_oveciek} ovečiek.")
Niekedy môže byť praktickejšie pracovať s "naoko" nekonečným cyklom. Takémuto cyklu dáme podmienku, ktorá je stále splnená a zastavíme ho pomocou príkazu break.
Napríklad takýto cyklus by vypísal čísla od 0 po 10:
x = 0
while True:
print(x)
x = x + 1
if x > 10:
break
Viac o cykloch a špeciálnych slovíčkach break a continue sa dá dočítať na teclado.com. Actually, na tejto stránke je rozumne vyzerajúci 30 dňový tutorial Pythonu, ktorý pekne rozširuje znalosti, ktoré by ste mali mať z našich hodín, odporúčam sa doň pozrieť.