====== Spam I ======
* Dotazy a odpovědi
* Testík
* Vyjasnění a diskuse zadání úlohy Spam filter
* Nastavení projektu pro Spam filter v PyCharmu
* Spouštění testů v PyCharmu
* Vysvětlení a demonstrace testů k úloze Spam filter
* Hádanka
* Příkaz ''yield''
===== Dotazy a odpovědi =====
* Kolik lidí se pokusilo implementovat funkci ''read_classification_from_file()''? Kolik lidí si myslí, že ji i úspěšně dokončilo?
* Na jaké problémy jste při práci se soubory narazili?
* Připomenutí: proč je dobré používat parametr ''encoding'' ve volání ''open(filename, mode, encoding='utf-8')''?
===== Hádanka =====
> {{page>courses:b4b33rph:internal:puzzles#cviceni_8}}
===== Programovací testík =====
Zadání na interních stránkách.
===== Úvod do úlohy Spam filtr =====
* Vyjasnění [[..:spam:uvod|diskuze o filtrování spamu z přednášky]], odpovědi na otázky
* [[..:spam:data|Data a jejich formát]]
* [[..:spam:dekompozice|Analýza a dekompozice problému]] na jednotlivé funkční bloky
===== Založení projektu a spouštění skriptů v PyCharm =====
Pokud někdo stále naráží na problémy, zkuste si přečíst
* [[courses:b4b33rph:tutorialy:python:pycharm#zalozeni_projektu_v_pycharm|jak založit projekt v PyCharm]] a/nebo
* [[courses:b4b33rph:tutorialy:python:pycharm#spousteni_skriptu_v_pycharm|jak spouštět skripty v PyCharm]].
===== Spouštění testů v PyCharm =====
> {{page>..:..:tutorialy:python:pycharm#spousteni_testu_v_pycharm&noheader&editbtn}}
===== Demonstrace testů k úloze Spam filter =====
[[http://docs.python.org/py3k/library/unittest.html]]
* Testy se snažíme psát srozumitelně, abyste jejich studiem něco získali.
* Mnoho pomocných funkcí, které u testů jsou, tvoří také zajímavý studijní materiál.
* Uvědomte si, že testy velmi často dělají opak toho, co má dělat váš kód: když má vaše funkce načítat data ze souboru, musí je jiná funkce v testu nejprve vytvořit. Zkuste zde hledat inspiraci k řešení vlastních problémů!
==== Testy ke kroku 1 ====
Stáhněte si {{..:spam:test1_readclassification.zip|testy ke kroku 1}} úlohy Spam filtr. Archiv rozbalte do adresáře, kde vyvíjíte spam filter.
* Zkuste si zdrojový kód testů sami přečíst. Poznamenejte si nejasnosti. Diskutujte o nich se cvičícím.
* Zkuste testy spustit.
* Co vám říká výstup? Jaký další (co nejmenší) krok byste udělali na základě výstupu unit testu, abyste se posunuli dál?
* Zkuste tento krok rovnou udělat. Jak se změnil výstup unit testu? Jak další krok byste udělali?
* ...
> {{page>..:..:internal:cviceni:spam:krok1#testy&noheader&editbtn}}
==== Testy ke kroku 2 ====
Zopakujte (podle potřeby) výše uvedené i pro {{..:spam:test2_corpus.zip|testy ke kroku 2}}.
> {{page>..:..:internal:cviceni:spam:krok2#testy&noheader&editbtn}}
===== Příkaz ''yield'' =====
Generátory a ''yield'' byly probrány na přednášce 31.10. 2017. Následující byste již měli znát, příklady jste už viděli.
++++ Iterable, iterator, ''yield'' |
* Co jsou "iterables"?
* Iterable je každý objekt, jehož prvky se dají procházet cyklem for. Seznamy, n-tice, řetězce, soubory, atd.
* Co je to generátor?
* Generátor je také "iterable", ale lze ho projít jen jednou.
* Generuje jednotlivé prvky "za pochodu", jeden po druhém. Není třeba mít všechny prvky v paměti.
* Co je ''yield''?
* Zavoláte-li funkci, která obsahuje ''yield'', **kód uvnitř funkce se nespustí**! Funkce pouze vrátí generátor.
* Vrácený generátor je "iterable"; má tedy metodu ''__next__'' (kterou volá cyklus ''for'', aniž byste o tom věděli).
* Při prvním volání metody ''next'' se funkce spustí, dokud nenarazí na první ''yield''. Tam se její běh přeruší (ovšem generátor si pamatuje její stav) a argument příkazu ''yield'' je vrácen volajícímu kódu.
* Při každém dalším volání metody ''next'' se funkce spustí od předchozího ''yield'', dokud nenarazí na další ''yield'' nebo na konec funkce, kdy se vyhodí výjimka ''StopIteration''.
> {{page>..:..:tutorialy:python:yield#yield&editbtn&noheader}}
++++
===== Programovací úlohy =====
* Dokončete [[..:spam:krok1|krok 1]] úlohy Spam filtr, tj. funkci ''read_classification_from_file()'' tak, aby procházela unit testem.
* Začněte pracovat na [[..:spam:krok2|kroku 2]] úlohy Spam filtr, tj. na třídě ''Corpus'' a její metodě ''emails()''.
====== Domácí úkol ======
===== Programování =====
Pokud se vám to nepodařilo už na cvičení, dokončete:
* [[..:spam:krok1|krok 1]] úlohy Spam filtr, tj. funkci ''read_classification_from_file()'' tak, aby procházela testem.
* [[..:spam:krok2|krok 2]] úlohy Spam filtr, tj. třídu ''Corpus'' a její metodu ''emails()'' tak, aby procházela testem.
===== Příprava =====
Příprava na [[..:spam:krok3|krok 3]] úlohy spam filtr:
> {{section>..:spam:krok3#priprava&noheader&editbtn}}
Příprava na [[..:spam:krok4|krok 4]] úlohy spam filtr:
> {{section>..:spam:krok4#priprava&noheader&editbtn}}