Janko a Marienka chcú, aby ich prvý program komunikoval s používateľom. Program preto musí vedieť načítať údaje, spracovať ich a zrozumiteľne zobraziť výsledok.
V tejto kapitole sa naučíte čítať vstup z terminálu, pracovať s textom a
číslami, prevádzať hodnoty medzi dátovými typmi a formátovať výstup. Napokon
spracujete aj neznámy počet riadkov pomocou sys.stdin.
Čo sa naučíte
Po skončení kapitoly budete vedieť:
- načítať text a čísla pomocou
input(); - prevádzať hodnoty medzi typmi
str,intafloat; - vytvoriť formátovaný výstup pomocou f-stringov;
- rozdeliť a spojiť text pomocou
split()ajoin(); - spracovať chybný vstup;
- prečítať neznámy počet riadkov zo
sys.stdin.
Čítanie vstupu z terminálu
Najjednoduchšie program získa údaje od používateľa pomocou vstavanej funkcie
input(). Pri jej volaní počká, kým používateľ zadá riadok textu a stlačí
kláves Enter. Zadaný text potom funkcia vráti programu.
Napríklad nasledujúci program požiada používateľa o zadanie mena:
name = input("Zadajte svoje meno: ")
print(name)
Ak používateľ zadá
Janko
program vypíše
Janko
Text uvedený v zátvorkách sa nazýva výzva (prompt). Zobrazí sa ešte pred čakaním na vstup a informuje používateľa o tom, aké údaje program očakáva.
Dôležitou vlastnosťou funkcie input() je, že vždy vracia reťazec (string), bez ohľadu na to, čo používateľ zadá. Aj keď vstup vyzerá ako číslo, Python ho stále považuje za text.
age = input("Zadajte svoj vek: ")
print(age)
print(type(age))
Ak používateľ zadá 25, výstup bude
25
<class 'str'>
Na prvý pohľad môže byť toto správanie prekvapujúce, no vyplýva z toho, že klávesnica prirodzene produkuje text. Ak program potrebuje pracovať s číselnými hodnotami, programátor musí zadaný text explicitne previesť na vhodný číselný typ.
Koniec vstupu (EOF)
Namiesto zadania ďalšieho riadka môže používateľ signalizovať, že už nie sú k dispozícii žiadne ďalšie vstupné údaje. Tento stav sa označuje ako koniec súboru (End Of File, skrátene EOF).
- V systémoch Linux a macOS sa EOF zadáva stlačením Ctrl+D na prázdnom riadku.
- V systéme Windows sa používa kombinácia Ctrl+Z a následne Enter.
EOF je obzvlášť užitočný pri programoch, ktoré čítajú neznámy počet riadkov vstupu, ako si ukážeme neskôr pri práci s objektom sys.stdin.
Reťazce v Pythone
Keďže funkcia input() vždy vracia reťazec, je užitočné najprv pochopiť, ako Python reťazce reprezentuje.
Reťazec (string) je postupnosť znakov používaná na reprezentáciu textových informácií. Reťazce môžu obsahovať písmená, číslice, interpunkčné znamienka, medzery aj špeciálne znaky, napríklad tabulátor alebo znak nového riadka. V Pythone sa zapisujú medzi jednoduché (') alebo dvojité (") úvodzovky, pričom oba zápisy majú rovnaký význam.
language = "Python"
message = 'Ahoj, svet!'
number = "12345"
Hoci reťazec "12345" obsahuje iba číslice, stále ide o reťazec, pretože je uzavretý v úvodzovkách. Python ho preto považuje za text, nie za číselnú hodnotu.
Reťazce sa správajú ako postupnosti (sequences), čo znamená, že ku každému znaku možno pristupovať pomocou jeho indexu.
text = "Python"
print(text[0])
print(text[3])
Výstup:
P
h
Python používa číslovanie od nuly, takže prvý znak má index 0, druhý znak index 1 atď.
Vstavaná funkcia len() vracia počet znakov v reťazci.
text = "Python"
print(len(text))
Výstup:
6
Reťazce patria medzi najčastejšie používané dátové typy v jazyku Python. Reprezentujú používateľský vstup, obsah súborov, text zobrazovaný programom a prakticky všetky ostatné textové informácie.
Čísla v Pythone
Kým reťazce reprezentujú textové údaje, programy často potrebujú vykonávať aj matematické výpočty. Python preto poskytuje niekoľko číselných dátových typov, z ktorých najčastejšie používané sú celé čísla (integers) a čísla s desatinnou čiarkou (floating-point numbers).
Celé číslo (int) reprezentuje celé číslo bez desatinnej časti.
x = 42
y = -17
Číslo s pohyblivou desatinnou čiarkou (float) reprezentuje reálne číslo, ktoré môže obsahovať desatinnú časť.
pi = 3.14159
temperature = -5.2
Oba číselné typy podporujú bežné aritmetické operácie, ako sú sčítanie, odčítanie, násobenie, delenie, umocňovanie či výpočet zvyšku po delení.
a = 10
b = 3
print(a + b)
print(a / b)
print(a ** b)
Prevod vstupu na číslo
Ak chcete s hodnotou z input() počítať, musíte ju previesť. Funkcia int()
vytvorí celé číslo a float() číslo s desatinnou časťou.
first = int(input("Zadajte prvé číslo: "))
second = float(input("Zadajte druhé číslo: "))
print(first + second)
Ak používateľ zadá text, ktorý nie je platné číslo, Python vyvolá chybu
ValueError. Pri používateľskom vstupe ju môžete zachytiť:
try:
age = int(input("Zadajte vek: "))
except ValueError:
print("Vek musí byť celé číslo.")
else:
print(f"O rok budete mať {age + 1} rokov.")
Formátovaný výstup pomocou f-stringov
F-string umožňuje vložiť hodnotu premennej priamo do textu. Pred úvodzovku
pridajte písmeno f a výraz zapíšte do zložených zátvoriek.
name = "Marienka"
age = 25
print(f"{name} má {age} rokov.")
F-string môže obsahovať aj výrazy:
price = 12.5
quantity = 3
print(f"Cena spolu: {price * quantity:.2f} €")
Na rozdiel od reťazcov môžu čísla priamo vystupovať v matematických výrazoch. Tento rozdiel je dôležitý, pretože hodnoty načítané pomocou funkcie input() sú vždy reťazce, aj keď používateľ zamýšľal zadať číslo. Prevod medzi reťazcami a číselnými typmi preto patrí medzi najčastejšie operácie v programoch napísaných v jazyku Python.
Čítanie viacerých riadkov pomocou sys.stdin
Funkcia input() je ideálna pre interaktívne programy, ktoré presne vedia, koľko vstupných hodnôt majú načítať. Mnohé programy však spracúvajú údaje zo súboru alebo z iného programu prostredníctvom štandardného vstupu (standard input), pričom počet vstupných riadkov nemusí byť vopred známy.
V takýchto prípadoch Python poskytuje objekt sys.stdin, ktorý umožňuje čítať vstup dovtedy, kým sú k dispozícii ďalšie údaje. Pred jeho použitím je potrebné importovať modul sys.
import sys
Najjednoduchším spôsobom spracovania všetkých vstupných riadkov je iterácia cez objekt sys.stdin pomocou cyklu for. Každá iterácia načíta jeden riadok vstupu a cyklus sa automaticky ukončí po dosiahnutí konca vstupu.
import sys
for line in sys.stdin:
print(line)
Ak je vstup
apple
banana
orange
cyklus sa vykoná trikrát – raz pre každý riadok. Po skončení vstupu, napríklad po stlačení Ctrl+D v systémoch Linux a macOS alebo Ctrl+Z a následne Enter vo Windows, sa cyklus ukončí.
Znak nového riadka
Každý riadok načítaný z objektu sys.stdin obsahuje na svojom konci znak nového riadka ('\n'), s výnimkou posledného riadka, ak vstup nekončí znakom nového riadka.
Keďže funkcia print() automaticky pridáva na koniec výstupu ďalší znak nového riadka, pri priamom vypisovaní načítaného riadka sa často zobrazujú prázdne riadky navyše.
Napríklad
import sys
for line in sys.stdin:
print(line)
pri vstupe
apple
banana
orange
vytvorí výstup
apple
banana
orange
Prázdnym riadkom sa vyhnete odstránením znaku nového riadka pred ďalším spracovaním vstupu.
Odstránenie znaku nového riadka pomocou rstrip()
Metóda rstrip() odstraňuje znaky z pravého konca reťazca. Ak jej
neodovzdáme žiadny argument, odstráni všetky koncové biele znaky
(whitespace), teda aj medzery a tabulátory. Ak chcete odstrániť iba znak
nového riadka, použite rstrip("\n"). Významné medzery tak zostanú
zachované.
text = "ahoj\n"
print(text.rstrip())
Výstup:
ahoj
Pri spracovaní vstupu z sys.stdin sa metóda rstrip() najčastejšie používa práve na odstránenie znaku nového riadka z konca každého načítaného riadka.
import sys
for line in sys.stdin:
line = line.rstrip("\n")
print(line)
Výstup:
apple
banana
orange
bez nežiaducich prázdnych riadkov.
Načítanie viacerých reťazcov do zoznamu
Predpokladajme, že vstup obsahuje jedno meno na každom riadku:
Janko
Marienka
Adam
Zuzana
Nasledujúci program načíta všetky mená do zoznamu.
import sys
names = []
for line in sys.stdin:
names.append(line.rstrip())
print(names)
Výstup:
['Janko', 'Marienka', 'Adam', 'Zuzana']
Pri každej iterácii cyklu sa načíta jeden riadok vstupu, odstráni sa z neho znak nového riadka pomocou metódy rstrip() a výsledný reťazec sa uloží do zoznamu.
Tento spôsob spracovania vstupu sa často používa pri práci s textovými súbormi, vstupnými prúdmi alebo v úlohách z algoritmizácie a súťažného programovania, pretože funguje bez ohľadu na to, koľko riadkov vstupu program dostane.
Užitočné metódy reťazcov
Metóda strip() odstráni biele znaky na oboch stranách. Metóda split()
rozdelí text na zoznam a join() spojí zoznam reťazcov do jedného textu.
line = " jablko, hruška, slivka "
fruits = [fruit.strip() for fruit in line.split(",")]
print(fruits)
print(" | ".join(fruits))
Výstup:
['jablko', 'hruška', 'slivka']
jablko | hruška | slivka
Cvičenia
- Načítajte polomer kruhu a vypíšte jeho obvod aj obsah na dve desatinné miesta.
- Načítajte celé meno a vypíšte ho ako zoznam slov pomocou
split(). - Načítajte riadky zo
sys.stdina vypíšte iba neprázdne riadky bez okolitého bieleho priestoru.
Zhrnutie
input() vracia vždy reťazec. Čísla preto prevádzame pomocou int() alebo
float(), výstup formátujeme pomocou f-stringov a neznámy počet riadkov
spracujeme iteráciou cez sys.stdin.