Download as pdf or txt
Download as pdf or txt
You are on page 1of 75

kolapreMimoriadneNadanDetiaGymnzium,Teplick7,83102Bratislava

AninoBELAN

PYTHON
uebntextpreseptimuosemronhogymnzia

BRATISLAVA
2013
Copyright2013,AninoBelan

DielojezverejnenpodlicenciouCreativeCommonsAttributionNonCommercialShareAlikeLicense
http://creativecommons.org/licenses/byncsa/3.0
Obsah
vod.....................................................................................................................................................4
PythonaleboNebezpenhady........................................................................................................6
PodmienkyavnimkyaleboMocnodsadenie................................................................................9
Zoznamy,nticeaslovnkyaleboSkladujemeinformcie.............................................................13
Cyklyaleboopakovaniejematkamdrosti....................................................................................17
Modulyalebonevymajtekoleso................................................................................................21
Funkciealeboakofungujeevolcia...............................................................................................24
Objektyalebodlhlekciaosardinkcharalokoch.......................................................................28
Dijkstrovalgoritmusalebokadejetonajkratie.............................................................................38
Programujemehrualebomimozemaniatoia............................................................................48
Popolukaazlatpriadkaalebovlkna,triedenieazloitos.........................................................59
Zver...................................................................................................................................................75
vod
Kedysivdvnychasoch,kedomcepotaemaliosembitovprocesory,keneexistoval
Linux,MacOSaniWindowsakegrafikapotaazvldlamaximlneosemfarieb,saspotami
robiliprevanedveveci.Hralisananichhryaprogramovalosa.Obeinnostirobiliudiasamiod
seba adobrovone. Kto mal prstup k potau, uval si jednak to, e sa mohol sta mocnm
Pacmanom a ra straidl, jednak to, e sa mohol sta mocnm programtorom a niekokmi
ikovnmi prkazmi mohol printi pota, aby robil presne to, o chce. A ke niekto priiel
snpadom,ebysainformatikamalauivkole,taksastchtodvochveczaaloprirodzeneui
prvetoprogramovanie.
Lene doba pokroila. Potae maj namiesto osembitovch procesorov
esdesiattyribitov,medzioperanmisystmamisimetevyberaafarbamisaneetr.Okrem
toho sa potae vyuvaj na mnoh ikovn veci. Mete v nich psa typograficky pekne
upraventexty,vytvratabukysozabudovanmivpotami,povaivytvrahudbuavideo,
robi 3D modely a animcie, skladova dta, mete sa s ich pomocou pripja do siete
akomunikovascelmsvetom.
Tietozmenysasamozrejmeodraziliajnavyuovaninformatiky.Nainformatikesau
mnostvo vec, ktor by sa mohli ui skr na slovenine, hudobnej a vtvarnej vchove
amatematikeajedindvod,preotietovecipripadlipodpredmetinformatikaje,esaprinich
pouvapota.Ztohtodvodusanainformatikeprogramujeoveamenej,akokedysi.
Ttoknikasavsnapriektomubudepokanauiprogramova.Dvodysviacer.
Prvjeten,evsprogramovaniemeuivi.Jetoremeslo,ktorjezaujmavaokrem
tohoeteajcelkomsluneplaten.Programtorovjemlo,takeniejeproblmnjssivodbore
zamestnanie.Kesavydtetoutocestou,mesavmstaivotnmpovolanm.
Totosasamozrejmenetkakadho.Ajpreud,ktorposkonentohtokurzuunenapu
aniriadokkdualemzmysel,ehoabsolvuj.Atoztchtodvodov:
Ke lovek aspo troku programuje, tak m lepiu predstavu o tom, o me od
programov,ktorprenehopeniektoin,aka.Aviacocen,kehrnejakskvelhru
alebopouvanejakprogram,ktormuzjednoduivot.
udiasivinoumyslia,evediavecidobrevysvetliavinousavtejtopredstaveosebe
alostnemlia.Programovaznamennieodobrevysvetlipotau.Dosdobrenato,aby
robil,oodnehochceme.Attoschopnosnieodobrevysvetlisalovekuzdeajinde,
nepriprcispotaom.
Programovaniemtvhodu,ekelovekspravnejakchybu,prdenatopomerne
rchlo. V ivote to tak vdy by nemus. Preto je programovanie zaujmav sksenos,
vakaktorejsamlovekmonosnauivyrovnvasasvlastnmichybamiauisaich
opravova.
Programovasadrznymispsobmiavrznychjazykoch.Napriektomu,enaSlovensku
savkolchvinouuPascalaleboniektorzjehoklonov(Delphi,Lazarus),rozhodlismesa
zvoliinjazykPython.Dvodysdva.
Prvjeten,ejazykPythonjepohodln.Robsavomprjemnearchlo.Naveci,ktor
bystevPascalepotrebovalityririadky,vmbudestaijeden,toonapete,budepravdepodobne

4
itatenajpreniekohoinho,akoprevsanamiestotoho,abystesamuselisstredinamnostvo
formalt,metesasstredinato,ochcetenaprogramova.
Druh je ten, e asy, kedy bol Pascal najvhodnej jazyk na vyuovanie, u dvno
pominuli. Ke sa pozriete, ktor jazyky sa uia v zaiatonckych kurzoch na univerzitch na
zpade,takstobujazyky,ktorssyntaxouodvodenodjazyka C(tedaC,C++aJava),
niektor funkcionlny jazyk (Haskell), alebo prve Python. Medzi univerzity, ktor zanaj
sPythonompatrnaprkladCambridgealeboMIT.Pythonjetotijazyk,ktorsamotnousvojou
syntaxountiud,abypsaliprogramyitatene.Nvyky,ktortaktozskate,ocente,kebudete
programova v inch jazykoch. K jazyku Python okrem toho existuje mnoho vemi pekne
napsanchkninc,oznehorobrovnakouniverzlnyjazyk,akojeC++aleboJava.
Vkadomprpadesatem,estepotejtoknikesiahliadfam,esavmbudepi
abudeprevsuiton.elmvmveatrpezlivosti,pevnnervy,psychickodolnosaprjemn
zbavu.

Anino

5
1.lekcia
PythonaleboNebezpenhady
PythonzaalvytvraHolananGuidovanRossumvroku1989adodnesjejehohlavnm
vvojrom. Nzov dal jazyku poda anglickej humoristickej skupiny Lietajci cirkus Montyho
Pythona.Dnessapouvajdvejehoverzieverzia2averzia3.Tentokurzbudezameranna
verziu3.
Intalcia je jednoduch. Pod Linuxom budete ma Python pravdepodobne rovno
naintalovan.Aknhodounie,stapouivobbenbalkovacsystmanechaautomaticky
naintalovabaleksnzvom python3.AkpouvateWindowsaleboMacOSX,stazjsna
strnku http://www.python.org/getit astiahnusiodtiapatrinbalek.Dajtesipozor,abyste
stiahliverziu,ktorejslozanana3.KeejePythonzverejnenpodOpenSourcelicenciou,
njdetetamajjehozdrojovkdy(jadroPythonujenapsanvCku).
Python je teda astne naintalovan. o s nm. Prv vec, ktor mete spravi, je, e
spusttepriamoprogrampython3.Ketakuinte,ukesavmnaobrazovkenieotakto1:
Python 3.2.3 (default, Jun 8 2012, 05:36:09)
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Tie zobky na konci znamenaj, e Python pova. Mete mu zada prkaz a on ho
okamitevykon.Metovyzeranaprkladtakto:
>>> print(2+3)
5
>>> print(1+1+1+0*9)
3
>>> print("Dobr de")
Dobr de
>>> print(9/4)
2.25
>>> print(2**5)
32
>>> kr = 5
>>> print(kr)
5

>>> kr = "Ahoj!"
>>> print(kr)
Ahoj!
>>> quit()

Akosimetevimn,Pythonviefungovacelkomdobreakokalkulaka.Funkciaprint
slinato,kepotrebujetenieovypsa.MatematikuPythonzvldacelkomdobre,takekemu
dte vypsa hodnotu 1+1+1+0*9, vie, e nsobenie m prioritu pred stanm, take najprv

1To,osavmuke,samozrejmezvisodpouithooperanhosystmu.Vprpadelinuxubudeteprogram
pravdepodobnespavprkazovomriadku,vprpadewindowssapospustenprogramuobjavterminl.Ajtext,ktor
saobjav,mebyin.Dleitje,evmPythonpovie,esaspustil,uvediepouitverziuanakoncisaobjaviatie
trizobky.

6
vypotato0*9(hviezdikaznamenkrt)apotomktomupripotatiejedniky.Dobremuide
ajdelenieaumocovanie(2**5znamen 25 ).
Zaujmavjeprkazkr = 5.Znamentotidokrabiceniekdevpamti,ktorsanazva
kr vlohodnotu5.Taktokrabicevpamtisvemiuitonanazvajsa premenn.Meno
premennejsimetevymyslieakchcete.2Vimnitesi,epovykonantohtoprkazuPythonni
nevypisoval a iba sa objavili alie zobky. A ke sme pouili funkciu print, obsah sme
vypsali.Kepotomvykonmeprkaz kr = "Ahoj!",vpremennej kr saocitnenovobsah
reazec Ahoj! a predol hodnota 5 bude navdy zabudnut. Ke znovu vypeme obsah
premennejkr,dokmesainhovsledku,akovpredolomprpade.FunkciaquitPythonukon.
Jedleit,abyfunkciamalazasebouztvorky.PodanichjuviePythonodliodpremennej.
Pretomfunkciaquitzasebouztvorky,ajkevnichnemiadneparametre.
Totojejedenspsob,akoPythonpouva.Niejetoplnezlspsobpodobnesapouva
prkazov riadok. Problm je, e ke chceme tieto vetky veci znovu zopakova, tak musme
prkazyodznovunapsa.
Nie je ale ni jednoduchie, ako si zvoli obben textov editor (naprklad kate, vi,
notepad++,TextWrangleralepokojneajnotepad),vetkyprkazydonehonapsa,sboruloi
skoncovkou.py(tedanaprklad 01-01-pokus.pytoprvslojeslolekcie,druhjeslo
programuvdanejlekcii).Sbortedabudeobsahovanasledujcitext:
print(2+3)
print(1+1+1+0*9)
print("Dobr de")
print(9/4)
print(2**5)
kr = 5
print(kr)
kr = "Ahoj!"
print(kr)
quit()

Teraz u len treba poveda Pythonu, aby ten sbor spustil. Ak pracujete pod linuxom,
situcia jejednoduch. Sta savprkazovom riadkudosta doadresra, vktorommte sbor
uloenazadaprkaz
python3 01-01-pokus.py
Programvmvype
5
3
Dobr de
2.25
32
5
Ahoj!

Podwindowsamijesituciatrochuzloitejia.Abysasborsvaimiprkazmispustil,sta
nadvojklikn.Askutone.Otvorsaokno,donehosavypuvsledky,programskonaoknosa

2Dvajtesialepozor,abynezanalonaslicuaobsahovaloibapsmen,sliceaznak_.

7
zavrie.Problmjevtom,etotovetkotrvlenzlomoksekundyavyporiadnenestihneteuvidie,
ovtomoknevlastneje.Abystetomuzamedzili,predprkazquit()vlotealprkaz
input("Stlate ENTER!")
TentoprkazvypeStlate ENTER!aaknato,kedymupouvatenieozad.Aajkemu
nezadteni,taktonevad.Prensjedleittoakanie.Kmnestlate ENTER,oknonezmiznea
vysametekochatm,opeknvmPythonvypsal.
loha1:Spustite Python a zadajte mu uveden prkazy. Vymyslite si nejak vlastn a tie mu
zadajtetie.
loha2:ovypePython,kemuzadteprkazprint(10 * "Ahoj ")
loha3:Vosvojomobbenomtextovomeditorenapteuvedenprkazy,ulotetopodnejakm
rozumnmmenomskoncovkou.pyasborspustite.
loha4:otosprav,kedonejakhosborunapeteprkazy
a = "(auto)"
b = "(autobus)"
zapcha = 3*a + 2*b + 4*a + 3*b + a
print(zapcha)

apotomtospustte?
loha5:NechajtePythonvypotasetneprnychselod1do19avsledokvypte.
loha6:NechajtePythonvypota20!(dvadsafaktoril)avsledokvypte.
loha7:(Bonusov pre machrov) Spravte zpchu, ktor nebude vypsan, ako v lohe 4, ale
vykreslenmautkanasledujcimspsobom:
_/ L\__,
'-o---o-'
Akdoreazcapridte"\n",znamentoprejdinanovriadok.

8
2.lekcia
Podmienkyavnimky
aleboMocnodsadenie
Prv lekcia, ktor ste mali t es prednedvnom dokoni, bola celkom jednoduch.
Pythonustevoaoprikzaliaontourobil.Naprvpohadsamezda,ekurzsplnilsvoje
poslanie.Potavsposlchaarobpresneto,ostemupovedali.Nadruhstranu,skonikurz
Pythonuprvoulekciou,topredsalenvyvolvaistpocitnenaplnenia aneplnosti.Nebojtesa,
Pythonetenepovedalsvojeposlednslovo.
Natchprogramoch,ktorsmerobiliminule,jetotijednanesympatickveczakadm
spraviatoist.Vbecsapouvateanesptaj,obychcelaibytoprialombehuprogramu
nhodounechcelnejakoinak.Tosadaleahkonapravi.Pozritesinasledujciprogram3:
1 print("Ako sa vol?")
2 meno = input()
3 vystup = "Ahoj " + meno + ", ja som Python."
4 print(vystup)

Vetkotonaptedosboruskoncovkou .pyaspustite.Keprogramspustte,najprvsa
vssluneopta,akosavolte.Potomprdezaujmavas.To,ojevtomtoprogramenov,je
funkcia input.Tak,kmnieonapeteastlate Enter.Text,ktornapete,vrtifunkcia
akosvojvsledok,sktormpotommeterobi,ouzntezavhodn.Mysmesihouloilido
premennejmeno.
Vtreomriadkuvytvormepremennvystup,doktorejulomezasebouzreazentexty
"Ahoj ",meno,ktorsmenatalizovstupua", ja som Python".Vtvrtomriadkutento
vsledokvypeme.
loha1:Pochopteavyskajtesito.
Keuviemezskaoduvateanejaksptnvzbu,memesksinaprogramovanieo
praktickejie.Naprkladhracautomat.
1 print("Ja som hrac automat.")
2 print("Stav desa eur.")
3 heslo = input("Zadaj heslo: ")
4 if heslo == "krokodil":
5 print("Vyhral si.")
6 print("Me si zobra tch desa eur nasp.")
7 else:
8 print("Prehral si.")
9 print("Desa eur ti prepadlo.")
10 print("Isto si chce zahra ete raz.")

Prvzaujmavdetailsavyskytujevtreomriadku.Funkciainputtamtotimparameter
"Zadaj heslo: ".Tospsob,efunkcianajprvnape Zadaj heslo: aapotomakna
vstupoduvatea.

3Riadkysslovanibakvlilepejorientcii.Ketobudeteska,slariadkovdoprogramunepte.

9
Tiedleit veci saale dej anariadkoch4a9.Heslo,ktoruvate zadal, mme
uloenvpremennejheslo.Akuvatenhodoutrafilsprvneheslokrokodil4,takmuchceme
napsa,evyhralamesivkladzobranasp.Inakmuchcemenapsa,eprehral.Nprogram
teda potrebujeme rozdeli na dve nezvisl vetvy, priom jedna sa vykon vtedy, ke bude
vpremennejheslokrokodiladruhsavykonvtedy,ketambudenieoin.
Presnenatosliprkazif(poanglickyak).Konkrtnevnaomprpadevyzertakto:
if heslo == "krokodil":
Zaprkazom if nasledujepodmienka.Naapodmienka heslo == "krokodil" jepradiviba
vtedy,akjevpremennej heslojeuloentextkrokodil.Zapodmienkoutrebadadvojbodku,
abybolojasn,eupodmienkaskonila.Tieznakyrovnsavtejpodmienkemusiabydve,
pretoejednorovnsaupouvame,kechcemenieovloidonejakejpremennej.
Aterazsadostvamekveci,podaktorejsanazvacelttokapitola,tedakmocnmu
odsadeniu.Kesapozrietenariadky5a6,tedatie,ktorsamajvykonavprpade,epouvate
ako heslo skutone zadal "krokodil", tak s oproti riadku s podmienkou odsaden o jeden
tabultor. (Tabultor je naznaen pkou. Tie pky do svojho programu nepte, dajte tam
tabultory!)Pythonztohopochop,eto,ojeodsaden,samvykonalenvtedy,akjepodmienka
splnen. Kesadostane k alm neodsadenm riadkom, tak vie, e tenpodmienen sek u
skonilazasmrobivetko.
Poskonenpodmienenejastinasledujeprkaz
else:
Tentoprkazsanikdynevyskytujesamostatneavdysamusspjasnejakmpredolm if.
(Naopaktoneplatifsamostatnemebyaprkazelsepoomnasledovanemus.)Elsepo
anglickyznameninak.Riadky,ktorpo else nasleduj(asodsadenotabultor),sateda
vykonajibavtedy,kepodmienkavpredolomprkaze if niejesplnen.Aktedapouvate
hesloneuhdne,vykonajsariadky8a9aprogrammuoznmi,epriielopeniaze.
Riadok10niejeodsaden.Vykonsatedabezohadunato,akheslouvate zadal
avyzvehra,abysizahraleteraz.
loha2:Pochopte,vyskajtesitoaneprepadnitehrskejzvislosti.Ajtaknevyhrte.
loha3: Pridajtepredriadok4prkaz print(heslo == "krokodil") obudetentoprkaz
vypisova?
o robi, ak chcete napsa nejak komplikovanejiu vec a naprklad do jednej vetvy
programuvloialprkazif?Jetojednoduch.Stapridaaltabultorakovnasledujcom
programe:
1 odpoved = input("Chce mi poveda slo? ")
2 if odpoved == "ano":
3 cislo = input("Tak povedz: ")
4 if cislo != "42":
5 print("Aha...")
6 else:
7 print(" :)")

4Sprvneheslomusmavetkypsmenkamalamusmakrtkei.

10
Programunebudemekomentovatakpodrobne,akopredol.Nazaiatku saoptame
uvatea,isasnamivbechodlbaviaalejsabudenieorobiibaakodpovie "ano".Kee
celaliaasprogramuodriadku3poriadok7jepodmienen,vetkojeodsadenotabultor.
Vtejtoastisapouvateaprogramopta,akslomutochcelpovedaaaktobude42 5,patrine
toocen.Riadky5a7spodmienenvakaprkazomifaelsenariadkoch4a6.Keesale
riadky4a6uojedentabultorodsaden,riadky5a7musiabyodsadenaodva.
Vimnitesinatomtoprogrameniekokoalchzaujmavost.Prvjedvojicaznakov !=
vriadku4.Ttodvojicaznamennerovnsa.Aktedauvatezadinslo,ako42,programto
vemineocen.
aliuzaujmavvecuvidte,kesanaprogrampozrietezvejdiaky.Toodsadzovanie
jedobrnielenprePython,aleajprevs.Vakanemujerovnovidie,ktorastikdupatriaku
ktormpodmienkamaprogramsapretodobreta.Vidtenaprkladhne,e else nariadku6
patrk if nariadku4aniek if nariadku2.Kpodobnmuodsadzovaniunabdajuiteliaaj
iakov,ktorzanajprogramovavjazykochPascalaleboC.Zaiatoncivtchtojazykochtoale
vinoukvlastnejkodenerobia.
loha4:Vyskajte. Skste zada programu tak vstupy, aby sa zachoval vetkmi monmi
spsobmi.
Posledn zaujmav rta predolho programu o ktorej bude re je drobn detail
vpodmienke if cislo != "42": Tendrobndetailstievodzovkyokolo42.Akoubolo
povedanvyie,funkciainputvrtiakosvojvsledoktext.Hodnotauloenvpremennejcislo
teda nebude slo, ale text. Ak nerozumiete, v om je problm, skste si spusti nasledujci
minimalistick program, ktor pota dvojnsobok zadanho sla a zada mu na vstupe
naprklad100.
1 cislo = input("Zadaj cislo: ")
2 print("Dvojnasobok toho cisla je", 2 * cislo)

loha5:Vyskajte.
Neoakvanvsledokpredolhoprogramujespsobentm,ekemPythonzisti,ak
jehodnotavrazu3 * 7,vyjdemu21,pretoe7jesloakemzisti,akjehodnotavrazu
3 * "ku" ,vyjdemu "kukuku",pretoe "ku" jereazec.Noaprvepreto,evpremennej
cislommereazec,ktorsanasloscepodob,aleslotonieje,sapredolprogramsprva
takdivne.
Akotedanapsaprogram,ktorvynsobzadanslodvomi?Musmereazec,ktornm
zistfunkciainput,zmeninaslo.Natoslifunkciaeval6.Ttofunkciavieprerobireazecna
slo.Nprogramtedamemeprerobinasledujcimspsobom:
1 vstup = input("Zadaj cislo: ")
2 cislo = eval(vstup)
3 print("Dvojnasobok toho cisla je", 2 * cislo)

Terazuvetkofungujetakakom.
Anadetaily.
5http://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#The_number_42
6Zanglickhoevaluatevyhodno.Funkciavyhodnotzadanvraz.Jenanejnebezpento,eakumonte
zlomysenmupouvateovizadanavyhodnotenievrazobsahujciprkaz,ktorzmaeoperansystm,funkcia
evalvyhodnotajten.Takeprirelnomprogramovanpouvajtettofunkciusmierouananajvopatrne.

11
loha6:Skstepredolmuprogramuakovstupzada"ku".
Akstelohu6splnili,videliste,eprogramuhynulvsmrtenchkochavychrlilnavs
chybovhlkupodobntejto:
Traceback (most recent call last):
File "02-04-dvojnasobok.py", line 2, in <module>
cislo = eval(vstup)
File "<string>", line 1, in <module>
NameError: name 'ku' is not defined

