Python / 3. časť: Tok programu

0

Podmienené vykonávanie

Interpreter Pythonu vykonáva kód programu krok za krokom, resp. riadok za riadkom. Hovoríme pritom o tzv. toku vykonávania (flow of execution) programu, ktorý sa dá zmeniť niekoľkými možnými spôsobmi. Všetky sú založené na tzv. podmienenom vykonávaní (conditional execution). Pomocou podmienok dokážeme riadiť vykonávanie programu, resp. meniť jeho tok nami požadovaným smerom.

Jedna zo základných možností aplikácie podmieneného vykonávania je využitie premenných typu bool (True, False) a tzv. Boolean výrazov. Ich výsledkom sú údaje typu bool, ktoré možno vyhodnotiť v rámci zadanej podmienky. Využívame pri tom tzv. operátory porovnania (comparison operators), resp. logické operátory (logical operators), ktoré produkujú nasledujúce výsledky:

Porovnanie

True, ak

x == y

x sa rovná y

x != y

x sa nerovná y

x < y, x <= y

x je menšie ako y, x je menšie alebo rovné ako y

x > y, x >= y

x je väčšie ako y, x je väčšie alebo rovné ako y

x > 0 and x < 10

x je väčšie ako 0 a zároveň menšie ako 10

x < 0 or x > 10

x je menšie ako 0 alebo väčšie ako 10

not (x < y)

negácia, teda True, ak x je väčšie ako y

Python pri vyhodnocovaní podmienok využíva pravidlo tzv. skráteného vyhodnocovania (short-circuit evaluation), pri ktorom nevykonáva časti kódu, ktoré nemusí. Napríklad ak je ľavý výraz operátora and vyhodnotený ako False, výraz nachádzajúci sa jeho pravej strane sa už nevykoná.

Podmienka

Programovací jazyk Python rovnako ako mnoho iných jazykov pozná najrozšírenejší výkonný výraz pre podmienené vykonávanie, ktorého syntax je nasledujúca:

if podmienka1 (Boolean expression):

    kód1 (body)

elif podmienka2:

    kód2

else:

    kód3

Kód, ktorý je v tele (body) podmienky if, musíme odsadiť najlepšie s použitím štyroch medzier. Nazývame ho telom, resp. súpravou (suite) či blokom (block) a je ukončený prvým neodsadeným riadkom. V prípade, že nepotrebujeme naplniť niektorý z blokov výrazmi, môžeme ho nahradiť kľúčovým slovom pass. Podobne ak nepotrebujeme využiť časti definované klauzulami elif a else, môžeme ich celé vynechať.

Pri tzv. zreťazenej podmienke (chained conditional) môžeme opakovať klauzulu elif toľkokrát, koľkokrát to potrebujeme, ale záverečná klauzula else môže byť použitá iba raz. Podmienky môžeme vnárať jednu do druhej (nested conditional), takéto podmienené vykonávanie sa však často stáva neprehľadným a môže byť príčinou sémantických chýb. Najčastejší sporný prípad je, ak vnorená podmienka neguje výsledok nadradenej podmienky.

Aplikáciu podmienok môžeme vidieť na príklade č. 1, v rámci ktorého je použitý úplný tvar výrazu if s klauzulami elif aj else:

import math

prah = 0.001

print("Výpočet druhej odmocniny kladného čísla")

cislo = float(input("Zadaj kladné číslo: "))

if (cislo > 0.0):

    priblizne = cislo/2.0

    while True:

        lepsie = (priblizne+cislo/priblizne)/2.0

        if abs(priblizne-lepsie) < prah:

            print("Odmocnina čísla",cislo,"je")

            print("a) pomocou Newtonovej metódy:",lepsie)

            print("b) pomocou funkcie math.sqrt():",math.sqrt(cislo))

            break

        priblizne = lepsie

elif (cislo == 0.0):

    print("Odmocnina čísla",cislo,"je")

    print("a) pomocou Newtonovej metódy:",0.0)

    print("b) pomocou funkcie math.sqrt():",math.sqrt(cislo))

else:

    print("Zadal si záporné číslo")

Opakovanie (iteration)

Opakovanie kódu v tzv. cykloch (loops) je jeden zo základných stavebných prvkov programu. Ide o vykonanie stanovenej činnosti toľkokrát, koľkokrát je to potrebné.

Konečné (definite) cykly

for premenná (loop variable) in rozsah (loop range)

    kód1 (loop body)

else:

    kód2

Cyklus for vykoná svoje telo toľkokrát, koľkokrát je splnená tzv. podmienka opakovania (terminating condition). Dochádza pritom k aktualizácii použitej premennej cyklu. Tá sa aktualizuje v rámci stanoveného rozsahu, pričom hovoríme o tzv. prechode (traverse) zadaným rozsahom. V prípade nesplnenia podmienky opakovania program pokračuje za cyklom for. Špeciálny prípad else sa vykoná vtedy, ak sa celý cyklus for vykoná bez aplikácie výrazu break.

Pri používaní cyklu for možno premennú cyklu nahradiť symbolom ‘_‘ a rozsah funkciou range(), ktorej argumentom je počet opakovaní a ktorá generuje sekvenciu celých čísel.

Nekonečné (indefinite) cykly

while podmienka (Boolean expression):

    kód1 (loop body)

else:

    kód2

V prípade cyklu while sa opakovaný kód vykonáva dovtedy, pokiaľ je podmienka vyhodnotená ako True. Na realizáciu cyklov, pri ktorých vopred poznáme počet opakovaní, je vhodnejšie použiť výraz for. Naopak, v prípade cyklov, pri ktorých je podmienka závislá od vnútorného stavu opakovaného kódu, je vhodnejšie použiť výraz while. Ten je okrem iného často spájaný s tzv. počítadlami (counters), pri ktorých dochádza k inkrementácii vnútorného stavu. Špeciálny prípad else sa aplikuje rovnako ako v prípade podmienky if, teda kód2 sa vykoná vtedy, ak nebude splnená podmienka opakovania.

Predčasné ukončenie cyklov

Cykly for a while sú tzv. vopred testované (pre-tested) cykly, ktorých telo sa vykoná v prípade splnenia podmienky, resp. testu vykonávaného ešte pred vykonaním tela cyklu. V prípade, ak chceme cyklus z určitého dôvodu prerušiť aj počas vykonávania tela, využívame na to výkonné výrazy break a continue:

break

okamžite ukončí vykonávanie cyklu a pokračuje za ním

continue

ukončí vykonávanie aktuálnej iterácie (kroku) cyklu a pokračuje na nasledujúcej iterácii (na nasledujúcom kroku)

Cykly rovnako ako podmienky môžeme vnárať jeden do druhého (nested loops).

V rámci príkladu č. 2 využívame cyklus for na výpis čísel vo vybratých číselných sústavách:

from prettytable import PrettyTable

tab = PrettyTable()

tab.field_names = ["Desiatková","Dvojková","Šesťnástková"]

print("Prvých 32 celých čísel zapísaných v číselnej sústave:")

for i in range(32):

    tab.add_row([i,bin(i),hex(i)])

print(tab)

 

Zobrazit Galériu

Marek Sopko

Všetky autorove články

Pridať komentár