3. Prvý program, výpisy, výpočty

Zopakujme si:

  • s Pythonom pracujeme v interaktívnom režime

  • premenné vytvárame pomocou priraďovacích príkazov

  • vieme pracovať s číslami a výrazmi, ktoré používajú základné operácie +, -, *, / a okrúhle zátvorky

V tejto téme sa naučíme ukladať naše výpočty, presnejšie postupy do textových súborov.

Výpočet ukladáme do súboru

Zatiaľ sme s Pythonom pracovali v interaktívnom režime: za symboly >>> sme zapísali buď nejaký výpočet alebo priraďovací príkaz a Python to okamžite vyhodnotil a znovu vypísal výzvu >>>. Tým nám dal najavo, že čaká ďalšie príkazy.

Častejšie ale budeme zostavovať príkazy, ktoré sa majú postupne vykonať, do textového súboru a až potom ich necháme vykonať. Takýmto textovým súborom budeme hovoriť programy. V Pythone sa im niekedy hovorí aj skripty. Takéto programy môžeme zostavovať skoro v ľubovoľnom textovom editore, ale pohodlnejšie to bude priamo v Pythonovskom editore, ktorý je súčasťou IDLE.

Textový editor na prípravu a opravovanie pythonovských programov otvoríme pomocou klávesovej skratky <Ctrl+N> (alebo pomocou voľby New File v menu File). Otvorí sa prázdne textové okno, do ktorého budeme zapisovať samotný program. Napr. môžeme sem zapísať:

# moj prvy program

strana_stvorca = 55
obvod = 4 * strana_stvorca
obsah = strana_stvorca * strana_stvorca

Tento program okrem troch známych príkazov priradenia obsahuje aj špeciálny riadok, ktorý začína znakom # (krížik). Znak # má pre Python špeciálnu funkciu: zvyšok riadku za týmto znakom sa bude Pythonom ignorovať (Pythonu je jedno, čo je tu zapísané). Tomuto hovoríme komentár a asi je to zaujímavejšia informácia pre nás čitateľov ako pre počítač. My budem vkladať komentáre do programu preto, aby sme takto buď niečo vysvetlili čitateľovi alebo pripomenuli.

V textovom editore sme teraz pripravili náš prvý niekoľkoriadkový program, ktorý slúži na to, aby ho Python vyhodnotil, teda vykonal jeho všetky príkazy. Procesu vyhodnocovania, resp. vykonávania sa hovorí spustenie programu (po anglicky Run). Lenže, aby sa dal program spustiť, musí byť uložený v textovom súbore (teraz sa nachádza len v okne textového editora). Ukladanie do súboru sa robí podobne ako v iných aplikáciach, teda pomocou klávesovej skratky <Ctrl+S> (alebo výberom voľby Save v menu File). Po uložení programu do súboru (nazvime ho napr. prvy, tento dostáva príponu .py) ho môžeme konečne spustiť. Slúži na to klávesová skratka <F5> (alebo voľba Run Module v menu Run).

Všimnite si, čo sa stalo po spustení programu:

  1. Python sa prepol späť do interaktívneho okna (tzv. Shell)

  1. Vypísal sa riadok:

    ======================= RESTART =======================
    

    Toto označuje, že Python sa pripravil na spustenie nášho programu tým, že zrušil všetky naše doterajšie výpočty, teda všetky naše premenné.

  1. Spustil náš program: postupne vykonal riadok za riadkom (teda naše tri priradenia)

  1. Po skončení vykonania všetkých príkazov Python vypíše známe tri znaky >>>, ktorými dáva najavo, že môžeme pokračovať v interaktívnom zadávaní príkazov.

Keďže náš program nevypisoval žiadne hodnoty - robil len priradenia nejakých hodnôt do premenných, jediný spôsob, ako sa presvedčíme, že naozaj niečo počítal, je zistenie hodnôt premenných, do ktorých sa niečo priradilo:

>>> strana_stvorca
55
>>> obvod
220
>>> obsah
3025

Naozaj teraz vidíme, že náš program s výpočtom obvodu a obsahu štvorca s danou veľkosťou strany 55 prebehol a aj správne vypočítal zadané vzorce. V pamäti to teraz vyzerá nejako takto:

_images/03_01.png

Keď potrebujeme v interaktívnom režime zistiť obsah nejakej premennej, prípadne zistiť hodnotu nejakého výpočtu, tak zapisujeme:

>>> obvod
220
>>> obsah + 75
3100

