Počítač za mě mluví s uživateli
- Jak si Python pamatuje a jak pracuje s krátkými texty.
- Tisknout krátké texty na výstup a něco tak sdělit uživateli programu.
- Získávat od uživatelů data prostřednictvím klávesnice.
- Použít možnosti komunikace s uživateli v kombinaci s předchozími znalostmi.
Textové řetězce
Máme-li řetězce uzavírat do uvozovek, vnucuje se otázka: jak si poradit, když má být znak uvozovek součástí řetězce? Zkus do konzole zadat třeba:
PokusnyText = "I'm making a note here: "huge success". It's hard to overstate my satisfaction."
Najdeš nějaký způsob, jak dostat dovnitř textového řetězce uvozovky?
(Autor textu: Jonathan Coulton)
Bylo by prima, aby s námi Python mohl komunikovat slovy, nejen číslyVe skutečnosti půjde samozřejmě nadále o čísla, pouze interpretované jako texty. a logickými hodnotami. K uchování textových řetězců slouží datový typ str (z anglického string). Zatímco číslo pozná Python ze zdrojového kódu jednoduše tak, že je složené z číslic, u slov to není tak jednoznačné. Proto je nutno textové řetězce uzavírat do uvozovek.
Vyzkoušej následující a podobné řádky v interaktivní konzoli:
print("Ahoj světe!") # funkce print si umi poradit s ruznymi datovymi typy, vc. textovych retezcu
Pozdrav = "Ahoj světe!" # do (nove vytvorene) promenne Pozdrav vlozime textovy retezec
print(Pozdrav) # Pozdrav je nazev promenne, takze piseme bez uvozovek!
Zkus prozkoumat i tyto pokročilejší možnosti:
len(Pozdrav) # prozkoumej funkci len a zjisti, co dela
"pravy sandal" == "levy sandal" # rovnost retezcu porovnavame stejne jako u cisel
"pravy sandal" > "levy sandal" # ale copak je pravy sandal vetsi nez levy?
ObaSandaly = "pravy sandal" + " a " + "levy sandal" # co dela s retezci operator plus?
Kategorie | Rozsah BMI (v kg/m2) | |
---|---|---|
0 | těžká podvýživa | ≤ 16,5 |
1 | podváha | 16,5 – 18,5 |
2 | ideální váha | 18,5 – 25 |
3 | nadváha | 25 – 30 |
4 | mírná obezita | 30 – 35 |
5 | střední obezita | 35 – 40 |
6 | morbidní obezita | > 40 |
Máme už funkci na určení pásma podle BMI. Odpovídá ale číslem, což je pro uživatele poněkud nepřívětivé. Teď už ale umíš zacházet s texty. Uprav tedy funkci tak, aby odpovídala slovy.
Funkce funguje zcela správně, jen výsledné číselné hodnoty je třeba nahradit názvy příslušných pásem (samozřejmě v uvozovkách).
Řešení
Jedno z možných řešení:
1 def BMI(Vaha, Vyska) :
2 return Vaha/(Vyska**2)
3
4 def Pasmo(Vaha, Vyska) :
5 Index = BMI(Vaha, Vyska) # funkci na vypocet BMI uz mame, tak nebudeme vzorec zadavat znova
6 if Index <= 16.5 :
7 return "tezka podvyziva"
8 elif Index <= 18.5 :
9 return "podvaha"
10 elif Index <= 25 :
11 return "idealni vaha"
12 elif Index <= 30 :
13 return "nadvaha"
14 elif Index <= 35 :
15 return "mirna obezita"
16 elif Index <= 40 :
17 return "stredni obezita"
18 else:
19 return "morbidni obezita"
Uživatelský vstup
Pozor: input() v Pythonu řady 2 se chová popsaným způsobem, načtená data „interpretuje“ a podle obsahu nastaví datový typ. V Pythonu řady 3 načítá zásadně řetězce. To se týká i Pythonu 3 v konzoli repl.it i zde vkládaných intereaktivních cvičení. Typ lze převést funkcí s příslušným názvem, např. int("42") vrátí celé číslo s hodnotou 42.
Když už umíme pro uživatele něco vypsat, měli bychom umět od něj data také získat. Uživatel nebude chtít zadávat parametry jednotlivě volaným funkcím. Program ho ale může vyzvat k zadání nějaké hodnoty.
Příklad: Hádanka
1 def Hadanka () :
2 OdpovedUzivatele = input("Cihla vazi kilo a pul cihly. Kolik kil vazi cihla?")
3 SpravnaOdpoved = *zde dopln spravnou odpoved*
4 if OdpovedUzivatele == SpravnaOdpoved :
5 print("Spravne, dobra prace!")
6 else :
7 print("Je mi lito, to neni spravne.")
Funkce input je asi nejjednodušší způsob, jak v průběhu programu od uživatele získat vstup z klávesnice. Parametrem je výzva zobrazená uživateli. Uživatel zadá nějakou hodnotu a tu funkce vrátí. Obvykle je tedy potřeba rovnou ji přiřadit nějaké proměnné. Data zadaná uživatelem jsou interpretována stejně, jako by byla vložena přímo do zdrojového kódu místo volání funkce input. Takže číslo si Python vyloží jako číslo, řetězec je třeba uvést v uvozovkách atp.
Touto problematikou se zabývá celý obor zvaný Human Computer Interface. Příbuzná prakticky zaměřená oblast se nazývá User Experience. Může se to zdát malicherné, ale i drobné změny uživatelského rozhraní mohou způsobit velké rozdíly v tržbách internetového obchodu (nebo taky pád letadla).
Výzvu uživateli je nutno srozumitelně a výstižně zformulovat, jinak uživatel nebude vědět, co se po něm chce. Asi znáš situaci, kdy ti počítač hlásí nějakou chybu, ale ty jaksi nemáš ponětí, o čem je řeč. Podobná je situace třeba při zadávání údajů do webového formuláře, u kterého ale není popsáno, v jakém formátu mají data být — např. rodné číslo zadané bez lomítka, telefon včetně mezinárodní předvolby (ale 00420, nebo +420?), poštovní směrovací číslo s mezerou či bez, adresa internetové stránky včetně http:// či bez a tak dále. Frustrovaný uživatel tedy zkouší a zkouší, zatímco formulář data odmítá, ale přitom neporadí, kde je problém. To je chyba tvůrce formuláře. Počítače mají přece sloužit svým uživatelům, a nikoliv naopak.
Jak to udělat, aby dostal uživatel na řešení hádanky více pokusů? Nebo dokonce aby musel hádat, dokud neuhodne? Pojď se začíst do další kapitoly!
Pokaždé stejná hádanka je trochu nuda. Z naší hádanky bychom ale mohli udělat něco užitečnějšího: třeba pomůcku k procvičování násobilky.
Příklad: Procvičování násobilky
1 import random
2 def Nasobeni () :
3 Cinitel_1 = random.randint(1, 10)
4 Cinitel_2 = random.randint(1, 10)
5 OdpovedUzivatele = input( str(Cinitel_1) + " * " + str(Cinitel_2) + " = ")
6 SpravnaOdpoved = Cinitel_1 * Cinitel_2
7 if OdpovedUzivatele == SpravnaOdpoved :
8 print("Spravne, dobra prace!")
9 else :
10 print("Je mi lito, to neni spravne.")
Program dělá skoro totéž. Jen místo napevno zadané otázky vygeneruje dvě náhodná čísla a sestaví z nich příklad k vypočtení. Probereme, co dělají jednotlivé nové části:
- import random slouží k načtení modulu, pro práci s náhodnými čísly. Podobně už znáš načtení modulu math a turtle.
- Díky načteným funkcím pro práci s náhodnými čísly lze volat random.randint(1, 10), což vrátí náhodné celé číslo v rozsahu daném parametry, tedy 1-10. Vyzkoušej si v konzoli samostatné volání této funkce!
- Funkce str() slouží k převodu např. čísla na textový řetězec. V uvedeném programu ji potřebujeme proto, abychom mohli vytvořit zadání příkladu. Schválně můžeš zkusit, že třeba zápis 3 + " orisky pro Popelku" skončí chybou, protože sčítat čísla a texty prostě nedává smysl.
- Výsledkem výrazu str(Cinitel_1) + " * " + str(Cinitel_2) + " = " je textový řetězec se zadáním příkladu - pečlivě ho prozkoumej, rozumíš všem jeho částem?
Shrnutí
- Na texty se v informatice díváme jako na posloupnosti znaků, kterým říkáme řetězce (angl. string).
- Řetězce zadáváme pomocí uvozovek.
- Délku řetězců zjišťujeme pomocí funkce len(), spojujeme je pomocí operátoru + a porovnáváme (podle pořadí jako ve slovníku) jako čísla (==, > atd.).
- Řetězce (ale i další datové typy) vypisujeme na obrazovku pomocí funkce print().
- K načtení dat od uživatele slouží funkce input(). Jako parametr jí můžeme předat řetězec s výzvou pro uživatele. Funkce vrací načtenou hodnotu, kterou tedy obvykle rovnou přiřadíme nějaké proměnné, abychom s ní mohli dále pracovat: Vaha = input("Zadej svou váhu v kilogramech:")