5. diel - Načítanie hodnôt z konzoly a parsovanie v Pythone
V predchádzajúcej lekcii, Premenné a typový systém v Pythone, sme si ukázali základné dátové typy, prácu s premennou a napísali sme si jednoduchý program.
V dnešnom Python tutoriáli sa pozrieme na parsovanie hodnôt z konzoly. Výsledkom bude niekoľko jednoduchých programov vrátane kalkulačky.
Program Parrot
Skúsme do programu zapojiť používateľa a nejako reagovať na jeho vstup.
Napíšeme program Parrot, ktorý bude dvakrát opakovať to, čo
používateľ napísal.
Načítanie textu z konzoly
Zatiaľ sme neskúšali z konzoly niečo načítať. Slúži na to funkcia
input(), ktorá používateľovi umožní zadať do konzoly riadok
textu a nám vráti zadaný textový reťazec. Aby sme mohli z konzoly
načítať, vytvoríme si nový projekt s názvom Parrot a jeho
kód upravíme tak, aby vyzeral takto:
print("Hi I'm Lora, the virtual parrot, and I love to repeat!")
print("Type something in: ")
text = input()
result = text + ", " + text + "!"
print(result)
To už je trochu zábavnejšie 🙂 Prvé dva riadky sú jasné (vypisujú
text). V ďalšom vytvoríme premennú text. Do premennej
text sa priradí hodnota z funkcie input() získaná
na konzole, teda to, čo používateľ zadal. Pre výstup si pre názornosť
vytvoríme ďalšiu premennú result.
Spájanie reťazcov
Zaujímavé je, ako sme do premennej result priradili hodnotu.
Využili sme na to tzv. konkatenáciu (spájanie) reťazcov.
Pomocou operátora + totiž môžeme spojiť niekoľko textových
reťazcov do jedného. Je jedno, či je reťazec v premennej, alebo či je
explicitne zadaný v úvodzovkách v zdrojovom kóde. Do premennej
result sme teda priradili obsah premennej text, ďalej
čiarku s medzerou, znovu text a potom výkričník. Nakoniec sme
premennú vypísali do konzoly a tým program skončil. Pozrime sa na jeho
výstup v konzole:
Parrot program:
Hi I'm Lora, the virtual parrot, and I love to repeat!
Type something in:
Hello parrot
Hello parrot, Hello parrot!
Program Doubler
Zdvojnásobovač si vyžiada na vstupe číslo, ktoré zdvojnásobí a vypíše. S doterajšími znalosťami by sme asi napísali niečo také:
print("Enter a number and I'll double it:")
a = input() # Let's try enter the number 12
a = a * 2
print(a)
V predchádzajúcej ukážke sme použili mriežku
#. Tá sa na slovenskej klávesnici píše pomocou
Pravého Alt a klávesu X:

V konzole vidíme:
Doubler program:
1212
Zdvojnásobenie čísla a sme vykonali pomocou priradenia.
Pokiaľ skúsime program spustiť, v konzole sa nám vypíše dvakrát nami
zadané číslo! Narážame na fakt, že funkcia input() nám
vracia textový reťazec. Pokiaľ sa pokúsime sčítať dva
reťazce, jednoducho sa oba reťazce spoja (ako keď sa spájajú slamky).
Všetko, čo príde z textovej konzoly, je vždy text. A to aj keď
zadáme číslo. Aby sme získali skutočne číslo, budeme ho musieť
tzv. naparsovať.
Parsovanie
Parsovaním sa myslí prevod z textovej podoby na nejaký špecifický typ,
napr. číslo. Pokiaľ budeme chcieť naparsovať napr. int z typu
str, budeme postupovať takto:
s = "56" a = int(s)
Funkcia int() berie ako parameter textový reťazec a pokúsi sa
ho previesť na číslo. Využime to v našom programe:
print("Enter a number and I'll double it:")
s = input() # Let's stick with our number 12
a = int(s)
a = a * 2
print(a)
Najprv si text z konzoly uložíme do textového reťazca s. Do
premennej a potom uložíme číselnú hodnotu reťazca
s. Ďalej hodnotu v a zdvojnásobíme a vypíšeme do
konzoly:
Doubler program:
Enter a number and I'll double it:
12
24
Parsovanie sa samozrejme nemusí podariť, ak bude v texte namiesto čísla napr. slovo, ale tento prípad zatiaľ nebudeme ošetrovať.
Jednoduchá kalkulačka
Ešte sme nepracovali s desatinnými číslami. Skúsme si teda napísať sľubovanú kalkulačku.
V nasledujúcej ukážke použijeme zložené zátvorky. Zložené zátvorky (ľavú a pravú) píšeme na slovenskej klávesnici pomocou Pravého Alt a klávesu B pre ľavú, resp. N pre pravú:

