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

Dilema I

  • diskuse problémů
  • vyjasnění zadání úlohy Vězňovo dilema
  • procvičování for cyklů
  • třída pro komplexní čísla a jejich sčítání, násobení, …
  • procvičování základních datových typů

Hádanka

Vězňovo dilema

Na přednášce byl prezentován problém vězňova dilematu. Přečtěte si pozorně zadání úlohy: Vězňovo dilema. Ptejte se na nejasnosti.

Typické dvouhráčové hry

Úkoly pro cvičení

For cykly

for přes indexy seznamu, po elementech, zjištění délky seznamu, prázdný seznam. Implementujte jednoduchou funkci find_max

def find_max(in_list):
    """
    find maximum value in a list or tuple
    :param in_list: a list or tuple of elements that allow < comparison
    :return: a tuple max_value, index of the max_value within the list
    """

Základní datové typy

základní datové typy: čísla, znaky, True, False, řetězce, platnost jednotlivých proměnných. Vylepšete funkci find_max tak, aby v případě, že vstupní seznam je prázdný vrátila hodnotu None. Vhodně otestujte.

Jednoduchá třída

Navrhněte a implementujte třídu ComplexNumber. Nejprve se zamyslete:

  • Čím je instance komplexního čísla definována? Jaké bude mít členské proměnné?
  • Jaké má vlastnosti?
  • Jaké má schopnosti? Jaké operace lze dělat s komplexním číslem?

Pokuste se třídu implementovat a postupně rozšiřujte její schopnosti. Neděste se, vyučující vám na cvičení ukáží jak na to.

  • Inicializace
  • Čitelná reprezentace
  • Velikost (absolutní hodnota) komp. čísla
  • Inkrement reálné a imaginární části
  • Inkrement komp. čísla jiným komplexním číslem
  • Součet komplexních čísel

Možnost hezky vypsat komplexní číslo, zjistit jeho velikost, nebo sečíst 2 komplexní čísla pomocí námi definovaných metod je šikovná, ale ještě šikovnější by bylo, kdybychom mohli

  • místo print(a.to_string()) napsat prostě print(a),
  • místo a.size() využít funkci abs(a), což je obvyklý způsob, jak zjistit absolutní hodnotu tam, kde to dává smysl, nebo
  • místo a.add(b) psát prostě a+b.

Python k tomu nabízí prostředky ve formě tzv. dunder metod (double underscore), kterým se taky někdy říká magické metody, ale nic magického na nich není (viz též oficiální dokumentace). Jsou to metody, které se obvykle nevolají přímo, ale volá je interpret Python v jistých situacích. Jednu z nich už jste poznali - metodu __init__(), kterou Python volá po vytvoření nové instance nějaké třídy a jejímž úkolem je instanci inicializovat.

Pokuste se naši třídu ComplexNumber vybavit těmito metodami:

  • __str__(self)
  • __abs__(self)
  • __add__(self, other)
  • Dokážete nyní odhadnout, k čemu slouží metoda __mul__(self, other) a pro jaký kód ji Python zavolá? Uměli byste tuto metodu implementovat pro třídu ComplexNumber? Zkuste to, není to nic těžkého.
  • Když umíme dvě komplexní čísla sečíst, umíme je i odečíst, nebo ne? Zkuste, co udělá následující kód:
    >>> a = ComplexNumber(1,2)
    >>> b = ComplexNumber(2,2)
    >>> c = a - b
    >>> print(c)
    Dokážete třídu upravit tak, aby tento kód fungoval?

Domácí úkol, příprava na příště

DÚ na příští týden - modul pro výpočet skalárního součinu 2 vektorů

  • Vytvořte modul vectors.py.
  • V něm bude definice třídy MyVector.
  • Konstruktor bude akceptovat (navíc k self) jeden parametr, kterým bude seznam s prvky vektoru.
  • Metoda get_vector(self) navrátí seznam obsahující prvky vektoru.
  • Pomocí metody __mul__(self,other) implementujte skalární součin dvou objektů typu MyVector. Výstupem je tedy skalár (jedno číslo). V metodě počítejte s libovolnou délkou vektorů, oba budou stejné, ale libovolné délky (ne jen 3-dimenzionální).
  • Soubor vectors.py nesmí importovat jiné moduly.
  • Soubor nahrajte do BRUTE do požadovaného termínu.
  • BRUTE vám kód ihned ohodnotí, případně několik sekund počkejte.
  • Za správně vyřešenou úlohu získáte až 2 body.

Nazapomeňte na vlastní kontrolu kódu, nespoléhejte pouze na kontrolu v BRUTE. Třeba něco jako:

if __name__ == "__main__":
    vec1 = MyVector([1,2,3]) # vektory mohou byt i jine dimenze nez 3!
    vec2 = MyVector([3,4,5]) 
    print(vec1.get_vector()) # priklad ziskani seznamu
    dot_product = vec1*vec2  # vypocet skalarniho soucinu, pretizeny operator *, vola se __mul__
    print(dot_product)       # jen kontrolni vypis

Čtení

Přečtěte zbytek vašeho vybraného Python tutorial. V případě doporučeného jsou to kapitoly 3-9. Nemusíte úplně rozumět všemu, ani si pamatovat vše zpaměti. Měli byste mít natrénován postup jak si dohledat potřebné informace, mít natrénovanu práci s např. Python 3 tutoriálem, nebo jiným podobným zdrojem veškeré moudrosti ;-)

Interaktivní cvičení

Na codecademy pokračujte v interaktivním kurzu Pythonu 2 nebo Pythonu 3, pokud k němu máte přístup. Předpokládáme, že otázky, které jste měli po části kurzu z minulého týdne, jste položili na fóru nebo právě dnes na cvičení a že tudíž můžete pokračovat dál sekcemi:

  • Functions
  • Taking a vacation
  • Python lists and dictionaries
  • A day at the supermarket
  • Student becomes the teacher
  • Lists and functions
  • Loops

Opět se pokuste dostat co nejdál. Stále platí, že tato cvičení vám mají především pomoci identifikovat věci, kterým nerozumíte. Pokládejte otázky na fóru nebo na cvičení!

courses/b4b33rph/cviceni/program_po_tydnech/tyden_02.txt · Last modified: 2023/10/06 08:27 by xposik