Reversi III

Výsledky učení

Po tomto cvičení student

  • ví, jakými strategiemi chce vybavit svého Reversi hráče, a má dobrou představu, jak je implementovat;
  • umí v Pythonu vytvořit textový soubor a zapsat do něj data, resp. otevřít existující soubor a data z něj načíst;
  • ovládá základní techniku pro parsování dat z textů pomocí str.split().

Program

  • Diskuze kódu hráče reversi
  • Práce se soubory
  • Programovací úlohy: metody save a load u třídy MyMatrix, počítání znaků v řetězci a souboru
  • Hádanka

Textové soubory

Seznamte se s tématem Práce se soubory. Popisovaný způsob se hodně podobá práci se soubory třeba v jazyku C.

Existuje i objektové rozhraní pro práci s cestami, adresáři a soubory, modul pathlib. Zkuste se podívat na několik krátkých videí o modulu pathlib.

V Pythonu 3 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 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

Programovací úlohy

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:

  • 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']
  • K odstranění bílých znaků ze začátku a konce řetězce můžete použít metodu strip.
    >>> s = '\t1,2,3,4 \n'
    >>> l = s.strip()
    >>> print(l)
    '1,2,3,4'

Slovníky

  • Práce s dictionary: Vytvořte funkci count_chars_in_string(s), 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 get.
  • Vytvořte funkci count_chars_in_file(filepath), která
    • jako svůj argument přijme jméno textového souboru (cestu k textovému 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.

Hádanka

Zadání hádanky se dozvíte na cvičení.

Domácí úkol

Odevzdání

Některou z příštích nedělí je třeba odevzdat Reversi hráče pro turnaj. Platný termín je v BRUTE! 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 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.
courses/b4b33rph/cviceni/program_po_tydnech/tyden_07.txt · Last modified: 2024/11/07 15:17 by xposik