====== Reversi III ====== ===== Program ===== * Diskuze kódu hráče reversi * Programovací úlohy: metody save a load u třídy MyMatrix, počítání znaků v řetězci a souboru * Hádanka ===== Programovací úlohy na cvičení ===== Programujte samostatně a ptejte se cvičícího. Snažte se o eleganci. Rozmyslete si trochu řešení předem, třeba na papír. ==== Práce se soubory ==== * Vytvořte třídu ''MyMatrix'', která dostává jeden nepovinný vstupní argument reprezentující matici (2D list). * Vybavte vaši třídu ''MyMatrix'' metodami ''save(self, filename)'' a ''load(self, filename)'': * metoda ''save'' uloží prvky matice do textového souboru se zadaným jménem; na každém řádku bude jeden řádek matice a jeho prvky budou oddělené mezerou. * metoda ''load'' načte z textového souboru se zadaným jménem uložená čísla a udělá z nich prvky matice. * Příklad použití: >>> a = MyMatrix([[1, 2, 3], [2, 3, 4]]) >>> a.save('matrix.txt') >>> b = MyMatrix() >>> b.load('matrix.txt') >>> a.get_matrix() == b.get_matrix() True Nápověda: * Vzpomeňte na úterní přednášku {{:courses:b4b33rph:prednasky:files.pdf|Práce se soubory}} * K rozdělení řetězce podle určitého znaku můžete použít metodu ''split''. >>> s = '1,2,3,4' >>> l = s.split(',') >>> print(l) ['1', '2', '3', '4'] ==== Slovníky ==== * Práce s dictionary: Vytvořte funkci ''count_chars_in_string(arg)'', která: * jako svůj argument přijme textový řetězec a * na výstupu poskytne slovník (dictionary) s četností jednotlivých znaků v daném řetězci. * mohla by vám pomoci třeba metoda ''[[https://docs.python.org/3/library/stdtypes.html#dict.get|get]]'' * Vytvořte funkci ''count_chars_in_file(arg)'', která * jako svůj argument přijme jméno textového souboru, * otevře jej, načte jeho obsah jako řetězec, * vytvoří dictionary s četností znaků v tomto řetězci a * vytvoří textový soubor se stejným názvem, jako měl původní text, ale s příponou ''.freq'', do něhož * uloží četnost znaků tak, že na každém řádku bude vždy znak a jeho četnost oddělené mezerou. ===== Textové soubory ===== V Pythonu 3 (oproti Pythonu 2) je zcela přepracována práce s řetězci. Nyní jsou všechny řetězce implicitně v unicode v kódování UTF-8. (Chcete-li používat jen sekvenci bytů, musí se použít nový datový typ ''bytes''.) To také znamená, že při načítání textů z textových souborů je třeba specifikovat kódování, v němž je textový soubor uložen: with open('soubor.txt', 'rt', encoding='utf-8') as f: retezec = f.read() Argument ''encoding="utf-8"'' používejte vždy, a to při čtení i při zápise. Neuvedete-li ho, Python použije implicitní kódování, které je ale závislé na operačním systému. Totožný program se pak může chovat jinak na různých systémech. Více např. zde: [[http://www.diveintopython3.net/files.html]] ===== Hádanka ===== > {{page>courses:b4b33rph:internal:puzzles#cviceni_7}} ===== Domácí úkol ===== ==== Odevzdání ==== Nadcházející neděli do 23:59:59 je třeba odevzdat Reversi hráče pro turnaj. [[courses:b4b33rph:cviceni:reversi:specifikace|specifikace]] ==== Programování ==== * Pokuste se naprogramovat funkce ''read_classification_from_file()'' a ''write_classification_to_file()'' pro čtení a zápis dat potřebných pro úlohu SPAM, viz [[..:spam:krok1|krok 1]]. Nepotřebujete k tomu znát nic víc než to, co jsme na tomto cvičení procvičili. Příště si ukážeme a vysvětlíme testy, které jsou k dispozici, a ověříme si, že vaše implementace testy splňuje.