====== 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 ===== /* [[https://forms.gle/kFqxMq54p7hjByPu6|101]] | [[https://forms.gle/3nLTaoxHoVa3zQVk7|102]] | [[https://forms.gle/QaZvFUtncp1Ne1CH7|103]] | [[https://forms.gle/vzsGD3QyLgcqMk1g7|104]] | [[https://forms.gle/oMqTMgeh4ao4uiwL8|105]] | [[https://forms.gle/uyin2XUR2RuBFCna6|106]] | [[https://forms.gle/MuffuZrZW4u4wWx8A|107]] | [[https://forms.gle/4kfZisGQAbhkvdvHA|108]] | [[https://forms.gle/yARdGc2Gxtt5qAudA|109]] */ > {{page>courses:b4b33rph:internal:puzzles#cviceni_8}} ===== Programovací testík ===== [[courses:b4b33rph:internal:kratke_testiky:start|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: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á. Bylo by dobře, kdybyste nejpozději příští týden věděli, s kým budete v týmu. Dejte nám 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. [[https://docs.google.com/forms/d/e/1FAIpQLSfWtoZGsMZpZU57nXX2dhPunyMpOvkIdRuN0WYH6XMoSx5Lng/viewform|Dotazník]] 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. ===== 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 ====== 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&editbtn}} Příprava na [[..:spam:krok4|krok 4]] úlohy spam filtr: > {{section>..:spam:krok4#priprava&noheader&editbtn}}