Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 4 - Načítání hodnot z konzole a parsování v Pythonu

V minulé lekci, Proměnné a typový systém v Pythonu, jsme si ukázali základní datové typy, práci s proměnnou a napsali jsme si jednoduchý program.

V dnešním Python tutoriálu se podíváme na parsování hodnot z konzole. Výsledkem bude několik jednoduchých programů včetně kalkulačky.

Program Papoušek

Zkusme do programu zapojit uživatele a nějak reagovat na jeho vstup. Napíšeme program Papoušek, který bude dvakrát opakovat to, co uživatel napsal.

Načtení textu z konzole

Zatím jsme nezkoušeli z konzole něco načítat. Slouží k tomu funkce input(), která uživateli umožní zadat do konzole řádku textu a nám vrátí zadaný textový řetězec. Abychom mohli z konzole načítat, založíme si nový projekt s názvem Papousek a jeho kód upravíme tak, aby vypadal následovně:

print("Ahoj, jsem virtuální papoušek Lóra, rád opakuji!")
print("Napiš něco: ")

vstup = input()
vystup = vstup + ", " + vstup + "!"
print(vystup)

To už je trochu zábavnější 🙂 První dva řádky jsou jasné (vypisují text). V dalším založíme proměnnou vstup. Do proměnné vstup se přiřadí hodnota z funkce input() získaná na konzoli, tedy to, co uživatel zadal. Pro výstup si pro názornost založíme další proměnnou vystup.

Spojování řetězců

Zajímavé je, jak jsme do proměnné vystup přiřadili hodnotu. Využili jsme k tomu tzv. konkatenaci (spojování) řetězců. Pomocí operátoru + totiž můžeme spojit několik textových řetězců do jednoho. Je jedno, jestli je řetězec v proměnné, nebo jestli je explicitně zadán v uvozovkách ve zdrojovém kódu. Do proměnné vystup jsme tedy přiřadili obsah proměnné vstup, dále čárku s mezerou, znovu vstup a poté vykřičník. Nakonec jsme proměnnou vypsali do konzole a tím program skončil. Podívejme se na jeho výstup v konzoli:

Program Papoušek:
Ahoj, jsem virtuální papoušek Lóra, rád opakuji!
Napiš něco: 

Nazdar ptáku
Nazdar ptáku, Nazdar ptáku!

Program Zdvojnásobovač

Zdvojnásobovač si vyžádá na vstupu číslo, které zdvojnásobí a vypíše. S dosavadními znalostmi bychom asi napsali něco takového:

print("Zadejte číslo k zdvojnásobení:")
a = input() # Zkusme zadat třeba číslo 12
a = a * 2
print(a)

V konzoli vidíme:

Program Zdvojnásobovač:
1212

Zdvojnásobení čísla a jsme provedli pomocí přiřazení. Pokud zkusíme program spustit, v konzoli se nám vypíše dvakrát námi zadané číslo! Narážíme na fakt, že funkce input() nám vrací textový řetězec. Pokud se pokusíme sečíst dva řetězce, jednoduše se oba řetězce spojí (jako když se spojují brčka). Cokoli tedy přijde z textové konzole, je vždy text. A to i když zadáme číslo. Abychom získali skutečně číslo, budeme ho muset tzv. naparsovat.

Parsování

Parsováním se myslí převod z textové podoby na nějaký specifický typ, např. číslo. Pokud budeme chtít naparsovat např. int z typu str, budeme postupovat takto:

s = "56"
a = int(s)

Funkce int() bere jako parametr textový řetězec a pokusí se ho převést na číslo. Využijme této znalosti v našem programu:

print("Zadejte číslo k zdvojnásobení:")
s = input()  # Držme se našeho čísla 12
a = int(s)
a = a * 2
print(a)

Nejprve si text z konzole uložíme do textového řetězce s. Do proměnné a poté uložíme číselnou hodnotu řetězce s. Dále hodnotu v a zdvojnásobíme a vypíšeme do konzole:

Program Zdvojnásobovač:
Zadejte číslo k zdvojnásobení:
12
24

Parsování se samozřejmě nemusí povést, bude-li v textu místo čísla např. slovo, ale tento případ zatím nebudeme ošetřovat.