Python vm tam pe, ako sa vol sbor, ktor ste prve spali (v naom prpade
02-04-dvojnasobok.py),naktoromriadkusastalachyba(nadruhom),vypechybnriadok,
oznmiakkninicabolaprvevolan(string)anakoniecchybuonajlepiepope(povonom
prekladezanglitinynieovzmyslenetum,ojeto'ku'.
Istouznte,etaktosprvaniejeistkvrnanadokonalostinhoprogramu.Programbysa
protinesprvnemuvstupumalnejakokultivovaneohradi.Akoalerozozna,ktorvstupjesprvny
aktornie?
Jednazmonostje,ezavolmefunkciu eval,alebudemedvapozor,ito,obude
robi,dopadnedobre.Aaktoskonchybou,nedovolmeprogramu,abyuvateovivypisoval
veci,ktorsprenszaujmav,alejemubyninepovedalianamiestotohomuvypemenieo
zrozumitenejie.Spravsatotakto:
1 vstup = input("Zadaj cislo: ")
2 try:
3 cislo = eval(vstup)
4 except:
5 print("Zadali ste nejak nezmysel")
6 quit()
7 print("Dvojnasobok toho cisla je", 2 * cislo)

Kritickasprogramu,vktorejmenastachyba,vlomedosekcie try (poanglicky


sks).Aksavtejtosekciinieopokaztedaaknastanechyba,ktorbyvygenerovalapodobn
vpis,akstevidelipredchvou,programbudepokraovasekciouexcept(poanglickyurobi
vnimku).Vtejtosekciinauvateazvalme,etonefungujeaprogramopustme.Vprpade,e
vetkoprebehlodobre,programpokraujeazasekciou except avypetendvojnsobok,po
ktoromsmecelasprahli.
loha7:Vyskajte.otosprav,kedovstupunapete(3 * 3 * 3 7) / 5?
loha8:otosprav,kezpredolhoprogramuvymaeteriadok6anavstupezadteprogramu
nejaknezmysel?
loha9:Akviete,epodmienkaif a % 2 == 0:jesplnen,prvevtedy,kejesloprne,
napteprogram,ktornatasloavypevm,ijeprne,aleboneprne.7
loha10:Zmete posledn program, aby v prpade, ak uvate zad slo, vypsal jeho
dvojnsobokaakuvateslonezad,programvypevstupdvakrtzasebou.

7 Znak % zist v Pythone zvyok po delen. Ak je teda a % 2 rovn 0, znamen to, e slo uloen
vpremennejadpovydelendvomazvyoknulaatedamusbyprne.

12
3.lekcia
Zoznamy,nticeaslovnky
aleboSkladujemeinformcie
VpredolejlekciismevylepilinauschopnosnieoPythonuprikzaato,osmerobili,
saucelkomsoldnezaalopodobanaprogramovanie.Vtejtolekciialetentosubnenastpen
trendetenachvuopustme.Naumesaaleveci,ktorsanmbudvbudcnostivemihodi
aktornmprogramtorskivotuahianeakanmspsobom.
Ideoto,edoterazsmedojednejpremennejuloilivdyibajednuvec.Niekedysaalehod
matamtchveculoenchviacero.Programtorivymysleliviacerofntakosatoduskutoni.
Avtejtolekciisipoviemeotrochznich.
Prv spsob, ako do jednej premennej uloi vea vec je zoznam. Zoznam vyrobte
naprkladtak,ejednotlivjehopolokynapetedohranatchztvoriekaoddelteiarkami:
a = ["Vek tresk", 42, "ivot, vesmr a vbec", "Star trek", 47]
Do tohto zoznamu sme uloili a p vec. Vidte, e niektor s reazce a niektor sla. Do
zoznamovmetevkladapraktickyokovek,dokoncaaliezoznamy.Dobresialerozmyslite,ak
chcete dozoznamu vklada objekty rznych typov. Akto robte bezdvodne, me savm to
vypomsti.
Keumtenejakzoznamvytvoren,metesnmrobimnostvovec.Aknaprklad
poznteporadieprvkuvzozname,meteknemupristupovapomocouhranatchztvoriek.
loha1:SpustitesiPythonakoprkazov riadok,vytvortesirovnakzoznam,akotutovyie
apotomzadajteprkazprint(a[1])ovmPythonvype?
T,ktorakali,ePythonbudepsanieoovekomtreskusavpredolejlohedokali
sklamania.Prvkyvzoznamestotislovanodnuly.a[1]jeadruhprvokaprkazzlohy1
pretovype42.
loha2:ovypunasledujceprkazy?Najprvsksteuhdnuapotomsitovyskajte.
print(a[5])
print(a[-1])
print(a[-5])

Nevindujteanaozajsitovyskajteprv,akobudetetaalej.
Prvprkazskonchybovouhlkou,ktorbudeobsahovanieovzmysleIndexError:
list index out of range,ovprekladeznamen,eindex,ktorstepouilijemimorozsah
zoznamu.Jetopochopiten.Keemnzoznampprvkov,stoprvky a[0]aa[4].Prvok
a[5]bybolaiestyataktamnieje.
aliedvaprkazyprekvapivochybovouhlkouneskonia.KePythonuuvedietezporn
index,zanepotaodkonca.a[-1]jetedaposlednprvokzoznamu.Keetchprvkovmme
p,a[-5]budeprvprvok.Kebystesaalechcelidostakprvkua[-6],skonilobytorovnakou
chybovouhlkou,akovprpadea[5].

13
Prvkyzoznamunemusteibavypisova,meteichajmeni.Kenaprkladzadteprkaz
a[4] = "Enterprise" anechtesivypsazoznama,budevyzeratakto:
['Vek tresk', 42, 'ivot, vesmr a vbec', 'Star trek', 'Enterprise']
loha3:aliasriapokusovsozoznamami.ovypunasledujceprkazy?
print(a[2:4])
print(a[2:7])
print(a[6:8])
print(a[2:])
print(a[:3])
print(a[:2]+a[3:])

Prvprkazvmvypekuszoznamu,ktorzanaprvkomslo2(tojetret)akonpred
prvkomslo4(tojepiaty),takevype['ivot, vesmr a vbec', 'Star trek'].Je
dleitsipamta,eaksavPythonezadvajrozsahy,vdytofungujetak,eavokrajtam
patrapravnie.
Druhprkazprekvapivochybunevype.Akrozsahkonzakoncomaktulnehozoznamu,
zobersavetkyprvkydokoncazoznamu,takeprkazvype['ivot, vesmr a vbec',
'Star trek', 'Enterprise'].Chybouneskonanitretprkaz.Akjerozsahplnemimo,
vsledkombudeprzdnyzoznamaprkazvype[].
tvrtprkazvypeaszoznamuodprvkuslo2dokonca,tedaop['ivot, vesmr
a vbec', 'Star trek', 'Enterprise'].Piatyprkazvypeaszoznamuodzaiatkupo
prvok slo 2 (prvok slo 3 tam u nebude!), take vsledok bude ['Vek tresk', 42,
'ivot, vesmr a vbec'].
Posledn prkaz ukazuje, e zoznamy meme spja obyajnm +. Ke spojme dva
podzoznamy uveden v prkaze, dostaneme ['Vek tresk', 42, 'Star trek',
'Enterprise'].
Podobne,akoprijednotlivchprvkoch,memedozoznamupriradzovaanahrdzaajcel
seky.Aknaprkladzadmeprkaz
a[1:3] = ["Han Solo", "Star wars", "Yoda", "Leia"]
taksaprvok.1aprvok.2(tedadruhatret)zmaanahradiasauvedenmityrmiprvkami.
Zoznamatedabudevyzeratakto:
['Vek tresk', 'Han Solo', 'Star wars', 'Yoda', 'Leia', 'Star trek',
'Enterprise']
Aby sa vm so zoznamami robilo pohodlnejie, mte k dispozcii mnoho prjemnch
funkci.Funkciepouvatetak,enapetemenozoznamu,potombodkuapotommenofunkcie.
Akbysmenaprkladchcelinzoznamutriedi,napemea.sort()akesihopotomnechme
vypsa,budevom
['Enterprise', 'Han Solo', 'Leia', 'Star trek', 'Star wars', 'Vek
tresk', 'Yoda']
Privolantejto funkciesimusteda pozor,abyvzozname boliveci,ktorsadajnavzjom
porovnva.Kebystetamstlemalitextovreazceajsla,funkciabyvyhlsilachybu.
Akbysmechcelinzoznamotoi,zadmeprkaz a.reverse().Akbysmechcelina
konieczoznamupridaprvok "Ender",zavolmeprkaz a.append("Ender"), akchcemezo

14
zoznamuzmazaStartrek,robsatoprkazom a.remove("Star trek") aakchcemezmaza
poslednprvokzoznamuapritomhovloidopremenneje,spravmetoprkazome = a.pop()
loha4:obudevzoznamea,kesnmtotovetkospravte?
Okremtchtofunkciexistujeteniektoralie.Prpadnchzujemcovodkazujemena
Googleamanuly.
Okremfunkcispomocouktorchmemezoznamyupravovaexistujajfunkcie,ktor
priamozoznamyvytvraj.Spomemesinajdleitejiuznichfunkciurange.
range(10) vytvorzoznam [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Rovnako,akopri
indexoch zana zoznam nulou a kon pred zadanou hranicou. range(5,10) vyrob zoznam
[5, 6, 7, 8, 9]zanasapkouakonpreddesiatkou.range(5,10,2)vyrobzoznam
[5, 7, 9] zanasapkou,konsapreddesiatkouavekoskrokuje2.Taktozoznamy
budemepouvaasto.8
Spomemeetekrtkoaliedvaspsoby,akonapchaviacdajovdojednejpremennej.
Prvznichjentica.Vecivnnicisaoddeujiarkou,okolonticesamudaokrhleztvorky,
aleniespovinn.Nticumemevyrobiprkazom
k = 2, 3, 5
Tie meme k jednotlivm prvkom pristupova s pomocou indexov, teda naprklad k[0] m
hodnotu2.Narozdielodzoznamusaalejednotlivprvkynedajmeni.Nticamaletvhodu,
esadahkorozbinaspnaprvky.Memetedaspravipriradenie
p, q, r = k
avpbude2,vqbude3avrbude5.
Totosaobashod,kepotrebujemevymeniobsahdvochpremennch.Nemusmeani
robiokukucezaliupremenn.Vmenapremennchmeprebehnpriamotakto:
a = 5
b = 3
a, b = b, a

Povykonantchtoprkazovbudevatrojkaavbpka.
loha5:Vyskajte.
Posledn spsob na masov ukladanie dajov je slovnk. Rovno ho predvedieme na
prklade:
slovnik = {"ahoj":"hello", "svet":"world"}
print( slovnik["ahoj"], slovnik["svet"] )
slovnik["dovidenia"] = "goodbye"
print( slovnik["dovidenia"] )

Akostesiuuritevimli,slovnkfungujepodobne,akozoznam,aleakoindexsanepouvaslo,
alevpodstatehocio.Vnaejukkestoreazce.Akometevidievtreomriadku,doslovnka
metekedykovekdodvanovpoloky.
loha6:Vyskajteatvorivorozvite.
8 Zoznamy vytvoren pomocou range s istm spsobom zvltne. Nemete naprklad sta
range(3)+range(4),pretoevsledokbyuneboltypu range.Akzoznam [0, 1, 2, 0, 1, 2, 3] naozaj
potrebujetevyrobi,mustetiezoznamyzmeninaobyajnprkazomlist.Hadanzoznamvmtedavyrobprkaz
list(range(3)) + list(range(4))

15
Pri dtovch truktrach v Pythone si treba da pozor na jednu vec. Pekne ju ilustruje
nasledujcapostupnosprkazov:
a = [ 2, 4, 6 ]
b = a
a[1] = 100
print(b[1])

omyslte,akhodnotuPythonvype?tyrialebosto?
Vyhralit,ostavilinasto.Vecitotifungujtak,epriradenie
a = [ 2, 4, 6 ]
vskutonostiznamenurobzoznam,zapamtajsihoadajmumenoaapriradenie
b = a
znamentomuistmuzoznamudajeteajmenob.Ketedazmenmedruhprvokvzozname a,
zmensaajdruhprvokvzoznameb.Aknmtotosprvanienevyhovujeavpremennej bbysme
chcelimascekpiuzoznamua,alebolabytoinkopiaazmenyakabysananejneprejavovali,
priradenievdruhomriadkujetrebaurobitakto:
b = list(a)
Funkcialistzabezpe,esazozoznamu,ktorjevavytvorkpia.Tejdmemenob,takesaa
sbuovplyvovanebud.Podobneakchcemevytvorikpiuslovnka,musmepouidict:
dictionary = dict(slovnik)
Kebysmespraviliibadictionary = slovnik,malibysmestleibajedenslovnk,tenbymal
aledverznemen:slovnikadictionary.
loha7:Pochopteavyskajte.
Na zver tejto lekcie ete jedna poznmka: aj obyajn textov reazce s v podstate
zoznamyadsasnimitaknarba.Kevykontenasledujceprkazy:
a = "najneobhospodrovvatenejieho"
print(a[7:15])

Pythonvmnapehospodr.
loha8: Ibaspomocoupremennej a zpredolejukkyajejpodreazcovvypte onajviac
rznych slov.Naprklad print(a[7:9]+a[18:20]+a[12:10:-1]) Mimochodom
opresnespravtposlednvecvtomste?

16
4.lekcia
Cykly
aleboopakovaniejematkamdrosti
Vtejtolekciibudemepodobneakovdruhejlekciivytvraprogramy,takespravtedobre,
aksijednotlivprkazybudeteukladadosboruapotomichspomocouPythonubudetespa.
Oprotiprogramomzdruhejlekciesaaleprogramyztejtolekciebudlivjednompodstatnom
detaile.Vdruhejlekciisatotikadprkaz,ktorstedoprogramunapsali,vykonalmaximlne
raz.Avprpade,emaltsmoluavyskytovalsavovntrinejakejpodmienenejastiapodmienka
nebolasplnen,nemuselsavyskytovaaniraz.Avtejtolekciisanaume,akotozariadi,abysa
nejakasprogramuvykonalaviackrt.
To,abysanejakkusprogramuopakoval,nmmuzabezpeiprvecykly.Pythonpozn
dvadruhycyklov:cyklusfor(poanglickypre)acykluswhile(poanglickykm).Pozrimesa
najprvnatenprvznich.
Predstavtesi,emtezoznam,vktorommteuloenmenhrdinov:
hrdinovia = ["Indiana Jones", "Spiderman", "Captain America", "Hulk",
"Iron Man", "Thor"]
achcetenapsaprogram,ktorokadomzuvedenchchlapovnape,ejehrdina.(Abyotom
nhodouniektonepochyboval)Jedenzospsobov,akotourobi,jenapsanasledujciprogram:
print(hrdinovia[0],"je hrdina!")
print(hrdinovia[1],"je hrdina!")
print(hrdinovia[2],"je hrdina!")
print(hrdinovia[3],"je hrdina!")
print(hrdinovia[4],"je hrdina!")
print(hrdinovia[5],"je hrdina!")
Istealeuznte,etaktoprstupmsvojenedostatky.Jednaksilovekpripadakocvien
opica,ktormakstledokolaCtrlCaCtrlV,pretoekadztchriadkovjeanajedendrobn
detail prakticky rovnak, jednak je zrejm, e ak by siniekto spomenul na nejakho alieho
superhrdinu,bolobytrebaprogramopraviadoplnialriadok.
Cyklustypuforumoujevykonanejakkuskduprekadprvokzurenhozoznamu.
Celtstranostutovyiememesjehopomocounahraditmitodvomariadkami:
for chlap in hrdinovia:
print(chlap,"je hrdina!")

Program, ktor tu vidte, vykon nasledujcu vec: Postupne zoberie vetky prvky zo
zoznamu hrdinovia, vlo ich do premennej chlap a vykon blok kdu, ktor je odsaden
otabultor.Predolvetusipretajteeteraz,pretoejedleit!
Rozmenen na drobn: Program najprv vlo do premennej chlap reazec "Indiana
Jones"avykontenprint,potomvlodopremennej chlapreazec "Spiderman"avykon
print,potomvlodopremennejchlapreazec"Captain America"avykonprintat.a
kmneprejdecelzoznam.

17
loha1:Pochopteavyskajte.Nezabudnitevprogramenastavipremennhrdinovia.Zmete
programtak,abystenezmenilizoznamhrdinovia,aleabyvypisovalibatchhrdinov,
ktorpatriamedziAvengerov.(TostodKapitnaAmericaalej.)
Abybolojasnejie,akoprkazforfunguje,ukemeniekokorznychprogramov,ktor
budmarovnakforcyklus.Cyklusbudeprechdzazoznam range(1,11),tedazoznamsel
od1do10.Kadprogrambudealerobinieotrochuin:
for i in range(1,11):
print(i)

sucet = 0
for i in range(1,11):
sucet = sucet + i
print(sucet)

sucin = 1
for i in range(1,11):
sucin = sucin * i
print(sucin)

for i in range(1,11):
s = ""
for j in range(i):
s = s + "*"
print(s)

Prvprogramslaod1do10postupnedosaddopremennejiaibaichvype.
Druhprogramsivyrobpremenn sucet,doktorejvcyklepostupnepripota najprv
jednotku,potomdvojku,potomtrojkuat.apodesiatku,takevpremennejsucetbudenakoniec
setvetkchselod1do10.Tretprogramfungujerovnako,akodruh,lenslamiod1do10
budeme postupne nsobi premenn sin, take v nej nakoniec bude uloen slo 10! (desa
faktoril).
tvrt program je troku komplikovanej. Odsaden as, ktor sa vykon postupne so
vetkmihodnotami,matyririadky.Vprvomsavytvorprzdnyreazec s.Potomnasleduje
alcyklus,ktorjedoprvhovnoren.Natomcyklejezaujmavto,esabudeopakovapresne
ikrt.Tedakebudevijednotka,zopakujesaraz,kebudevidvojka,zopakujesadvakrtat.
Vovntornomcyklesakreazcusprilepvdyjednahviezdika,takeakjenaprkladhodnota i
p,budeposkonenvntornhocykluvpremennej sreazec"*****".Nazvercyklusareazec
vype.
loha2:Uhdnite, o sprav tvrt program ete predtm, ako ho spustte. Nevindujte!
Vyskajteapochopte.
loha3:Vypotajtesetselod1do1000.
loha4:Vypotajtesinselod1do1000(tedaslo1000!).
loha5:Skstenapsaprogram,ktorbuderobipresnetoist,otvrtprogramzukky,ale
nebudemavsebevnorendvacykly.(Dsato!)

18
loha6:Napteprogram,ktorsivyptaodpouvateareazec,avypehotak,emedzikad
dvaznakyvlohviezdiku.Tedanapr.prevstup "Ahoj" vype "A*h*o*j".iadna
hviezdikanesmieprenieva.
Druhtypcyklujecykluswhile.Tenniejeviazannaiadnyzoznam,alenapodmienku.
Cyklussabudeopakovadovtedy,kmjepodmienkasplnen.Tmtospsobommemenaprklad
kontrolova,ijevstupodpouvateasprvny.Pozrimesiopukkovprogram:
1 vstup = ""
2 while vstup != "A":
3 vstup = input("Nap A: ")
4 if vstup != "A":
5 print("Hovoril som A!!!")
6 print("Hur, je to A!")

Riadky3,4a5sabudopakovadovtedy,kmjevpremennejvstupnieoin,akoA.Na
riadku3natamevstup.Riadky4a5sliaibanato,abysmepouvateovivynadali,aktozase
nezvldol. Ke sa mu konene podar zada A,cyklus skon (pretoe podmienka na riadku 2
prestane by splnen) a vykon sa riadok . 6, v ktorom sa program pote, e sa to konene
podarilo.
Podmienkanadruhomriadkusakontrolujevdypredtm,nesatelocykluspust.Preto
smemuselinastavipremennvstupetepredcyklom.Akbysmejunenastavili,dostalibysme
chybovhlku,lebobyPythonnevedelotestovapodmienkunariadku2.Akbysmepremenn
vstupnastavilinahodnotuA,cyklusbysanevykonalaniraz,lebopodmienkabyhnenazaiatku
nebolasplnen.
loha7:Natavajteslaadovtedy,kmpouvatenezadnulu.Potomvyptesetvetkch
zadanchsel.
loha8: Njditenajmenieslo,ktorjevieako10000ajedeliten31.(Rada:Vlotedo
premennej31apripotavajteknej31dovtedy,kmbudevsledokmenaleborovn,
ako10000.)
Scyklamisaviauetedvauitonprkazy,ktorsadajpouivobochtypochcyklov.
Prv je prkaz break (po anglicky zlom), ktor pouijeme, ke nejak cyklus potrebujeme
rchloukoni.Naprkladkebysmechcelinpredolprogramupravitak,epotrochzlch
pokusochusdime,etopouvatenezvldneaskonme:
1 vstup = ""
2 pocetZlych = 0
3
4 while vstup != "A":
5 vstup = input("Nap A: ")
6 if vstup != "A":
7 print("Hovoril som A!!!")
8 pocetZlych = pocetZlych + 1
9 if pocetZlych == 3:
10 break
11
12 if pocetZlych == 3:
13 print("Nevad! Niekedy nabudce.")
14 else:
15 print("Hur, je to A!")

19
Zriadili sme si nov premenn pocetZlych, v ktorej si budeme pota poet zlch
pokusov.Aksapouvatepomli,nariadku8zvmejejhodnotu.AkpremennpocetZlych
dosiahnehodnotu3,znamento,esapouvatepomlilutrikrtatakzavolmeprkaz break.
Ten spsob, e cyklus skon aprogram bude pokraova za nm. Tam musme pozrie, i sa
pouvatepomliltrikrt(vtedysateinebudeme,ibahopoutujemealebopovzbudme),aleaksa
nepomliltrikrt,vtedyhochvlimeme.
Vprpade,epouijemeprkazbreakvnejakomcykle,ktorjevnorendoinhocyklu,
zrusaibatennajvntornej.
loha9:Pochopteavyskajte!
loha10:Mesasta,enariadku12budehodnotapremennejpocetZlych4?Akno,ako?Ak
nie,preo?
Druhuitonslovojecontinue(poanglickypokrauj).Znamennatentobehcyklu
savykaliaspraval.Predstavtesi,echcemespotavetkyneprneslaod1do20.Mohli
bysmetospravinaprkladtakto:
1 sucet = 0
2 for i in range(1,21):
3 if i % 2 == 0:
4 continue
5 sucet = sucet + i
6 print(sucet)

Cyklusnariadku2zabezpe,eriadky3a5savykonajdvadsakrt,priomvibud
postupnevetkyslaod1do20.Riadkami3a4sialezabezpeme,eakbudeviprneslo,
programsananehovykale.Toznamen,eriadok5savykonibapreneprnehodnoty iaibatie
sadostandocelkovhostu.
Rozdielmedzibreakacontinuejeten,ekebysmenariadku4pouilibreak,cyklusby
skonil u pri i rovnom 2 a v premennej sucet by bola hodnota 1. Kee sme ale pouili
continue,cykluspreirovn2neskonil,ibanepokraovalalejnariadok5,alespustilsaznovu
salouhodnotoui.
loha11:Pochopteavyskajte.
loha12:Spravtetojednoduchiebezcontinue.

20
5.lekcia
Moduly
alebonevymajtekoleso
iadnyjazykurennavvojsoftvrusidnesnevystalensmosebe.asy,kedysikad
programtormuselvetkospraviodzkladovsm,snenvratnepre.Programovaniesarozrstlo
do mnohch smerov a zaha mnoh oblasti udskej innosti. Niektor udia programuj hry,
niektorrobiavekdatabzovsystmy,niektorprogramujmikroipypriemyselnchrobotov,
niektor sieov komunikan protokoly a kad z nich potrebuje trochu in sadu nstrojov.
Ataktorznesadynstrojovposkytujprvemoduly.
Modulyskniniceobjektovafunkci,ktorprevsurobiliinprogramtori,abysavm
dobrerobilo.KesinaintalujetePython,niektormodulyumtepriamokdispozcii.Okrem
nichexistujealemnohoalch,takeskr,nesapusttedonejakhoviehoprojektu,oplatsa
strvi nejak as googlenm, aby ste zistili, i u niekto nenaprogramoval bu rovno to, o
potrebujete,aleboasponejakvec,ktorvmprcuvrazneuah.Tradujesa,ePythonm
modulyplnenavetko.Ajetotakmerpravda.
Pomesaalepozrienaveci,ktormmekdispozciirovno.Ajtchjealerelatvnevea.
Ako sa d dozvedie, ktor to s a o obsahuj? Python v sebe obsahuje pomerne rozsiahlu
dokumentciu.Tjepsanpoanglicky,aleaktomysltesprogramovanmvne,takmskr
zanetetaanglickdokumentciu,tmlepie.
KesachcetedovolaPythonovskejpomoci,trebaspustiinterpreterPythonuakesavm
objaviatrizobky,ktorhovoria,ePythonpova,trebanapsaprkazhelp().Tmsaprepnete
doprostredianataniedokumentcie.KebudetechciesnaspdoPythonu,trebanapsaquit
alebostlaiCtrlD.Kealechcetenieovedie,metesasptabunakovslovPythonu
(vtedytrebanapsa keywordsznamentokovslov),alebosametesptananejak
veci,ktorspriamosasoujazyka(trebanapsatopicsznamentotmy),alebonapete
modulesavtedysanieodozvieteprveomoduloch.Pythonnavsvychrlzoznammodulovavy
simetevybera.
Je zrejm, e celm tm mnostvom modulov sa v jednej lekcii prehraba ned. Preto
spomemeaspodvaznich.Prvjekninicarandom.Ttokninicaobsahujemnostvovec,ktor
satkajnhody,nhodnchselatatistiky.
loha1:SpustitesiinterpreterPythonu,zadajteprkazhelp(),potomnapterandomapozritesi
dokumentciukukninici.Potompouitevyhadvaapozritesidokumentciuktejistej
kninicinainternete.
Pravdepodobnevstomnostvofunkci,ktorskdispozcii,zmiatlo.Srdcetatistikaby
sceplesalo,alenmzatiabudstaiibanejakzkladnveci:funkcia random(),ktorvyrob
nhodnrelneslozintervalu 0,1 ) ,funkciarandint(a,b),ktorvyrobnhodncelslo
zintervalu a , b (randint(1,6) bude teda fungova rovnako, ako hracia kocka), funkcia
choice,ktordostanenavstupezoznamavyberieznehonhodnprvokafunkcia shuffle,
ktordostanenavstupezoznamanhodnevompoprehadzujeprvky.
Radibysmetietofunkciepouvalivnaomprograme.AkopresvediPython,abynmto
dovolil?Jeviaceromonost.

21
Prvjet,edoprkazovhoriadku,alebodoprogramunapeme
import random
Tospsob,esakvmuprogramupripojcelmodulrandomavymetepouvajehofunkcie
tak,enapetemenomodulu,bodkuamenofunkcie.Kusprogramutedamevyzeranaprklad
takto:
import random

a = ['a','b','c','d','e']
random.shuffle(a)
print(a)

print(random.choice(a))
print(random.random())
print(random.randint(1,6))

loha2:Vyskajtesito.
Druhmonosjenenatacelmodul,aleibatiefunkcie,ktorbudetepotrebova.Akby
smechcelinataibatiefunkcie,ktorsmepouilivpredolejukke,spravilibysmetoprkazom
from random import shuffle, choice, random, randint
Tentozpismoprotipredolmudvevhody.Prvjet,enemustenatavamilin
funkci,kevmstaiatyri.Druhjet,epotomvprogramenemustevypisovapredmeno
kadejfunkcietorandomsbodkou.Vtejtodruhejpodobebytedapredolprogramvyzeraltakto:
from random import shuffle, choice, random, randint

a = ['a','b','c','d','e']
shuffle(a)
print(a)

print(choice(a))
print(random())
print(randint(1,6))

To,enemusmevypisovamenomodulu,mebyaledvojsenzbra.Aktotivyrobte
funkciu,ktorsavolchoiceajvovaomprograme9,budesavmstoufunkciouzmoduluplies.
Aktotorizikohroz,odporasadraskrtohoprvhoprstupu.
loha3:Vyskajtesiajtentodruhpostup.Dalotorovnakvsledky,akovpredolejverzii?
Tretiamonosje,ezmodulunatatevetkyfunkcie.Robsatoprkazom
from random import *
Tentospsobalepouvajteonajmenej,pretoetaktosidosvojhoprogramunaahtemnostvo
novchfunkciaakstesinepretalidokumentciuporiadne,takopoloviciznichaninetute,e
akosavolaj.Ariziko,esavmpomotajmenfunkcizmodulusvaimifunkciami,jenaozaj
vek.
loha4:Totoradejanineskajte.

9Otom,akosivyrobivlastnfunkcie,etebudere.

22
aliakninica,ktorvtejtolekciispomenieme, jekninica datetime.Akounzov
napoved,sjejpomocousaddobrepracovasdtumamiaasmi.
loha5:Pozritesimanulkukninicidatetime,buvnpovednomsystmealebonainternete
podatoho,ovmviacvyhovuje.Zvldobresipozrite,akofungujobjekty datea
timedelta.
loha6:Napteprogram,ktorvypota,kokomtednesdn.
loha7:Napteprogram,ktorvypota,akdtumbudeostodnodteraz.
loha8:Napteprogram,ktorvypota,naakdevtdnipadnVianocevroku3000.
loha9:Napteprogram,ktoresstokrthodkockouavypevm,kokokrtpadlaestka.
loha10:Napte program, ktor predol pokus pdesiatkrt zopakuje, vsledky ulo do
zoznamuatenpotomutriediodnajmenchhodntponajvieavype.
loha11:Napteprogram,ktorzsel1a49vyberiesedemnhodnchrznychsel.
loha12:Natajte modul antigravity (prkaz import antigravity) a pozrite sa, o to
sprav.

23
6.lekcia
Funkcie
aleboakofungujeevolcia
Uisaprogramovajevistomzmyslepodobn,akouisajazyk.Najprvsanautenejak
slovka, pochytte zklady gramatiky, potom sa ute hovori nieo zmyslupln a nakoniec
pochoptelogikujazykaasteschopnvommyslie.Predollekcieboliotchprvchslovkach
agramatike.Vtejtolekciisaualepoksimenaprogramovanieozmysluplnejie.Samozrejmesa
popritomajnieonovnaume.
Tonieonovbudfunkcie.Funkciajekuskdu,ktormsvojosobitzmyselaoplatsa
hokvliprehadnostipomenova.Taktokuskdumemepouinaviacerchmiestachvalom
programeibatak,ezavolmemenofunkcieanemusmetamprepisovaceltenkd.Okremtoho
niektorfunkciemuvrtivsledok,ktormemeneskrpoui.Podotantejtolekcieby
malobyzrejm,efunkcienmmuznanesprjemniivotaspsobi,ecelprogrambude
psobizmysluplnejmdojmom,nebolodoterazzvykom.
Vtejtolekcisatotipoksimenaprogramovaevolciu.Budetoevolciaplneumel,
ktorstm,osadejevprrode,nebudemaveaspolonho,namiestotyrochtypovbz,ktorsa
vyskytujvDNAbudemepouvaslaod0do9anamiestozhrubatrochmilirdbzodkadho
zrodiov,akotomajudia,ichnaevirtulnepotvorybudmaibap.
Najprvsitedaspravmefunkciu,ktornmnhodnvirtulnupotvoruvyrob.Keesa
budemeastohrasnhodou,budemepotrebovanejakfunkciezmodulurandom:
1 from random import random, randint, choice
2
3 def potvora():
4 p = []
5 for i in range(5):
6 p.append(randint(0,9))
7 return p

Nariadku3zanadefincianaejprvejfunkcie potvora.Funkciuvytvramekovm
slovomdefpoktoromnasledujemenofunkcie,ztvorky,vktorchmubyuvedenparametre
advojbodka.Vytvormesiprzdnyzoznampapotomdonehovlomepnhodnchselod0do
9.Tentozoznampotomnariadku7funkciavyhlsipomocouprkazu return zasvojvsledok.
Funkciasaukonbuprkazomreturn,alebotak,eprdenakoniec.
Kechcemenaunovfunkciuvyska,memepofunkciivloitestovackd,vktorom
jupouijeme.Tenusamozrejmenebudeodsadenotabultor.Ketedachcemevidievsledok,
ktorfunkciapotvora()vrti,memepouiprkaz
print(potvora())
loha1:Vyskajte.Vyskajteviackrt,nechvidte,akpeknpotvorynaafunkciageneruje.
Potomtestovackdvymateavprogramesinechvajtelenhotovfunkcienabudce
budemetestovazasnieoalie.
Potvorysanmgenerujpekne.Leneniejepotvoraakopotvora.Niektorskrajieako
in.Totinajkrajiapotvora,akmeexistova,jepotvora[1, 2, 3, 4, 5].Neptajtesa,

24
preo.Potvoryskrtkamajtakvkus.Noapotvorajetakpekn,nakokchmiestachsazhoduje
snajkrajoupotvorou.Najkrajiapotvoramtedakrsu5,potvora[1, 4, 7, 9, 5]mkrsu2,
pretoesasnajkrajoupotvorouzhodujenaprvomaposlednommieste(toemniekdevsebeete
ajtvorkujejnepomenemjunasprvnommieste)apotvora[9, 3, 6, 0, 1]mkrsu0.
Chudinka.
Terazsiurobmefunkciukrasa(p),ktorbudemazalohuzisti,akkrsnajezadan
potvora:
8 def krasa(p):
9 najkrajsiaPotvora = [1, 2, 3, 4, 5]
10 k = 0
11 for i in range(5):
12 if p[i] == najkrajsiaPotvora[i]:
13 k += 1
14 return k

Ttofunkciamvstupnparameterpremenn p.Dotejtopremennejsiulopotvoru,
ktorhodltestova.Nariadku9sizadefinujenajkrajiupotvoruanariadku10nastavpremenn
k,vktorejbudepota,akjepotvorakrsna,nanulu.Vcyklenariadkoch11a13funkciaprejde
vetkypozcievgenetickomkdeaaksatestovanpotvoranadanejpozciizhodujesnajkrajou
potvorou,zvikrsuo1.10Keprebehnecelcyklus,krsajevypotanafunkciajuvrtiako
svojuhodnotu.
Funkciumeteotestovanasledujcimtestovacmkdom:
a = potvora()
print(a, krasa(a))

Vyrobenpotvorusivomulomedopremennejaavypemejuspolusjejkrsou.Vimnitesi,
e pri volan funkcie krasa sa hodnota z premennej a vloila do premennej p. Funkcie vo
veobecnostimajsvojeskromnpremennakemu,pouvajtie.Premennzvonkumu
pouitie,aleibavtedy,kenemajinmonos.
loha2:Vyskajteto.Aknajkrajiupotvorusavmpodarilovygenerova?
Potvory s spoloensk ivochy, ktor ij v svorkch. Kad svorka pozostva
zdesiatichpotvor.Nasledujcaprocedranmtaksvorkuvyrob:
15 def svorka():
16 s = []
17 for i in range(10):
18 s.append(potvora())
19 return s

loha3:Pochopte,akofunkciafungujeaotestujteju.Testovackdsivymyslite.
Kestevpredolejlohevypisovalisvorku,vpisbolpravdepodobnenevemiitaten.
Pretobybolofajnurobisifunkciu,ktorvypesvorkukrajiekadholenadojednhoriadku
apodamonostknemuajnape,akjekrsny.

10Tusmesidovolilipouiprogramtorskskratku:Namiestoprkazu k = k + 1,ktordopremennej k
vlohodnotuo1viu,netambolapredtm,smepouiliprkaz k += 1,ktorpremennvavozvohodnotu
vpravo,iespravtoist,lenmusmemenejpsa.

25
20 def vypis(s):
21 for pot in s:
22 print(pot, krasa(pot))

Ttofunkciadostanenavstupesvorkuaprekadhojejlenavypepatrinpotvoruajjej
krsu. Otestujte si ju, km budete ta alej. Vak je vpis kraj, ako ke svorku vypete
spomocoujedinhoprint?
Keesajednoevolciu,patrilobysapovedaviacotom,akotomajpotvoryzariaden
spotomstvom.Vecisamajtak,eakchcematpotvorapotomstvo,mealenemussinjs
partnera.Aksipartneranenjde,mpotomkovsamasosebou.11 Potomokzdedkadbzupo
jednomzrodiovaibanhodarozhoduje,epoktorom.Okremtohoaleetemedochdza
kmutcim.Spravdepodobnosou8%mekadbzanadobudnplnenhodnhodnotu.
Potomkadvompotvormvyrobnasledujcafunkcia:
23 def potomok(a,b):
24 mlade = []
25 for i in range(5):
26 if randint(0,1) == 0:
27 mlade.append(a[i])
28 else:
29 mlade.append(b[i])
30 for i in range(5):
31 if random() < 0.08:
32 mlade[i] = randint(0,9)
33 return mlade

Funkciasinajprvvyrobprzdnyzoznam mlade.Potomsinariadkoch25a29pkrt
hodmincou(vygenerujenhodnslo0alebo1)aakpadne0,prilepmladmubzuodrodiaa
aakpadne1,prilepmladmubzuodrodiab.12Vcyklenariadkoch30a32prebehnmutcie.
Akgenertornhodnchselvygenerujeslo,ktorjemenie,ako0,08(pravdepodobnos,esa
tostane,jeprve8%),taksabzazmennanejakplnenhodnhodnotu.Hotovmladpotom
funkciavrtiakohodnotu.
loha4:Otestujte.Odporantestovackdje
print(potomok([0, 0, 0, 0, 0],[1, 1, 1, 1, 1]))
Akoastodochdzakmutcim?astejiealebozriedkavejie,nesteakali?
Spoloenskivotsvorkyfungujetak,epotvory,ktorpatriadokrajejpolovicesvorkysi
vyber partnera (vyber si nhodne lska krsnych potvor je slep) a s nm maj dvoch
potomkov. Ak si vyber niekoho z krajej polovice, tak ten si potom tie ete vyber svojho
partnera. Do alej genercie tak prejde presne toko potvor, koko bolo v predolej. Funkcia
novasvorka(s)dostanenavstupsvorkuavyrobznejpodatchtopravidielaliugenerciu:
34 def novasvorka(s):
35 s = sorted(s, key = krasa, reverse = True)
36 nova = []
37 for i in range(int(len(s) / 2)):
38 partner = choice(s)
39 nova.append(potomok(s[i],partner))
40 nova.append(potomok(s[i],partner))
41 return nova
11Volsatopartenogenzaavbiologickomsvetetozvldajnaprkladvoky.
12Podobnmechanizmussavprrodevolcrossingoveradejesaprivznikupohlavnchbuniek.

26
Nariadku35funkciazoradsvorkupodakrsy.Keepotrebujememasvorkuzoraden
odnajvejkrsyponajmeniu,trebapritriedennastaviopanporadie.Nariadku36vyrobme
premennprenovsvorku.
Vcyklenariadkoch37a40pridvamedonovejsvorkypotomkovpotvorzostarejsvorky.
Funkcialen(s)nmprezrad,kokolenovsvorkam.Ttohodnotuvydelmedvomiazmenme
nacelslo.Taktoprejdemelenkrajiupolovicusvorky.Kadmulenovivyberiemenariadku
38nhodnhopartneraadonovejsvorkypridmeichdvochpotomkov.Vslednsvorkufunkcia
vrtiakosvojuhodnotu.
A meme spusti evolciu. Na zaiatku vygenerujeme nhodn svorku a km si to
nerozmyslme,memepotaalieaaliegenercie.Kesmeuvtejtolekciivetkodvalido
funkci,dajmetamajsamotnevolciu:
42 def evolucia():
43 s = svorka()
44 generacia = 0
45 koniec = False
46 while not koniec:
47 print("Genercia: ",generacia)
48 vypis(sorted(s, key=krasa, reverse = True))
49 vs = input(":")
50 if vs == 'x':
51 koniec = True
52 s = novasvorka(s)
53 generacia += 1

Vpremennej generacia sibudemepota,kukokejgenerciismesadopracovali.Na


riadku48vypemezoradensvorku,nariadku49savdyoptame,iuchcepouvatekoni,
ak zad okovek okrem x (teda naprklad aj ke iba stla Enter), vyrobme nov svorku
azvimehodnotuvpremennejgeneraciao1.
Nazveretettofunkciutrebaspusti.Nezabudnitevloiriadok
54 evolucia()

loha5:Pochopteaotestujte.Akosasvorkamen?Objavsaniekedypotvoraskrsou4?Objav
saniekedypotvoraskrsou5?
loha6:Vyrobte funkciu priemernaKrasa(s), ktor dostane ako vstupn parameter svorku
avypota jej priemern krsu. Upravte funkciu evolucia tak, aby si do zoznamu
ukladalapriemernkrsuvkadejgenercii.Nakoniectenzoznamvypte.
loha7:Upravtefunkciunovasvorkatak,abybolidvenajkrajiepotvoryobdarendlhovekosou
aautomatickyprelidonovejsvorky.Partnerasibudpotomvyberaibatyrinajkrajie
potvory(vrtanetchdlhovekch).Akosabudevyvjasvorkavtakomtoprpade?
loha8:Vymyslitesinejakzaujmavpravucelhoprocesuauskutoniteju.
Nprkladevolunhoalgoritmubolnetypicktm,ebolodopredujasn,akomvyzera
skveljedinecakomutovetkomsmerova.Aksaalepodobnalgoritmyspojasnejakou
fyziklnousimulciou,situciasastvaeteoveazaujmavejou.Svediaotomajnasledujcetri
vide:
http://www.youtube.com/watch?v=Xe_euHneE0I
http://www.youtube.com/watch?v=JBgG_VSP7f8
http://www.youtube.com/watch?v=cP035M_w82s

27
7.lekcia
Objekty
alebodlhlekciaosardinkcharalokoch
V predolej lekcii sme si ukzali, ako si vek program rozdeli na menie lohy
aspomocoufunkcismetakzvldlinapsanieo,obysavjednomobrovskomprogramerobilo
naozajzle.Funkciesztohtohadiskanramneuitonvec.
Vtejtolekciisialeukemeprstup,ktorsavniektorchsitucichosvedileteovea
viac.Namiestotoho,abysmevytvralifunkcie,budemevytvraobjekty.Objektybudmanejak
svojevlastnostiajnejaksvojefunkcie,spomocouktorchbudvediemedziseboukomunikova.
Aketovetkospustme,budetorobipresneto,opotrebujeme.
Pome ale na vec postupne. Zanime klasickm prkladom. Predstavte si, e idete
programova vek databzu zamestnancov pre nejak firmu. Zaneme nieim skromnm.
VytvormesitrieduZamestnanec,ktorbudeobsahovatridaje:meno,priezviskoaplat.Keje
triedahotov,memesizaavytvraobjektydanejtriedyasnimirobi,ouznmezavhodn.
Dobretovidnonanasledujcomprklade:
1 class Zamestnanec:
2 meno = ""
3 priezvisko = ""
4 plat = 0
5
6 jozo = Zamestnanec()
7 jozo.meno = "Jozef"
8 jozo.priezvisko = "Mrkvika"
9 jozo.plat = 753.20
10
11 print("%s %s m plat %.2f euro" %
12 (jozo.meno, jozo.priezvisko, jozo.plat))

Na riadkoch 1 a 4 sme si vytvorili triedu Zamestnanec a jej jednotliv atribty sme zatia
nastavili na przdne reazce a na nulu. (Atribt je tak uen pomenovanie pre premenn
nejakhoobjektu.)Nariadku6smesivytvoriliobjekt jozo,ktorjetriedy Zamestnanec,tm
pdomumvytvorenvntornpremennjozo.meno,jozo.priezviskoajozo.plat.Tie
majalezatiatandardnhodnotynastavennariadkoch2a4.Nariadkoch7a9tietohodnoty
prepemeanariadkoch11a12vypemeoJoovidverninformcie.
Vimnitesipercentovfintu,ktorsmepouiliprivpise.Akvreazcipouijemepecilne
sekvencie,memePythonupoveda,nechichnahradhodnotamiznticezareazcom.Opercia,
ktormtonahradenienasvedommznak %.Jenariadku11nakonci.Vnaomprpadesme
pouili dve sekvencie %s, ktor bud nahraden reazcom (z anglickho string) asekvenciu
%.2f,ktorbudenahradendesatinnmslom(zanglickhofloat),ktorsavypespresnosou
dvemiestazadesatinnouiarkou,takeJanovplatvypemespresnosounacenty.13
loha1:Vyskajte.Vytvortesialchdvochzamestnancovavetkchvypte.

13 T,ktor programovali vjazyku C,si istespomnaj, epodobn pecilne sekvencie pouval prkaz
printf.

28
Prvouvhodouobjektovje,eichmeteahkoupravovaapridvaimfunkciepoda
vlastnej vahy. Naprklad je celkom neikovn, e ke chceme vypsa informcie o plate
zamestnanca,zakadmmusmenapsapomernevekprkaz.Oveaikovnejiebybolo,keby
objektzamestnanecmalmetduvypis(),ktorsaovetkopostarsama.(Metdajetakuen
pomenovanieprefunkciunejakhoobjektu.)Zariaditoaleniejeproblm.
1 class Zamestnanec:
2 meno = ""
3 priezvisko = ""
4 plat = 0
5 def vypis(self):
6 print("%s %s m plat %.2f euro" %
7 (self.meno, self.priezvisko, self.plat))
8
9 jozo = Zamestnanec()
10 jozo.meno = "Jozef"
11 jozo.priezvisko = "Mrkvika"
12 jozo.plat = 753.20
13 jozo.vypis()

Funkciusmedefinovalivovntritriedy Zamestnanec nariadkoch5a7.Pouitjena


riadku13.Vimnitesi,efunkciamjedenparametersnzvom self.Akdefinujemefunkciuvo
vntritriedy,prvparametertejtofunkciebudevdyobjektdanejtriedy,sktormsaprvepracuje
aaprpadnalieparametresadajnastaviprivolanfunkcie.Tenprvparametersimete
nazva, ako chcete, ale poui self patr k dobrmu Pythonovskmu programtorskmu
vychovaniu ake bude po vs niekto program ta, bude hne vedie, o o sa jedn. Tento
parameter sme vyuili na riadku 7. Ak bude teda funkciu vola objekt jozo, vype to daje
oJoovi,akmtevytvorenobjektfero,vypetodajeoFerovi.
alianeikovnvecje,ehneakonariadku9vytvortenovhozamestnanca,mustena
alchtrochriadkochnastavovanovhodnoty.Kebysatietodvaprocesydalispoji,bolobyto
strunejieajprehadnejie.
Naeproblmyvyrieiskvelfunkcia__init__.(Nzovjedvapodtrnky,initazasedva
podtrnky.)Ketotinejaktriedamfunkciustmtomenom,zavoljuautomatickyvdy,ke
savytvranovobjekttejtotriedy.Taktofunkciasanazvakontruktor.Pouijesanasledujcim
spsobom:
1 class Zamestnanec:
2
3 def vypis(self):
4 print("%s %s m plat %.2f euro" %
5 (self.meno, self.priezvisko, self.plat))
6
7 def __init__(self, meno, priezvisko, plat = 337.70):
8 self.meno = meno
9 self.priezvisko = priezvisko
10 self.plat = plat
11
12 jozo = Zamestnanec("Jozef", "Mrkvika", 753.20)
13 fero = Zamestnanec("Frantiek", "Otruba")
14 jozo.vypis()
15 fero.vypis()

29
Kontruktorsmevytvorilinariadkoch7a10.Mtyriparametre.Prvjeobjekt,sktorm
saprvepracuje.aliesmeno,priezviskoaplat,ktorchcemeobjektunastavi.Nariadkoch
8a10vytvormeobjektuatribtymeno,priezviskoaplatanastavmeichnahodnoty,ktor
dostanefunkciaakoparametre.
Ke teraz vyrbate nov objekt, parametre, ktor pouijete pri jeho vrobe, sa dostan
priamokontruktoru.To,estieparametreibatriakontruktorichmatyri,nevad.Prv
parameterkontruktora jeodkaznaobjekt,takehodnotysadosadiaaoddruhhoparametra
alej.
Akosimetevimn,poslednparameterkontruktoramnastaventandardnhodnotu
337,70eura(ojeminimlnamzda).Toznamen,eaksaposlednparameterneuvedie,pouijesa
ttohodnota.Vyskalismeto,kesmevyrbaliobjektfero.
loha2:Vyskajteapochopte.
NaatriedaZamestnanecbysasamozrejmeetedalavylepovamnohmispsobmiadali
bysajejpridvaalieaaliepostupnostiafunkcie.Totovylepovaniejejednazvec,ktors
na objektovom prstupe k programovaniu fajn. Zanechajme ju ale svojmu osudu a sksme
naprogramovazasenieoinpirovanbiolgiou.
Namiesto programovania ale zaneme popisom toho, o chceme programova. Popis
budeme stle spresova, a km nebude zrejm, ak objekty budeme v naom programe
potrebova,akmajmaatribtyaobudmazalohuaapotomsapustmedoprogramovania.
Budeme chcie naprogramova more. V tom mori bud i dva druhy rb: sardinky
araloky.14 Sardinky er planktn a mnoia sa. Kee planktnu je dos, sardinky by asom
zaplnilicelmore.ralokyersardinky.Aksnarat,tiesamnoia,aleaknaratnies,tak
uhyn.
Kesipozorne pretate predolodsek,zistte, e sav omvyskytujtieto podstatn
men:more,ryby,sardinky,raloky,planktn.Planktnusanprogramvenovanebude.Pouili
smehoibanavysvetlenietoho,enmsardinkypribdajlentak.Ostatntyrivecishorci
kandidti na to, aby sme z nich spravili triedy nho programu. Aby sme situciu trochu
zjednoduili,nebudemevytvraanitrieduryba,ktorbyvsebezahalavetko,omajsardinky
aralokyspolon.15Ostalinmtedatritriedy,ktorbudetrebavytvori:sardinka,ralokamore.
More bude reprezentovan tvorekovm papierom a na kadom polku sa bu bude
nachdzasardinka,ralok,alebotamnebudeni.Pomesapozriepodrobnejienato,obud
musiejednotlivtriedyzvldnu.
TriedaSardinkasibudemusieosebepamtasvojtypbudetopsmenko's',abybola
odlitenodraloka,budesipamtaobjektmore,doktorhopatr,budesipamtasradnice,na
ktorchsaprvenachdza,svojvek,as,vktoromdosiahnedospelos(prisardinketobudtri
kol),interval,vakomsamemnoi(razzadvekol)aas,predakmsanaposledymnoila.
aliavec,nadktorousabudetrebazamyslie,sveci,ktorbudemusiesardinkadokza.
Budesamusievediepohnnaniektorsusednpolko(metdapohyb)abudesamusievedie
rozmnoi(metdapotomstvo).

14ralokyvskutonostiniesryby,aleparyby.
15Vytvoritaktoobjektalememazmysel.Kedokontettolekciu,metesanatotomiestovrti
apremysliesi,akobyobjektRybavyzeralaakbybolojehomiestovprograme.Prerobiprogramtmtospsobom
bydokoncamohlobyvistomzmysleprirodzenejie.

30
Kesmesitotovetkorozmysleli,memesapustidoprogramovaniasardinky.Pripsan
kdubudemevyuvaajfunkcietriedyMoreoktorejzatiaveminebolare.Peknnatomje,e
aniniejenutn,abybola.Nato,esanmnejakmetdatriedy Morehod,memeprspoas
vytvraniasardinkyapokojnejumemepoui.LenjupotomnesmiemevtriedeMorezabudn
vytvori.Kdsardinkytedabudevyzeratakto:
1 from random import choice
2
3 class Sardinka:
4 """Trieda reprezentujca obe"""
5 def __init__(self, more, x = -1, y = -1):
6 self.more = more
7 if x == -1 and y == -1:
8 volnemiesta = more.volneMiesta()
9 if volnemiesta == []:
10 raise Exception("Pln more!!!")
11 x,y = choice(volnemiesta)
12 self.x = x
13 self.y = y
14 self.interval = 2
15 self.posmnoz = 0
16 self.dospelost = 3
17 self.vek = 0
18 self.typ = 's'
19 def _mlade(self,x,y):
20 s = Sardinka(self.more,x,y)
21 return s
22 def pohyb(self):
23 volne = self.more.blizkeVolno(self.x,self.y)
24 if volne != []:
25 x,y = choice(volne)
26 self.more.presun(self, x, y)
27 self.vek += 1
28 self.posmnoz += 1
29 def potomstvo(self):
30 if self.vek >= self.dospelost and self.posmnoz >= self.interval:
31 volne = self.more.blizkeVolno(self.x,self.y)
32 if volne != []:
33 x,y = choice(volne)
34 novaRyba = self._mlade(x,y)
35 self.more.pridajRybu(novaRyba)
36 self.posmnoz = 0

Kontruktor m za lohu nastavi sardinke vetky atribty. M okrem parametra self


alietriparametre.Prvoznaujemore,doktorhobudesardinkapatri,aliedvaoznauj
sradnice,kdesamvytvori.Vprpade,eprivolanfunkcieneboliparametrezadan,alebomaj
obesradnicehodnotu -1,vyptamesinariadku8odmorasradnicevetkchvonchmiest
(predpokladme,emetdatriedy More volneMiesta vrtizoznamprovsel)ajednoznich
nhodnevyberieme(riadok11).Akjezoznamprzdnyatedauvmoriiadnemiestonezostalo,
vyhlsimechybu(riadok10).Akchybunezachytmepomocoutry,akotobolopopsanvdruhej
lekcii,programsaukon.Aknejakvonmiestomme,vyberiemezvonchmiestnhodn
pomocou funkcie choice (riadok 11). Atribt self.interval uruje, ako asto sa me
sardinka mnoi, atribt self.posmnoz hovor, kedy sa sardinka naposledy mnoila, sardinka
dosiahnedospelosvovekuself.dospelostajejaktulnyvekjeself.vek.
loha3:Metdapohybjedobreitatenajbezkomentra.Pokstesapochopi,orob,etepred
tm,akobudetetaalej.

31
Nariadku23smezavolalimetdublizkeVolno,vktorejnmmorevrtizoznamvetkch
vonchpolok vokol zadanch sradnc.Akten zoznam nie jeprzdny, vyberieme z neho
nhodnprvokapoiadamemore,abyrybunatpozciupresunulo.Nazverzvmehodnoty
atribtovvekaposmnozo1,pretoepresardinkuuplynulojednokolo.
Metda potomstvo fungujepodobne.Najprvskontroluje,eijerybaudospelai
nemalapotomstvoprlinedvno(riadok30).Potomzist,ijenaokolonejakvonmiesto,kam
bysadalorozmnoi(riadky31a32).Akvonmiestas,takznichjednonhodnevyberie
apomocoumetdy_mladevytvornovsardinkusozadanmisradnicami.Zavolmetdumora
pridajRybu,spomocouktorejsimorevimne,epribudlanovryba.Nazvernastavsardinke
asposlednhomnoeniana0.
Vimnitesimetdu _mlade,ktorsmevolalizmetdy potomstvo.Ttometdanerob
niin,lento,evytvornovsardinku.Nepredpokladsa,ebyjupouvalniektomimotriedy
Sardinka.Taktometdysapodakonvencieoznaujtak,eichmenozanapodtrnkom.
Pythonvmnebudebrnitaktometduzavola,aleautoritriedytakdvajnajavo,ettometda
nie je uren na verejn pouvanie. Nao sme vlastne tto metdu vytvrali, sa dozviete
ochvoku.
Pomesaterazvenovaralokom.Vetkyveci,ktorfungovaliprisardinke,budfungova
ajpriralokovi.ralokovibudetrvaindobu,kmdospejeabudemainintervalmnoenia,ale
zkladnfunknosbudemarovnakakosardinka.Anadetaily.
Jednaksibudetrebazapamta,akjeralokmomentlnenarat,priomtrebadbanato,
eketohoralokzoerieprivea,usamunaratosalejnezvyuje.alejsitrebauvedomi,e
saralokhbetrochuinak,akosardinka.Najprvsapozrie,isavjehookolnachdzajnejak
sardinkyaakno,takerie.Aktamiadnesardinkynies,taksapresunienasusednvon
miesto.Pomesapozrienakdraloka:
37 class Zralok(Sardinka):
38 """Trieda reprezentujca predtora"""
39 def __init__(self,more, x = -1, y = -1):
40 Sardinka.__init__(self,more,x,y)
41 self.interval = 3
42 self.dospelost = 4
43 self.typ = 'Z'
44 self.nazratost = 1
45 self.maxnazratost = 2
46 def _mlade(self,x,y):
47 s = Zralok(self.more,x,y)
48 return s
49 def pohyb(self):
50 sardinka = self.more.blizkaSardinka(self.x,self.y)
51 if sardinka == []:
52 self.nazratost -= 1
53 if self.nazratost < 0:
54 self.more.uhyn(self)
55 else:
56 Sardinka.pohyb(self)
57 else:
58 x,y = choice(sardinka)
59 self.more.zozer(self,x,y)
60 self.vek += 1
61 self.posmnoz += 1

32
Sympatick je hne zaiatok celho kdu triedy. Tm, e napeme
class Zralok(Sardinka) zabezpeme,etrieda Zralok zdedodtriedy Sardinka celjej
funkcionalitu,takejunemusmerobinanovo.(TriedaZraloksapretozvyknenazvapotomok
triedySardinka.Vovekchprojektochsataktodajvytvoricelhierarchieobjektov.)Znamen
tonaprklad,etriedaZralokbudemaautomatickymetdupotomstvoamypretonemusme
aniprstompohn.
Nieoalenanovobudememusiespravi.Vprvomradebudetrebanapsanovkontruktor
pre raloka. Nariadku 40zavolme kontruktor zosardinky, ktornm ponastavuje sradnice
aostatn veci. Vimnite si jeden detail ak volme metdu nejakho inho objektu, hodnotu
prvhoparametraneuvdzame,lebosaautomatickynahradobjektom,ktorvolme.Akvolme
metdupredkanaejtriedy(akovtomtoprpade __init__ zosardinky),musmeuviesvetky
parametre,tedaajtenselfnazaiatku.
Potom,akosmezavolalikontruktorzosardinky,eteprestavmeveci,ktormralokinak
typ,dobudospievaniaainterval,vktoromsaralokymnoia.Nakoniecnastavmepoiaton
naratosralokaamaximlnunaratos,ktormedosiahnu.
loha4:Poriadnesipretajteralokovumetdupohybaprtenato,orob.
Vrmesakmetde _mlade,ktorsmespomnaliuprisardinke.Priralokovismeju
zmenilitak,enamiestonovejsardinkyvyrobnovhoraloka.Naonmtmetdapresneje?
Pointajevtom,esardinkaajralokmajtistmetdu potomstvo.Aketamnariadku34
generujemenovmla,taknevieme,itombysardinka,aleboralok.Pretozavolmemetdu
_mlade.Tnmvprpade,ejuvolmezosardinkyvyrobsardinkuaakjuvolmezoraloka,
vyrobnmraloka.
PrednamijeposledntriedaMore.Pripomemesimetdy,ktorsmepouilivdoterajom
kdeaktorbudememusienaprogramova:
volneMiesta(self)mvrtizoznamvetkchvonchmiest
blizkeVolno(self,x,y)mvrtizoznamvonchmiestvokolpozcie[x,y]
presun(self,ryba,x,y) m presun rybu (teda sardinku alebo raloka) urenho
parametromrybanapozciu[x,y]
pridajRybu(self,ryba)pridrybu(sardinkualeboraloka)domora
blizkaSardinka(self,x,y) mvrtizoznammiest,naktorchssardinky,vokol
pozcie[x,y]
zozer(self,zralok,x,y)mpresunralokanapozciu[x,y]azruirybu,ktorsa
natejpozciinachdzala.
Okremtchtofunkcibysahodilietenejakalie,ktornazaiatkuvediapridadomora
poiatonsardinkyaraloky,funkcianavpismoraafunkcia,ktorpohnekadousardinkou
aralokomazariadi,esabudmnoi.
Akatribtybudemoreobsahova,akchcemeabytotovetkomohlorobi?Vprvomradeto
bude vekos. Kee more bude tvorcov sta nm jedno slo. Potom budeme potrebova
tvorcovtabuku,vktorejsibudemeuchovva,kdesryby,kderalokyakdejevono.Takto
tabukuvytvormeakozoznam,ktorhokadprvokbudezasezoznam.Aktedabudemechcie
vedie,osanachdzanasradniciach[2,6],pozriemesa,akhodnotumself.more[2][6].

33
Vpremennej self.more[2]jetotiuloenriadokslo2aself.more[2][6]jejehoprvok
slo6.Okremtohobudememadvazoznamy,jedennasardinkyadruhnaraloky.
loha5:Nasledujezdrojovkdtriedymore.Pomalyaporiadnesihopretajteapokstesaprs
nato,otorob.Potomsisvojezveryporovnajteskomentrom.
62 class More:
63 """Prostredie pre predtorov a obete"""
64 def __init__(self,velkost = 20):
65 self.more = []
66 self.velkost = velkost
67 for i in range(velkost):
68 riadok = []
69 for j in range(velkost):
70 riadok.append('.')
71 self.more.append(riadok)
72 self.sardinky = []
73 self.zraloky = []
74 def pridajRybu(self,ryba):
75 if self.more[ryba.x][ryba.y] == '.':
76 self.more[ryba.x][ryba.y] = ryba.typ
77 if ryba.typ == 's':
78 self.sardinky.append(ryba)
79 else:
80 self.zraloky.append(ryba)
81 def pridajSardinku(self):
82 self.pridajRybu(Sardinka(self))
83 def pridajZraloka(self):
84 self.pridajRybu(Zralok(self))
85 def volneMiesta(self):
86 vm = []
87 for i in range(self.velkost):
88 for j in range(self.velkost):
89 if self.more[i][j] == '.':
90 vm.append((i,j))
91 return vm
92 def _najdiBlizko(self,co,x,y):
93 zoz = []
94 for i in range(-1,2):
95 for j in range(-1,2):
96 if i == 0 and j == 0:
97 continue
98 nx = (x+i) % self.velkost
99 ny = (y+j) % self.velkost
100 if self.more[nx][ny] == co:
101 zoz.append((nx,ny))
102 return zoz
103 def blizkeVolno(self,x,y):
104 return self._najdiBlizko('.',x,y)
105 def blizkaSardinka(self,x,y):
106 return self._najdiBlizko('s',x,y)
107 def presun(self,ryba,x,y):
108 self.more[ryba.x][ryba.y] = "."
109 self.more[x][y] = ryba.typ
110 ryba.x, ryba.y = x,y

34
111 def zozer(self,zralok,x,y):
112 for i in range(len(self.sardinky)):
113 if self.sardinky[i].x == x and self.sardinky[i].y == y:
114 self.sardinky.pop(i)
115 break
116 self.more[zralok.x][zralok.y] = '.'
117 self.more[x][y] = zralok.typ
118 zralok.x, zralok.y = x,y
119 def uhyn(self,zralok):
120 self.zraloky.remove(zralok)
121 self.more[zralok.x][zralok.y] = "."
122 def vypis(self):
123 for i in range(self.velkost):
124 s = ""
125 for j in range(self.velkost):
126 s += self.more[i][j] + " "
127 print(s)
128 def pohyb(self):
129 for i in self.sardinky:
130 i.pohyb()
131 i.potomstvo()
132 for i in self.zraloky:
133 i.pohyb()
134 i.potomstvo()

Vkontruktorenastavmezkladnatribty.Najviacpriestoruzabernastavenieprzdneho
mora(riadky67a71).Vimnitesi,epolko,ktorjeprzdnereprezentujeznak'.'.
MetdapridajRybuskontroluje,ijepolko,kamchcemepridarybuprzdneaakno,
bodkuprepetypomryby,tedabu 's' alebo 'Z'.Podatypurybypridrybudosprvneho
zoznamu.
Metdy pridajSardinku a pridajZraloka slia na poiaton pridanie sardiniek
aralokov.Keevolmekontruktory Sardinka a Zralok ibasparametrom,ktoruruje,do
ktorhomorabudpatrianezadvamesradnice,sradnicesavygenerujnhodne.
Metda volneMiesta prehad cel more (s kadou rozumnou hodnotou premennej i
skontrolujevetkyrozumnhodnotypremennej j)aakjepatrinpolkomoravon,dvojicu
(i,j)priddozoznamuvm.Nakoniectentozoznamvrtiakovsledok.
Metdy blizkeVolno a blizkaSardinka robia v podstate to ist nieo hadaj
vblzkostizadanchsradnc.Abysmetonemuseliprogramovadvakrt,spravmesipomocn
metdu, ktor vyhad okolo bodu to, o jej povieme a t potom len zavolme s rznymi
parametrami. Tto pomocn metda je _najdiBlizko a okrem self m tri parametre: o
hadmeasradnice,okoloktorchtohadme.Sradniceokolitchpoloksaoddanhopolka
liao-1,0aleboo1.Premenniajnadobudnpostupnevetkymonkombinciehodnt-1,
0a1.Vprpade,esobepremennnulov,nechmepomocou continuevecitak,lebovtedyto
niejesusednpolko,alesamotnpolko,ktorhosusedovmmekontrolova.Inakvypotame
sradnicesusednhopolkanxany.Privpotepouijemefintu
nx = (x+i) % self.velkost
(a jej proajok pre y), ktor spsob, e sa za susedn bud povaova aj polka, ktor sa
nachdzajnaopanchkoncochmapy.Pripomname,eznak % jezvyokpodelen.Aakby
vekosmapybolanaprklad10,tak(9 + 1) % 10bybolo0a(0 + (-1)) % 10bybolo9.

35
Sradnicevetkchmiest,naktorchnjdemepoadovanobjektsibudemeukladadozoznamu
atenzoznamnariadku102vrtimeakovsledokmetdy.
Metdaposunnastavvzoznamemorepvodnpozciurybyna'.',najejnovpozciu
vlotyprybyasamotnejrybezmensradnice.
Metda zozer prehadva zoznam sardiniek a km nenjde tak, ktor m zadan
sradnice.Vyhodjuzozoznamusardiniekanajejvzoznamemoremiestopresunieraloka.
Metdauhynvyhodurenhoralokazozoznamuralokovajehomiestovmoriozna,
akovon.
Metdavypisvypeporiadkochcelmore.
Metdapohybnajprvpohneanechsarozmnoikadsardinkuapotompohneanechsa
rozmnoikadhoraloka.
Kemmetedanaeskveltriedyhotov,pomeichpoui.Naprkladtakto:
135 m = More(30)
136 for i in range(60):
137 m.pridajSardinku()
138 for i in range(6):
139 m.pridajZraloka()
140 m.vypis()
141 while (input(':') != 'q'):
142 m.pohyb()
143 m.vypis()

Vytvormemore3030polokanasadmedoneho60sardinieka6ralokov.Nechme
morevypsa.Potommemestlaenteramoresamosabudestaraoto,abysavetkovom
pohloaabynmvypsalo,opotrebujeme.Kenstoprestanebavi,zadmeq.
loha6:Vyskajteto.
loha7:Akotovovaommoridopadlo?Vetkouhynulo?Ostaliibasardinky?Anijedno,ani
druh? Spravte viacero pokusov.Pokste saupravi program tak, aby zaznamenal do
nejakchnovchzoznamovpotysardiniekaralokovvjednotlivchkolch.Skstetie
zoznamyvypsa,dostaichdotabukovhokalkultoraanakresligraf.
loha8:Krehk ekologick rovnovha je v mori vtedy, ke nie je ani przdne, ani plne
zasardinkovan. Skste meni parametre rozmery mora, vodn poty sardiniek
aralokov,vlastnostisardiniekaralokovtak,abysarovnovhaudralaonajdlhie.
loha9:Vrmesaknaejvahenastrane 30.Predstavtesi,ebystemalispravitriedu Ryba
atriedySardinkaaZralokbybolijejpotomkami.Ktoratribtyaktormetdybyste
dalidoRyby?Ktorznichbysteprepsalivsardinkeaktorvralokovi?
loha10:Vyskajtesifintu,ktorsmepouilinastrane30,kesmevymali,obudeobjekta
onie,nainomprklade.Predstavtesi,eideteprogramovasoftvrnapredajleteniek.
Popte slovne, o to m robi, podiarknite podstatn men a zamyslite sa, ako by
vyzerali ako triedy v Pythone. (loha pre pokroilch: naprogramujte to a predajte
nejakejleteckejspolonosti.)

36
Ete drobn poznmka pre tch, ktor by chceli vedie, nakoko n model ekosystmu
zodpoved skutonosti. Na obrzku 1 mete vidie graf, ktor zachytva daje kanadskej
koiarskej spolonosti Hudson Bay Company o pote krlich a rysch ko, ktor spolonos
nakpilaodlovcov.16Zznamypokrvajtakmerstoroie.Akvmtengrafvnieompripomnaten
vgraf,hovortonieootom,etenmodeljespravendobreaaspodoistejmieryopisuje
realitu.

Obrzok1:Rysyakrliky

16CitovanzEugenePleasantsOdum:FundamentalsofEcology,Saunders,1953

37
8.lekcia
Dijkstrovalgoritmus
alebokadejetonajkratie
Podobne,akomajchemicisvojezleniny,sktormivediapracova,akomajstrojri
materily, ktorch vlastnosti poznaj, ako maj matematici svoje vety a defincie, maj aj
informaticisvojzkladnpracovnnstrojalgoritmyadtovtruktry.Algoritmusjefinta,ako
nieozistiivypota.17Dtovtruktrajefinta,akonieouloivpamtipotaatak,abysa
stmpotomdobrepracovalo.
Niektoralgoritmysnaozajslvneanazvajsapodasvojichtvorcovmonosteu
poulinaprkladoEuklidovomalgoritme.Ttolekciabudepojednvaoalgoritme,ktorvymyslel
EdsgerWybeDijkstra.Dijkstrabolholandskpotaovvedec,ktorsanezmazatenevpsaldo
histrie informatiky mimo inho tm, e sa spolupodieal na vzniku jazyka ALGOL 6018,
zktorhobolineskrodvodenjazykyCaPascalaniektorjehortypodedilajPython.Okrem
tohojeDijkstratenlovek,ktorprogramtorovuhovoril,epouvavprogramovanskokyje
kodliv,takevyuaniporiadneneviete,otoskokysadozvietesatoibaakbudetechcie
programovavassembleri.
Dijkstrovalgoritmusrieinasledujciproblm:Predstavtesi,emtemapuSlovenskaana
nejvyznaencestnvzdialenostitak,akotometevidienaobrzku 2.Chcetezistinajkratiu
cestu,ktorvediezBanskejBystricedoPopradu.

Obrzok2:CestnvzdialenostinaSlovensku
Ke sa lovek na t mapu pozrie, tak vid, e do vahy pripadaj tri monosti cez
Ruomberok,cezertovicu(trasacezBreznoaHybe)alebocezTelgrt.Staspotajednotliv
dkyavybranajkratiucestu.KebystealemalihadanajkratiucestuzBratislavydoSniny,tch

17 SlovoalgoritmuspochdzazmenaperzskhomatematikaalChwarizmiho,ktorakoprvvedelplne
rieikvadratickrovnice.
18 Dijkstraskolegom Zonneveldom sbili, esaneoholia, km kompiltorALGOLu nedokonia. Sub
dodrali.

38
monostzrazubudeviacejajerelnenebezpeenstvo,ebystenanieozabudli.Pretojedobr
zveri takto vyhadvanie potau. A na to, ako presne to m pota rta, aby mu to dlho
netrvaloaabyzaruenetnajkratiucestunaiel,prvepriielpnDijkstra.
Akotofunguje,predvediemenajskrnamape.Akotonaprogramova,budemerozmaa
potom.Predpokladajme,ehadmenajkratiucestuzBanskejBystricedoPopradu.Keemme
pota,nemusmebytrochrinjdemenajkratiucestuzBanskejBystricedokadhomesta
apotomsapozrieme,kokotovyloprePoprad.
Spravmetedaprvkrokalgoritmu:

Obrzok3:CestyzBanskejBystrice
Nazaiatkujezrejmibajedno:edoBanskejBystricesazBanskejBystricedostaneme
najlepietak,enebudemenikamchodi.PretosiBanskBystricuoznamezelenouanapemesi
knejnulujetominimlnavzdialenos,ktortrebaprejs,abysmesatamdostali.
Druhvec,ktorvtomtoprvomkrokuspravmeje,esapozriemenamest,doktorchsa
viemezBystricedostaaaktoviemespravilepie,nedoteraz19,zapemesi,odkiasmetam
priliakokosmemuseliprejs.Mestmmezatiavyznaenervenou.Niejetotizatiaist,e
njdenvzdialenostisnajkratie.NaprkladdoPrievidzemeexistovaskratkacezZvolen,ktor
smezatianemaliancuobjavi.
Druhkrokalgoritmuzanevmomente,kesiuvedomme,espomedziervenchmiest
memejednoprefarbinazeleno.JetokonkrtneZvolen.Spomedzidoteraznavtvenchmiest
mnajkratiudosiahnutvzdialenos.Toznamen,ekebysmehadaliobchdzkucezktorkovek
zozvynchervenchmiest,taktolepieakona23kilometrovnemmeancustihn.Zvolen
tedamemeprefarbinazeleno.
Terazsaoppozrieme,kamsaddostazoZvolena.Nesmiemepritomalezabudn,e
cestujemezBystrice,takekebudemerta,akoalekojetodoLuenca,musmekvzdialenosti
ZvolenLuenecpripotanajrchlejiucestu,ktorousaviemezBystricedostadoZvolena(to
u vieme, e je 23). Op si zapamtme, odkia sme sa do Luenca, Levc a Nitry dostali.
Vsledokmetevidienaobrzku4.

19 Doterazsmesadoiadnehozokolitchmiestnedostali,takezapemerovnovzdialenostiodBystrice.
Valejfzealgoritmutoalebudekomplikovanejie.

39
Obrzok4:PridancestycezZvolen
Amemesnatretkrok.Opprezriemevetkymest,ktorszafarbennaerveno
avyberiemeznichto,ktormprisebenajmeniuvzdialenos.VtomtoprpadetobudeBrezno.
Vzdialenossazaruenenebudedazlepi.KratiacestadoBreznabytotimuselaviesbuzo
zelenhomestaatobysmepriBreznetomenieslozskali,ukesmezafarbovalidotyn
mestonazeleno,aleboceznejakervenmestoatobybolaokuka,lebocezvetkyervenmest
jetoalej.Pozrieme,kamsaddostazBreznaaupravmepatrinvzdialenosti:

Obrzok5:Breznoasusedia

loha1:Ktormestozmenmenazelenvalomkroku?

40
Obrzok6:Ruomberokaokolie
no,rieenielohy1jemestoRuomberok.Vimnitesi,emdvochetenevybavench
susedov:ilinuaHybe.KesmepotalicestudoHbcezRuomberok,vylonm54+42=96.
KeesmesaupredtmdostalidoHbkratoucestou,priHybiachninemenme.Kebysa
ukzalo,ecestacezRuomberokjekratia,kHybiambysmepriradilimeniesloazapamtali
bysmesi,esmesatamdostalizRuomberka.
Apokraujemealej.ervenmestosnajmenouvzdialenosouodBystricejePrievidza.
Zmenmejunazelen.Viemesaznejdostadoiliny,doNovhoMestanadVhomadoNitry.
DoilinyadoNitrysmealenalikratiecesty,necezPrievidzu,takeichmeninebudeme.

Obrzok7:Prievidza
Terazubymalobyzrejm,akobudemepokraova.Naalejstranesspravenalie
trikrokyalgoritmu.Skstesiichnajprvspravisamiapotomporovnajte,ivmtovylorovnako.
Skontrolujte,istevdyvybralisprvnezelenmestoajistesprvneupravilijehosusedov.

41
Obrzok8:Luenec

Obrzok9:Hybe

Obrzok10:Telgrt

42
Vimnite si, e ke sme v poslednom kroku kontrolovali susedov Telgrtu, tak sme aj
PopraduajRoavemenilizatianjdennajkratiucestu,pretoecezTelgrttobolobliie.
loha2:Vytlatesimapu,zoberteervenazelenperoakalkulakuadopotajtenajkratiecesty
zBanskejBystricedoostatnchmiestSlovenska.
loha3:Sksteporozma,akobysatodalonaprogramova.

Skr, ne zaneme programova, povedzme si najprv nieo o tom, ako prenies mapu
Slovenska,sktorousmedoterazpracovali,dopotaa.Mapatakakosmejunakreslilije
zmatematickho hadiska graf. Tm nie je myslen graf nejakej funkcie, ale truktra, ktor
pozostvazvrcholov(vnaomprpademiest)ahrn(vnaomprpadeciest).Kadhranasvis
sdvomavrcholmi.20 Keevnaomgrafejeprikadejhranenejakslo(ktoroznaujedku
cesty),jetoohodnotengraf.
Grafysavpamtiuchovvajdvomaspsobmi.Ktorjevhodnej,zvisodtoho,im
grafveaalebomlohrn.Akjehrnvea,jedobrsizriadidvojrozmernpole,vktoromsipri
kadejdvojicivrcholovbudetepamta,itamjealeboniejehranaaakmhodnotu.VPythone
satodrieinaprkladslovnkom,ktorhokadprvokbudeopslovnk.Vnasledujcejukke
predvedieme,akobytakmaticavyzeralapretrimest:Bratislavu,TrnavuaNitru.
matica = {}
matica['Bratislava'] = {}
matica['Bratislava']['Bratislava'] = -1
matica['Bratislava']['Trnava'] = 56
matica['Bratislava']['Nitra'] = -1
matica['Trnava'] = {}
matica['Trnava']['Bratislava'] = 56
matica['Trnava']['Trnava'] = -1
matica['Trnava']['Nitra'] = 47
matica['Nitra'] = {}
matica['Nitra']['Bratislava'] = -1
matica['Nitra']['Trnava'] = 47
matica['Nitra']['Nitra'] = -1

Akchcemeterazzisti,akjedkacestyzNitrydoTrnavy,stasapozrienahodnotu
matica['Nitra']['Trnava'].Akjehodnotanezpornslo,jetovzdialenos.Akjehodnota
-1,znamento,emedzidanmidvomamestamicestanevedie.
loha4:Vyskajte zada pythonu uveden prkazy a potom si nechajte vypsa cel objekt
matica.Potomsanatenvpischvupozerajteapokstesavomzorientova.
Druhspsob,akosizapamtagraf,jevhodnejiepoui,kejehrnmenejaprevan
vinumaticebytvorilimnusjednotky.Vtedysiprikadomvrcholebudemepamtaibazoznam
vrcholov,doktorchznehovediehranaadkytchtohrn.Taktoreprezentciugrafusimeme
vPythoneurobinasledujcimspsobom:
graf = {}
graf['Bratislava'] = [['Trnava',56]]
graf['Trnava'] = [['Bratislava',56],['Nitra',47]]
graf['Nitra'] = [['Trnava',47]]

20http://sk.wikipedia.org/wiki/Graf_%28matematika%29

43
loha5:Vyskajtezadapythonuuvedenprkazyapotomsinechajtevypsacelobjektgraf.
Potomsanatenvpischvupozerajteapokstesavomzorientova.
V naom prpade mapy Slovenska je hrn relatvne mlo, preto pouijeme tento druh
prstup.Problmaleje,ecelmapuSlovenskammeuloenvoformteCSV.21Kadcestaje
tamurensvojimikrajnmimestamiadkou.Zaiatoksboruvyzertakto:
Bratislava,Trnava,56
Bratislava,Kty,61
Bratislava,Komrno,125
Kty,Nov Mesto nad Vhom,76
Trnava,Nov Mesto nad Vhom,64
Trnava,Nitra,47

Vhodoutoho,edtaskladujemevsboreaniepriamovprogrameje,ekebudemechcie
mapuvylepi,stadosborupridanejakriadky.Nevhodouje,ebudetrebanapsafunkciu,
ktortensborpretaaurobnmdtovtruktru.Tnevhodajealerelatvnemal,pretoe
spravisitakfunkciuniejeproblm:
1 def citajSubor(meno):
2 subor = open(meno,"r")
3 riadky = subor.readlines()
4 cesty = {}
5 for i in riadky:
6 a = i.split(",")
7 for j in range(2):
8 if not a[j] in cesty:
9 cesty[a[j]] = []
10 cesty[a[0]].append([a[1],float(a[2])])
11 cesty[a[1]].append([a[0],float(a[2])])
12 subor.close()
13 return cesty

Funkcia m jedin parameter meno sboru, ktor chceme ta. Na riadku 2 sbor
otvorme.Znamento,epeknepoprosmeoperansystm,abynsksborupustil.Tendruh
parameter"r"hovor,echcemezosboruta.Kebystetamnamiestordaliw,znamenalobyto,
echcete dosboruzapisovaaoperan systmbysbor,doktorhoidetezapisova, najprv
zmazal,takesanepomteawtamnedvajte.
Nariadku 3volme funkciu readlines,ktorcel sborpreta aakovsledok vrti
zoznamjehoriadkov.Tedavrtinieo,obudezanatakto:
['Bratislava,Trnava,56\n', 'Bratislava,Kty,61\n', 'Bratislava,Komrno,
125\n', 'Kty,Nov Mesto nad Vhom,76\n', ...
Nariadku4sivyrobmeslovnkcesty,doktorhoulomengraf.Zatiajeprzdny.
V cykle na riadkoch 5 a 11 teraz jednotliv riadky spracujeme. Riadok uloen do
premennej i najprvrozdelmenajednotlivastipomocoufunkcie split.Ttofunkciarozdel
reazecnaasti,ktorsoddeleniarkou.Tiarkusmedalifunkciiakoparameter.(Akbysme
tam nedali ni, funkcia by reazec rozdelila poda tzv. blank znakov medzery, tabultoru
aprechodunanovriadok.)Prispracovanprvhoriadkutedavpremennejabudememahodnotu
['Bratislava', 'Trnava', '56\n']

21Commaseparatedvaluesaleboponaomhodnotyoddeleniarkou.Taktosborymajtvhodu,e
snimivediapracovaajtabukovkalkultoryainbensoftvr.

44
Nariadkoch7a9sapozrieme,inaedvemestummevslovnku.Aknejaknemme,takho
tampridmeaakohodnotumuzatiavlomeprzdnyzoznam.Nariadku10pridmeprvmu
mestudozoznamudruh(akozoznamajsovzdialenosou).Funkcia float nmzmenreazec
'56\n' na slo 56.0. Na riadku 11 pridme druhmu mestu do zoznamu prv s tou istou
vzdialenosou,pretoenaspjetorovnakoaleko.22
Nariadku12sborzatvormepoviemeoperanmusystmu,euhoprensnemus
draotvoren.Nariadku13vrtimeto,osmenatali,akovsledokfunkcie.
loha6:Vyrobtesisborcesty.csvapokstesanatahospomocounaejfunkcie.Nechajte
si vypsa vsledok, potom sa na ten vpis chvu pozerajte a pokste sa v om
zorientova.
loha7: (Premachrov.)Vtomtomomenteprestatetaapokstesaurobitosami.Keto
urobte,pretajtesiajnauverziu.
Ak u to mte hotov, alebo ak (nebodaj!) nie ste machri, pote sa pozrie, ako to
naprogramovalautoruebnice.
Akostesivimli,prikadommeste,sktormsmepracovali,smesiuchovvalitridaje:
mesto,zktorhosmeprili,minimlnuvzdialenos,ktorsanmzatiapodarilodosiahnuafarbu
tedainformciuotom,iujedosiahnutvzdialenosminimlnamon.Abysanmstmito
dajmidobrepracovalo,vytvormesitrieduSmerovka,ktorbudetietotridajeobsahova.
14 class Smerovka:
15 def __init__(this, vzdialenost=float("infinity"),
16 odkialsmeprisli="odnikial", hotovo=False):
17 this.vzdialenost = vzdialenost
18 this.odkialsmeprisli = odkialsmeprisli
19 this.hotovo = hotovo

Vimnite sitandardnhodnoty,ktorbudemasmerovkanastaven,akneurmeinak.
Vzdialenos bude nastaven na float("infinity"), po naom nekoneno. no, Python vie
pota aj s nekonenom. Je to slo, ktor je vie, ako kad in relne slo. Ak vs na
matematike uili, e nekoneno nie je slo, nenechajte sa tm zvikla. Kee na zaiatku
nepoznme cestu do iadneho z miest, hodnota nekoneno je ako vzdialenos presne to, o
potrebujeme.Hodnotuodkialsmeprislizatianastavmena odnikial.Atribt hotovobude
oznaova,iujemestozelen.NazaiatkubudemahodnotuFalse.
MemezaaprogramovaDijkstrovalgoritmus.Vytvormeprenehosamostatnfunkciu
najkratsiaCesta.Tdostanenavstupedvaparametre.Prvbudecestnsie,akosmejunatali
zo sboru. Druh bude mesto, z ktorho budeme chcie cestova. Mesto, do ktorho budeme
cestova, urova nemusme, lebo Dijkstrov algoritmus nm aj tak njde najkratiu cestu do
vetkch.
Akovsledokvrtifunkciaslovnk.Kadmumestubudepriradensmerovka,ktorbude
hovori,kadiajetodonehozozadanhomestanajbliieaakojetovprpadenajkratejcesty
aleko.
Naafunkciamevyzeranaprkladtakto:

22 Totovprpadejednosmernchciestnemusbyvdypravda.Dijkstrovmualgoritmubytoalenevadilo.
Fungovalbyajtak.

45
20 def najkratsiaCesta(cesty,odkial):
21 kade = {}
22 for i in cesty:
23 kade[i] = Smerovka()
24 kade[odkial] = Smerovka(0, '', True)
25 posledne = odkial
26 minimum = 0
27 while minimum < float("infinity"):
28 for i in cesty[posledne]:
29 if kade[i[0]].vzdialenost > kade[posledne].vzdialenost + i[1]:
30 kade[i[0]].vzdialenost = kade[posledne].vzdialenost + i[1]
31 kade[i[0]].odkialsmeprisli = posledne
32 minimum = float("infinity")
33 nova = ''
34 for i in kade:
35 if (not kade[i].hotovo) and kade[i].vzdialenost < minimum:
36 nova = i
37 minimum = kade[i].vzdialenost
38 posledne = nova
39 if posledne != '':
40 kade[posledne].hotovo = True
41 return kade

Slovnk, v ktorom budeme uklada medzivsledky aj finlny vsledok Dijkstrovho


algoritmusabudenazvakade.Vytvormehonariadku21.Nariadkoch22a23vyuijemeto,e
kespravmeforcyklus,ktorbudeprechdzacezslovnkcesty,taksadoriadiacejpremennej
cyklubudpostupnevkladavetkyke,vnaomprpademest.Prekadmestotedavytvorme
v slovnku kade nov smerovku. Kad smerovka bude ma zatia nekonen vzdialenos.
Nariadku 24 nastavme mestu, z ktorho hadme najkratie cesty smerovky, ktor hovor,
enajkratiacestadonehomeria0kilometrovaemestoujehotov.
Vpremennej posledne budemeskladovaposlednmesto,ktorsmezatiaprefarbilina
zeleno. Zatia do neho vlome mesto, z ktorho zaname. V premennej minimum budeme
skladovavzdialenosposledneuzavrethomestaodvchodzieho.Zatiatobude0.
Hlavncyklusfunkciesaodohrnariadkoch27a40.Cyklusbudebeadovtedy,km
bude v premennej minimum hodnota menia ako nekoneno. Na riadkoch 28 a 31 prezrieme
vetky cesty, ktor ved z posledne uzavretho mesta a skontrolujeme, i do susednch miest
nevediecezposledneuzavretlepiacesta.Aksmelepiunali,takjunariadkoch30a31mestu
nastavme. (Ak do mesta doteraz iadna cesta neviedla, m nastaven vzdialenos nekoneno
alepie bude okovek, ne to.) V cykle na riadkoch 34 a 37 njdeme spomedzi doteraz
neuzavretch miest to,ktorjevchodziemu najbliie. Tovyhlsime nariadku40zahotov.
Dobresipozritepodmienkunariadku35.
Akuiadneneuzavretmesto,doktorhosaviemedosta,neostalo,hodnotapremennej
minimum,ktorsmenastavilinariadku32ostanenekonenoahlavncyklussaskon.Zoznam
kadevrtifunkciaakosvojvsledok.
Najkratiucestudokadhomestammezisten.Terazulenostvatcestuvypsa.Nato
sispravmesamostatnfunkciu.Tbudemadvavstupnparametre:slovnksnajkratmicestami
amesto,doktorhochcemeprs.Mevyzeranaprkladtakto:

46
42 def vypisTrasu(najkratsie,kam):
43 if najkratsie[kam].vzdialenost == float("infinity"):
44 print("Ned sa tam dosta. :(")
45 return
46 cesta = [kam]
47 kdesme = kam
48 while najkratsie[kdesme].vzdialenost != 0:
49 kdesme = najkratsie[kdesme].odkialsmeprisli
50 cesta.append(kdesme)
51 print("Najkratia cesta vedie cez mest:")
52 for i in reversed(cesta):
53 print(i)
54 print("Vzdialenos je %d kilometrov." % najkratsie[kam].vzdialenost)

Nariadku43skontrolujeme,isadocieovhomestavbecddosta.Kejetotimapa
rozdelen na viacero samostatnch ast, nemus sa to vbec da. Rovnako by mohli nasta
problmy,kebysmepracovalisjednosmernmicestami.Aksatotedaned,podmeotomsprvu
avpisukonme.
Aksadocieovhomestadostad,spravmesizoznamcesta.Donehosiulomecieov
mesto.Rovnakosihoulomeajdopremennej kdesme.Vcyklenariadkoch48a50savdy
zmesta,kdeprvesmepresuniemedomesta,odkiasmedonehopriliatotomestopridmedo
cesty.Torobmedovtedy,kmsanedostanemedomesta,ktormodvchodziehovzdialenos0,
teda do vchodzieho. Kee mme mest v zozname cesta uloen v opanom porad od
cieovhokvchodziemumusmeprivpisenariadkoch52a53zoznamotoi.
Aterazulenostvanaeskvelfunkciepoui,naprkladtakto:
55 siet = citajSubor("cesty.csv")
56 oznam = "V databze mme tieto mest:\n"
57 for i in siet:
58 oznam += i + " "
59 print(oznam)
60 odkial = input("Z ktorho mesta si prajete cestova? ")
61 kam = input("Kam si prajete s? ")
62 najkratsia = najkratsiaCesta(siet,odkial)
63 vypisTrasu(najkratsia,kam)

Dijkstrovalgoritmussapouvanamnohchmiestach.Stanaprkladzamenikilometreza
potrebnasanamiestonajkratejcestybudepotanajrchlejiu.Podobnalgoritmy(ajke
trochu rafinovanejie) sa pouvaj na vyhadvanie najrchlejieho spojenia v cestovnch
poriadkoch.
loha8:Pochopteaakstesitonespraviliposvojom,takvyskajte.

47
9.lekcia
Programujemehru
alebomimozemaniatoia
Ttokapitolabudeotom,akonaprogramovavPythonehru.Oprogramovanhierexistuje
samozrejme rozsiahla literatra.23 V tejto kapitole sa ale dozviete vetky zkladn finty, ktor
potrebujetenato,abystebolischopnvytvorivPythonehruvovlastnejrii.
Vprvomradebudetepotrebovanejakkninicu,ktorviepracovasobrzkamiazvukmi,
viespracovavstupodmyiazklvesnice.Takchtoknincurenchnatvorbuhierexistuje
viacero, vina ale zatia funguje len pre Python 2. Existuje ale svetl vnimka kninica
pyglet.TbehhladkoajpodPythonom3.Mustesijualenajprvstiahnuanaintalova.Vase
psaniatejtokapitolyalettoprocedrapozostvazdvochkrokov24:
Najprvsitrebastiahnuanaintalovasoftvrzvan mercurial.Jetosoftvr,ktorje
vemi uiton, ke viacer programtori pracuj na tom istom projekte. S jeho pomocou s
schopn posiela zmeny, ktor prve urobili alebo si stiahnu najnoviu verziu projektu. Tento
softvr pouvaj aj programtori pyglet. Stiahnite si ho z adresy
http://mercurial.selenic.com/wiki/Downloadanaintalujte.
Kebudemercurialnaintalovan,spustitesiprkazovriadokadonehozadajteprkaz
hg clone https://pyglet.googlecode.com/hg/ pyglet
Tenspsob,esacel kninica, ktorchcete intalova, stiahne doadresra pyglet.Kesa
sahovaniedokon,zadajteprkaz
cd pyglet
ktormsaprepnetedoprvevytvorenhoadresraavomzadajteprkaz
python3 setup.py install
ktor obstarkompletn intalciu kninice pyglet prePython3.Tuuvedenpostupbymal
fungova pre kad z bench operanch systmov (Linux, Os X, Windows). Intalcia tie
chvkutrvakesaskon,metezaakninicupygletpouva.
Kemmespenekninicunaintalovan,memesakonenevenovaprogramovaniu.
Predtm,nesazanemezaoberasamotnoukninicou,poviemeeteprslovoniektorchrtch
Pythonu,oktorchzatianebolareaktorbudemepotrebova.
Prvzaujmavvecje,edopremennchsadajpriradiajfunkcie.Jednoduchukku
metevidietu:
def vypis():
print("Myslm, teda som. Aspo myslm.")

hu = vypis
hu()

23PrpadnmzujemcomodporameknikuCoreTechniquesandAlgorithmsinGameProgramming,ktorej
autoromjeDanielSanchezCrespo.Jetonaozajskvelkniha.
24Problmjevtom,epodPythonom3momentlnefungujeibaplnenajnoviaverzia,naktorejvvojri
etelenpracuj.Ttoverziabudeuriteasomzverejnennaintalciuklasickmspsobom.Alemomentlneete
zverejnenniejeatieverzie,ktorzverejnens,sPythonom3nefunguj.

48
ProgramvypevrokserantaNavkuzAnkMorporkskejnonejhliadkynapriektomu,
enevolmefunkciuvypis,alefunkciuhu.
To,esafunkciadvloidopremennej,sadvyuinaprkladnato,esafunkciadda
akoparameterinejfunkcii.Tosaniekedycelkommehodi.Pozritesinaprkladtoto:
def kluc(a):
return len(a)

mena = ["Janko","Bob","Alice","Eve","Arabela","Marienka"]
mena.sort()
print(mena)
mena.sort(key=kluc)
print(mena)

Zoznammien mena utriedimepomocoufunkciesort.Funkciaichzotriedipodaabecedy.


Toaleniejejedinspsob,akosamendajutriedi.Akchcemeutriedimennaprkladpoda
dky,spravmesifunkciu,ktorakosvojvsledokvrtidkuparametra.Attofunkciumeme
daakoparameterkeysortu,abyvedel,emtriedipodanejaniepodaabecedy.Funkcioukluc
meteplneovlda,podaohosabudezoznamtriedi.
loha1:Vyskajtesiobaprklady.Preptefunkciukluctak,abystezoznamutriediliabecedne
podadruhhopsmenaslova.
Drobn poznmka poda dky slova sa zoznam dal utriedi aj prkazom
mena.sort(key=len) Akexistujefunkcia,ktorpotrebujeme,memejurovnopoui.Nieje
trebavytvravlastn.
Abybolzmtoketev,existuj nielenfunkcie,ktorakoparameter dostannejak
funkciu,aleajfunkcie,ktorfunkciuvrtiaakosvojvsledok.Mesatospravinaprkladtakto:
import time

def obal(f):
def nova():
t = time.time()
f()
print("Funkcia",f.__name__,"sa u skonila.")
print("Trvala %.5f seknd." % (time.time() - t))
return nova

def vypis():
print("Myslm, teda som. Aspo myslm.")

vypis = obal(vypis)
vypis()

Funkciaobaldostanenavstupefunkciuavrtiinfunkciu,ktorvykonpvodnfunkciu
a zist, ako dlho beala. To sa me hodi, ke naprklad potrebujete zisti, ktor funkcia v
program zdruje. Prkaz vypis = obal(vypis) potom zmen pvodn funkciu vypis na
funkciuvypissovstavanmistopkami.
Ttofintasadpouiajvpodobetzv.dekortoru.Predolprogrammemeprepsado
takejtopodoby:

49
import time

def obal(f):
def nova():
t = time.time()
f()
print("Funkcia",f.__name__,"sa u skonila.")
print("Trvala %.5f seknd." % (time.time() - t))
return nova

@obal
def vypis():
print("Myslm, teda som. Aspo myslm.")

vypis()

Funkcia obal,ktoroukinmfunkcimviemepridastopky,jerovnak,akovpredolom
prpade.Kechcemepridastopky,kfunkciivypis,stavriadkunadouuvies@obal.Robto
toist,akokebysmepofunkciinapsalivypis = obal(vypis).
loha2:Pochopteavyskajte.
Dekortorysaobaspouvajvpythonovskchkniniciach,kechceme,abypouvate
moholnapsaibapodstatnasnejakejfunkcieanemuseldonejprepisovaspstuvec,ktormu
tampridkninicasamotn.Podobnetorobajpyglet.
Pozrimesanaprvjednoduchprogram,vktorompygletpouijeme:
1 import pyglet
2
3 window = pyglet.window.Window()
4 label = pyglet.text.Label('Hello, world',
5 font_size=36,
6 x=window.width//2, y=window.height//2,
7 anchor_x='center')
8
9 @window.event
10 def on_draw():
11 window.clear()
12 label.draw()
13
14 pyglet.app.run()

Nariadku3vytvormeokno,vktoromsabudevetkodia.Parametramimemeuri,akmby
vek,kdembyumiestnenaleboichcemezapnceloobrazovkovreim.Nariadkoch4a7
vytvormeceduu(poanglickylabel).Ceduajeobrzokstextom.Zadmetext,ktorchcemena
cedulima,vekospsma(font_size)asradnicevokne(xaynastavujemeichtak,abybol
npisvstredeokna.Dvelomtkaznamenajceloselndelenie.Pozor!Sradnicesspraventak,
ebod [0,0] jevavodole.Akstenavyknutnasradnicezmatematiky,takvmtozvltne
neprde,aleaksteuprogramovalinejakingrafiku,mohlistesastretnajsinmprstupom.)
alejnastavmeto,evhorizontlnomsmerechcemenpisvycentrova(anchor_x).Cedulisa
dajuriajnejakalieparametre,naprkladpouitfont.
A dostvame sa k funkcii s dekortorom. Funkcia sa mus vola on_draw. Zavol ju
samotn kninica, take do nej treba napsa, ako sa m vykresli scna. Dekortor

50
@window.eventhovor,esajednoobsluhuudalosti.To,kedysaprekresovanieudeje,nemme
celkompodkontrolouudejesatovtedy,kesikninicazmysl.Alepotrebujememafunkciu,
ktortourob,kejetreba.
Samotnfunkciaoknopremaeavykreslceduu.
Nariadku14saspustsamotnaplikcia.Otvorsaokno,programbudedvapozor,o
pouvaterob,udalostisabudposielavetkmobslunmfunkcim,ktorsmeurobili,budesa
vykresova,osamvykresovaaprpadnesabudrobiajnejakalieveci.Akstlate ESC
alebozavrieteokno,programsaskon.
loha3:Vyskajte.
alukkovprogramvsebezahatakmervetko,obudemepotrebova,kebudeme
robinauhru:
1 import pyglet
2 from pyglet.window import key
3 from pyglet.window import mouse
4
5 ufon = pyglet.resource.image('09-alien.png')
6 cas = 0
7
8 window = pyglet.window.Window()
9
10 @window.event
11 def on_draw():
12 window.clear()
13 ufon.blit((window.width - ufon.width)//2, 20)
14 label = pyglet.text.Label(str(cas), font_size=36,
15 x=window.width//2, y=window.height//2,
16 anchor_x='center')
17 label.draw()
18
19 @window.event
20 def on_key_press(symbol, modifiers):
21 if symbol == key.M:
22 print("Stlail si M")
23 elif symbol == key.LEFT:
24 print("Stlail si pku vavo.")
25
26 @window.event
27 def on_mouse_press(x, y, button, modifiers):
28 if button == mouse.LEFT:
29 print("Klikol si avm na sradniciach [%d,%d]" % (x,y))
30
31
32 def sekunda(dt):
33 global cas
34 cas += 1
35
36 pyglet.clock.schedule_interval(sekunda,1)
37
38 pyglet.app.run()

51
Na prvch troch riadkoch natame kninicu pyglet a aby sme nemuseli zakadm
vypisovamilinyodkazov,natamezvlajobjektykeyamouse.Tiesanmzdu,kebudeme
potrebovazisti,akklvesbolstlaenakdesaudialikliknutiamyou.
Dopremennejufonnatameobrzokzosboru.Sborbymalbyumiestnenvtomistom
adresri,akosamotnprogram,inakhoPythonnenjde.Premenncasvynulujeme.
Nariadku8vyrobmeokno,vktoromsabudeprogramodohrva.Kontruktorusadaj
zadaparametre,ktorurujvekosokna,nadpisoknaaleboikonu.
Pomesapozrienaobsluhuudalost.Akoprvvytvormeudaloson_draw(riadky10a
17).Plochuvymaeme(riadok12).Dostredudolenakreslmeufna(riadok13).Pozritesa,akosa
potaumiestnenieufna.Opertor//znamendelenievcelchslach,takenaprklad14 // 3
bude 4. Vytvorme ceduu, do ktorej zapeme hodnotu premennej cas (riadky 14 a 16)
avykreslmeju(riadok17).Predfunkciunezabudnemepridadekortor.
aliafunkciamnasvedomsprvuudalostzklvesniceanazvasaon_key_press.M
dva parametre. Parameter symbol uruje, ak klves bol stlaen, parameter modifiers zas
uruje,akmodifiktory(naprkladctrl,altaleboshift)bolipouit.Kadklvesmsvoje
meno, naprklad klves M m meno key.M. Naa funkcia iba nape nieo do terminlu, ke
stlateklvesM,alebopkuvavo.
Funkcia,ktormnastarostireagovanakliknutiemyou,sanazva on_mouse_press.
Mtyriparametre.Parametre x a y urujsradnicemiesta,kdesakliknutieudialo.Parameter
buttonuruje,ktortlaidlonamyibolostlaen.Parametermodifiersmrovnakvznam,
akovpredolejfunkcii.Naafunkciavypesradnicemiesta,naktorsakliklo,aleibavprpade,
esaklikloavmtlaidlommyi.
Nariadkoch32a36sadejezaujmavvec.Riadok36nastavuje,esapravidelnerazza
sekundumzavolafunkciasekunda.(Menofunkciejeprvparameter,akoastosamfunkcia
vola,jedruhparameter.)Funkcia sekunda nerobniin,ibazvgloblnupremenn cas
ojedna.Vslednefekttedabude,epremenncasbudeplnifunkciustopiek.
Funkcia, ktor tmto spsobom volme, mus ma parameter. V naom prpade je to
parameter dt. Do tohto parametra dostane funkcia skuton as, ktor uplynul od poslednho
volania. Niekedy sa toti stane, e sa nieo zdr (naprklad sa udeje nejak komplikovan
vykresovanie)afunkciasanespustposekunde,alepojedenapolsekunde.Akchceme,abyhra
reagovalaajnataktonhodnzdrania,jedobrttoinformciuzapracova.Vtejtoukketoale
nerobme.
Dobre.Mmenastaven,akosamoknovykresova,mmenastaven,osamdia,ke
djdeknejakejudalostiodmyiiklvesniceammenastaven,ekadsekundusamzmeni
as.Memetocelspusti.Udejesataknariadku38.
loha4:Pochopteavyskajte.
Predol ukka popisuje vetky veci, s pomocou ktorch sme schopn naprogramova
jednoduchhru.Aleakostesiistovimli,ttoukkaniektorveciibanaznaujeacelkomisto
neposkytujeodpovedenamnohopodstatnchotzok,naprkladAkjekdklvesy medzera?
aleboAkozisti,ijeniektorklvesprvestlaen?Odpovejetajtemanul.Aktomyslte
sprogramovanmhiervne,ajtaksatomunevyhnete.ManulkukniniciPygletnjdetenaadrese
http://pyglet.org/doc/programming_guide.pdf Na strnke http://pyglet.org njdete aj alie
zaujmavinformcie.

52
Memesatedapustidoskutonejhry.Budetoremakeprastarejhry,ktorkedysidvno
behvalanapotaochPMD85.Potrebujemenatoaletriobrzky.Obrzokufna,rozmery118
pixelov,budeuloenvsbore 09-alien.png,obrzokrakety,rozmery27 13pixelov,bude
uloen v sbore 09-rocket.png a obrzok strely, rozmery 1 3 pixely v sbore
09-missile.png. Okrem toho budeme potrebova aj nejak randl. Obrtime sa na niektor
databankuzvukov,naprkladhttp://soundbible.comastiahnemesinejakpeknvbuchnaprklad
sbor BombExplosion.wav zadresy http://soundbible.com/107BombExplosion1.html Vetky
tietosboryumiestnimevadresri,vktorombudemepsaprogramamemezaapracova.
Cel hru si mete pozrie v nasledujcej ukke. Pokste sa najprv poriadne preta
apochopikd.Apotomsipretajtekomentraovertesi,istesprvnepochopili,osakdedeje:
1 import pyglet
2 from pyglet.window import key
3 import random
4
5 window = pyglet.window.Window(320,200,fullscreen = True)
6 window.set_mouse_visible(False)
7 pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
8 pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA,
9 pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
10
11 class Alien:
12 alien_img = pyglet.resource.image('09-alien.png')
13
14 def __init__(self,hra):
15 self.hra = hra
16 self.x = random.randint(0,28)
17 self.y = 192
18 self.rychlost = 3
19 if random.random() < 0.08:
20 self.rychlost = 10
21
22 def pohni(self):
23 self.y -= random.randint(0,self.rychlost)
24 if self.y <= 0:
25 self.hra.dosiel(self)
26
27 def kresli(self):
28 Alien.alien_img.blit(11*self.x,self.y)
29
30 class Raketa:
31 def __init__(self,hra):
32 self.image = pyglet.resource.image('09-rocket.png')
33 self.x = 14
34
35 def kresli(self):
36 self.image.blit(11*self.x - 8,0)
37
38 def vlavo(self):
39 if self.x > 0:
40 self.x -= 1
41
42 def vpravo(self):
43 if self.x < 28:
44 self.x += 1

53
45 class Strela:
46 missile_img = pyglet.resource.image('09-missile.png')
47
48 def __init__(self,hra,x):
49 self.hra = hra
50 self.x = x
51 self.y = 0
52 self.rychlost = 10
53
54 def pohni(self):
55 self.y += self.rychlost
56 self.hra.strielam(self)
57
58 def kresli(self):
59 Strela.missile_img.blit(11*self.x + 6,self.y)
60
61 class Hra:
62 vybuch = pyglet.resource.media('BombExplosion.wav',streaming=False)
63
64 def __init__(self):
65 self.zivoty = 3
66 self.vypustit = 100
67 self.aliens = []
68 self.raketa = Raketa(self)
69 self.strely = []
70
71 def kresli(self):
72 if self.zivoty < 0:
73 prehra = pyglet.text.Label("Prehral si!!!",
74 font_size=30,
75 x=window.width // 2,
76 y=window.height // 2,
77 anchor_x='center')
78 prehra.draw()
79 return
80 if self.vypustit == 0 and len(self.aliens) == 0:
81 vyhra = pyglet.text.Label("Vyhral si!!!",
82 font_size=30,
83 x=window.width // 2,
84 y=window.height // 2,
85 anchor_x='center')
86 vyhra.draw()
87 return
88 zivoty = pyglet.text.Label(str(self.zivoty),
89 font_size=18,
90 x=10, y=window.height - 18)
91 zivoty.draw()
92 pocet = pyglet.text.Label(str(self.vypustit),
93 font_size=18,
94 x=window.width - 50,
95 y=window.height - 18)
96 pocet.draw()
97 for i in self.aliens:
98 i.kresli()
99 for i in self.strely:
100 i.kresli()
101 self.raketa.kresli()

54
102 def spracujKlaves(self,klavesa):
103 if klavesa == key.LEFT:
104 self.raketa.vlavo()
105 elif klavesa == key.RIGHT:
106 self.raketa.vpravo()
107 elif klavesa == key.SPACE:
108 self.strely.append(Strela(self,self.raketa.x))
109
110 def krok(self,dt):
111 if random.random() < 0.05 and self.vypustit > 0:
112 self.aliens.append(Alien(self))
113 self.vypustit -= 1
114 for i in range(int(dt/0.1)):
115 for i in self.strely:
116 i.pohni()
117 for i in self.aliens:
118 i.pohni()
119
120 def strielam(self,strela):
121 trafeni = []
122 for alien in self.aliens:
123 if alien.x == strela.x and alien.y < strela.y:
124 trafeni.append(alien)
125 if trafeni == []:
126 if strela.y > 200:
127 self.strely.remove(strela)
128 return
129 najnizsi = trafeni[0]
130 for alien in trafeni:
131 if alien.x < najnizsi.x:
132 najnizsi = alien
133 self.aliens.remove(najnizsi)
134 self.strely.remove(strela)
135 self.vybuch.play()
136
137 def dosiel(self,alien):
138 self.zivoty -= 1
139 self.aliens.remove(alien)
140
141 h = Hra()
142
143 @window.event
144 def on_key_press(symbol, modifiers):
145 h.spracujKlaves(symbol)
146
147 @window.event
148 def on_draw():
149 window.clear()
150 h.kresli()
151
152 pyglet.clock.schedule_interval(h.krok,0.1)
153 pyglet.app.run()

loha5:Naozajtenprogramporiadnepretajte!!!

55
Taksteprvepretalineceltristranykdu.osaznehodvidienaprvpohad?
Vprvomradeto,evcelejhresavyskytujtyriobjekty:Alien,Raketa,StrelaaHra.
Trieda Alien reprezentujeufnov,ktortoianamatikuZem.Objektovtejtotriedymeby
vhreviaceronaraz.Objekttriedy Raketa budeibajeden.Napriektomu,ejetoraketa,bude
pobiehapozemiaostreovaufnov.ObjektovtypuStrela,ktorbuderaketavypa,meby
viacero.ObjektHratobudevetkoriadi.
aliezaujmavvecisizasliapozornejietanie.Spomemenajprvdrobndetailyna
riadku5bolooknootvorenvreimefullscreentedanacelobrazovku.Ttovobujedobr
mapoasladeniavypnutazapnjuakevetkofunguje.Nariadku6skryjememyana
riadkoch7a9nastavmepyglettak,abypriesvitnpngobrzkyvykresovalakopriesvitn.
alejsitrebavimn,akofungujsradnice.Nariadku5savytvoroknosrozmermi320
200bodov.Jedenufnmrkuobrzka11bodov,takesaichnarkuobrazovkyvmestveda
seba320//11teda29.Ufni,raketaajstrelybudmatedanamiestosradnice xslood0do28.
Kesipozriete metdu kresli vjednotlivch objektoch, vidte, etoto slosavdynsob
jedenstimi(rkouufna),abysaobjektydostalinasprvnemiesto.Raketaajstrelasaeteo
ksokposun,abyichstredbolvdypodstredompatrinhoufna.
Kebysmepredolukkuprogramovaliporiadne,namiestokonkrtnychselbysapatrilo
pouva premenn a vlastnosti obrzkov. To umouje program jednoduchie meni
aprispsobova,kebytobolotreba.
alejsivimniterozdiel,akmnatavameobrzokpretriedu AlienapretrieduRaketa.
Vprpaderaketysmesispravilivkontruktore(vofunkcii __init__)premenn self.image
adonejsmeobrzoknatali.Kebysmetotakalespraviliajvprpadetriedy Alien,takbysa
muselobrzoknataprekadhomimozemanazvlazbytonebytovpotaizaberalovea
pamte,pretoevetciufnisrovnakaobrzokprenichstanatapreceltrieduraz.Akoto
spravi ikovnejie, vidte v naom programe. Mimo vetkch metd si vytvorme premenn
alien_imgadonejnatameobrzok(riadok12).Ttopremennjespolonprevetkyobjekty
triedyAlien.Kejuchcemepoui,pristupujemeknejakokAlien.alien_img(riadok28).
Pomesaterazpozrie najednotliv triedy.Zanime triedou Alien.Vkontruktoresa
ufnovinastavjehohra,vyberiesastpec,vktorombudeufnpada,sradnica ysanastavna
vrchobrazovkyanastavsarchlos.Tjevinou3,alespravdepodobnosou8%mebyaj10,
pretoeniektorufnisvsadkri.
Okrem kontruktora m Alien ete metdu pohni, ktor nm pohne o nhodn poet
bodov(odnuladojehorchlosti)smeromnadolazavolmetduhrydosiel,aksaufnovipodar
prsa nazem ametdu kresli,ktor ufnanakresl tam, kdeprve je.To, epripohybe
pouijemenhodnsla,spsob,esaufnnepohybujerovnomerne,aletrhane.Lepietotak
vyzer.
TriedaRaketamkontruktor__init__,ktornataobrzokanastavraketudostredu,
metdu kresli, ktor ju nakresl a metdy vlavo a vpravo, ktor pohn raketou doava
adoprava.
TriedaStrelamkontruktor,ktorjejnastavurenpozciuarchlos,metdu pohni,
ktor strelou pohne a zavol metdu hry strielam, aby hra zistila, i strela nhodou nieo
nezasiahla.
KonenesadostvameksamotnejtriedeHra.Ttotriedabudemasvojuvlastnpremenn
vybuch,doktorejnatamezvukvbuchu,ktorbudehraspavdy,kenejakstrelazni

56
ufna (riadok 62). Sbor, v ktorom mme zvuk uloen, sa nazva BombExplosion.wav.
Parameterstreamingudva,isamzvukprehrvazdisku.AkjejehohodnotaFalse,zvuksi
programnatadopamte.Tojevhodnprikrtkychaastosaopakujcichzvukoch.Akchcete
prehrvahudbuvpozad,jevhodnejiejuceldopamteneaha,prehrvatozdiskuapoui
tandardnhodnotuTrue.
Vkontruktore__init__nastavmepoetivotovhrana3,poetufnov,ktormajby
vypusten na 100, vyrobme raketu a spravme si zoznamy ufnov a striel, ktor s prve na
obrazovke.Obatietozoznamyszatiaprzdne.
Okremkontruktorabudematsamotnhrapmetd.Metdakreslibudemanastarosti
vykreslenie celej scny. Tto metdu budeme vola, ke nastane udalos on_draw. Metda
spracujKlaves budemanastarostispracovanieudalostizklvesnice.Budemejuvola,ke
nastaneudaloson_key_press.Metdakroksabudevolakaddesatinusekundyabudehba
vetkmivecami,ktornezvisiaodklvesnicetedastrelamiaufnmi.Okremtohobudemana
starostiajvypanienovchufnov.Metdustrielamsmeuspomnalipristrele.Ttometda
pre zadan strelu zist, i strela niekoho nezasiahla a vybav prpadn likvidciu ufnov
anepotrebnchstriel.Poslednmetdadosielsazavol,kesanejakmuufnovipodardorazi
anazem.
Pome sa jednotlivm metdam venova podrobnejie. V metde kresli sa najprv
pozrieme,iuhrnhodouneprehral.Akjepoetivotovmenakonula,vypesatragick
sprvaaviacsanekreslni(riadky7279).Aksanmumedziasompodarilovyhubivetkch
ufnov(poettch,ktorchetetrebavypustiajpoettch,ktorsnaobrazovkejenulov),
vypemesprvuotom,ehrvyhralatiesvykresovanmskonme(riadky8087).Inak
vypeme poet zostvajcich ivotov (riadky 88 91), poet ufnov, ktor ete akaj na
vypustenie(riadky9296)anariadkoch97a101vykreslmevetkchaktvnychufnov,strely
araketu.
Metda spracujKlaves vierozlitriklvesy.Vprpadestlaeniapkyvpravoalebo
vavo zavol patrin funkciu rakety a pohne ou doprava alebo doava. V prpade stlaenia
medzeryvyrobnamieste,naktoromsaprveraketanachdzastrelu.
Metda krok sanajprv pozrie, i ete treba nejakch ufnovvypusti a ak no,tak to
spravdepodobnosou 5% urob. Potom si zist, o koko sa volanie funkcie zdralo oproti
predpsanejdesatinesekundy(presnasmuloenvpremennejdt)akokokrtjettohodnota
viaakodesatinasekundy,tokokrtpohneufnmiajraketami.
Metdastrielamjepomernezloit.Najprvsivyrobmezoznam trafenianariadkoch
122a124donehoulomevetkchufnov,cezktorchstrelapreletela.Akzoznamostalprzdny
skontrolujeme,iustrelanepreletelacezokrajaakno,takjuzrumeaskonme(riadky125a
128).Akzoznamprzdnynieje,taknariadkoch129a132njdemeufna,ktorjespomedzi
zasiahnutchnajniie(dobresipozrite,akotohadaniepresnefunguje!).Najniiehoufnaaj
streluzrumeaprehrmezvukvbuchu.
Primetde dosiel ibaznimepoetivotovo1azrumeufna,ktormusapodarilo
prist.
Teraz to ete treba spusti. Na riadku 141 vyrobme nov hru h. Nastavme udalosti
prekresovaniaaspracovaniaklvesnicenapatrinfunkciehryh.Nariadku152nastavme,esa
mkaddesatinusekundyvolafunkciah.krokanariadku153tocelspustme.
loha6:Pochopteavyskajte.

57
loha7:Pridajtealiurchlosufnov,ktorsrchlej,neben,alepomal,nevsadkri.
loha8:Zabezpete,abymohlibynarazvypustennajviactristrely.
loha9:Zmete nastavenia a obtianos hry. Pohrajte sa s rchlosou ufnov,
spravdepodobnosou, s akou s vypan, s pravdepodobnosou, s akou sa spaj
vsadkri.Dosiahnitestav,abybolahrauhraten,alenron.
loha10:Pridajteklves,ktormsaposkonenhrybudedaspustinovhra.
loha11:Naprogramujtenejakinhru.

Obrzok11:Screenshotzhry

58
10.lekcia
Popolukaazlatpriadka
alebovlkna,triedenieazloitos
Iste si vetci pamtte prbeh o tom, ako zl macocha pomieala hrach so oovicou
anechalatoPopoluketriedi.TriedenievtedyprevzalinamiestoPopolukyholbky,abymohlas
na bl (poda Grimmovcov) prpadne do kostola (poda Dobinskho) a da sa tam dokopy
skrsnymprincom.25 Holbkyvetkosprvnepotriedili,princsizobralPopolukuailiastne
dokianepomreli.
U tto pradvna rozprvka naznauje, ak je triedenie dleit. V tejto lekcii sa nm
budeme zaobera podrobnejie. A to triedenm v istom zmysle komplikovanejm, ne bolo to
Popolukine.Nebudemetotirozdeovajednuzmesnadvehromdky,alevnaomprpadenm
zlmacochazvermericuhrachuapovie:Zoratehrkyodnajmeniehoponajv!
Ketobudemeprogramova,nebudememasamozrejmekdispozciikopuhrachu,alepole
snejakminhodnmislami.Zoradisla(aleboinobjekty)odnajmeniehoponajviesad
viacermi spsobmi. A tu sa dostvame k aliemu zaujmavmu aspektu programovania: nie
kadspsobjerovnakodobr.Vtejtolekciisiukemeniektorznichapoviemesinieootom,
akosaurujezloitosalgoritmov,abysmevedeliporovna,ktorznichbudelepaktorhor.
Lentaknaprogramovajednotlivtriediacealgoritmyaporozprvaonichbyboloaleprli
jednoduchvzhadomnato,akdobrupriprcisPythonomste.Abybololepievidno,ako
jednotliv triediace algoritmy funguj, rozhodli sme sa spravi program tak, aby bolo graficky
znzornen, o sa v naom poli deje. Cel pole budeme vykresova ako stpcov graf a na
vykresovaniepouijeme kninicu pyglet,sktoroustesamali monoszoznmi vpredolej
lekcii.
Abysmealemohlitentovekolepprojektzavi,trebaspravidveveci.Vprvomradesi
potrebujemevytvoriobjekt,ktorbudemavlastnostipoa,okremtohoalebudemaajnejak
aliebudesavedienakresliabudepota,kokozmiensavomudialo.Vdruhomrade,aby
smesavrmcinhotriediacehoalgoritmunemuselistaraovykresovanie,potrebujemesin
programrozdelinadvevlkna.Kadvlknobudebeasamostatneakmtepotasviacermi
jadrami,mekaddokoncabeanainomprocesore.Prvvlknobudetriedipoleaoniinsa
nebude stara. Druh vlkno bude ma na starosti vykresovanie a nebude nijak zasahova do
triedenia.
AtaksmesaodPopolukynenpadneprepracovalikzlatejpriadke,ktorjevnaejudovej
slovesnosti odbornka na vlkna. Km vakvlkna zaneme pouva, musme sa otom, ako
snimiPythonpracuje,otonaui.
RovnakoakonainvecimPythonnaprcusvlknamikninicu.Tsavol threading
aprenaepotrebybudestai,kesiznejimportujemeobjekt Thread,spomocouktorhovieme
vlknovytvori.
Predstavtesiteraz,emmenejakdleitfunkciu,ktorpotrebujemespustitrikrt,od
vsledkovjednhospustenianezvisiadnealieabufunkciaprocesorprlinezaauje,alebo

25 Dobinskhovariantdvalprincoviprleitoskrznymrafinovanmskokom,akonaprkladenechal
natriekostolnlavicusmolou,nechsatamPopolukaprilep,alenajehoveksklamanietonedralodospevne

59
mmekdispozciidostatokjadier,abymohlibeaviacerfunkcienaraz.Vnasledujcomprklade
budetoutofunkcioufunkciafunkcia.Ttoibaosebepodsprvu,ezaala,poktrisekundy
apodsprvu,eskon.

154 import time


155 from threading import Thread
156
157 def funkcia(i):
158 print("tartuje dleit funkcia",i)
159 time.sleep(3)
160 print("Kon dleit funkcia",i)
161
162 for i in range(3):
163 funkcia(i)
164
165 print("\n\n")
166
167 for i in range(3):
168 v = Thread(target=funkcia, args=(i,))
169 v.start()

Prvmonos,akofunkciutrikrtspusti,metevidienariadkoch9a10.Jetoklasick
metda,naakstebolinavyknutdoteraz.Celtencyklusbudetrvaonieomloviac,akodev
seknd.
Dsatoalespraviajikovnejie.Nariadkoch14a16vytvormetrivlkna.Kadmu
vlknupovieme,ktorfunkciumspusti(parametertarget)asakmiparametrami(parameter
args).Akonhlevlknospustme,nhlavnprogramsaoviacejnestaramesialejrobi
vlastnveci,tedanaprkladvytvorialievlkno.Vslednefektbudeten,evetkytrifunkcie
odtartuj v tesnom zvese, o tri sekundy vetky tri viacmenej naraz skonia a teda tie tri
vykonaniafunkciezaberdokopyibanieoviacakotrisekundy.Oprotipredolmuspsobujeto
oessekndlepie.
Vzhadomnato,evinafunkcinefungujetak,evinusvojejinnostipresp,ale
relnezaaujeprocesor,jerozumnvlknavyuvabuvtedy,kepotrebujeterozdeovaprcu
medziviaceroprocesorov,alebovtedy,ketrebaakananejakvstupyaleboodosielanejak
vstupy.Pozrimesananasledujciprklad.
Predstavte si, e mte rchle pripojenie na internet (ak ho naozaj mte, nemuste si
predstavova)apeteprogram,vktorompotrebujetestiahnutristrnky.Jednoduchverziatakho
programumevyzeratakto:

1 import urllib.request
2 import time
3
4 def stiahni(url):
5 poziadavka = urllib.request.Request(url)
6 return urllib.request.urlopen(poziadavka).read()
7
8 vystup = ["","",""]
9

60
10 start = time.time()
11
12 vystup[0] = stiahni("http://www.smnd.sk")
13 vystup[1] = stiahni("http://www.sme.sk")
14 vystup[2] = stiahni("http://www.nrsr.sk")
15
16 print("Trvalo to %.2f s" % (time.time() - start))

Naprcusinternetompotrebujemekninicu urllib.Nariadkoch4a6mmekrtku
funkciu,ktorzozadanejadresyvytvorobjektpoziadavka,otvorju(funkciaurlopen)avrti
dta, ktor odtia prjme (funkcia read). Tto funkcia je skutone strun keby sme robili
seriznuaplikciu,patrilobysaceltonataniedadoblokutryasprvneoetrivnimky.Na
riadkoch12a14natametristrnky,ulomesiichdozoznamu vstupanakoniecvypemeas
potrebnnastiahnutie.
Vrme sa teraz k predpokladu, e vaa linka je naozaj rchla. V tom prpade situciu
zdrujlinkynastraneserverov.Kuvmbymohlipokojneprdidtaodvetkchtrochserverov
naraz,alekeejeprogramspraventak,esajednotlivstrnkysahuj postupne,jetocel
zbytonepomal.
V takejto situcii je vhodn poui vlkna. Kee ale chceme zmera as sahovania,
potrebujemezisti,kedyvetkytrivlknaskonia.Onytotivbecnemusiaskoninaraz,kad
ije svojim vlastnm ivotom. Na synchronizciu vec ohadom vlkien m Python truktru
nazvanfronta,poanglicky Queue.Frontajeobjektsmnostvomfunkcioktorchsadotate
vmanuli26,tusivakspomeniemeibatyriznich.Spomocouputmetedofrontynieovloi
to nieo vinou predstavuje popis nejakej lohy. Metdu get pouije vlkno, ke si chce
niektorlohuzfrontyvyzdvihnaspracova.Akvofronteninieje,getak,kmsatamnieo
neobjav.Kesavlknoklohedostane,vykonjuaspomocouprkazu task_done dfronte
vedie,etjeholohajehotov.Metdajoinnerobniin,lenak,kmbudvetkylohyvo
frontespracovan.Nprogramnasahovaniestrnokmemespomocouvlkienafrontyprepsa
takto:
1 import threading
2 import queue
3 import urllib.request
4 import time
5
6 fronta = queue.Queue()
7 vystup = ["","",""]
8
9 def stiahni(url):
10 poziadavka = urllib.request.Request(url)
11 return urllib.request.urlopen(poziadavka).read()
12
13 def sosadlo():
14 vstup = fronta.get()
15 vystup[vstup[0]] = stiahni(vstup[1])
16 print("%s hotovo." % vstup[1])
17 fronta.task_done()
18
19 start = time.time()

26http://docs.python.org/3/library/queue.html

61
20 for i in range(3):
21 t = threading.Thread(target = sosadlo)
22 t.daemon = True
23 t.start()
24
25 for stranka in [(0,"http://www.smnd.sk"),
26 (1,"http://www.sme.sk"),
27 (2,"http://www.nrsr.sk")]:
28 fronta.put(stranka)
29
30 fronta.join()
31
32 print("Trvalo to %.2f s" % (time.time() - start))

Nazaiatkunaimportujemevetkypotrebnkninice,vytvormefrontufrontaazoznam
do ktorho budeme uklada natan dta vystup. Funkcia stiahni je plne rovnak, ako
vpredolom prklade. Na vytvorenie jednotlivch vlken pouijeme funkciu sosadlo. Tto
funkcia pok, km sa pre u vo fronte njde loha (riadok 14), Kad loha je dvojica
pozostvajca z sla aadresy. slouruje,doktorejpolokyzoznamu vystup sam uloi
vsledok,adresauruje,akstrnkasamsahova.Nariadku15sadopatrinejpolokyulo
patrintext,nariadku16savypeoznamanariadku17vlknofronteoznmi,ejevetko
hotov.
Nariadkoch20a23vytvormetrivlkna,ktorspustiafunkciu sosadlo.Nariadku22
nastavmejednotlivmvlknam,estodmoniznamento,ehlavnprogramskonavtedy,
keskoniaajtietovlkna.Akbysmetonespravili,vlknamu alejbeaajposkonen
hlavnhoprogramu.Vlknanatartujeme(riadok23),alekadznichostanevisienariadku14,
pretoefrontajezatiaprzdna.
Na riadkoch 25 a 28do fronty napchme vetky strnky, ktor chceme stiahnu spolu
sporadovmislami,abyvlknavedeli,kammajuloivstup.Akonhlesafrontanapln,vlkna
sijednotlivstrnkyrozoberazansahova.Aknemteprvevemizaneprzdnenlinku,ahko
samesta,esanatavanieneskonvtomporad,vakomstehozadali.Niektorstrnkys
kratie,niektordlhieanastraneniektorhoserveramubyvonejielinky.
Nariadku30programpok,kmvetkyvlknaneohlsiafronte,eshotov.Mete
porovnadosiahnutassahovaniaspredolmprstupom.Vniektorchnaichpokusochsaasy
prlinelili,vniektorchboldruhrchlejatrojnsobne.Zlenastavelinieknavaejstrane
anastraneserverov,zktorchsahujete.
loha1:Vyskajte a pochopte. Vyskajte zada do vstupu aj strnky na horie prstupnch
serverochaporovnajteasydosiahnutmetdousvlknamiabezvlkien.
Teraz,keuvieme,akofungujvlkna,pomesapozrienato,akovytvorizoznam,
ktorbudesmsebavedievykresliabudesipamta,kokozmiensavomodohralo.
Budemesasamozrejmesnaivytvorinovtriedu.Kealevytvormeobjekttejtotriedy
(nechsabudevolanaprkladp),budemesnmmusievediespravinasledujceopercie:
print(p[2]) (tedazisti,osanachdzanatreommieste)
p[1] = 17 (tedanastavidruhprvokna17)
print(len(p)) (tedavedieosebepoveda,akjedlh)

62
TaktovecisavPythonerieiapomocoupecilnychmetd,ktormajdopreduuren
menovinouzanajceakoniacedvomapodtrnkmi.Zatiasmesastretlisdvomitakmito
metdamismetdou__init__,ktorsaspaautomatickyprivytvorenobjektuasmetdou
__name__, s ktorou sme sa stretli, ke sme hovorili o dekortoroch a s pomocou ktorej sme
zisovalimenofunkcie.Terazsipoviemeoalchtrochtakchtometdach.Abyobjektvedel
fungovaakozoznamaleboslovnk,trebamuvytvorikadztchtometd.
Metda __getitem__(self,key) m ako vsledok vrti obsah prvku oznaenho
kom key. Ke teda budete pouva p[2], je to to ist, ako keby ste pouvali
p.__getitem__(2)
Metda __setitem__(self,key,value) nastav prvok oznaen kom key na
hodnotu value. Ke teda pouijete prkaz p[1] = 17, v skutonosti sa vykon
p.__setitem__(1,17)
Metda __len__(self) vrti vekos zoznamu. Funkcia len(p) vrti teda t ist
hodnotu,akop.__len__()
Vyzbrojen tmito vedomosami meme zaa vytvra naepole. Nasledujci program
rozdelmenadveasti.Vprvejspravmevetko,osatkanovejtriedy,vdruhejpridmesamotn
triedenieaostatnvecipotrebnnaspoluprcuskninicoupyglet.Takenajprvtprvas:
1 import pyglet
2 from pyglet.window import key
3 import random
4 import time
5 from threading import Thread
6
7 window_width = 800
8 window_height = 600
9
10 def obdlznik(x1, y1, x2, y2):
11 pyglet.graphics.draw(4,
12 pyglet.gl.GL_QUADS,
13 ('v2f', (x1, y1, x1, y2,
14 x2, y2, x2, y1)))
15
16
17 class Pole:
18 def __init__(self,length,maximum):
19 self.dx = window_width // length
20 self.dy = window_height // (maximum + 1)
21 self.changes = 0
22 self.data = []
23 for i in range(length):
24 self.data.append(random.randint(1,maximum))
25 self.size = max(2,self.dx - 2)
26 size1 = max(2,self.dy - 2)
27 self.size = min(self.size,size1)
28 def __getitem__(self,key):
29 return self.data[key]
30 def __setitem__(self,key,value):
31 self.data[key] = value
32 self.changes += 1
33 def __len__(self):
34 return len(self.data)

63
35 def draw(self):
36 for i in range(len(self.data)):
37 x = i * self.dx + (self.dx - self.size) // 2
38 y = self.data[i] * self.dy
39 obdlznik(x,y,x+self.size,y+self.size)
40 obdlznik(x + self.size // 2,0,
41 x + self.size // 2 + 1,y)
42 pocet = pyglet.text.Label(str(self.changes),
43 font_size=30,
44 x=100,
45 y=window_height - 50,
46 anchor_x='center')
47 pocet.draw()

Nazaiatkusmeimportovalipotrebnkninice,nariadku7a8smenastavilipremenn
urujcerkuavkuokna.Nariadkoch10a14smevytvorilifunkciu,ktornakreslobdnik.
Obdnikjeurensradnicamiprotiahlchrohov x1, y1 a x2, y2.Funkcia draw zkninice
pygletsaodvolvanakninicuOpenGL,sktoroupygletspolupracuje.Jejpodrobnpopisjeale
nadrmectchtoskrpt.
Dostvame sa k samotnej triede Pole. Jej kontruktor m dva parametre dku poa
avekosmaximlneholena.Najprvsavomnastaviapremenn dx a dy,ktoruruj,koko
priestoru ostane pre jeden prvok pri vykresovan v smere osi x a v smere osi y. V atribte
changessibudemepamta,kokozmiensavpoliudialo.Atribtdatabudeobsahovasamotn
dtapoa.Nariadkoch23a24honaplnmedanmpotomnhodnchselvurenomrozsahu.Na
riadkoch25a27vypotame vekostvoreka, ktorsabudevykresovanamiesto hodnoty.
Nemalbypresiahnuanidx 2anidy 2,alemalbybyaspo2.
Nariadkoch28a34vyrobmemetdy,oktorchbolarevyie.Vimnitesimetdu
__setitem__,ktorjespraventak,evdy,kesanastavniektorejpolokepoanovhodnota,
zviatribtchangeso1.
Na riadkoch 37 a 47 je metda, ktor m na starosti vykresovanie. Pre kad prvok
zoznamudatasavypotajsradnicexaynaktorchsamvykresli.Naurenchsradniciach
savykresltvorekaknemudlhstopkaanaspodokobrazovky.Nazversavypepoetzmien,
ktorsazatiavpoliudiali.
Skvel.Naepole,ktorjeschopnsavykresliaviesosebezznamybysmemalihotov.
Memezaatriedi.Samotntriedeniesaodohrvofunkcii bubblesort.Tototriedeniezatia
nebudemekomentova,pomesanajprvpozrienazvyokprogramu:
48 p = Pole(70,50)
49
50 def bubblesort():
51 for i in range(1,len(p)):
52 for j in range(i,0,-1):
53 if p[j] < p[j-1]:
54 p[j],p[j-1] = p[j-1],p[j]
55 time.sleep(0.25)
56 else:
57 break
58
59 window = pyglet.window.Window(window_width,window_height,
60 fullscreen = False)
61 window.set_mouse_visible(False)

64
62 @window.event
63 def on_draw():
64 window.clear()
65 p.draw()
66
67 def update(dt):
68 pass
69
70 t = Thread(target = bubblesort)
71 t.setDaemon(True)
72 t.start()
73
74 pyglet.clock.schedule_interval(update,0.04)
75 pyglet.app.run()

Nariadku48vytvormepolesosedemdesiatimiprvkami,priomhodnotybudod1do50.
Nariadkoch50a57jeuspomnanprocedrabubblesort,ktorbudepoletriedi.Nariadkoch
59a61vytvormeokno,doktorhobudemekreslianastavme,abyvomnebolviditenkurzor
myi.Nariadkoch62a65jevykresovaciafunkciaon_draw.Nedejesavnejnizvltne,lento,
esavetkozmaeanakreslsapole.
Zaujmavjefunkcia update.Funkciatotiobsahujejedinkovslovo pass,ktor
znamen,efunkciavbecninerob.Prirodzenesanatskaotzka,naojenmtakfunkcia
dobr.Vecsamtotitak,efunkciaon_drawsavolibavtedy,kesakninicapygletdozvie,
esanieozmenilo.Alenaetriedeniesabudeodohrvavplneinomvlkne,takesakninica
nemodkiaozmenedozvedie.27Pretosmesiurobilifunkciu updateavolmejudvadsapkrt
zasekundu.Funkciasceninerob,alevakatomu,esazavol, pyglet vie,emprekresli
scnu.
Nariadkoch70a72natartujeme vlknostriedenm anariadkoch 74a75spustme
volaniefunkcieupdateanatartujemevecitkajcesakninicepyglet.
loha2:Pochopteavyskajte.Funkciu bubblesortzatiapodrobnetanemuste,sksteiba
ztoho,ovmprogramukazuje,prsnato,akotofunguje.
Konenemmezasebouvetkypodpornprceamemesavenovasamotnmutriedeniu.
Akoprvsmezvolilitakzvanbublinkovtriedenie.Pripomemeeterazjehokd:
1 def bubblesort():
2 for i in range(1,len(p)):
3 for j in range(i,0,-1):
4 if p[j] < p[j-1]:
5 p[j],p[j-1] = p[j-1],p[j]
6 time.sleep(0.25)
7 else:
8 break

Pre kad prvok v poli (nazvime ho doasne Hubert) spravme nasledujcu operciu:
Pozriemesa,ijeHubertmen,neprvokodnehovavoaakje,vymenmeich.Totoopakujeme,
akmnenarazmenaprvok,ktoruniejev,neHubertalebokmHubertnedoraznapln
zaiatok.(Pripomname,epremennjmevcyklenariadku3nadobudnvetkyhodnotyod i
27 To,esajednovlknonemodkiadozvedie,osadejevinom,niejecelkompravda.Vlknamu
medziseboukomunikova,doasnesipresebavyhradzovapremennapomocousemaforovzabezpei,abynejak
kuskduvykonvaloibajednovlkno.Detailynjdetevmanulikukninicithreading.

65
do1.Nuluunenadobudne.)Ketopostupnespravmesovetkmiprvkamivpoli,kadprvok
taktoprebublnasvojemiestoanakoniecbudecelpoleutrieden.
Bubblesortsmeakonaevodntriedeniezvolilizdvochdvodov:Jednakpreto,lebosa
ahkoprogramuje.Vdruhomradepreto,ejetojednoznajhorchznmychtrieden.Abysmeho
alelentaknaprzdnoneohovrali,budesatrebaaspotrochuzaoberamatematikouazisti,koko
priradenbudetrebavykona,kechcemepoletmtospsobomtriedi.Tejmatematikysatuado
koncalekciebudevyskytovaviac.Aksavmpotaniebrid,alechcetevedie,akofungujalie
typytriedenia,pokojnetmatematikupreskote.
Predstavmesi,emmedesaprvkovpole,ktorjezoradenpresneopane,nebysme
chceli,tedavyzertakto:
10987654321
Vprvomkrokuvymenme9s10.Natopotrebujemespravi dve priradeniadopoa.Polebude
vyzeratakto:
91087654321
Kebudemeposvadopreduosmiku,budemejumusievymeninajprvsdesiatkouapotom
sdeviatkouabudemepotrebovaurobityripriradeniadopoa.
Takto to postupne urobme so vetkmi prvkami. Nakoniec budeme dostva dopredu
jednotku. Budeme ju musie vymeni a s deviatimi slami a vyjde ns to teda na osemns
priraden.Dokopysmetchpriradenvykonali
2+ 4+6+8+10+12+14+16+ 18=90
Voveobecnomprpade,kedyprvkovnemme10,ale n ,bytchvmenbolo
( n1)n
2+ 4+6++2 (n1)=2[1+2+ 3++(n1)]=2 =n 2n
2
Akostesiistovimli,vpredolomriadkusauvyskytovalamatematikakonkrtneset
aritmetickej postupnosti a prava vrazov. Vylo nm, e vo veobecnom prpade budeme
potrebova maximlne n 2n vmen. Ke autorom knihy neverte (o je prstup, ku ktormu
povzbudzujeme),taksanatenriadoketechvupozerajteapochopteho.
Znalcivedia,e n 2n jekvadratickfunkcia.Kesa programtoribaviaotom,akje
algoritmuszloit,takimastonetrebavedie,kokoopercijetopresne.Bezohadunato,ije
vsledok n 2n alebo 20 n2 +4 n+55 ,algoritmusmprenichkvadratickzloitos(zapisujesato
aj,emzloitos O( n2 ) ),pretoesivpoteopercivmajibatjehoas,ktormsklonypri
zvujcomsa n rsnajrchlejieaajprinejignorujkontantu,ktoroujevynsoben.Akby
lohualgoritmusvoveobecnomprpadezvldalna 27 n+ 16 opercii,malbyzloitos O(n)
(tzv. linerna zloitos) a ak by to bolo 2 n+ n5 , mal by zloitos O(2n ) (tzv. exponencilna
zloitos).Rchlostialgoritmovsavprvomradeporovnvajpodazloitosti.Algoritmus,ktor
mzloitos O( n2 ) jepokladan zavraznelep,akoalgoritmus,ktormzloitos O(2n ) ,
pretoenapr. 21000 jenepredstavitenevie,ne 10002 vcelomviditenomvesmrejelenasi
177
2 atmov.28

28 Samozrejme jenutn si pri takomtorozliovan zachova zdrav rozum azvi naprklad, ak vek
hodnoty n pripadajdovahy.Akbysmemalidvaalgoritmy,prvbypotrebovalvykona 1000 n operci,druh
2
n operciavedelibysme,e n mebymaximlne10,jeuritelepiepouidruhalgoritmus,ajkem
kvadratickzloitosaprvmlinernu.Kebyalemaloby n milin,prvalgoritmusbudevhodnej.

66
Poksmesateraznalgoritmusvylepi.Prvvylepenie,ktorlovekumenapadnje,
e zakadm vymiea iba susedn prvky je zbyton obmedzenie. Ke niektor prvok
potrebujemedostanajehomiesto,bolobyoveajednoduchieposunvetkyvieprvkyojedno
miestovpravoazatrieovanprvokrovnopriraditam,kampatr.Taktonemusbyzatrieovan
prvokpostupnepriradendovetkchpozciaveapriradentakuetrme.Algoritmus(nazvasa
triedenievsvanm)bymoholpovylepenvyzeranaprkladtakto:

1 def insertsort():
2 for i in range(1,len(p)):
3 a = p[i]
4 n = i - 1
5 while n >= 0 and p[n] > a:
6 p[n+1] = p[n]
7 time.sleep(0.625)
8 n -= 1
9 p[n+1] = a
10 time.sleep(0.625)

Prvokzoznamu,ktoridemeuprata,siulomedopremenneja.Prvkyzoznamuposvame
doprava,kmsviene prvokvpremennej a,alebokmneprdeme nazaiatok zoznamu
(riadky5a8).Zdranienariadku7mpolovinhodnotuoprotizdraniuvbubblesorte,pretoe
robmeibajednopriradenienamiestodvoch.Kesuvetkypotrebnprvkypresunut,prvok
zpremennejasaulonasprvnemiesto.
loha3:Pochopteavyskajte.Nezabudniteprivytvranvlknazmenifunkciu,ktormvlkno
spusti.Akjezloitostriedeniainsertsort?
Akstesprvnevyrieiliproblmzloitosti,zistiliste,evnajhoromprpade(akbybolo
(n1)n n2 n
polezoraden naopak)budefunkcia presva 1+2+3++(n1)= = prvkov.Na
2 2 2
jednustranujetodvakrtmenej,akopribublinkovomtrieden,ojeskvel.Aknieopredtm
trvalo hodinu, teraz to bude trva iba pol hodiny. Na druh stranu, zloitos je stle O (n 2) .
Akbudemetriedimilinsel,budememusiespravinamiestobilinaoperciibapolbilinaato
smesitedaveminepomohli,lebovrozumnomasenestihnemeanijedno,anidruh.Existuje
vbectriedenie,ktorbybolonatokolepie,ebymaloajlepiuzloitos?
Existuje.Dokoncaviacero.Zviacerchkandidtovtupredvediemehaldovtriedeniealias
heapsort. Km sa ale dostaneme k samotnmu triedeniu, musme si poveda nieo viac
odtovchtruktrach,ktorbudemepouva.
V kapitole, v ktorej sme hadali najkratiu cestu medzi dvoma mestami, ste sa stretli
sdtovoutruktrounazvanougraf.Terazbudemepotrebovaistpecilnygraf,ktorsanazva
binrnystrom.Binrnystrommetevidienaobrzku12.

67
Obrzok12:Binrnystrom
Binrnystromsaskladzviacerchrovn.Vrcholnakadejrovnijespojensjednm
vrcholomnavyejrovni.Vnimkutvorvrcholnanajvyejrovni,ktorsanazvakore.(no,
je to zvltne, ale binrne stromy maj kore hore.) Kad vrchol me by spojen hranami
svrcholminanichrovniach,aletiehranymubymaximlnedve.(Kvlitomusatenstrom
vol binrny.) Od nho binrneho stromu budeme ete navye chcie, aby boli jeho vrcholy
umiestnenonajvyieavposlednomriadkuonajviacvavo,takeakmmatakstromosem
vrcholov,takmusvyzerapresnetak,akonaobrzku12.Dotohtostromuterazprepeme(pekne
poriadkoch)slaznhopoaamemezaatriedi.
Vprvomradebudemechcie,abysanbinrnystromstalhaldou.Haldajestrom,ktorm
tpeknvlastnos,eslo,ktorjezapsanvniektoromvrchole,musbyvie,nevetkysla
pod nm.29 N strom evidentne takou haldou zatia nie je, pretoe naprklad slo 3, ktor je
zapsanvkorenistromujemenie,neobeslavovrcholochpodnm.
Ako z nho stromu tak haldu urobi? Jednoducho. Prejdeme vetky pozcie v strome
pekne od vrchu aak zistme, e slo na niektorej pozcii je vie, ne slo nad nm, sla
vymenmeanaeslobudemealejposvahoreadovtedy,kmnebudemanadsebouvie
alebokmnebudevkoreni.Udejesatedatoto:

Sedmikusmepresunulivyie.

tvorkamnadsebouvyieslo,taksounehbeme.

29Binrnystromahaldascelkomnzornenakreslentu:http://xkcd.com/835/

68
estkusmepresunulivyie.

Osmikusmenasprvnemiestodostalianadvakroky.

Sdvojkouhbanetreba.

Pkusmepresunulivyie.

Sjednotkouhbanetreba.

Terazjeuznhobinrnehostromuhalda.Svnejtieistsla,akopredtm,alekad
mpodseboulenniiesla.
Skr,nesapustmealej,poksmesavypota,kokonajviacpriradennsstlospravi
zostromuhaldu.Kadvmenasdvepriradenia.Zaalismepresvana n1 pozciach(na
vetkch okrem korea) a slo z kadej pozcie sme vdy presvali vyie, take sme urite
nespraviliviacpriraden,neje 2 n h ,kde h jevkastromu.30
30Tentoodhadbysasamozrejmedalzlepi.Vesmenaprkladnamieston1pouilin.Aletaktojezpis
jednoduchakrajaukesa,etaktoodhadjedostaton.

69
Fajn.Haldumme.Akoznejzskautriedenpole?Natopouijemenasledujcitrik:
Zatiaviemeibajednonajvprvokpoa(osmika)jezaruenevkoreni.Pokojneho
memeodloinakoniecnhopoa.Musmehoaleniemnahradi.Aabysinstromzachoval
tpeknvlastnos,ejeodvrchuazavaplneobsaden,musmehonahraditoujednotkouvavo
dole.

Obrzok13:Zaradenosmika

Lenenastalproblm.Vmomente,kesmejednotkuzapsalidokorea,nskvelstrom
prestalbyhaldou.(Pozriobrzok13.)Trebatonejakoopravi.
Terazsmealevtrochuinejsitucii,akokesmehalduvytvrali.Tjednotkumusme
sniemvymeni.Kebysmejednotkuvymenilispkou,pkabysceunemalanadseboumenie
slo,aledostalabysanadsedmiku,onemeby.Pretosapotrebujemepozrie,ktorzdolnch
susedovjednotkyjevavymeni jednotkusnm.Totoopakujeme, akmznovunemme
haldu:

Vimnitesi,epriprechodezdruhhonatretieposchodiesajednotkamuselavymeniso
estkouaniestrojkou,leboinakbysatrojkadostalanadestku.
Optedammehalduanajvprvokmmevkoreni.Zaradmehotedadouutriedench
selanahradmehoslomnaposlednejpozcii,tedatvorkouaopupravmestrom,abybol
haldou.

Totosabudeopakova,akmnebudepoleutrieden.

70

Ajeutrieden.
Kokoopercinsstlattofza?Opsa n1 krtdostalonejakslodokoreaabolo
hotrebadopravinasprvnemiesto.Zaruenesmetedanepouiliviac,ne 2 n h priraden,kde h
jevkastromu.
Pomesateraznachvuvenovatajomnmupsmenu h .Potrebovalibysmevedie,koko
poschodbudemabinrnystrom,ktorvzniknezpoasnprvkami.Totojejednazloh,naktor
jelepiepozriesazdruhejstranyaoptasakemmstroms h poschodiami,kokoselsa
midohozmest?
Vprvomriadkujejednoslo.Vdruhomdve.Vtreomtyri,vtvrtomosemat.Vdy
valomriadkujedvakrt viac sel, akovpredolom.Poty selvriadkochstm pdom
mocninydvojky.Vnimkutvorposlednriadok,ktornemusbycelkompln.Vminimlnom
prpadejevposlednomriadkujedinslo.Vetkchselvstromejetmpdom
h2
1+2+4+8++2 +1
(t jednotka na konci je to jedno slo v poslednom riadku). T, o vedia sta geometrick
postupnosvedia,ejetodokopy 2h1 .Metesitooverinanaomprvomstromemaltyri
riadky,vposlednombololenjednosloadokopysadonehovolo 23 teda8sel.

71
Vmaximlnomprpadejeposlednriadokpln.Vetkchselvstromebudeteda
h2 h1 h
1+2+4+8++2 +2 =2 1
prepoetselntedaplat,e
h1 h
2 n<2

Terazsispomenieme,akofungovallogaritmus(alebosaoptamestariehobrata)azpredolej
nerovnostidostaneme
h1log2 n<h
Vyhralisme.Vieme,e h saliod log2 n omenejako1.Poetpriraden,ktorsmepouilipoas
celhotriedenia,jetedamen,ne 2 n h+2 n h = 4 n h 4 n log2 n .
Porovnajmetostriedenmvsvanm.Predstavtesi,ebystemuselitriedimilinsel.
999 999.1000 000
Vprpade vsvania v najhorom prpade pouijete =499 999 500 000 teda asi
2
psto milird priraden. Vprpade haldovho triedenia budete potrebova maximlne
4 000 000 . log 2 1 000 000 = 4 000 000 . 19,9 79 726 274 ieasiosemdesiatmilinovpriraden.
Tojeasiestisckrtmenej.Adleitjeto,enabenompotaitoprvnestihneteatodruh
hej.
Jezrejm,edvojkovlogaritmuszmilinajeslopodstatnemenie,nemilinjeto
onieomenej,ako20.Zloitoshaldovhotriedenianebudeteda O (n 2) ,ale O (n log n) .31
Vetci,ktorsaprehrzlipredolouhorouterie,sizaslianehyncuesactu.Meme
zaaprogramova.Najprvsaaleoplatzamyslie,akobudemesladohaldyuklada.Mohliby
smesispravigrafpodobneakovsmejlekcii.Aletobysmemuselinajprvpresvaslazo
zoznamudografuapotomnasp.Omnoholepiebyboloudraslanejakovpoli.
Memespravinaprkladvec,ktorvidtenaobrzku14.Zakorestromuvyhlsimenult
prvokzoznamu,druhriadokbudtvoriprvadruhprvok,tretriadokbudetvoritretaiesty
prvokzoznamuat.

Obrzok14:Oslovanstrom
Potrebovalibysmealenejakorchlozisti,ktorprvokjesktormspojen.Anatosanm
budehodielegantnmatematickfinta.Vimnitesi,evrcholsslom n mpodsebouvdy
31 Vimnite si, e vzpise zloitosti jepouit zpis log n ,ktorm matematici oznauj logaritmusso
zkladom 10namiesto log 2 n .Tomdvepriny.Prvjet,evinformatikesavyskytujedvojkovlogaritmus
astejie, akodesiatkovatakvniektorchlnkochinformatici pouvaj zpis log n predvojkovlogaritmus.
Druhdvodjeten,edvojkovlogaritmusnejakhoslajevdyasi3,32krtv,nedesiatkovakontantysa
vzpisezloitostizanedbvaj,takejetenzpisdobreajsdesiatkovmlogaritmom.

72
vrcholysslami 2 n+1 a 2 n+ 2 anadsebouvrchol (n1)/ / 2 (pripomeme,espomocou / /
savPythone3zapisujeceloselndelenietedanapr. 14/ /3=4 ).
Vyzbrojentoutofintoumemenaprogramovahaldovtriedenie:

1 def heapsort():
2 for i in range(1,len(p)):
3 n = i
4 while n > 0 and p[n] > p[(n-1)//2]:
5 p[n],p[(n-1)//2] = p[(n-1)//2],p[n]
6 n = (n-1)//2
7 time.sleep(1.25)
8 for i in range(len(p)-1,0,-1):
9 p[i],p[0] = p[0],p[i]
10 time.sleep(1.25)
11 n = 0
12 while 2*n + 1 < i:
13 a = 2*n + 1
14 if 2*n + 2 < i and p[2*n + 2] > p[2*n + 1]:
15 a = 2*n + 2
16 if p[a] > p[n]:
17 p[a],p[n] = p[n],p[a]
18 n = a
19 time.sleep(1.25)
20 else:
21 break

Nariadkoch27vytvormehaldu.Postupneprejdemevetkyprvkypoa(hlavncyklus
for)akadposvamevstromenahordovtedy,kmnadnmniejevieslo,alebokmnieje
plnenavrchu(cykluswhile,vpremennejnjeslovrchola,sktormprvepracujeme).To,e
smeplnehore,spoznmepodatoho,en == 0.
Nariadkoch821saudejesamotntriedenie.Hodnota ipredstavujeposlednprvok,ktor
etevstromemme,zvyokuniejestrom,aleutriedenpole.Nariadku9vymenme kore
stromu(vktoromjeaktulnenajvie slopoa)sposlednmprvkomatmhozaradme na
sprvnemiesto.Vcyklenariadkoch1221dostaneme slo,ktorsaocitlovkoreninatak
miesto, aby strom op tvoril haldu. Na riadkoch 13 a 15 zistme, i je via hodnota pod
aktulnym vrcholom vavo alebo vpravo slo vrchola svou hodnotou si uchovme
vpremenneja.Dvamepritompozor,abysmenevliezlidouutriedenejasti,ktorzana itym
prvkom. Ak je hodnota vo vrchole a via, ako hodnota vo vrchole n, tak ich vymenme
apokraujemealej(riadky1619).Aknieje,prvokjeunamiesteamemevntorncyklus
skoni.
loha4: Pochopte,naprogramujteakochajtesa.Nezabudnitezaseupravispustenievlknana
novtriedenie.
Nazverlekciespomemenieojednoduch.
Dsadokza,evoveobecnostije O (n log n) najlepiazloitos,ktorsadpritrieden
dosiahnu.Aleaknastanistpecifickokolnosti,situciasadetezlepi.
Predstavtesinaprklad,edopreduvieme,evnaompolibudzarueneibaprirodzen
slaod1do50.Ttopodmienkajezhodouokolnostsplnenpripomemesi,akobolopole

73
inicializovan.Ninmnebrnipoleprezrieazapamtasi,kokovombolojednotiek,koko
dvojok,kokotrojokapotompodatohtozznamupoleprepsa.Nazaiatokdasprvnypoet
jednotiek, po om sprvny poet dvojok Tto finta sa nazva potacie triedenie alias
countingsort.Naprogramovantovyzertakto:

1 def countingsort():
2 pocty = 51 * [0]
3 for i in p:
4 pocty[i] += 1
5 time.sleep(0.625)
6 pozicia = 0
7 for i in range(1,51):
8 for j in range(pocty[i]):
9 p[pozicia + j] = i
10 time.sleep(0.625)
11 pozicia += pocty[i]

Najprvsivytvormezoznam pocty,ktorbudema51prvkovsamnuly.Vcyklena
riadkoch35saprezriecelpolepaprekadhodnotu,ktorsavomnjde,zvmepatrin
polokuvzoznamepoctyojedna.Potomvcyklenariadkoch711dopvodnhopoazapeme
vdytokokusovdanejhodnoty,kokonjdemevzoznamepocty.Pomocnpremennpozicia
nmhovor,odkiammezaazapisova.Akmpole n prvkov,pritanspravme n zpisovdo
zoznamupoctyaprizpisespravme n zpisovdopoap.Dokopyjeto 2 n zpisov.Algoritmus
mtedazloitos O(n) .Aktedamtetriedipole,oktoromviete,esavomnachdzaiba
niekokotypovpoloiek,zvte,iniejevhodnpouipotacietriedenie.
loha5:Vyskajte.
loha6:Sksteprerobimetdudrawtak,abysapolevykresovalodotvrtinyobrazovky,ktor
urte v kontruktore. Spustite potom tyri vlkna tak, aby v kadom bealo jedno
triedenieavetkybysaukazovalinaobrazovkesasne,kadvinejtvrtine.
Zaujmavchtriedenjeeteniekoko.Spomemenaprklad quicksort,ktormvemi
elegantn algoritmus alebo timsort, ktor vymyslel v roku 2002 Tim Petersen a ktor ako
triediaci algoritmus pouva vo svojich procedrach Python. Detaily zvedav itate njde na
wikipedii.
loha7:Pozritesividetkajcesatriedenia,naktornjdeteodkazyniie.
http://www.youtube.com/watch?v=ywWBy6J5gz8
http://www.youtube.com/watch?v=kPRA0W1kECg

74
Zver
astnestesadostalinakoniecskrptkjazykuPython.oteraz?Nuo.Programujte.
okovek.Natudujteporiadnekninicu pyglet aurobtehru.Natudujtesiksoknejakejvedy
(matematiku,fyziku,chmiu,biolgiu,okovek)askstenaprogramovanieovnej.Pte
drbovskriptyprelinux.Skstesaspomocoupythonuhrasobrzkami.Pustitesadosaenia.
Navtvtestrnky http://www.ksp.sk ahttp://oi.sk,skstevyrieinieona http://projecteuler.net,
prihlste sa do http://www.smnd.sk/main/spongia Alebo si len tak naprogramujte nejak
jednoduchskriptpreradosatetesazneho.Mnohoastiaprajem.

Anino

75

You might also like