zadání tutoriálu

Transkript

zadání tutoriálu
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

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

Více

1 Postrelacn´ı databázový systém 2 Objektove relacn´ı databázové

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

Více

Strukturované testování

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

Více

hodnota zdraví u osob bez domova - Aktuální otázky sociální politiky

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

Více

vysoké učení technické v brně

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

Více

Číslo v pdf

Čí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...

Více

Návod k obsluze CAS CL-5000

Návod k obsluze CAS CL-5000 UŽIVATELSKÝ MANUÁL – NÁVOD K OBSLUZE 

Více

Operacˇnı syste´my - RNDr. Šárka Vavrečková, Ph.D.

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

Více

KoresponDance Europe 5–31/10/2009

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

Více