V dneˇsn´ı dobˇe nelze bez urˇcit´e m´ıry programov´an´ı vykon´avat vˇedeckou pr´aci t´emˇeˇr v ˇz´adn´em oboru. Existuje mnoho jazyk˚ u a prostˇred´ı specifick´ ych pro urˇcit´e obory jako je napˇr. ROOT v ˇc´asticov´e fyzice, Mathematica, Maple v teoretick´ ych oborech a MATLAB pro zpracov´an´ı sign´alu. Programovac´ı jazyk Python vˇsak spolu s velmi rozvinut´ ym ekosyst´emem knihoven poskytuje vˇetˇsinu funkcionality tˇechto specifick´ ych jazyk˚ u ˇci prostˇred´ı a umoˇzn ˇuje tak pracovat v jednotn´em, plnohodnotn´ em jazyku i prostˇred´ı nez´ avisle na oboru, operaˇcn´ım syst´emu ˇci architektuˇre poˇc´ıtaˇce. Nav´ıc je ke staˇzen´ı zdarma a lze ho jednoduˇse nainstalovat na vˇsech bˇeˇzn´ ych operaˇcn´ıch syst´emech (jako Windows, GNU/Linux, OSX, FreeBSD). Tento tutori´ al je ps´ an pro verzi 3 jazyka Python, kter´a nab´ız´ı oproti starˇs´ı verzi 2 mnoho vylepˇsen´ı a usnadnˇen´ı. N´ azev Python znamen´a v angliˇctinˇe krajta, byl vˇsak zvolen na poˇcest kultovn´ıho seri´ alu Monty Python. C´ılem tohoto tutori´ alu je nauˇcit se naˇc´ıst soubor s daty a data pak n´aslednˇe zpracovat. Konkr´etnˇe budeme statisticky zpracov´ avat v´ ysledky loˇ nsk´eho roˇcn´ıku SVAT (2014). V tomto tutori´alu budou (nˇekter´e) z´ aklady jazyka Python postupnˇe ukazov´ any na pˇr´ıkladech. Pro kompletnˇejˇs´ı u ´vod do jazyka Python se v´ıce hod´ı ofici´ aln´ı tutori´ al na adrese http://docs.python.org/3/tutorial/.
2
Instalace prostˇ red´ı pro programov´ an´ı v Pythonu
Existuje v´ıce moˇznost´ı, jak si nainstalovat interpret (program, kter´ y vyhodnocuje zdrojov´ y k´od ˇci zad´ avan´e pˇr´ıkazy) jazyka Python a dodateˇcn´e knihovny. Pro nezkuˇsen´e je doporuˇceno nainstalovat distribuci (kolekci knihoven) Anaconda od Continuum Analytics, kterou lze zdarma st´ahnout na str´ance https://www.continuum.io/downloads, staˇc´ı vybrat verzi s Pythonem 3 a postupovat dle n´avodu. Pro zkuˇsenˇejˇs´ı staˇc´ı pro u ´ˇcely tohoto tutori´alu samotn´ y Python interpret, pˇr´ıpadnˇe nainstalovat bal´ık ipython pro pouˇzit´ı rozhran´ı IPython Notebook.
3
Rozhran´ı IPython (Jupyter) Notebook
Existuje v´ıce zp˚ usob˚ u jak programovat v jazyce Python: • naps´ an´ı a n´ asledn´e intepretov´ an´ı zdrojov´ ych soubor˚ u, • interaktivn´ı zad´ avan´ı v´ yraz˚ u intepretu. Pro u ´ˇcely uˇcen´ı se jazyka Python je lepˇs´ı druh´a volba. Standardn´ı interaktivn´ı rozhran´ı intepretu jazyka Python je vˇsak ponˇekud stroh´e a proto je pro u ´ˇcely tohoto tutori´alu doporuˇceno rozhran´ı IPython Notebook, kter´e poskytuje “seˇsit”, ve kter´em lze kombinovat bloky form´atovan´eho textu a zdrojov´eho k´ odu i s v´ ysledky jeho intepretace. Tyto seˇsity pak lze exportovat do r˚ uzn´ ych form´at˚ u (PDF, LATEX, HTML). Tento tutori´ al je pr´ avˇe v´ ysledkem exportu takov´eho seˇsitu, kter´ y lze nal´ezt v archivu dat k tutori´ alu a pˇri jeho spuˇstˇen´ı (viz. n´ıˇze) lze pracovat s tutori´alem interaktivnˇe. V archivu jsou to soubory s koncovkou *.ipynb pro starˇs´ı verze programu IPython je urˇcen jeden z nich oznaˇcen´ y v2. D´ıky moˇznosti exportu je IPython seˇsit tak´e ide´aln´ı pro ˇreˇsen´ı u ´loh ze SVAT. Od verze 4.0 byl IPython pˇrejmenov´ an na Jupyter, kter´ y poskytuje podobn´e rozhran´ı i pro jin´e jazyky. IPython Notebook se tedy v novˇejˇs´ıch instalac´ıch jmenuje Jupyter Notebook.
3.1
Spuˇ stˇ en´ı IPython notebook
Na OS Windows se po instalaci distribuce Anaconda objev´ı v nab´ıdce program˚ u poloˇzka IPython Notebook (nejsp´ıˇse v podsloˇzce anaconda). Po spuˇstˇen´ı t´eto poloˇzky se objev´ı okno termin´alu, ve kter´em budou vypisov´ any r˚ uzn´e diagnostick´e zpr´ avy. Na syst´emech *NIX-ov´eho typu (GNU/Linux, OSX, *BSD) je potˇreba nejdˇr´ıve aktivovat programy v distribuci Anaconda pˇr´ıkazem v termin´alu ipython notebook za pˇredpokladu, ˇze pˇri instalaci byla vybr´ana moˇznost pro nastaven´ı promˇenn´e PATH, jinak je potˇreba explicitnˇe tuto promˇennou v termin´ alu nastavit, napˇr. v pˇr´ıpadˇe instalace distribuce do ~/anaconda3/ export PATH="~anaconda3/bin:$PATH". Nakonec je na vˇsech syst´emech potˇreba otevˇr´ıt ve webov´em prohl´ıˇzeˇci adresu http://localhost: 8888, pokud se neotevˇre automaticky. Pokud tato adresa nefunguje, pod´ıvejte se do okna termin´alu, zda nevypsal jinou adresu. Ve webov´em prohl´ıˇzeˇci se zobraz´ı sloˇzky a soubory. Najdˇete si nˇejakou sloˇzku a pˇres tlaˇc´ıtko “New” vpravo nahoˇre vyberte v menu “Notebook >> Python3”. 1
Po otevˇren´ı seˇsitu se objev´ı blok (ˇci buˇ nka) s textov´ ym polem ˇcekaj´ıc´ı na vstup, pˇred kter´ ym je naps´ano In []:. Do textov´eho pole lze napsat v´ yraz, kter´ y m´a intepret vyhodnotit, napˇr. (1 + 4) * 7. Pro vyhodnocen´ı v´ yrazu je tˇreba zm´ aˇcknout kombinaci kl´aves Ctrl+Enter nebo na horn´ı liˇstˇe stisknout tlaˇc´ıtko troj´ uheln´ıku (Run). Po vyhodnocen´ı, kter´e je znaˇcen´e In [*] pˇred blokem, se dan´emu vstupn´ımu bloku pˇriˇrad´ı poˇradov´e ˇc´ıslo a zobraz´ı se pˇred n´ım In [1]. Pod n´ım se zobraz´ı blok s v´ ystupem ˇci v´ ysledkem v´ yrazu, pˇred kter´ ym bude Out[1]. Nad´ale budou v tomto tutori´alu zobrazov´any pˇr´ımo tyto bloky po vyhodnocen´ı. Ve vstupn´ıch bloc´ıch (pˇred nimi je In) jsou tedy zad´avan´e v´ yrazy k vyhodnocen´ı a po nich n´ asleduj´ı bloky s v´ ysledky vyhodnocen´ı (pˇred nimi je Out). Pro pˇrid´ an´ı dalˇs´ıho vstupn´ıho bloku lze zm´aˇcknout kl´avesu b nebo tlaˇc´ıtko + na horn´ı liˇstˇe. Kolem nov´eho bloku se objev´ı ˇsediv´ y r´ ameˇcek znaˇc´ıc´ı, ˇze je aktu´alnˇe vybran´ y. V tento moment lze pro tento blok vybrat pomoc´ı menu na horn´ı liˇstˇe nebo zm´aˇcknut´ım kl´avesy y, resp. m, zda se jedn´a o blok k´odu k vyhodnocen´ı, resp. blok textu form´ atovan´eho v jednoduch´em jazyce Markdown, kter´ y se hod´ı pro psan´ı pozn´ amek a matematick´ ych vzorc˚ u. Pro editaci bloku je pak tˇreba zm´aˇcknout kl´avesu Enter a n´aslednˇe se kolem bloku objev´ı zelen´ y r´ ameˇcek. Pˇr´ıpadnˇe lze pro ˇcastou sekvenci “vyhodnot’ blok a pˇridej dalˇs´ı a edituj” pouˇz´ıvat kl´ avesovou zkratku Alt+Enter. In [1]: (1 + 4) * 7 Out[1]: 35 V´ yraz je obvykle ukonˇcen koncem ˇr´ adku. Blok k´odu m˚ uˇze obsahovat v´ıce v´ yraz˚ u, jako v´ ysledek cel´eho bloku se pak bere v´ ysledek posledn´ıho v´ yrazu. Pokud se na ˇr´adku vyskytne symbol #, vˇse za n´ım nen´ı interpretov´ ano (jako kdyby text za n´ım zde v˚ ubec nebyl) a hod´ı se proto k psan´ı koment´aˇr˚ u. In [2]: 4 + 5 # tento text neovlivn´ ı chod programu 3 * 2 Out[2]: 6
4
Naˇ c´ıtan´ı dat v´ ysledk˚ u SVAT
Uloˇzte si soubor vysledky.html (staˇzen´ y z http://svat.fjfi.cvut.cz/rocnik2014/vysledky/) z archivu s daty k tutori´ alu do nˇejak´e sloˇzky (napˇr. na Plochu). Nyn´ı otevˇreme uloˇzen´ y soubor In [3]: soubor = open(’vysledky.html’, "r") V pˇredchoz´ım v´ yrazu jsme provedli po ˇradˇe n´asleduj´ıc´ı: 1. Zavolali jsme funkci open se vstupn´ımi hodnotami ’vysledky’ a "r", kter´e jsou oddˇelen´e ˇc´arkou. Jedn´ a se o hodnoty typu ˇretˇezec znak˚ u (typ str), jsou zapisov´any mezi apostrofy nebo dvojit´e uvozovky. • ’vysledky.html’ je cesta k souboru, kter´ y m´a b´ yt otevˇren. V tomto pˇr´ıpadˇe je tato cesta relativn´ı ke sloˇzce, ve kter´e se nach´az´ı IPython seˇsit, napˇr. ’../vysledky.html’ by bylo um´ıstˇen´ı v nadˇrazen´e sloˇzce. V pˇr´ıpadˇe, kdy byl soubor uloˇzen na Plochu, m˚ uˇze b´ yt jednoduˇsˇs´ı zadat absolutn´ı cestu, na Windows: ’C:/Users/uzivatel/Plocha/vysledky.html’, na OS *NIX-ov´eho typu ’/home/uzivatel/Plocha/vysledky.html’. • "r" znaˇc´ı, ˇze soubor m´ a b´ yt otevˇren v reˇzimu pouze pro ˇcten´ı, tedy nelze do nˇej zapisovat. To se v tomto pˇr´ıpadˇe hod´ı, abychom si omylem nepˇrepsali data. Pokud bychom chtˇeli z´apis pro ˇcten´ı i zapisov´ an´ı, pouˇzili bychom "r+". 2. V´ ysledek funkce, kter´ ym je objekt pˇredstavuj´ıc´ı otevˇren´ y soubor, jsme si uloˇzili pod symbolem soubor. Python automaticky alokuje pamˇet’ pro objekty pˇri jejich vytvoˇren´ı a automaticky jejich pamˇet’ znovu uvolˇ nuje v momentˇe, kdy uˇz na nˇe ˇz´adn´ y symbol nebo jin´ y objekt neodkazuje. Vol´ an´ı funkc´ı v Pythonu je tedy velmi podobn´e jako v matematice z = f (x, y), ale hodnoty mohou b´ yt obecnˇe jak´ekoliv objekty, nejenom ˇc´ısla. V Pythonu jsou ve skuteˇcnosti vˇsechno objekty (vˇcetnˇe ˇc´ısel a funkc´ı). M˚ uˇzeme se pod´ıvat na objekt odkazovan´ y symbolem soubor 2
In [4]: soubor Out[4]: < io.TextIOWrapper name=’vysledky.html’ mode=’r’ encoding=’UTF-8’> Pˇri vyhodnocov´ an´ı v´ yrazu byl symbol nahrazen hodnotou, na kterou se odkazuje. Objekty mohou m´ıt na sebe nav´ azan´e jin´e objekty ve formˇe tzv. atribut˚ u, ke kter´ ym se pˇristupuje pomoc´ı z´apisu objekt.jmeno, kde jmeno je symbolick´ y n´azev atributu objektu objekt. Napˇr. takto lze pˇristupovat ke jm´enu souboru, kter´ y je reprezentov´ an objektem uloˇzen´ ym pod symbolem soubor In [5]: soubor.name Out[5]: ’vysledky.html’ Speci´ aln´ım typem atribut˚ u jsou tzv. metody, coˇz jsou funkce sv´azan´e s dan´ ym objektem, kter´e zpravidla operuj´ı pr´ avˇe na nˇem. Napˇr´ıklad takto lze zjistit, zda jde do souboru zapisovat In [6]: soubor.writable() Out[6]: False V´ ysledkem vol´ an´ı metody writable je hodnota False reprezentuj´ıc´ı logickou nepravdu, coˇz odpov´ıd´ a naˇsemu oˇcek´ av´ an´ı. Logick´ a nepravda je reprezentov´ana objekty typu bool, mohou m´ıt hodnoty pouze True (pravda) a False (nepravda). Nyn´ı vyp´ıˇseme prvn´ıch 10 ˇr´adk˚ u souboru In [7]: cislo_radku = 1 while cislo_radku <= 7: radek = soubor.readline() print(radek, end=’’) cislo_radku += 1 <meta charset="UTF-8"> <meta name="description" content=""> V´ ysledky | Semin´ aˇ r vˇ edy a techniky na FJFI V pˇredchoz´ım bloku jsme nejdˇr´ıve pod symbolem uloˇzili ˇc´ıslo 1. Pot´e byl kl´ıˇcov´ ym slovem while otevˇren blok k´ odu odsazen´ y o 4 mezery doprava, kter´ y bude opakov´an, dokud v´ ysledek v´ yrazu mezi while a dvojteˇckou bude True. Zde je vyhodnocov´an v´ yraz ekvivalentn´ı x ≤ 7. Opakovan´ y blok k´odu obsahuje 3 v´ yrazy 1. Naˇcten´ı n´ asleduj´ıc´ıho ˇr´ adku ze souboru metodu readline a uloˇzen´ı v´ ysledku (ˇretˇezec znak˚ u) pod symbolem radek. 2. Vyps´ an´ı ˇr´ adku na standardn´ı v´ ystup (zde text pod v´ ystupn´ım blokem) pomoc´ı funkce print. Funkci je nastavena hodnota jej´ıho vstupn´ıho parametru end na pr´azdn´ y ˇretˇezec znak˚ u, aby nevypisoval znak pro odˇr´ adkov´ an´ı ’\n’, protoˇze samotn´ y ˇr´adek uˇz jej obsahuje. yraz s oper´atorem += je ekvivalentn´ı 3. Pod symbolem cislo radku si uloˇz´ıme hodnotu o 1 vyˇsˇs´ı. V´ v´ yrazu cislo radku = cislo radku + 1. Nyn´ı budeme ˇc´ıst dalˇs´ı ˇr´ adky, dokud nenajdeme ˇr´adek, ve kter´em se nach´az´ı ˇretˇezec ’’, pod kter´ ym se nach´ az´ı tabulka s v´ ysledky In [8]: while True: # neust´ al´ e opakov´ an´ ı radek = soubor.readline() if ’’ in radek: # HTML tag tbody v ˇ r´ adku break # ukonˇ cit opakov´ an´ ı else: # pokud logick´ a podm´ ınka nebyla splnˇ ena continue # pokraˇ covat na dalˇ s´ ı opakov´ an´ ı cyklu
3
Cyklus neust´ ale (protoˇze logick´ a podm´ınka po while je vˇzdy splnˇena) ˇcte n´asleduj´ıc´ı ˇr´adky. Pot´e vyhodnocuje logick´e vˇetven´ı programu pomoc´ı if ... else ... konstruktu, kter´ y vyhodnot´ı logick´ y v´ yraz mezi if a dvojteˇckou a pokud je pravdiv´ y, vykon´a blok k´odu pod if .... V opaˇcn´em pˇr´ıpadˇe vykon´ a blok pod else. Zde logick´ y v´ yraz vyhodnocuje, zda je hledan´ y ˇretˇezec obsaˇzen´ y v ˇr´adku (ekvivalent x ∈ M). Pokud je, kl´ıˇcov´e slovo break ukonˇc´ı opakov´an´ı. V opaˇcn´em pˇr´ıpadˇe kv˚ uli continue skoˇc´ı na dalˇs´ı opakov´ an´ı. else a jemu pˇr´ısluˇsn´ y blok nen´ı nutn´e uv´adˇet, pokud to nen´ı nutn´e, coˇz zde nebylo, protoˇze dalˇs´ı opakov´ an´ı by zaˇcalo automaticky. Nyn´ı jsme se ocitli v urˇcit´e, pro n´ as d˚ uleˇzit´e pozici v souboru, kterou si zapamatujeme In [9]: pred_tabulkou = soubor.tell() # aktu´ aln´ ı pozice v souboru pred_tabulkou Out[9]: 2274 Nyn´ı se pod´ıv´ ame na n´ asleduj´ıc´ıch 6 ˇr´ adk˚ u a pot´e se vr´at´ıme na p˚ uvodn´ı pozici In [10]: for i in range(0, 6, 1): # pro kaˇ zd´ e i v {0, ..., 5} radek = soubor.readline() if True or ’<’ in radek: # HTML tag v r ˇ´ adku print(radek, end=’’) soubor.seek(pred_tabulkou) # pˇ resun na pozici v souboru Out[10]: 2274
Ondˇ rej Pol´ aˇ cek
3
38,98
Konstrukt for element in sekvence: opakuje jemu pˇr´ısluˇsn´ y blok k´odu pro kaˇzd´ y prvek z nˇejak´e sekvence a pˇri kaˇzd´em opakov´ an´ı nastav´ı promˇennou element na dan´ y prvek. Jedn´a se o analogii z´apisu ∀x ∈ M. Tzv. gener´ atorov´ a funkce range(b, e, s) vytv´aˇr´ı seznam index˚ u od ˇc´ısla b do e - 1 s krokem s. Zde by staˇcilo napsat range(6), protoˇze pokud nen´ı specifikov´ano jinak, b=0, s=1. for cyklus po ˇradˇe nastavuje promˇennou i na hodnoty tˇechto index˚ u. Sice jsme tyto indexy pˇr´ımo nepouˇzili, ale jednoduˇse jsme t´ımto napsali “opakuj 6-kr´ at”. Vid´ıme, ˇze bude potˇreba na kaˇzd´em ˇra´dku vyextrahovat ˇc´ıslo mezi HTML tagy td a jm´eno mezi th tagy. K tomuto u ´ˇcelu sestroj´ıme funkci, kter´a na dan´em ˇr´adku vyextrahuje hodnoty mezi tagy na ˇr´adku In [11]: def extrahuj_mezi_tagy(retezec): ’’’Tento ˇ retˇ ezec znak˚ u slouˇ z´ ı jako dokumentace funkce Protoˇ ze zaˇ cal 3 apostrofy, m˚ uˇ ze se t´ ahnout pˇ res v´ ıce ˇ r´ adk˚ u. Jako dokumentaˇ cn´ ı ˇ retˇ ezec se bere prvn´ ı ˇ retˇ ezec v tˇ ele funkce. Tato funkce vr´ at´ ı ˇ c´ ast ˇ r´ adku (ˇ retˇ ezec) mezi tagy. ’’’ # konec ˇ retˇ ezce konec_tagu1 = retezec.find(’>’) # najdi pozici znaku ’>’ v ˇ r´ adku # najdi pozici znaku ’>’ v ˇ r´ adku, # ale zaˇ cni hledat od konce minul´ eho zacatek_tagu2 = retezec.find(’<’, konec_tagu1) return retezec[konec_tagu1 + 1:zacatek_tagu2] Definice funkce zaˇc´ın´ a kl´ıˇcov´ ym slovem def, n´asleduje jm´eno funkce a pak symbolick´e parametry v z´ avork´ ach. Jako prvn´ı by pak mˇel n´ asledovat v tˇele funkce (odsazen´ y blok) dokumentaˇcn´ı ˇretˇezec (je nepovinn´ y). Vyhodnocov´ an´ı v´ yraz˚ u v tˇele konˇc´ı pˇri vr´acen´ı nˇejak´e hodnoty pomoc´ı kl´ıˇcov´eho slova return. Zde je vr´ acena podmnoˇzina ˇretˇezce oznaˇcen´a indexovac´ım oper´atorem [b:e:s], kter´ y funguje velmi podobnˇe jako range a vr´ at´ı tu ˇc´ ast indexovateln´eho objektu, kter´e odpov´ıdaj´ı indexy generovan´e ekvivalentn´ım vol´ an´ı range. Objekty jsou v Pythonu zpravidla indexov´any od 0 (prvn´ı prvek m´a index 0). Nyn´ı jeˇstˇe zadefinujeme funkci, kter´ a vyextrahovanou hodnotu pˇrevede na desetinn´e ˇc´ıslo (typ float) 4
In [12]: def na_cislo(hodnota): ’’’Konvertuje ˇ retˇ ezec znak˚ u na desetinn´ e ˇ c´ ıslo pokud se nepodaˇ r´ ı konvertovat, vr´ at´ ı 0 ’’’ # v hodnotˇ e zamˇ en´ ıme deset. ˇ c´ arku za teˇ cku. hodnota = hodnota.replace(’,’, ’.’) try: # je moˇ zn´ e, ˇ ze nastane chyba (v´ yjimka) return float(hodnota) # konvertovat na desetinn´ e ˇ c´ ıslo except: # pokud nastala chyba return 0 Pˇred konverz´ı je vˇsak potˇreba zamˇenit desetinnou ˇc´arku za teˇcku. Pot´e je v try bloku ˇretˇezec konvertov´ an a v´ ysledn´ a hodnota vr´ acena. Pokud bˇehem vyhodnocov´an´ı bloku pˇr´ısluˇsn´eho try dodje k chybˇe, je m´ısto nˇej vyhodnocov´ an except blok pod n´ım, ve kter´em je vr´acena 0. V Pythonu lze rozliˇsit r˚ uzn´e typy v´ yjimek, ale to pˇresahuje r´ amec tohoto tutori´alu. Nyn´ı m˚ uˇzeme zaˇc´ıt naˇc´ıtat data do nˇejak´e datov´e struktury. K tomu se n´ am budou hodit dva speci´aln´ı datov´e typy pro reprezentaci sloˇzen´ ych datov´ ych struktur. Prvn´ı je tzv. slovn´ık (dict) reprezentuj´ıc´ı vztah heslo -> definice. Zapisuje se jako {heslo: definice, heslo2: definice2, ...}. Heslo m˚ uˇze b´ yt jak´ ykoliv nemˇenn´ y objekt (napˇr. ˇc´ıslo, ˇretˇezec), definice cokoliv. Jako hesla zde pouˇzijeme jm´ena u ´ˇcastn´ık˚ u, jako definice seznamy jejich v´ ysledk˚ u. Pro reprezentaci seznamu ˇc´ısel pouˇzijeme typ list, kter´ y se zapisuje mezi hranat´e z´avorky [objekt1, objekt2, ...]. K jednotliv´ ym prvk˚ um v tˇechto objektech se pak pˇristupuje pomoc´ı indexovac´ıho oper´ atoru, v pˇr´ıpadˇe slovn´ıku slovnik[heslo], v pˇr´ıpadˇe seznamu indexem seznam[0]. Seznamy podporuj´ı indexaci podmnoˇziny jako ˇretˇezce. Nyn´ı budeme ˇc´ıst ˇr´ adky aˇz do konce HTML tabulky (znaˇcen´e tagem ) a postupnˇe budeme plnit naˇs´ı datovou strukturu In [13]: ucastnici = {} # pr´ azdn´ y slovn´ ık for radek in soubor: if radek == ’\n’: # pokud pr´ azdn´ y ˇ r´ adek continue # pˇ reskoˇ c´ ıme ho elif ’
’Petr Doleˇ zal’: [4.0, 29.54, 0, 6.0, 0, 0, 35.54], ’Vojtˇ ech Laitl’: [0.0, 21.61, 20.58, 16.97, 19.17, 25.0, 103.32], ’ˇ Simon Jel´ ınek’: [3.0, 28.99, 35.5, 13.49, 9.14, 0, 87.13]} Nyn´ı m˚ uˇzeme zaˇc´ıt pracovat s naˇcten´ ymi daty. Pˇredt´ım si vˇsak pro jistotu uloˇz´ıme v´ ysledek do souboru, ’w’ zde znaˇc´ı m´ od z´ apisu (write) a soubor vytvoˇr´ı ˇci pˇrep´ıˇse at’ uˇz existuje ˇci ne In [14]: vysledky = open(’nactena_data’, ’w’) # ’w’ pro z´ apis (write) radek = str(ucastnici) # slovn´ ık ve formˇ e ˇ retˇ ezce vysledky.write(radek) # zapsat do souboru vysledky.close() # zavˇ r´ ıt soubor, aby skuteˇ cnˇ e uloˇ zil
5
Statistick´ e zpracov´ an´ı dat
Jedn´ım z nejuˇziteˇcnˇejˇs´ıch statistick´ ych ukazatel˚ u je aritmetick´ y pr˚ umˇer n r˚ uzn´ ych hodnot xi n
hxi =
1X 1 (x1 + x2 + · · · + xn ) = xi n n i=1
Proto zadefinujeme funkci, kter´ a vypoˇc´ıt´ a arit. pr˚ umˇer hodnot v seznamu In [15]: def prumer(seznam): ’’’Vr´ at´ ı aritmetick´ y pr˚ umˇ er hodnot v seznamu’’’ return sum(seznam) / len(seznam) Pouˇzili jsme funkci sum, kter´ a vr´ at´ı souˇcet prvk˚ u v seznamu a len, kter´a vr´at´ı d´elku seznamu. Nyn´ı m˚ uˇzeme napˇr. vypoˇc´ıtat pr˚ umˇern´ y roˇcn´ık u ´ˇcastn´ık˚ u. Roˇcn´ık je prvn´ı (index 0) element seznamu naˇcten´ ych dat. Sekvenci definic ve slovn´ıku z´ısk´ame metodou values, v tomto pˇr´ıpadˇe dostaneme sekvenci seznam˚ u dat. In [16]: rocniky = [seznam[0] for seznam in ucastnici.values()] prumer(rocniky) Out[16]: 2.6666666666666665 Pouˇzili jsme zde zkr´ acenou formu generov´an´ı seznamu for cyklem. Tato forma je ekvivalentn´ı z´apisu rocniky = [] for seznam in ucastnici.values(): rocniky.append(seznam[0]) Tak´e m˚ uˇzeme jednoduˇse zjistit pr˚ umˇern´ y souˇcet z´ıskan´ ych bod˚ u, suma z´ıskan´ ych bod˚ u je posledn´ı prvek seznamu (index -1 aneb prvn´ı od konce, tedy z´aporn´ y) In [17]: celkove = [seznam[-1] for seznam in ucastnici.values()] prumer(celkove) Out[17]: 40.756666666666675
6
´ Ukoly
Tento tutori´ al byl pouze kr´ atkou exkurz´ı do moˇznost´ı jazyka Python. N´asleduj´ıc´ı u ´koly m˚ uˇzete pouˇz´ıt jako motivaci pro prohlouben´ı sv´eho porozumˇen´ı zde pˇredloˇzen´ ych pˇr´ıklad˚ u.
6
6.1
´ Ukol 1 (1,5 b.): Definujte funkci pro smˇ erodatnou odchylku a vypoˇ c´ıtejte ji pro roˇ cn´ıky u ´ˇ castn´ık˚ u a celkov´ e sumy bod˚ u
Dalˇs´ım d˚ uleˇzit´ ym statistick´ ym parametrem je tzv. smˇerodatn´a odchylka σ, kter´a ud´av´a rozmez´ı hodnot (hxi − σ, hxi + σ), do kter´eho by se mˇelo vej´ıt cca 68% n´ahodn´ ych hodnot
Definuje funkci podobnou funkci prumer, kter´a vr´at´ı smˇerodatnou odchylku hodnot v seznamu vypoˇc´ıtanou podle tohoto vzorce. Pro mocnˇen´ı ˇc´ısel xy pouˇzijte oper´ator x ** y. Pak vypoˇc´ıtejte smˇerodatnou odchylku roˇcn´ık˚ u a celkov´ ych sum z´ıskan´ ych bod˚ u.
6.2
´ Ukol 2 (1,5 b.): Sestrojte seznam pr˚ umˇ er˚ u v jednotliv´ ych s´ eri´ıch pomoc´ı zkr´ acen´ e formy
Vnoˇren´e, zkr´ acen´e generov´ an´ı seznam˚ u je velmi uˇziteˇcn´ y trik. Napˇr´ıklad seznam 10 seznam˚ u prvn´ıch 10 n-t´ ych mocnin lze jednoduˇse zapsat jako [[i**j for j in range(10)] for i in range(10)] Pomoc´ı t´eto konstrukce a funkce prumer sestrojte seznam pr˚ umˇer˚ u v jednotliv´ ych s´eri´ıch.
6.3
´ Ukol 3 (6 b.): Seˇ rad’te u ´ lohy v historii SVAT podle poˇ ctu ˇ reˇ sitel˚ u
Uloˇzen´ y HTML soubor obsahuje detailn´ı v´ ysledky t´eto i pˇredchoz´ıch (ty jsou ale v jin´em form´atu a schovan´e) s´eri´ı. Neˇreˇsen´e u ´lohy jsou znaˇceny pomlˇckou -. Najdˇete u kaˇzd´e u ´lohy poˇcet ˇreˇsitel˚ u a vytvoˇrte a seˇrad’te seznam trojic [pocet resitelu, serie, c ulohy]. Seznam m˚ uˇzete seˇradit napˇr. funkc´ı sorted. M˚ uˇze se tak´e hodit metoda split objekt˚ u typu str, kter´a rozdˇel´ı ˇretˇezec podle zadan´eho znaku.