Už víš že funkce ti umožňují kousek kódu:
Další výhoda funkce je, že ji můžeš jednoduše vyměnit za jinou, lepší funkci – pokud má ta lepší funkce stejné rozhraní (angl. interface).
Aby se ti líp představovalo, o čem budeme povídat, představ si elektrickou zásuvku ve zdi. Do takové zásuvky můžeš zapojit počítač, lampu, nabíječku na mobil, vysavač, nebo rádio. Zásuvka poskytuje elektrický proud; je jedno, jak ho použiješ. Stejně tak je jedno jestli je „druhý konec“ zásuvky připojený k solárnímu panelu nebo k atomové elektrárně. Zásuvka poskytuje elektrický proud, a jsou u ní důležité určité parametry (tvar, napětí, frekvence, maximální proud) na kterých se obě strany, poskytovatel proudu i spotřebič, shodly.
Podívej se na tuhle hlavičku funkce. Víš z ní, co ta funkce dělá a jak ji použít?
def ano_nebo_ne(otazka):
"""Zeptá se uživatele na otázku a vrátí True nebo False dle odpovědi"""
Podobnou funkci už jsi napsala; víš že „vevnitř“ volá input
a ptá se na
příkazové řádce.
Co kdybys ale měla následující funkci?
def ano_nebo_ne(otazka):
"""Ukáže tlačítka "Ano" a "Ne" a až uživatel jedno zmáčkne, vrátí True
nebo False dle stisknutého tlačítka."""
Když zavoláš tuhle funkci, ano_nebo_ne('Chutná ti čokoláda?')
, ukáže se
okýnko se dvěma tlačítky.
Když uživatel jedno zmáčkne, funkce vrátí True nebo False.
Z hlediska programu se nic nemění: jediné co se změní je definice funkce; volání je pak stejné jako dřív.
Najdi nějaký svůj program, který používá ano_nebo_ne
, případně jen print
a input
.
Stáhni si modul tkui.py
do adresáře se svým programem.
Naimportuj z něho funkce, které potřebuješ.
Jsou k dispozici čtyři:
from tkui import input, nacti_cislo, ano_nebo_ne, print
Tento import přepíše vestavěné funkce input
a print
variantami,
které mají (téměř) stejné rozhraní – jen dělají něco trochu jinak.
Případné vlastní definice funkcí nacti_cislo
a ano_nebo_ne
pak z programu
vyndej, aby se použily ty naimportované.
Program by měl fungovat stejně jako dřív!
Je to tím, že tyto funkce mají stejné rozhraní jako jejich dřívější protějšky, tedy:
input
bere otázku jako řetězec; print
může bere více argumentů k vypsání), ainput
vrací
řetězec; u print
nevrací nic smysluplného).Většina z těchto informací je přímo v hlavičce funkce. Ty ostatní je dobré popsat v dokumentačním řetězci, aby ten, kdo chce funkci použít, věděl jako na to.
Modul tkui
je jen ilustrační. Nedoporučuju ho používat.
Příkazová řádka je dělaná tak, aby byla užitečná pro programátory. Až se naučíš základy a vytvoříš nějaký skvělý program, přijde čas k logice (tzv. backendu) přidat část, která bude lépe použitelná pro uživatele – tedy okýnko nebo webovou stránku (tzv. frontend).
Udělat hezké a funkční uživatelské rozhraní je ovšem většinou celkem složité,
a často se dělá až potom, co jsou samotné „vnitřnosti“ funkční a otestované.
Doporučuju postupovat stejně, když se programování učíš: zůstaň u základních
print
a input
, dokud nezvládneš samotné programování.
A pak se můžeš naučit něco nového!
Co si ale z této lekce odnes je koncept rozhraní: při zachování několika
informací z hlavičky je možné vyměnit funkci za něco úplně jiného.
A stejně tak je možné jednu funkci (třeba input
) volat ze spousty různých
programů, pokud znáš její rozhraní.