Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

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