====== Spam I ======
[[courses:b4b33rph:internal:cviceni:program_po_tydnech:tyden_08|Učitelská verze stránky]]
===== Výsledky učení =====
Po tomto cvičení student
* rozumí zadání úlohy Spam filtr, rozumí formátu dat;
* umí spustit testy k prvnímu kroku úlohy Spam filtr, rozumí jejich výstupům a chápe, jak mohou být užitečné při řešení úlohy;
* umí vytvářet jednoduché generátory pomocí příkazu ''yield''.
===== Program =====
* Dotazy a odpovědi
* Testík
* Hádanka
* Vyjasnění a diskuse zadání úlohy Spam filter
* Vysvětlení a demonstrace testů k úloze Spam filter
* Příkaz ''yield''
===== Dotazy a odpovědi =====
* Kdo dokončil implementaci funkcí ''count_chars_in_string()'' a ''count_chars_in_file()''?
* 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')''?
===== Programovací testík =====
Zadání 4. testíku se dozvíte na cvičení.
===== Hádanka =====
Zadání hádanky se dozvíte na cvičení.
===== Úvod do úlohy Spam filtr =====
* Vyjasnění [[..:spam:uvod|diskuze o filtrování spamu z přednášky]], odpovědi na otázky
* [[..:spam:specifikace|Specifikace celé úlohy]] - co **musí** celé řešení splnit
* [[..:spam:data|Data a jejich formát]]
* [[..:spam:dekompozice|Analýza a dekompozice problému]] na jednotlivé funkční bloky
==== Tým pro Spam filtr ====
Druhá část úlohy Spam filtr je týmová. Do příštího týdne vyplňte
[[https://docs.google.com/forms/d/e/1FAIpQLSfWtoZGsMZpZU57nXX2dhPunyMpOvkIdRuN0WYH6XMoSx5Lng/viewform|Dotazník]]
a dejte nám tak vědět, zda tým už máte nebo si někoho najdete sami, zda byste chtěli, abychom vám někoho přidělili, nebo zda máte k týmové práci takový odpor, že opravdu chcete úlohu řešit sami.
* Pokud se rozhodnete úlohu řešit sami, vězte, že to bude mnohem více práce: musíte vytvořit kód, report i prezentaci sami. V týmu se o práci můžete podělit.
* Je to hlavně pro naši i vaši orientaci, abychom my i vy věděli, s kým jste v týmu, příp. komu máme partnera do týmu najít. Proto se ptáme i na úroveň Pythonu, abychom dokázali vás dokázali lépe "namatchovat" k sobě.
* Týmy mohou být sestaveny napříč cvičeními. (Závěrečnou prezentaci stačí předvést na jednom cvičení.)
===== Založení projektu a spouštění testů =====
Pokud stále narážíte na problémy se zakládáním projektů, spouštěním skriptů, či testů, zkuste si přečíst následující informace:
* [[courses:b4b33rph:tutorialy:python:vscode|VS Code]]
* [[courses:b4b33rph:tutorialy:python:pycharm|PyCharm]]
===== 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?
* ...
==== Testy ke kroku 2 ====
Zopakujte (podle potřeby) výše uvedené i pro {{..:spam:test2_corpus.zip|testy ke kroku 2}}.
===== 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, iterátor, generátor, ''yield'' |
* Co jsou "iterables"?
* Iterable je každý objekt, který umí vrátit iterátor, tj. objekt, který implementuje metodu ''__iter__()'', která iterátor vrací.
* Z praktického hlediska je to každý objekt, jehož prvky se dají procházet cyklem ''for''.
* Seznamy, n-tice, řetězce, soubory, atd.
* Co je to "iterátor"?
* Iterátor je každý objekt implementující tzv. "iterator" protokol, tj. každý objekt, který implementuje metody ''__iter__()'' a ''__next__()''.
* Iterátor se používá k procházení prvků nějaké "iterable" kolekce, aniž by bylo potřeba načíst do paměti všechny prvky kolekce najednou. Díky tomu jsou efektivní pro velké datové sady.
* Každý iterátor je také "iterable" (implementuje metodu ''__iter__()'', která obvykle vrací stejnou instanci, na niž byla metoda zavolána).
* Iterátor lze použít k projítí prvku kolekce pouze jednou. Dostane-li se na konec, je třeba požádat kolekci o nový iterátor.
* Co je to generátor?
* Generátor je speciálním typem iterátoru, který se definuje pomocí funkce obsahující jeden nebo více příkazů ''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 iterátorem: 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''.
++++
===== Programovací úlohy =====
* Dokončete [[..:spam:krok1|krok 1]] úlohy Spam filtr, tj. funkci ''read_classification_from_file()'' tak, aby procházela testy.
* Začněte pracovat na [[..:spam:krok2|kroku 2]] úlohy Spam filtr, tj. na třídě ''Corpus'' a její metodě ''emails()''.
====== Domácí úkol ======
Vyplňte [[https://docs.google.com/forms/d/e/1FAIpQLSfWtoZGsMZpZU57nXX2dhPunyMpOvkIdRuN0WYH6XMoSx5Lng/viewform|dotazník]] ohledně složení týmů pro Spam filtr, pokud jste to ještě neudělali.
===== 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 testy.
* [[..:spam:krok2|krok 2]] úlohy Spam filtr, tj. třídu ''Corpus'' a její metodu ''emails()'' tak, aby procházela testy.
===== Příprava =====
Příprava na [[..:spam:krok3|krok 3]] úlohy spam filtr:
> {{section>..:spam:krok3#priprava&noheader&nodate}}
Příprava na [[..:spam:krok4|krok 4]] úlohy spam filtr:
> {{section>..:spam:krok4#priprava&noheader&nodate}}