zadání tutoriálu
Transkript
1 Programovacı́ jazyk Python letem světem V dnešnı́ době nelze bez určité mı́ry programovánı́ vykonávat vědeckou práci téměř v žádném oboru. Existuje mnoho jazyků a prostředı́ specifických pro určité obory jako je např. ROOT v částicové fyzice, Mathematica, Maple v teoretických oborech a MATLAB pro zpracovánı́ signálu. Programovacı́ jazyk Python však spolu s velmi rozvinutým ekosystémem knihoven poskytuje většinu funkcionality těchto specifických jazyků či prostředı́ a umožňuje tak pracovat v jednotném, plnohodnotném jazyku i prostředı́ nezávisle na oboru, operačnı́m systému či architektuře počı́tače. Navı́c je ke staženı́ zdarma a lze ho jednoduše nainstalovat na všech běžných operačnı́ch systémech (jako Windows, GNU/Linux, OSX, FreeBSD). Tento tutoriál je psán pro verzi 3 jazyka Python, která nabı́zı́ oproti staršı́ verzi 2 mnoho vylepšenı́ a usnadněnı́. Název Python znamená v angličtině krajta, byl však zvolen na počest kultovnı́ho seriálu Monty Python. Cı́lem tohoto tutoriálu je naučit se načı́st soubor s daty a data pak následně zpracovat. Konkrétně budeme statisticky zpracovávat výsledky loňského ročnı́ku SVAT (2014). V tomto tutoriálu budou (některé) základy jazyka Python postupně ukazovány na přı́kladech. Pro kompletnějšı́ úvod do jazyka Python se vı́ce hodı́ oficiálnı́ tutoriál na adrese http://docs.python.org/3/tutorial/. 2 Instalace prostředı́ pro programovánı́ v Pythonu Existuje vı́ce možnostı́, jak si nainstalovat interpret (program, který vyhodnocuje zdrojový kód či zadávané přı́kazy) jazyka Python a dodatečné knihovny. Pro nezkušené je doporučeno nainstalovat distribuci (kolekci knihoven) Anaconda od Continuum Analytics, kterou lze zdarma stáhnout na stránce https://www.continuum.io/downloads, stačı́ vybrat verzi s Pythonem 3 a postupovat dle návodu. Pro zkušenějšı́ stačı́ pro účely tohoto tutoriálu samotný Python interpret, přı́padně nainstalovat balı́k ipython pro použitı́ rozhranı́ IPython Notebook. 3 Rozhranı́ IPython (Jupyter) Notebook Existuje vı́ce způsobů jak programovat v jazyce Python: • napsánı́ a následné intepretovánı́ zdrojových souborů, • interaktivnı́ zadávanı́ výrazů intepretu. Pro účely učenı́ se jazyka Python je lepšı́ druhá volba. Standardnı́ interaktivnı́ rozhranı́ intepretu jazyka Python je však poněkud strohé a proto je pro účely tohoto tutoriálu doporučeno rozhranı́ IPython Notebook, které poskytuje “sešit”, ve kterém lze kombinovat bloky formátovaného textu a zdrojového kódu i s výsledky jeho intepretace. Tyto sešity pak lze exportovat do různých formátů (PDF, LATEX, HTML). Tento tutoriál je právě výsledkem exportu takového sešitu, který lze nalézt v archivu dat k tutoriálu a při jeho spuštěnı́ (viz. nı́že) lze pracovat s tutoriálem interaktivně. V archivu jsou to soubory s koncovkou *.ipynb pro staršı́ verze programu IPython je určen jeden z nich označený v2. Dı́ky možnosti exportu je IPython sešit také ideálnı́ pro řešenı́ úloh ze SVAT. Od verze 4.0 byl IPython přejmenován na Jupyter, který poskytuje podobné rozhranı́ i pro jiné jazyky. IPython Notebook se tedy v novějšı́ch instalacı́ch jmenuje Jupyter Notebook. 3.1 Spuštěnı́ IPython notebook Na OS Windows se po instalaci distribuce Anaconda objevı́ v nabı́dce programů položka IPython Notebook (nejspı́še v podsložce anaconda). Po spuštěnı́ této položky se objevı́ okno terminálu, ve kterém budou vypisovány různé diagnostické zprávy. Na systémech *NIX-ového typu (GNU/Linux, OSX, *BSD) je potřeba nejdřı́ve aktivovat programy v distribuci Anaconda přı́kazem v terminálu ipython notebook za předpokladu, že při instalaci byla vybrána možnost pro nastavenı́ proměnné PATH, jinak je potřeba explicitně tuto proměnnou v terminálu nastavit, např. v přı́padě instalace distribuce do ~/anaconda3/ export PATH="~anaconda3/bin:$PATH". Nakonec je na všech systémech potřeba otevřı́t ve webovém prohlı́žeči adresu http://localhost: 8888, pokud se neotevře automaticky. Pokud tato adresa nefunguje, podı́vejte se do okna terminálu, zda nevypsal jinou adresu. Ve webovém prohlı́žeči se zobrazı́ složky a soubory. Najděte si nějakou složku a přes tlačı́tko “New” vpravo nahoře vyberte v menu “Notebook >> Python3”. 1 3.2 Interaktivnı́ rozhranı́ intepretu IPython Notebook Po otevřenı́ sešitu se objevı́ blok (či buňka) s textovým polem čekajı́cı́ na vstup, před kterým je napsáno In []:. Do textového pole lze napsat výraz, který má intepret vyhodnotit, např. (1 + 4) * 7. Pro vyhodnocenı́ výrazu je třeba zmáčknout kombinaci kláves Ctrl+Enter nebo na hornı́ liště stisknout tlačı́tko trojúhelnı́ku (Run). Po vyhodnocenı́, které je značené In [*] před blokem, se danému vstupnı́mu bloku přiřadı́ pořadové čı́slo a zobrazı́ se před nı́m In [1]. Pod nı́m se zobrazı́ blok s výstupem či výsledkem výrazu, před kterým bude Out[1]. Nadále budou v tomto tutoriálu zobrazovány přı́mo tyto bloky po vyhodnocenı́. Ve vstupnı́ch blocı́ch (před nimi je In) jsou tedy zadávané výrazy k vyhodnocenı́ a po nich následujı́ bloky s výsledky vyhodnocenı́ (před nimi je Out). Pro přidánı́ dalšı́ho vstupnı́ho bloku lze zmáčknout klávesu b nebo tlačı́tko + na hornı́ liště. Kolem nového bloku se objevı́ šedivý rámeček značı́cı́, že je aktuálně vybraný. V tento moment lze pro tento blok vybrat pomocı́ menu na hornı́ liště nebo zmáčknutı́m klávesy y, resp. m, zda se jedná o blok kódu k vyhodnocenı́, resp. blok textu formátovaného v jednoduchém jazyce Markdown, který se hodı́ pro psanı́ poznámek a matematických vzorců. Pro editaci bloku je pak třeba zmáčknout klávesu Enter a následně se kolem bloku objevı́ zelený rámeček. Přı́padně lze pro častou sekvenci “vyhodnot’ blok a přidej dalšı́ a edituj” použı́vat klávesovou zkratku Alt+Enter. In [1]: (1 + 4) * 7 Out[1]: 35 Výraz je obvykle ukončen koncem řádku. Blok kódu může obsahovat vı́ce výrazů, jako výsledek celého bloku se pak bere výsledek poslednı́ho výrazu. Pokud se na řádku vyskytne symbol #, vše za nı́m nenı́ interpretováno (jako kdyby text za nı́m zde vůbec nebyl) a hodı́ se proto k psanı́ komentářů. In [2]: 4 + 5 # tento text neovlivnı́ chod programu 3 * 2 Out[2]: 6 4 Načı́tanı́ dat výsledků SVAT Uložte si soubor vysledky.html (stažený z http://svat.fjfi.cvut.cz/rocnik2014/vysledky/) z archivu s daty k tutoriálu do nějaké složky (např. na Plochu). Nynı́ otevřeme uložený soubor In [3]: soubor = open(’vysledky.html’, "r") V předchozı́m výrazu jsme provedli po řadě následujı́cı́: 1. Zavolali jsme funkci open se vstupnı́mi hodnotami ’vysledky’ a "r", které jsou oddělené čárkou. Jedná se o hodnoty typu řetězec znaků (typ str), jsou zapisovány mezi apostrofy nebo dvojité uvozovky. • ’vysledky.html’ je cesta k souboru, který má být otevřen. V tomto přı́padě je tato cesta relativnı́ ke složce, ve které se nacházı́ IPython sešit, např. ’../vysledky.html’ by bylo umı́stěnı́ v nadřazené složce. V přı́padě, kdy byl soubor uložen na Plochu, může být jednoduššı́ zadat absolutnı́ cestu, na Windows: ’C:/Users/uzivatel/Plocha/vysledky.html’, na OS *NIX-ového typu ’/home/uzivatel/Plocha/vysledky.html’. • "r" značı́, že soubor má být otevřen v režimu pouze pro čtenı́, tedy nelze do něj zapisovat. To se v tomto přı́padě hodı́, abychom si omylem nepřepsali data. Pokud bychom chtěli zápis pro čtenı́ i zapisovánı́, použili bychom "r+". 2. Výsledek funkce, kterým je objekt představujı́cı́ otevřený soubor, jsme si uložili pod symbolem soubor. Python automaticky alokuje pamět’ pro objekty při jejich vytvořenı́ a automaticky jejich pamět’ znovu uvolňuje v momentě, kdy už na ně žádný symbol nebo jiný objekt neodkazuje. Volánı́ funkcı́ v Pythonu je tedy velmi podobné jako v matematice z = f (x, y), ale hodnoty mohou být obecně jakékoliv objekty, nejenom čı́sla. V Pythonu jsou ve skutečnosti všechno objekty (včetně čı́sel a funkcı́). Můžeme se podı́vat na objekt odkazovaný symbolem soubor 2 In [4]: soubor Out[4]: < io.TextIOWrapper name=’vysledky.html’ mode=’r’ encoding=’UTF-8’> Při vyhodnocovánı́ výrazu byl symbol nahrazen hodnotou, na kterou se odkazuje. Objekty mohou mı́t na sebe navázané jiné objekty ve formě tzv. atributů, ke kterým se přistupuje pomocı́ zápisu objekt.jmeno, kde jmeno je symbolický název atributu objektu objekt. Např. takto lze přistupovat ke jménu souboru, který je reprezentován objektem uloženým pod symbolem soubor In [5]: soubor.name Out[5]: ’vysledky.html’ Speciálnı́m typem atributů jsou tzv. metody, což jsou funkce svázané s daným objektem, které zpravidla operujı́ právě na něm. Napřı́klad takto lze zjistit, zda jde do souboru zapisovat In [6]: soubor.writable() Out[6]: False Výsledkem volánı́ metody writable je hodnota False reprezentujı́cı́ logickou nepravdu, což odpovı́dá našemu očekávánı́. Logická nepravda je reprezentována objekty typu bool, mohou mı́t hodnoty pouze True (pravda) a False (nepravda). Nynı́ vypı́šeme prvnı́ch 10 řádků souboru In [7]: cislo_radku = 1 while cislo_radku <= 7: radek = soubor.readline() print(radek, end=’’) cislo_radku += 1 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="description" content=""> <title>Výsledky | Seminář vědy a techniky na FJFI</title> V předchozı́m bloku jsme nejdřı́ve pod symbolem uložili čı́slo 1. Poté byl klı́čovým slovem while otevřen blok kódu odsazený o 4 mezery doprava, který bude opakován, dokud výsledek výrazu mezi while a dvojtečkou bude True. Zde je vyhodnocován výraz ekvivalentnı́ x ≤ 7. Opakovaný blok kódu obsahuje 3 výrazy 1. Načtenı́ následujı́cı́ho řádku ze souboru metodu readline a uloženı́ výsledku (řetězec znaků) pod symbolem radek. 2. Vypsánı́ řádku na standardnı́ výstup (zde text pod výstupnı́m blokem) pomocı́ funkce print. Funkci je nastavena hodnota jejı́ho vstupnı́ho parametru end na prázdný řetězec znaků, aby nevypisoval znak pro odřádkovánı́ ’\n’, protože samotný řádek už jej obsahuje. 3. Pod symbolem cislo radku si uložı́me hodnotu o 1 vyššı́. Výraz s operátorem += je ekvivalentnı́ výrazu cislo radku = cislo radku + 1. Nynı́ budeme čı́st dalšı́ řádky, dokud nenajdeme řádek, ve kterém se nacházı́ řetězec ’<tbody>’, pod kterým se nacházı́ tabulka s výsledky In [8]: while True: # neustálé opakovánı́ radek = soubor.readline() if ’<tbody>’ in radek: # HTML tag tbody v řádku break # ukončit opakovánı́ else: # pokud logická podmı́nka nebyla splněna continue # pokračovat na dalšı́ opakovánı́ cyklu 3 Cyklus neustále (protože logická podmı́nka po while je vždy splněna) čte následujı́cı́ řádky. Poté vyhodnocuje logické větvenı́ programu pomocı́ if ... else ... konstruktu, který vyhodnotı́ logický výraz mezi if a dvojtečkou a pokud je pravdivý, vykoná blok kódu pod if .... V opačném přı́padě vykoná blok pod else. Zde logický výraz vyhodnocuje, zda je hledaný řetězec obsažený v řádku (ekvivalent x ∈ M). Pokud je, klı́čové slovo break ukončı́ opakovánı́. V opačném přı́padě kvůli continue skočı́ na dalšı́ opakovánı́. else a jemu přı́slušný blok nenı́ nutné uvádět, pokud to nenı́ nutné, což zde nebylo, protože dalšı́ opakovánı́ by začalo automaticky. Nynı́ jsme se ocitli v určité, pro nás důležité pozici v souboru, kterou si zapamatujeme In [9]: pred_tabulkou = soubor.tell() # aktuálnı́ pozice v souboru pred_tabulkou Out[9]: 2274 Nynı́ se podı́váme na následujı́cı́ch 6 řádků a poté se vrátı́me na původnı́ pozici In [10]: for i in range(0, 6, 1): # pro každé i v {0, ..., 5} radek = soubor.readline() if True or ’<’ in radek: # HTML tag v řádku print(radek, end=’’) soubor.seek(pred_tabulkou) # přesun na pozici v souboru Out[10]: 2274 <tr> <th style="text-align:left">Ondřej Poláček</th> <td>3</td> <td>38,98</td> Konstrukt for element in sekvence: opakuje jemu přı́slušný blok kódu pro každý prvek z nějaké sekvence a při každém opakovánı́ nastavı́ proměnnou element na daný prvek. Jedná se o analogii zápisu ∀x ∈ M. Tzv. generátorová funkce range(b, e, s) vytvářı́ seznam indexů od čı́sla b do e - 1 s krokem s. Zde by stačilo napsat range(6), protože pokud nenı́ specifikováno jinak, b=0, s=1. for cyklus po řadě nastavuje proměnnou i na hodnoty těchto indexů. Sice jsme tyto indexy přı́mo nepoužili, ale jednoduše jsme tı́mto napsali “opakuj 6-krát”. Vidı́me, že bude potřeba na každém řádku vyextrahovat čı́slo mezi HTML tagy td a jméno mezi th tagy. K tomuto účelu sestrojı́me funkci, která na daném řádku vyextrahuje hodnoty mezi tagy na řádku In [11]: def extrahuj_mezi_tagy(retezec): ’’’Tento řetězec znaků sloužı́ jako dokumentace funkce Protože začal 3 apostrofy, může se táhnout přes vı́ce řádků. Jako dokumentačnı́ řetězec se bere prvnı́ řetězec v těle funkce. Tato funkce vrátı́ část řádku (řetězec) mezi tagy. ’’’ # konec řetězce konec_tagu1 = retezec.find(’>’) # najdi pozici znaku ’>’ v řádku # najdi pozici znaku ’>’ v řádku, # ale začni hledat od konce minulého zacatek_tagu2 = retezec.find(’<’, konec_tagu1) return retezec[konec_tagu1 + 1:zacatek_tagu2] Definice funkce začı́ná klı́čovým slovem def, následuje jméno funkce a pak symbolické parametry v závorkách. Jako prvnı́ by pak měl následovat v těle funkce (odsazený blok) dokumentačnı́ řetězec (je nepovinný). Vyhodnocovánı́ výrazů v těle končı́ při vrácenı́ nějaké hodnoty pomocı́ klı́čového slova return. Zde je vrácena podmnožina řetězce označená indexovacı́m operátorem [b:e:s], který funguje velmi podobně jako range a vrátı́ tu část indexovatelného objektu, které odpovı́dajı́ indexy generované ekvivalentnı́m volánı́ range. Objekty jsou v Pythonu zpravidla indexovány od 0 (prvnı́ prvek má index 0). Nynı́ ještě zadefinujeme funkci, která vyextrahovanou hodnotu převede na desetinné čı́slo (typ float) 4 In [12]: def na_cislo(hodnota): ’’’Konvertuje řetězec znaků na desetinné čı́slo pokud se nepodařı́ konvertovat, vrátı́ 0 ’’’ # v hodnotě zaměnı́me deset. čárku za tečku. hodnota = hodnota.replace(’,’, ’.’) try: # je možné, že nastane chyba (výjimka) return float(hodnota) # konvertovat na desetinné čı́slo except: # pokud nastala chyba return 0 Před konverzı́ je však potřeba zaměnit desetinnou čárku za tečku. Poté je v try bloku řetězec konvertován a výsledná hodnota vrácena. Pokud během vyhodnocovánı́ bloku přı́slušného try dodje k chybě, je mı́sto něj vyhodnocován except blok pod nı́m, ve kterém je vrácena 0. V Pythonu lze rozlišit různé typy výjimek, ale to přesahuje rámec tohoto tutoriálu. Nynı́ můžeme začı́t načı́tat data do nějaké datové struktury. K tomu se nám budou hodit dva speciálnı́ datové typy pro reprezentaci složených datových struktur. Prvnı́ je tzv. slovnı́k (dict) reprezentujı́cı́ vztah heslo -> definice. Zapisuje se jako {heslo: definice, heslo2: definice2, ...}. Heslo může být jakýkoliv neměnný objekt (např. čı́slo, řetězec), definice cokoliv. Jako hesla zde použijeme jména účastnı́ků, jako definice seznamy jejich výsledků. Pro reprezentaci seznamu čı́sel použijeme typ list, který se zapisuje mezi hranaté závorky [objekt1, objekt2, ...]. K jednotlivým prvkům v těchto objektech se pak přistupuje pomocı́ indexovacı́ho operátoru, v přı́padě slovnı́ku slovnik[heslo], v přı́padě seznamu indexem seznam[0]. Seznamy podporujı́ indexaci podmnožiny jako řetězce. Nynı́ budeme čı́st řádky až do konce HTML tabulky (značené tagem </table>) a postupně budeme plnit našı́ datovou strukturu In [13]: ucastnici = {} # prázdný slovnı́k for radek in soubor: if radek == ’\n’: # pokud prázdný řádek continue # přeskočı́me ho elif ’<th’ in radek: # zkrácenina else if aktualni_jmeno = extrahuj_mezi_tagy(radek) # pod heslem (řetězec představujı́cı́ jméno) # si uložı́me (zatı́m) prázdný seznam ucastnici[aktualni_jmeno] = [] # uložı́me si odkaz přı́mo na ten seznam aktualni_seznam = ucastnici[aktualni_jmeno] elif ’<td’ in radek: # ekvivalent f(g(x)) vysledek = na_cislo(extrahuj_mezi_tagy(radek)) # připojit hodnotu na konec seznamu aktualni_seznam.append(vysledek) elif ’</table>’ in radek: break # konec tabulky -> konec načı́tánı́ ucastnici # koukněme se na výsledek Out[13]: {’Dominik Krasula’: [2.0, 0, 8.21, 0, 0, 0, 8.21], ’Dominika Jochcová’: [4.0, 5.9, 11.45, 3.7, 0, 0, 17.35], ’Jakub Salavec’: [3.0, 5.0, 19.36, 0, 0, 0, 24.36], ’Jan Petr’: [2.0, 6.13, 13.77, 0, 0, 0, 19.91], ’Jiřı́ Jičı́nský’: [2.0, 18.61, 18.21, 0, 0, 0, 36.82], ’Jiřı́ Růžička’: [3.0, 24.59, 21.19, 0, 6.31, 0, 52.1], ’Kateřina Smı́talová’: [4.0, 13.0, 0, 0, 0, 0, 13.0], ’Marie Zlı́nská’: [3.0, 17.73, 0, 0, 5.0, 0, 22.73], ’Martin Scheubrein’: [3.0, 29.93, 28.69, 13.68, 5.3, 0, 72.3], ’Ondřej Brunner’: [2.0, 2.95, 0, 0, 0, 0, 2.95], ’Ondřej Daneš’: [2.0, 5.64, 0, 0, 0, 0, 5.64], ’Ondřej Poláček’: [3.0, 38.98, 34.21, 36.8, 0, 0, 109.99], 5 ’Petr Doležal’: [4.0, 29.54, 0, 6.0, 0, 0, 35.54], ’Vojtěch Laitl’: [0.0, 21.61, 20.58, 16.97, 19.17, 25.0, 103.32], ’Šimon Jelı́nek’: [3.0, 28.99, 35.5, 13.49, 9.14, 0, 87.13]} Nynı́ můžeme začı́t pracovat s načtenými daty. Předtı́m si však pro jistotu uložı́me výsledek do souboru, ’w’ zde značı́ mód zápisu (write) a soubor vytvořı́ či přepı́še at’ už existuje či ne In [14]: vysledky = open(’nactena_data’, ’w’) # ’w’ pro zápis (write) radek = str(ucastnici) # slovnı́k ve formě řetězce vysledky.write(radek) # zapsat do souboru vysledky.close() # zavřı́t soubor, aby skutečně uložil 5 Statistické zpracovánı́ dat Jednı́m z nejužitečnějšı́ch statistických ukazatelů je aritmetický průměr n různých hodnot xi n hxi = 1X 1 (x1 + x2 + · · · + xn ) = xi n n i=1 Proto zadefinujeme funkci, která vypočı́tá arit. průměr hodnot v seznamu In [15]: def prumer(seznam): ’’’Vrátı́ aritmetický průměr hodnot v seznamu’’’ return sum(seznam) / len(seznam) Použili jsme funkci sum, která vrátı́ součet prvků v seznamu a len, která vrátı́ délku seznamu. Nynı́ můžeme např. vypočı́tat průměrný ročnı́k účastnı́ků. Ročnı́k je prvnı́ (index 0) element seznamu načtených dat. Sekvenci definic ve slovnı́ku zı́skáme metodou values, v tomto přı́padě dostaneme sekvenci seznamů dat. In [16]: rocniky = [seznam[0] for seznam in ucastnici.values()] prumer(rocniky) Out[16]: 2.6666666666666665 Použili jsme zde zkrácenou formu generovánı́ seznamu for cyklem. Tato forma je ekvivalentnı́ zápisu rocniky = [] for seznam in ucastnici.values(): rocniky.append(seznam[0]) Také můžeme jednoduše zjistit průměrný součet zı́skaných bodů, suma zı́skaných bodů je poslednı́ prvek seznamu (index -1 aneb prvnı́ od konce, tedy záporný) In [17]: celkove = [seznam[-1] for seznam in ucastnici.values()] prumer(celkove) Out[17]: 40.756666666666675 6 Úkoly Tento tutoriál byl pouze krátkou exkurzı́ do možnostı́ jazyka Python. Následujı́cı́ úkoly můžete použı́t jako motivaci pro prohloubenı́ svého porozuměnı́ zde předložených přı́kladů. 6 6.1 Úkol 1 (1,5 b.): Definujte funkci pro směrodatnou odchylku a vypočı́tejte ji pro ročnı́ky účastnı́ků a celkové sumy bodů Dalšı́m důležitým statistickým parametrem je tzv. směrodatná odchylka σ, která udává rozmezı́ hodnot (hxi − σ, hxi + σ), do kterého by se mělo vejı́t cca 68% náhodných hodnot σ(x) = 1 2 2 2 (x1 − hxi) + (x2 − hxi) + · · · + (xn − hxi) n−1 12 n = 1 X 2 (xi − hxi) n − 1 i=1 ! 21 Definuje funkci podobnou funkci prumer, která vrátı́ směrodatnou odchylku hodnot v seznamu vypočı́tanou podle tohoto vzorce. Pro mocněnı́ čı́sel xy použijte operátor x ** y. Pak vypočı́tejte směrodatnou odchylku ročnı́ků a celkových sum zı́skaných bodů. 6.2 Úkol 2 (1,5 b.): Sestrojte seznam průměrů v jednotlivých sériı́ch pomocı́ zkrácené formy Vnořené, zkrácené generovánı́ seznamů je velmi užitečný trik. Napřı́klad seznam 10 seznamů prvnı́ch 10 n-tých mocnin lze jednoduše zapsat jako [[i**j for j in range(10)] for i in range(10)] Pomocı́ této konstrukce a funkce prumer sestrojte seznam průměrů v jednotlivých sériı́ch. 6.3 Úkol 3 (6 b.): Seřad’te úlohy v historii SVAT podle počtu řešitelů Uložený HTML soubor obsahuje detailnı́ výsledky této i předchozı́ch (ty jsou ale v jiném formátu a schované) sériı́. Neřešené úlohy jsou značeny pomlčkou -. Najděte u každé úlohy počet řešitelů a vytvořte a seřad’te seznam trojic [pocet resitelu, serie, c ulohy]. Seznam můžete seřadit např. funkcı́ sorted. Může se také hodit metoda split objektů typu str, která rozdělı́ řetězec podle zadaného znaku. 7
Podobné dokumenty
zadání tutoriálu
V minulém dı́le tutoriálu jsme se seznámili se základnı́mi pravidly syntaxe a programovanı́ v jazyce
Python. Popularita tohoto jazyka však nepramenı́ pouze z velmi pohodlné syntaxe, ale také...
1 Postrelacn´ı databázový systém 2 Objektove relacn´ı databázové
rozdı́l je v tom, že se nejedná o dobu, kdy data platila, ale kdy se vložila do DB).
Dotazovacı́ jazyky nejsou standardizovány. Formálnı́m zápisem je relačnı́ kalkul rozšı́řený o časové...
Strukturované testování
všechny objekty majı́ očekávané relace s jinými objekty.
uzly vykazujı́ předpokládané hodnoty atributů.
hrany jsou tam, kde se očekávajı́ v rámci daných relacı́.
hrany majı́ správné ...
hodnota zdraví u osob bez domova - Aktuální otázky sociální politiky
ale také špatné a nežádoucí a zároveň hodnoty reagují na individuální nebo skupinové aktivity
(Cakirpaloglu; 2004). Každá osobnost má svou vlastní stupnici hodnot řazenou dle významu,
který pro něj...
vysoké učení technické v brně
ukazatele (< a >), změní hodnotu, resp. buňku, na kterou datový ukazatel odkazuje, pouze
o jedničku.
To v praxi znamená, že pro přičtení např. hodnoty 42 k aktuální hodnotě v buňce, na
kterou odkaz...
Číslo v pdf
v průměru. Pak můžeme použı́t hashovacı́ tabulku, čı́mž se dostaneme na průměrný čas O(N ) a stejnou pamět’.
Možná vás napadlo, že mı́sto hledánı́ maxima až po spočtenı́ hodnot f...
Operacˇnı syste´my - RNDr. Šárka Vavrečková, Ph.D.
a jednoduché přı́kazy jako napřı́klad kopı́rovánı́ souborů nebo procházenı́ mezi adresáři (složkami),
• vnějšı́ přı́kazy – jedná se o spustitelné soubory (s přı́ponou COM, EXE, MSC, ...
KoresponDance Europe 5–31/10/2009
Serge Ricci získal klasické taneční vzdělání u Roselly Hightower v Cannes, jako interpret
spolupracoval s řadou skupin a vzdělával se v různých tanečních technikách (Alexander, Body Mind
Centering...