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

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

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.

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_.

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.

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
2
3
4

print("Ako sa vol?")
meno = input()
vystup = "Ahoj " + meno + ", ja som Python."
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
2
3
4
5
6
7
8
9
10

print("Ja som hrac automat.")


print("Stav desa eur.")
heslo = input("Zadaj heslo: ")
if heslo == "krokodil":

print("Vyhral si.")

print("Me si zobra tch desa eur nasp.")


else:

print("Prehral si.")

print("Desa eur ti prepadlo.")


print("Isto si chce zahra ete raz.")

Prvzaujmavdetailsavyskytujevtreomriadku.Funkciainputtamtotimparameter
"Zadaj heslo: ".Tospsob,efunkcianajprvnape Zadaj heslo: aapotomakna
vstupoduvatea.
3Riadkysslovanibakvlilepejorientcii.Ketobudeteska,slariadkovdoprogramunepte.

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
2
3
4
5
6
7

odpoved = input("Chce mi poveda slo? ")


if odpoved == "ano":

cislo = input("Tak povedz: ")

if cislo != "42":

print("Aha...")

else:

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
2

cislo = input("Zadaj cislo: ")


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
2
3

vstup = input("Zadaj cislo: ")


cislo = eval(vstup)
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
2
3
4
5
6
7

vstup = input("Zadaj cislo: ")


try:
cislo = eval(vstup)
except:
print("Zadali ste nejak nezmysel")
quit()
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
tresk', 'Yoda']

Solo',

'Leia',

'Star

trek',

'Star

wars',