Jednoduchá kalkulačka

Ještě jsme nepracovali s desetinnými čísly. Zkusme si tedy napsat slibovanou kalkulačku. Bude velmi jednoduchá. Na vstup přijdou dvě čísla a program poté vypíše výsledky pro sčítání, odčítání, násobení a dělení:

print("Vítejte v kalkulačce")
print("Zadejte první číslo:")   # Zkusme třeba pí, tedy 3.14
a = float(input())
print("Zadejte druhé číslo:")  # Zkusme třeba e, tedy 2.72
b = float(input())
soucet = a + b
rozdil = a - b
soucin = a * b
podil = a / b
print(f"Součet: {soucet}")
print(f"Rozdíl: {rozdil}")
print(f"Součin: {soucin}")
print(f"Podíl: {podil}")
print("Děkuji za použití kalkulačky!")

A takto vypadá výstup programu v konzoli:

Jednoduchá kalkulačka:
Vítejte v kalkulačce
Zadejte první číslo:
3.14
Zadejte druhé číslo:
2.72
Součet: 5.86
Rozdíl: 0.41999999999999993
Součin: 8.5408
Podíl: 1.15441176470588
Děkuji za použití kalkulačky!

Použití f-stringu

Pro jednodušší výpis do konzole zde používáme formátovaný výpis pomocí interpolace (nebo též f-string) ve tvaru:

print(f"text {proměnná}")

Tato šikovná utilita je v Pythonu dostupná od verze 3.6. V opačném případě bychom museli použít přetypování na řetězec pomocí str(proměnná), což je méně pohodlné :-) Celý řádek by totiž vypadal takto:

print("text" + str(proměnná))

Právě jsme se naučili opak parsování a nyní tedy v Pythonu umíme převést cokoli do textové podoby.

Desetinná čísla v Pythonu

Rozdíl čísel 3.14 a 2.72 vychází v naší kalkulačce podivně. Očekávaný výsledek 0.42 se nedostavil proto, že přesnost čísel s plovoucí desetinnou tečkou je omezena a nemusí přesně představovat reálné číslo, které chceme reprezentovat. To může vést (a často vede) k drobným zaokrouhlovacím chybám, jako je ta, kterou vidíme v rozdílu 3.14 a 2.72. Řešení jsou možná v jádru dvě.

Typ Decimal

Prvním řešením je použití datového typu Decimal. Tento typ je určen pro finanční a měnové výpočty, kde je přesnost kritická. Je ovšem nutné jej importovat z modulu decimal. Toto sice ještě neznáme, ale jde o jednoduchý proces. Na začátek programu napíšeme následující řádek:

from decimal import Decimal

A k načtení čísel použijeme Decimal místo float:

a = Decimal(input())
b = Decimal(input())
rozdil = a - b
print(f"Rozdíl: {rozdil}")

V konzoli už vidíme očekávaný výstup:

Výstup s použitím Decimal:
Rozdíl: 0.42

Zaokrouhlení pomocí funkce round()

Druhým řešením je použít funkci round() pro zaokrouhlení výsledků na požadovaný počet desetinných míst:

rozdil = round(a - b, 2)  # Chceme zaokrouhlit na dvě desetinná místa, proto ta dvojka

print(f"Rozdíl: {rozdil}")

V konzoli opět vidíme očekávaný výstup:

Výstup po zaokrouhlení:
Rozdíl: 0.42

Jak využití různých modulů, tak i použití matematických funkcí jsme si tu zatím pouze naznačili jako určitou bonusovou znalost. Podrobně si je vysvětlíme v dalších lekcích kurzu.

V následujícím kvízu, Kvíz - Konzole a proměnné v Pythonu, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 214x (3.79 kB)
Aplikace je včetně zdrojových kódů v jazyce Python

 

Předchozí článek
Proměnné a typový systém v Pythonu
Všechny články v sekci
Základní konstrukce jazyka Python
Přeskočit článek
(nedoporučujeme)
Kvíz - Konzole a proměnné v Pythonu
Článek pro vás napsal Karel Zaoral
Avatar
Uživatelské hodnocení:
515 hlasů
Karel Zaoral
Aktivity