A hneď sa dozvedáme výsledok, totiž shell po zadaní výrazu, ho automaticky vyhodnotí a vypíše jeho hodnotu. Žiaľ, takýto mechanizmus pre spúšťanie programov nefunguje. Ak by sme opravili náš program:

# moj prvy program

strana_stvorca = 55
obvod = 4 * strana_stvorca
obvod
obsah = strana_stvorca * strana_stvorca
obsah + 75

Teda po výpočte hodnôt premenných obsah a obvod by sme ich chceli vypísať podobne, ako sme to robili v interaktívnom režime. Lenže takto zapísaný program po (uložení a) spustení robí presne to isté, ako predtým: teda nič nevypisuje. Zapamätajme si túto vlastnosť vyhodnocovania pythonovských programov:

  • Python postupne vyhodnocuje program riadok za riadkom

  • ak je príkazom priradenie, vykoná ho, teda priradí vypočítanú hodnotu do zadanej premennej

  • ak riadok programu obsahuje len výpočet bez priradenia, Python tento výpočet vyhodnotí (zistí hodnotu premennej obsah), ale keďže sme túto hodnotu nikam nepriradili, tak ju zahodí

Nám sa to javí tak, že riadky programu, ktoré obsahujú len výrazy bez priradenia, nerobia nič. My už teraz vieme, že takto sa hodnoty z programu vypisovať nedajú. Na toto nám bude slúžiť špeciálny príkaz print.

Výpis hodnôt

Skôr ako použijeme tento príkaz v programe prvy.py, budeme ho testovať v interaktívnom režime. Zapíšme:

>>> print(obvod)
220
>>> print(obsah + 75)
3100

Príkaz vypisuje presne rovnaké výsledky, ako sme dosiahli bez použitia print. Okrem slova print musíme vypisovanú hodnotu (premennej alebo výrazu) uzavrieť do okrúhlych zátvoriek.

Opravme teraz náš prvý program tak, aby po spustení vypísal obvod, obsah a teraz aj zväčšený obsah o 75:

# moj prvy program

strana_stvorca = 55
obvod = 4 * strana_stvorca
print(obvod)
obsah = strana_stvorca * strana_stvorca
print(obsah)
print(obsah + 75)

Program teraz naozaj vypíše tri očakávané čísla:

======================= RESTART =======================
220
3025
3100
>>>

