Zápočet se udílí za získání alespoň 70 bodů za domácí úkoly.
Úkoly se odevzdávají v ReCodExu.
Budu rád, když se mi budete ozývat. Když vám cokoliv nepůjde, nestyďte se říci si o radu.
Když vám něco půjde, nestyďte se pochlubit se :) Napište mi mail na mares+p1m@kam.mff.cuni.cz,
případně si můžeme domluvit schůzku po Zoomu nebo osobní konzultaci. Také jsem k zastižení na Matrixu
jako @mj:matrix.ucw.cz a na Telegramu
jako @golluxino.
datum
| téma
|
---|
29. 9. |
|
6. 10. |
|
13. 10. |
|
20. 10. |
|
27. 10. |
- Výklad: Funkce (videozáznam)
- Napište funkci, která:
- vrátí nejmenší ze tří čísel:
řešení
- vrátí n-té Fibonacciho číslo:
řešení
- spočítá, kolik je v seznamu sudých čísel:
řešení
- vybere ze seznamu sudá čísla (a vrátí jejich seznam):
řešení
- dostane dva seřazené seznamy čísel a vrátí jejich průnik:
řešení
- dostane koeficienty kvadratické rovnice ax2 + bx + c = 0
a vrátí seznam jejích kořenů:
řešení
|
3. 11. |
- Výklad: Seznamy, řezy a řetězce (videozáznam)
- Napište funkci, která:
- otočí řetězec (
datel → letad )
- otočí číslo v desítkové soustavě (
1024 → 4201 ; může se hodit,
že int(x) převádí z řetězce na číslo a str(x) opačně)
- spočítá, kolik zadaný řetězec obsahuje slov (oddělených mezerami)
- … kolik různých slov
- vyhodnotí výraz se sčítáním (
12+34+1 → 47 )
- vyjádří číslo česky (
123 → "sto dvacet tři" ):
řešení
- Řešení příkladů
|
10. 11. |
- Výklad: List comprehensions (videozáznam)
- Napište funkci, která:
- vytvoří tabulku násobilky (a×b pro všechna a, b od 1 do daného čísla)
- zjistí průnik dvou (neuspořádaných) seznamů
- vybere z textu slova, která jsou palindromická (čtou se stejně popředu jako pozpátku)
- spočítá skalární součin dvou vektorů
- vynásobí dvě matice (ne nutně čtvercové)
- seřadí slova na řádku podle jejich délky (nápověda: nejprve slova převést na dvojice
(délka, slovo), ty pak setřídit a nakonec z dvojic zase udělat slova)
- Řešení příkladů
|
17. 11. |
Cvičení se nekoná.
|
24. 11. |
- Výklad: Množiny a slovníky (videozáznam)
- Příklady: robůtek, kontakty
- Napište funkci, která:
- Vrátí
True nebo False podle toho, zda jsou
dané dva seznamy stejné až na pořadí prvků. Co když se mohou prvky
v seznamech opakovat?
- Vrátí
True nebo False podle toho, zda jsou
všechny prvky daného seznamu navzájem různé.
- Řešení
- Spočítejte frekvence všech k-gramů (k-tic znaků) v textu.
K-gramy vypište uspořádaně podle frekvence
(řešení, jiné řešení).
Můžete vyzkoušet třeba na originálu Psa baskervillského
z Projektu Gutenberg. Řádky souboru můžete načítat pomocí
for řádek in open('soubor', encoding='utf-8') .
- Aplikace k-gramů:
- Pro každý k-gram zjistěte, jaká všechna písmena po něm mohou následovat.
Pokud jedno písmeno opakuje, uložte ho vícekrát.
- Předchozí tabulku využijte k náhodnému generování textu. První k-gram zvolte
náhodně a pak opakovaně vybírejte náhodné následující písmeno. Pro náhodný
výběr ze seznamu se může hodit
random.choose(seznam) (nezapomeňte
na import random ).
- Řešení.
|
1. 12. |
- Výklad: Třídy a objekty (videozáznam)
- Příklad definice třídy. Dodělejte do něj:
- Naučte každé zvíře slyšet navíc na jméno potvůrka.
- Doplňte atribut pozice a zařiďte, aby zvíře slyšelo na jméno
jenom tehdy, když pozice je doma.
- Vytvořte odvozenou třídu Pes, jehož metoda ozvi_se
na každé druhé zavolání zaštěká a jinak zavrčí.
|
8. 12. |
- Pokračování tříd a objektů z minula.
- Nadefinujte třídu Rect reprezentující obdélníky v rovině: (domácí úkol)
- atributy x1, y1, x2, y2 pro souřadnice levého dolního
a pravého horního vrcholu
- vytváření objektů voláním Rect(x1, y1, x2, y2)
- konverze na řetězec
- metoda perimeter pro výpočet obvodu
- metoda area pro výpočet obsahu
- operátor == (metoda __eq__(self, other)) pro rovnost obdélníků
(vrátí True nebo False)
- operátor in (metoda __contains__(self, other)) pro test, zda je jeden
obdélník podmnožinou druhého (neostře)
- operátor & (metoda __and__(self, other)) pro průnik obdélníků
(vrátí nový obdélník nebo None, pokud průnik má nulový obsah)
- Nadefinujte třídu RoundRect odvozenou od Rect pro obdélníky
se zakulacenými rohy (s jednotkovým poloměrem; předpokládejme že délky všech stran
jsou alespoň 2). Předefinujte metody, aby dávaly smysl.
|
15. 12. |
- Výklad: Triky s funkcemi (videozáznam)
- Je dán seznam řetězců tvaru "jméno příjmení":
- Setřiďte je primárně podle příjmení, sekundárně podle jména (řešení).
- Najděte osobu s nejdelším příjmením.
- Na rozmyšlení: Jak byste naložili s osobami, které mají více křestních jmen,
případně více příjmení?
- Cvičení na redukci seznamů (řešení):
- Napište funkci red(s,f), která dostane seznam s
a funkci f(x,y) a spočítá
s[0] f s[1] f s[2] f ... f s[-1]. Zápisem x f y
myslíme zavolání f(x,y), celý výraz se vyhodnocuje zleva
doprava.
- Zapište pomocí redukce součet prvků seznamu.
- Zapište pomocí redukce nalezení maxima seznamu.
- Zapište pomocí redukce nalezení prvního nenulového prvku (není-li, vraťte 0).
- Co redukce udělá pro operátor -?
- Co udělá red(s, lambda x, y: (x,y))?
- (*) Zapište pomocí redukce test, zda jsou všechny prvky seznamu stejné.
- Na rozmyšlení: Jak byste redukci definovali pro jednoprvkové seznamy?
Může dávat nějaký smysl pro prázdné seznamy?
- (mimochodem, redukci má Python zabudovanou a jmenuje se functools.reduce)
- Napište generátor, který dostane dva seznamy a bude generovat jejich
kartézský součin.
- Napište funkci compose(f,g), která pro dvě funkce f a g
(obě s jedním parametrem) vrátí funkci, jež je jejich složením.
|
22. 12. |
- Výklad: Soubory a výjimky (videozáznam)
- Napište program, který dostane textový soubor a:
- Spočítá, kolik je v něm řádků, slov a viditelných znaků (tedy bez mezer a konců řádků)
- Zkopíruje ho do jiného souboru …
- … tak, aby řádky šly v opačném pořadí (první se stane posledním atd.)
- … tak, aby šla v opačném pořadí i slova na řádcích
- Najde na každém řádku všechna čísla (oddělená mezerami) a vypíše jejich součet;
slova, která nejsou čísly, ignoruje.
|
5. 1. |
- Výklad: Standardní knihovna (videozáznam)
- Příklady:
- Simulujte 1000 hodů kostkou. Spočítejte výskyty každého čísla.
Kolik jich je nejméně a kolik nejvíce? (řešení)
- Generujte náhodně body ve čtverci [-1,1] × [-1,1].
Počítejte, kolik z nich padlo do jednotkového kruhu, a tím
aproximujte π. (řešení)
- Generujte náhodně permutace slov věty "Nemám rád zbytečně použité permutace."
Kolik z nich dávalo smysl? :) (řešení)
- Vygenerujte náhodně permutaci na množině 1 až N a spočítejte,
kolik má pevných bodů. Opakováním experimentu odhadněte, jaká
je pravděpodobnost, že náhodná permutace nemá pevný bod. (řešení)
- Pomocí Malé
Fermatovy věty testujte, zda je nějaké velké číslo pravděpodobně
prvočíslem. Hodí se tříparametrová funkce pow(a, b, c),
která efektivně spočítá ab mod c.
- Simulujte náhodnou procházku po celých číslech od 0 do N.
Začínáme v 0, v každém kroku náhodně buď zvýšíme nebo snížíme o 1
(v 0 jen zvyšujeme). Po kolika krocích se dostaneme do N? Jak dopadne
dvojrozměrná verze (ze středu čtverce se chceme dostat k okraji)?
|