Po tomto cvičení student
for
cyklus k implementaci jednoduchých opakujících se činností,
__dunder__
metody, kde je to vhodné.
for
cyklů
Zadání hádanky se dozvíte na cvičení.
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.
Několik základních kontrolních bodů, kterých je rozumné se držet:
Další hry ala vězňovo dilema pro vaši inspiraci:
years
obsahující seznam několika letopočtů, které jsou pro vás něčím významné, např. roky narození vašich blízkých.
for
-cyklu, každý na jeden řádek. Jaké různé způsoby řešení této úlohy vás napadají?
years
tak, aby váš kód skončil chybou, nebo se choval z vašeho pohledu neočekávaně. Zkuste porozumět chybové hlášce/důvodu, proč se kód chová právě takto. K porozumění/vysvětlení můžete využít dokumentaci k Pythonu, internetová fóra, i umělou inteligenci.
def find_max(collection): """ Return a tuple: the maximum item found in the collection, and its index """
years
tak, aby funkce find_max
selhala nebo vrátila nečekaný výsledek.
find_all_max(collection)
, která nebude vracet jen jeden index maximálního prvku, ale seznam indexů všech výskytů maximálního prvku.
Navrhněte a implementujte třídu ComplexNumber
.
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.
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
print(a.to_string())
napsat prostě print(a)
,
a.abs()
využít funkci abs(a)
, což je obvyklý způsob, jak zjistit absolutní hodnotu tam, kde to dává smysl, nebo
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:
__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.
>>> a = ComplexNumber(1,2) >>> b = ComplexNumber(2,2) >>> c = a - b >>> print(c)Dokážete třídu upravit tak, aby tento kód fungoval?
vectors.py
.
MyVector
.
self
) jeden parametr, kterým bude seznam s prvky vektoru.
get_vector(self)
navrátí seznam obsahující prvky vektoru.
__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í).
vectors.py
jiné moduly (snad kromě modulu typing
). Požadovanou funkcionalitu máte implementovat sami, nikoli ji delegovat na nějaké jiné knihovny, které by práci udělali za vás.
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
Přečtěte zbytek vašeho vybraného Python tutorialu ([Kubias2008] nebo Nauč se Python!). 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
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:
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 Discordu, na fóru nebo na cvičení!