Uvedomte si, že program, ktorý sme uložili do súboru a spustili, Python vykonáva príkaz za príkazom, pritom:

  • komentáre (začínajúce znakom #) ignoruje

  • aritmetické výrazy vyhodnotí a ak sú súčasťou priraďovacieho príkazu, tak túto hodnotu vloží, priradí do premennej

  • výrazy (aj premenné), ktoré sa nachádzajú v príkaze print tiež vyhodnotí a hodnoty vypíše do textového okna Shell

  • výrazy (aj premenné), ktoré nie sú súčasťou priraďovacieho príkazu a nie sú ani súčasťou príkazu print sa tiež vyhodnotia, ale tento výsledok sa zahodí

Vypisovanej hodnote (výraz alebo premenná), ktorú sme uzatvárali do zátvoriek, hovoríme parameter príkazu print. V skutočnosti môže mať tento príkaz viac parametrov a vtedy ich medzi zátvorky oddelíme čiarkami, napr.

>>> print(2, 2+1, 10/2, 2*3+1)
2 3 5.0 7
>>> print(strana_stvorca, obvod, obsah)
55 220 3025

Ako parameter môžeme uviesť aj text uzavretý medzi apostrofy (alebo úvodzovky). Hovoríme mu znakový reťazec. Môžeme zapísať napr.

>>> print('Pozdravujem vas, lesy, hory!')
Pozdravujem vas, lesy, hory!
>>> print('obvod stvorca so stranou', strana_stvorca, 'je', obvod)
obvod stvorca so stranou 55 je 220
>>> print('6 faktorial =', 1*2*3*4*5*6)
6 faktorial = 720

Vďaka takémuto použitiu príkazu print dokážeme vylepšiť náš prvý program:

# moj prvy program

strana_stvorca = 55
print('stvorec so stranou', strana_stvorca)
obvod = 4 * strana_stvorca
print('ma obvod', obvod)
obsah = strana_stvorca * strana_stvorca
print('ma obsah', obsah)

Teraz už bude spustenie nášho programu vypisovať:

stvorec so stranou 55
ma obvod 220
ma obsah 3025

Chyby v programe

Každý, kto programuje, sa stretá aj s chybami. Už ste sa zoznámili so syntaktickými chybami, pri ktorých nás Python upozorňuje na to, že v zápise príkazu nie je niečo v poriadku. Napr.

>>> 19 - (3 4)
SyntaxError: invalid syntax
>>> 2cena = 0
SyntaxError: invalid syntax

V prvom zápise pravdepodobne chýba nejaká operácia v zátvorkách. Možno sme chceli zapísať 19 - (3 + 4). V druhom zápise priraďovacieho príkazu sme zvolili chybné meno premennej: meno premennej nesmie začínať číslicou. Správou SyntaxError nám Python oznamuje, že ďalej sa nedá pokračovať, kým si neopravíme chybu.

Ak máme syntaktickú chybu v programe, ktorý je zapísaný v súbore, takýto program nespustíme (pomocou Run), kým chybu neopravíme.

Už ste videli napr. aj takúto chybovú správu:

>>> vek
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    vek
NameError: name 'vek' is not defined

Tato chyba nemusí označovať, že sme sa pomýlili v zápise. Python nám tu neoznamuje syntaktickú chybu, ale hoci takýto zápis vyhovuje jeho pravidlám zápisu (syntax jazyka), pri snahe o jeho vykonanie sa Pythonu niečo „nepáči“. V tomto prípade je to použitie mena premennej, napriek tomu, že ešte neexistuje, teda, že sme do nej ešte nič nepriradili. Zrejme takúto premennú treba najprv vytvoriť (priradením).

Podobnú chybu dostaneme aj pri:

>>> strana_stvorca = 55
>>> obvod = 4 * strana_stvrca
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    obvod = 4 * strana_stvrca
NameError: name 'strana_stvrca' is not defined

kde asi Python neočakáva, že vytvoríme premennú s menom strana_stvrca, ale opravíme preklep v mene tejto premennej. Chyby, ktoré nie sú syntaktické, ale Python takýto príkaz nevie vykonať, nazývame sémantické chyby. Ak sa sémantická chyba vyskytne v programe, takýto program môžeme spustiť, ale pri vykonávaní chybného príkazu program spadne s chybovou správou. Zrejme môžeme chybu opraviť (ak vieme, čo sa stalo) a program spustiť znovu.

Najnáročnejšia situácia je s tretím typom chýb, sú to tzv. logické chyby. Program, ktorý vyzerá, že je správny, niekedy môže dať nesprávne výsledky. Problémom samozrejme nie je chybné správanie Pythonu, ale skrytá logická chyba. Takéto chyby sa ťažšie odhaľujú a niekedy aj ťažko opravujú. Často si to vyžaduje väčšie programátorské skúsenosti.

Pozrite toto riešenie programu na výpočet obvodu a obsahu štvorca:

# moj vylepseny prvy program

a = 55
print('stvorec so stranou', a)
obvod = 55 + 3 * a
print('ma obvod', obvod)
obsah = obvod + 51 * a
print('ma obsah', obsah)

Úmyselne sme tu použili nejaké magické vzorce, ale po spustení to funguje dobre:

stvorec so stranou 55
ma obvod 220
ma obsah 3025

Lenže, ak v programe zmeníme veľkosť strany štvorca napr. na 45:

# moj vylepseny prvy program

a = 45
print('stvorec so stranou', a)
obvod = 55 + 3 * a
print('ma obvod', obvod)
obsah = obvod + 51 * a
print('ma obsah', obsah)

dostaneme výsledky, ktoré sa niekomu môžu zdať správne:

stvorec so stranou 45
ma obvod 190
ma obsah 2485

Ale výpis dáva úplne zlé hodnoty (obvod mal byť 180 a obsah 2025). Takže si zapamätajte, že ak vám program dá pre nejaké hodnoty správne výsledky, nemusí to znamenať, že správne hodnoty dostaneme aj pre iné vstupné údaje.

Uvedomte si, že chybovými správami sa nám Python snaží pomôcť, aby sme našli chyby v našich programoch a mohli ich čo najlepšie opraviť. Čím budete viac programovať, čím sa budete častejšie stretať s rôznymi chybovými správami, tým rýchlejšie ich budete vedieť odhaľovať a opravovať. Treba si zapamätať, že program, ktorý prejde bez chybovej správy, nemusí znamenať, že je bezchybný. Často budú naše prvé programy obsahovať logické chyby, pri ktorých nám Python nepomôže žiadnou chybovou správou. Hľadať chyby v takýchto programoch a potom ich aj opravovať je veľmi náročný proces, ktorý si bude vyžadovať veľa trpezlivosti a hlavne získavanie programátorských skúseností.

Úlohy

  1. Napíšte program, ktorý vypíše návrh vašej biznisovej vizitky. Výpis môže vyzerať napr.

    +--------------------+
    |             ~~~    |
    |  Juraj    / o o \  |
    |  JÁNOŠÍK  \  ~  /  |
    |             """    |
    |    IT konzultant   |
    +--------------------+
    

  1. Napíšte program, ktorý zo znakov # (krížik) vypíše zväčšený nejaký text, napr.

    ####  #   # ##### #   #  ###  #   #
    #   # #   #   #   #   # #   # ##  #
    ####   ###    #   ##### #   # # # #
    #       #     #   #   # #   # #  ##
    #       #     #   #   #  ###  #   #
    

  1. Napíšte program, ktorý vypočíta a vypíše 2 umocnené na 100. Výsledok vypíšte v tvare:

    2 ** 100 = 126...
    

  1. Napíšte program, ktorý pod seba vypíše hodnoty súčinov 1*1, 11*11, 111*111, 1111*1111, …, 111111111*111111111:

    1
    11
    121
    12321
    ...
    12345678987654321
    

  1. Napíšte program, ktorý vypíše hodnoty faktoriálov čísel od 1 do 10:

    1 faktorial = 1
    2 faktorial = 2
    3 faktorial = 6
    4 faktorial = 24
    5 faktorial = 120
    6 faktorial = 720
    7 faktorial = 5040
    8 faktorial = 40320
    9 faktorial = 362880
    10 faktorial = 3628800
    

    Uvedomte si, že napr. 6 faktoriál vieme vypočítať ako 1*2*3*4*5*6.

  1. Napíšte program, v ktorom je na začiatku v premennej cislo priradená nejaká hodnota. Program vypíše najprv samotné číslo, potom o 1 väčšie číslo (nasledovníka) a na záver o 1 menšie číslo (predchodcu) v tvare, napr.:

    Zadane cislo je 142
    Nasledovnik cisla 142 je 143
    Predchodca cisla 142 je 141
    

  1. Škôlkari Jurko, Marienka a Peťo sa hrajú s guľôčkami. Vieme, že Jurkopocet1 guľôčok, Marienka má od neho o pocet2 guľôčok viac a Peťo má o pocet3 guľôčok viac ako Jurko a Marienka dokopy. Napíšte program, ktorý pre tri premenné pocet1, pocet2 a pocet3 vypíše, koľko gulôčok má každý zo škôlkarov. Ak predpokladáme, že pocet1=7, pocet2=5, pocet3=3, program vypíše:

    Jurko ma 7 gulocok.
    Marienka ma 12 gulocok.
    Peto ma 22 gulocok.
    

  1. Napíšte program, ktorý prepočíta sumu peňazí v českých korunách na euro. V premennej ck máme priradenú túto sumu a predpokladáme, že kurz je 26 korún za 1 euro, potom program vypíše, napr.

    suma 235.5 ck
    bude 9.057692307692308 euro
    

    Neskôr sa naučíme takéto čísla zaokrúhľovať.

  1. Napíšte program, ktorý bude robiť opačný prevod medzi menami ako v príklade (6): v premennej euro máme priradenú nejakú sumu v eurách a program ju vypíše v českých korunách. Napr.

    suma 17.5 euro
    bude 455.0 ck
    

  1. Na účte v banke máme nejakú sumu peňazí (v premennej ucet). Na tomto účte každý rok pribudnú 4%. Vypíšte stav účtu po jednom, dvoch a troch rokoch. Napr.

    na ucte je 150 euro
    po prvok roku 156.0 euro
    po druhom roku 162.24 euro
    po tretom roku 168.7296 euro
    

Zhrnutie

čo sme sa naučili:

  • s Pythonom sa dá pracovať v interaktívnom aj v programovom režime

  • program sa musí nachádzať v textovom súbore a môže obsahovať komentáre, priraďovacie príkazy a príkazy print pre výpis

  • program spúšťame pomocou povelu Run (klávesovou skratkou <F5> alebo cez menu)

  • v programe môžu byť syntaktické, semantické alebo logické chyby

dôležité zásady:

  • vkladajme do programu komentáre, aby sme my a aj iný čitateľ ľahšie pochopili jeho funkčnosť

  • programy zapisujme čo najviac čitateľne, napr. voľbou vhodných mien premenných, medzerami medzi operáciami a tiež za čiarkami v príkaze print