'Vek

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
print(hrdinovia[1],"je
print(hrdinovia[2],"je
print(hrdinovia[3],"je
print(hrdinovia[4],"je
print(hrdinovia[5],"je

hrdina!")
hrdina!")
hrdina!")
hrdina!")
hrdina!")
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
2
3
4
5
6

vstup = ""
while vstup != "A":
vstup = input("Nap A: ")
if vstup != "A":
print("Hovoril som A!!!")
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15

vstup = ""
pocetZlych = 0
while vstup != "A":
vstup = input("Nap A: ")
if vstup != "A":
print("Hovoril som A!!!")
pocetZlych = pocetZlych + 1
if pocetZlych == 3:
break
if pocetZlych == 3:
print("Nevad! Niekedy nabudce.")
else:
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
2
3
4
5
6

sucet = 0
for i in range(1,21):
if i % 2 == 0:
continue
sucet = sucet + i
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
2
3
4
5
6
7

from random import random, randint, choice


def potvora():
p = []
for i in range(5):
p.append(randint(0,9))
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
9
10
11
12
13
14

def krasa(p):
najkrajsiaPotvora = [1, 2, 3, 4, 5]
k = 0
for i in range(5):
if p[i] == najkrajsiaPotvora[i]:
k += 1
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
16
17
18
19

def svorka():
s = []
for i in range(10):
s.append(potvora())
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
21
22

def vypis(s):
for pot in s:
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
24
25
26
27
28
29
30
31
32
33

def potomok(a,b):
mlade = []
for i in range(5):
if randint(0,1) == 0:
mlade.append(a[i])
else:
mlade.append(b[i])
for i in range(5):
if random() < 0.08:
mlade[i] = randint(0,9)
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
35
36
37
38
39
40
41

def novasvorka(s):
s = sorted(s, key = krasa, reverse = True)
nova = []
for i in range(int(len(s) / 2)):
partner = choice(s)
nova.append(potomok(s[i],partner))
nova.append(potomok(s[i],partner))
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
43
44
45
46
47
48
49
50
51
52
53

def evolucia():
s = svorka()
generacia = 0
koniec = False
while not koniec:
print("Genercia: ",generacia)
vypis(sorted(s, key=krasa, reverse = True))
vs = input(":")
if vs == 'x':
koniec = True
s = novasvorka(s)
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
2
3
4
5
6
7
8
9
10
11
12

class Zamestnanec:
meno = ""
priezvisko = ""
plat = 0
jozo = Zamestnanec()
jozo.meno = "Jozef"
jozo.priezvisko = "Mrkvika"
jozo.plat = 753.20
print("%s %s m plat %.2f euro" %
(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
2
3
4
5
6
7
8
9
10
11
12
13

class Zamestnanec:
meno = ""
priezvisko = ""
plat = 0
def vypis(self):
print("%s %s m plat %.2f euro" %
(self.meno, self.priezvisko, self.plat))
jozo = Zamestnanec()
jozo.meno = "Jozef"
jozo.priezvisko = "Mrkvika"
jozo.plat = 753.20
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15

class Zamestnanec:
def vypis(self):
print("%s %s m plat %.2f euro" %
(self.meno, self.priezvisko, self.plat))
def __init__(self, meno, priezvisko, plat = 337.70):
self.meno = meno
self.priezvisko = priezvisko
self.plat = plat
jozo = Zamestnanec("Jozef", "Mrkvika", 753.20)
fero = Zamestnanec("Frantiek", "Otruba")
jozo.vypis()
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

from random import choice


class Sardinka:
"""Trieda reprezentujca obe"""
def __init__(self, more, x = -1, y = -1):
self.more = more
if x == -1 and y == -1:
volnemiesta = more.volneMiesta()
if volnemiesta == []:
raise Exception("Pln more!!!")
x,y = choice(volnemiesta)
self.x = x
self.y = y
self.interval = 2
self.posmnoz = 0
self.dospelost = 3
self.vek = 0
self.typ = 's'
def _mlade(self,x,y):
s = Sardinka(self.more,x,y)
return s
def pohyb(self):
volne = self.more.blizkeVolno(self.x,self.y)
if volne != []:
x,y = choice(volne)
self.more.presun(self, x, y)
self.vek += 1
self.posmnoz += 1
def potomstvo(self):
if self.vek >= self.dospelost and self.posmnoz >= self.interval:
volne = self.more.blizkeVolno(self.x,self.y)
if volne != []:
x,y = choice(volne)
novaRyba = self._mlade(x,y)
self.more.pridajRybu(novaRyba)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

class Zralok(Sardinka):
"""Trieda reprezentujca predtora"""
def __init__(self,more, x = -1, y = -1):
Sardinka.__init__(self,more,x,y)
self.interval = 3
self.dospelost = 4
self.typ = 'Z'
self.nazratost = 1
self.maxnazratost = 2
def _mlade(self,x,y):
s = Zralok(self.more,x,y)
return s
def pohyb(self):
sardinka = self.more.blizkaSardinka(self.x,self.y)
if sardinka == []:
self.nazratost -= 1
if self.nazratost < 0:
self.more.uhyn(self)
else:
Sardinka.pohyb(self)
else:
x,y = choice(sardinka)
self.more.zozer(self,x,y)
self.vek += 1
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

class More:
"""Prostredie pre predtorov a obete"""
def __init__(self,velkost = 20):
self.more = []
self.velkost = velkost
for i in range(velkost):
riadok = []
for j in range(velkost):
riadok.append('.')
self.more.append(riadok)
self.sardinky = []
self.zraloky = []
def pridajRybu(self,ryba):
if self.more[ryba.x][ryba.y] == '.':
self.more[ryba.x][ryba.y] = ryba.typ
if ryba.typ == 's':
self.sardinky.append(ryba)
else:
self.zraloky.append(ryba)
def pridajSardinku(self):
self.pridajRybu(Sardinka(self))
def pridajZraloka(self):
self.pridajRybu(Zralok(self))
def volneMiesta(self):
vm = []
for i in range(self.velkost):
for j in range(self.velkost):
if self.more[i][j] == '.':
vm.append((i,j))
return vm
def _najdiBlizko(self,co,x,y):
zoz = []
for i in range(-1,2):
for j in range(-1,2):
if i == 0 and j == 0:
continue
nx = (x+i) % self.velkost
ny = (y+j) % self.velkost
if self.more[nx][ny] == co:
zoz.append((nx,ny))
return zoz
def blizkeVolno(self,x,y):
return self._najdiBlizko('.',x,y)
def blizkaSardinka(self,x,y):
return self._najdiBlizko('s',x,y)
def presun(self,ryba,x,y):
self.more[ryba.x][ryba.y] = "."
self.more[x][y] = ryba.typ
ryba.x, ryba.y = x,y

34

111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

def zozer(self,zralok,x,y):
for i in range(len(self.sardinky)):
if self.sardinky[i].x == x and self.sardinky[i].y == y:
self.sardinky.pop(i)
break
self.more[zralok.x][zralok.y] = '.'
self.more[x][y] = zralok.typ
zralok.x, zralok.y = x,y
def uhyn(self,zralok):
self.zraloky.remove(zralok)
self.more[zralok.x][zralok.y] = "."
def vypis(self):
for i in range(self.velkost):
s = ""
for j in range(self.velkost):
s += self.more[i][j] + " "
print(s)
def pohyb(self):
for i in self.sardinky:
i.pohyb()
i.potomstvo()
for i in self.zraloky:
i.pohyb()
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
136
137
138
139
140
141
142
143

m = More(30)
for i in range(60):
m.pridajSardinku()
for i in range(6):
m.pridajZraloka()
m.vypis()
while (input(':') != 'q'):
m.pohyb()
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
2
3
4
5
6
7
8
9
10
11
12
13

def citajSubor(meno):
subor = open(meno,"r")
riadky = subor.readlines()
cesty = {}
for i in riadky:
a = i.split(",")
for j in range(2):
if not a[j] in cesty:
cesty[a[j]] = []
cesty[a[0]].append([a[1],float(a[2])])
cesty[a[1]].append([a[0],float(a[2])])
subor.close()
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',
125\n', 'Kty,Nov Mesto nad Vhom,76\n', ...

'Bratislava,Komrno,

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
15
16
17
18
19

class Smerovka:
def __init__(this, vzdialenost=float("infinity"),
odkialsmeprisli="odnikial", hotovo=False):
this.vzdialenost = vzdialenost
this.odkialsmeprisli = odkialsmeprisli
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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

def najkratsiaCesta(cesty,odkial):
kade = {}
for i in cesty:
kade[i] = Smerovka()
kade[odkial] = Smerovka(0, '', True)
posledne = odkial
minimum = 0
while minimum < float("infinity"):
for i in cesty[posledne]:
if kade[i[0]].vzdialenost > kade[posledne].vzdialenost + i[1]:
kade[i[0]].vzdialenost = kade[posledne].vzdialenost + i[1]
kade[i[0]].odkialsmeprisli = posledne

minimum = float("infinity")
nova = ''
for i in kade:
if (not kade[i].hotovo) and kade[i].vzdialenost < minimum:
nova = i
minimum = kade[i].vzdialenost
posledne = nova
if posledne != '':
kade[posledne].hotovo = True
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
43
44
45
46
47
48
49
50
51
52
53
54

def vypisTrasu(najkratsie,kam):
if najkratsie[kam].vzdialenost == float("infinity"):
print("Ned sa tam dosta. :(")
return
cesta = [kam]
kdesme = kam
while najkratsie[kdesme].vzdialenost != 0:
kdesme = najkratsie[kdesme].odkialsmeprisli
cesta.append(kdesme)
print("Najkratia cesta vedie cez mest:")
for i in reversed(cesta):
print(i)
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
56
57
58
59
60
61
62
63

siet = citajSubor("cesty.csv")
oznam = "V databze mme tieto mest:\n"
for i in siet:
oznam += i + "
"
print(oznam)
odkial = input("Z ktorho mesta si prajete cestova? ")
kam = input("Kam si prajete s? ")
najkratsia = najkratsiaCesta(siet,odkial)
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
2
3
4
5
6
7
8
9
10
11
12
13
14

import pyglet
window = pyglet.window.Window()
label = pyglet.text.Label('Hello, world',
font_size=36,
x=window.width//2, y=window.height//2,
anchor_x='center')
@window.event
def on_draw():
window.clear()
label.draw()
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

import pyglet
from pyglet.window import key
from pyglet.window import mouse
ufon = pyglet.resource.image('09-alien.png')
cas = 0
window = pyglet.window.Window()
@window.event
def on_draw():
window.clear()
ufon.blit((window.width - ufon.width)//2, 20)
label = pyglet.text.Label(str(cas), font_size=36,
x=window.width//2, y=window.height//2,
anchor_x='center')
label.draw()
@window.event
def on_key_press(symbol, modifiers):
if symbol == key.M:
print("Stlail si M")
elif symbol == key.LEFT:
print("Stlail si pku vavo.")
@window.event
def on_mouse_press(x, y, button, modifiers):
if button == mouse.LEFT:
print("Klikol si avm na sradniciach [%d,%d]" % (x,y))
def sekunda(dt):
global cas
cas += 1
pyglet.clock.schedule_interval(sekunda,1)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

import pyglet
from pyglet.window import key
import random
window = pyglet.window.Window(320,200,fullscreen = True)
window.set_mouse_visible(False)
pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA,
pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
class Alien:
alien_img = pyglet.resource.image('09-alien.png')
def __init__(self,hra):
self.hra = hra
self.x = random.randint(0,28)
self.y = 192
self.rychlost = 3
if random.random() < 0.08:
self.rychlost = 10
def pohni(self):
self.y -= random.randint(0,self.rychlost)
if self.y <= 0:
self.hra.dosiel(self)
def kresli(self):
Alien.alien_img.blit(11*self.x,self.y)
class Raketa:
def __init__(self,hra):
self.image = pyglet.resource.image('09-rocket.png')
self.x = 14
def kresli(self):
self.image.blit(11*self.x - 8,0)
def vlavo(self):
if self.x > 0:
self.x -= 1
def vpravo(self):
if self.x < 28:
self.x += 1

53

45
46
47

class Strela:
missile_img = pyglet.resource.image('09-missile.png')

48
49
50
51
52

def __init__(self,hra,x):
self.hra = hra
self.x = x
self.y = 0
self.rychlost = 10

54
55
56

def pohni(self):
self.y += self.rychlost
self.hra.strielam(self)

53

57

58
59
60

61
62
63

64
65
66
67
68
69
70

71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

def kresli(self):
Strela.missile_img.blit(11*self.x + 6,self.y)
class Hra:
vybuch = pyglet.resource.media('BombExplosion.wav',streaming=False)
def __init__(self):
self.zivoty = 3
self.vypustit = 100
self.aliens = []
self.raketa = Raketa(self)
self.strely = []
def kresli(self):
if self.zivoty < 0:
prehra = pyglet.text.Label("Prehral si!!!",
font_size=30,
x=window.width // 2,
y=window.height // 2,
anchor_x='center')
prehra.draw()
return
if self.vypustit == 0 and len(self.aliens) == 0:
vyhra = pyglet.text.Label("Vyhral si!!!",
font_size=30,
x=window.width // 2,
y=window.height // 2,
anchor_x='center')
vyhra.draw()
return
zivoty = pyglet.text.Label(str(self.zivoty),
font_size=18,
x=10, y=window.height - 18)
zivoty.draw()
pocet = pyglet.text.Label(str(self.vypustit),
font_size=18,
x=window.width - 50,
y=window.height - 18)
pocet.draw()
for i in self.aliens:
i.kresli()
for i in self.strely:
i.kresli()
self.raketa.kresli()

54

102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153

def spracujKlaves(self,klavesa):
if klavesa == key.LEFT:
self.raketa.vlavo()
elif klavesa == key.RIGHT:
self.raketa.vpravo()
elif klavesa == key.SPACE:
self.strely.append(Strela(self,self.raketa.x))
def krok(self,dt):
if random.random() < 0.05 and self.vypustit > 0:
self.aliens.append(Alien(self))
self.vypustit -= 1
for i in range(int(dt/0.1)):
for i in self.strely:
i.pohni()
for i in self.aliens:
i.pohni()
def strielam(self,strela):
trafeni = []
for alien in self.aliens:
if alien.x == strela.x and alien.y < strela.y:
trafeni.append(alien)
if trafeni == []:
if strela.y > 200:
self.strely.remove(strela)
return
najnizsi = trafeni[0]
for alien in trafeni:
if alien.x < najnizsi.x:
najnizsi = alien
self.aliens.remove(najnizsi)
self.strely.remove(strela)
self.vybuch.play()
def dosiel(self,alien):
self.zivoty -= 1
self.aliens.remove(alien)
h = Hra()
@window.event
def on_key_press(symbol, modifiers):
h.spracujKlaves(symbol)
@window.event
def on_draw():
window.clear()
h.kresli()
pyglet.clock.schedule_interval(h.krok,0.1)
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169

import time
from threading import Thread
def funkcia(i):
print("tartuje dleit funkcia",i)
time.sleep(3)
print("Kon dleit funkcia",i)
for i in range(3):
funkcia(i)
print("\n\n")
for i in range(3):
v = Thread(target=funkcia, args=(i,))
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
2
3
4
5
6
7
8
9

import urllib.request
import time
def stiahni(url):
poziadavka = urllib.request.Request(url)
return urllib.request.urlopen(poziadavka).read()
vystup = ["","",""]

60

10
11
12
13
14
15
16

start = time.time()
vystup[0] = stiahni("http://www.smnd.sk")
vystup[1] = stiahni("http://www.sme.sk")
vystup[2] = stiahni("http://www.nrsr.sk")
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

import
import
import
import

threading
queue
urllib.request
time

fronta = queue.Queue()
vystup = ["","",""]
def stiahni(url):
poziadavka = urllib.request.Request(url)
return urllib.request.urlopen(poziadavka).read()
def sosadlo():
vstup = fronta.get()
vystup[vstup[0]] = stiahni(vstup[1])
print("%s hotovo." % vstup[1])
fronta.task_done()
start = time.time()
26http://docs.python.org/3/library/queue.html

61

20
21
22
23
24
25
26
27
28
29
30
31
32

for i in range(3):
t = threading.Thread(target = sosadlo)
t.daemon = True
t.start()
for stranka in [(0,"http://www.smnd.sk"),
(1,"http://www.sme.sk"),
(2,"http://www.nrsr.sk")]:
fronta.put(stranka)
fronta.join()
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

import pyglet
from pyglet.window import key
import random
import time
from threading import Thread
window_width = 800
window_height = 600
def obdlznik(x1, y1, x2, y2):
pyglet.graphics.draw(4,
pyglet.gl.GL_QUADS,
('v2f', (x1, y1, x1, y2,
x2, y2, x2, y1)))
class Pole:
def __init__(self,length,maximum):
self.dx = window_width // length
self.dy = window_height // (maximum + 1)
self.changes = 0
self.data = []
for i in range(length):
self.data.append(random.randint(1,maximum))
self.size = max(2,self.dx - 2)
size1 = max(2,self.dy - 2)
self.size = min(self.size,size1)
def __getitem__(self,key):
return self.data[key]
def __setitem__(self,key,value):
self.data[key] = value
self.changes += 1
def __len__(self):
return len(self.data)

63

35
36
37
38
39
40
41
42
43
44
45
46
47

def draw(self):
for i in range(len(self.data)):
x = i * self.dx + (self.dx - self.size) // 2
y = self.data[i] * self.dy
obdlznik(x,y,x+self.size,y+self.size)
obdlznik(x + self.size // 2,0,
x + self.size // 2 + 1,y)
pocet = pyglet.text.Label(str(self.changes),
font_size=30,
x=100,
y=window_height - 50,
anchor_x='center')
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
49
50
51
52
53
54
55
56
57
58
59
60
61

p = Pole(70,50)
def bubblesort():
for i in range(1,len(p)):
for j in range(i,0,-1):
if p[j] < p[j-1]:
p[j],p[j-1] = p[j-1],p[j]
time.sleep(0.25)
else:
break
window = pyglet.window.Window(window_width,window_height,
fullscreen = False)
window.set_mouse_visible(False)

64

62
63
64
65
66
67
68
69
70
71
72
73
74
75

@window.event
def on_draw():
window.clear()
p.draw()
def update(dt):
pass
t = Thread(target = bubblesort)
t.setDaemon(True)
t.start()
pyglet.clock.schedule_interval(update,0.04)
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
2
3
4
5
6
7
8

def bubblesort():
for i in range(1,len(p)):
for j in range(i,0,-1):
if p[j] < p[j-1]:
p[j],p[j-1] = p[j-1],p[j]
time.sleep(0.25)
else:
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
2+ 4+6++2 (n1)=2[1+2+ 3++(n1)]=2

( n1)n
=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
2
3
4
5
6
7
8
9
10

def insertsort():
for i in range(1,len(p)):
a = p[i]
n = i - 1
while n >= 0 and p[n] > a:
p[n+1] = p[n]
time.sleep(0.625)
n -= 1
p[n+1] = a
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
1+2+4+8++2

h2

+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
prepoetselntedaplat,e

1+2+4+8++2
2

h1

h2

+2

n<2

h1

=2 1

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
=499 999 500 000 teda asi
Vprpade vsvania v najhorom prpade pouijete
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

def heapsort():
for i in range(1,len(p)):
n = i
while n > 0 and p[n] > p[(n-1)//2]:
p[n],p[(n-1)//2] = p[(n-1)//2],p[n]
n = (n-1)//2
time.sleep(1.25)
for i in range(len(p)-1,0,-1):
p[i],p[0] = p[0],p[i]
time.sleep(1.25)
n = 0
while 2*n + 1 < i:
a = 2*n + 1
if 2*n + 2 < i and p[2*n + 2] > p[2*n + 1]:
a = 2*n + 2
if p[a] > p[n]:
p[a],p[n] = p[n],p[a]
n = a
time.sleep(1.25)
else:
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
2
3
4
5
6
7
8
9
10
11

def countingsort():
pocty = 51 * [0]
for i in p:
pocty[i] += 1
time.sleep(0.625)
pozicia = 0
for i in range(1,51):
for j in range(pocty[i]):
p[pozicia + j] = i
time.sleep(0.625)
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