Takmer každý program napísaný v jazyku Python komunikuje s okolím. Môže od používateľa vyžadovať zadanie údajov, spracovať zadané informácie a následne zobraziť výsledky na obrazovke. Naučiť sa čítať vstup a vytvárať prehľadný výstup je preto jedným z prvých krokov na ceste k programovaniu v jazyku Python.
V tomto návode sa naučíte, ako čítať vstup z terminálu, ako Python reprezentuje text a čísla, ako prevádzať medzi rôznymi dátovými typmi a ako vytvárať prehľadný a čitateľný výstup. Okrem toho sa naučíte spracovávať väčšie množstvo vstupných údajov pomocou sys.stdin a zoznámite sa s niekoľkými užitočnými metódami na prácu s reťazcami.
Čítanie vstupu z terminálu
Najjednoduchším spôsobom, ako môže program získať údaje od používateľa, je použiť vstavanú funkciu input(). Keď program narazí na volanie funkcie input(), jeho vykonávanie sa pozastaví, kým používateľ nezadá riadok textu a nestlačí kláves Enter. Zadaný text sa následne vráti programu.
Napríklad nasledujúci program požiada používateľa o zadanie mena:
name = input("Enter your name: ")
print(name)
Ak používateľ zadá
Alice
program vypíše
Alice
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("Enter your age: ")
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 jazyku Python
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 = 'Hello, world!'
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 je
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 bude
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 jazyku Python
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)
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
Ak sa chceme týmto prázdnym riadkom vyhnúť, je vhodné pred ďalším spracovaním odstrániť znak nového riadka z konca každého načítaného riadka.
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 medzery, tabulátory aj znaky nového riadka.
text = "hello\n"
print(text.rstrip())
Výstup:
hello
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()
print(line)
Výstup bude
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:
Alice
Bob
Charlie
David
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:
['Alice', 'Bob', 'Charlie', 'David']
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.