====== 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}}