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 konzultaci. Také jsem k zastižení na Matrixu
jako @mj:matrix.ucw.cz a na Telegramu
jako @golluxino.
datum
| téma
|
---|
1. 10. |
|
8. 10. |
|
15. 10. |
|
22. 10. |
|
29. 10. |
- Výklad: Funkce
- 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í
|
5. 11. |
Necvičíme, protože cvičíme: Děkanský sportovní den
|
12. 11. |
- Výklad: Seznamy, řezy a řetězce
- 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ů
|
19. 11. |
- Výklad: List comprehensions
- 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ů
|
26. 11. |
- Výklad: Množiny a slovníky
- Příklady: robůtek, kontakty
- Napište funkci, která:
- Vrátí
True nebo False podle toho, zda jsou
dané dva seznamy řetězců stejné až na pořadí prvků. Co když se mohou řetězce
v seznamech opakovat?
- Vrátí
True nebo False podle toho, zda jsou
všechny prvky daného seznamu navzájem různé.
- 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í.
|
3. 12. |
- Výklad: Třídy a objekty
- 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čí.
|
10. 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 Rect(0,0,0,0), 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.
- Naučte metodu __eq__, aby vracela False, pokud porovnává s něčím,
co není Rect, případně RoundRect. Může se hodit isinstance.
|
17. 12. |
- Výklad: Triky s funkcemi
- 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.
|
7. 1. |
Plán:
- Výklad: Soubory a výjimky
- 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.
|