Kalkulačka bude veľmi jednoduchá. Na vstup prídu dve čísla a program potom vypíše výsledok pre sčítanie:
print("Welcome to calculator")
print("Enter first number:") # Let's try pi: 3.14
a = float(input())
print("Enter second number:") # Let's try e: 2.72
b = float(input())
total = a + b
print(f"Addition: {total}")
print("Thank you for using calculator!")
A takto vyzerá výstup programu v konzole:
Simple calculator:
Welcome to calculator
Enter first number:
3.14
Enter second number:
2.72
Addition: 5.86
Thank you for using calculator!
Použitie f-stringu
Pre jednoduchší výpis do konzoly tu používame formátovaný výpis pomocou interpolácie (alebo tiež f-string) v tvare:
print(f"text {variable}")
Táto šikovná utilita je v Pythone dostupná od verzie 3.6. V opačnom
prípade by sme museli použiť pretypovanie na reťazec pomocou
str(variable), čo je menej pohodlné
Celý riadok by totiž vyzeral
takto:
print("text" + str(variable))
Práve sme sa naučili opak parsovania a teraz teda v Pythone vieme previesť čokoľvek do textovej podoby.
Naša kalkulačka však stále nevie zvyšné početné operácie. Poďme na ich implementáciu použiť Copilota v režime Agent. Zadáme mu prompt: "Rozšír kalkulačku o operácie odčítania, násobenia a delenia." Copilot nám následne navrhne rozšírenie programu:

Poďme si teraz vyskúšať všetky operácie kalkulačky:
print("Welcome to calculator")
print("Enter first number:")
a = float(input())
print("Enter second number:")
b = float(input())
print(f"Addition: {a + b}")
print(f"Subtraction: {a - b}")
print(f"Multiplication: {a * b}")
if b != 0:
print(f"Division: {a / b}")
else:
print("Division: Cannot divide by zero")
print("Thank you for using calculator!")
A takto vyzerá výstup programu v konzole:
Simple calculator:
Welcome to calculator
Enter first number:
3.14
Enter second number:
2.72
Addition: 5.86
Subtraction: 0.41999999999999993
Multiplication: 8.5408
Division: 1.15441176470588
Thank you for using calculator!
Desatinné čísla v Pythone
Rozdiel čísel 3.14 a 2.72 vychádza v našej
kalkulačke zvláštne. Očakávaný výsledok 0.42 sa nedostavil
preto, že presnosť čísel s plávajúcou desatinnou bodkou je obmedzená a
nemusí presne predstavovať reálne číslo, ktoré chceme
reprezentovať. To môže viesť (a často vedie) k drobným chybám pri
zaokrúhľovaní, ako je tá, ktorú vidíme v rozdiele 3.14 a
2.72. Riešenia sú v jadre dve.
Typ Decimal
Prvým riešením je použitie dátového typu Decimal. Tento
typ je určený pre finančné a menové výpočty, kde je presnosť
kľúčová. Je však nutné importovať ho z modulu decimal. Toto síce ešte
nepoznáme, ale ide o jednoduchý proces. Na začiatok programu napíšeme
nasledujúci riadok:
from decimal import Decimal
A na načítanie čísel použijeme Decimal miesto
float:
a = Decimal(input()) b = Decimal(input()) difference = a - b print(f"Difference: {difference}")
V konzole už vidíme očakávaný výstup:
Output using Decimal:
Difference: 0.42
Zaokrúhľovanie pomocou funkcie
round()
Druhým riešením je použiť funkciu round() na zaokrúhlenie
výsledkov na požadovaný počet desatinných miest:
difference = round(a - b, 2) # We want to round to two decimal places, hence the 2 print(f"Difference: {difference}")
V konzole opäť vidíme očakávaný výstup:
Output after rounding:
Difference: 0.42
Ako využitie rôznych modulov, tak aj použitie matematických funkcií sme si tu zatiaľ iba naznačili ako určitú bonusovú znalosť. Podrobne si ich vysvetlíme v ďalších lekciách kurzu.
Zhrnutie lekcie
Hodnoty načítané z konzoly pomocou funkcie input()
prichádzajú do programu vždy ako text. Ak s nimi chceme počítať, musíme
ich najprv previesť na správny dátový typ, napríklad pomocou
int() pre celé čísla alebo float() pre desatinné
čísla. Na jednoduchých príkladoch sme si ukázali načítanie vstupu,
spájanie reťazcov aj pohodlnejšie formátovanie výstupu pomocou
f-stringov. Pri desatinných číslach sme narazili aj na
nepresnosti vznikajúce pri výpočtoch. Na presnejšiu prácu s desatinnými
číslami je možné použiť typ Decimal, prípadne výsledok
zaokrúhliť funkciou round().
V nasledujúcom kvíze, Kvíz - Konzoly a premenné v Pythone, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
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é 153x (4.52 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python
