Úlohy k prednáške 3¶
Nižšie nájdeš úlohy na precvičenie z tretej prednášky JDA, kde sme rozoberali funkcie (základné aj pokročilé), rekurziu, rozsah platnosti premenných (scoping), výnimky a prácu so súbormi (textové, binárne a JSON). Úlohy sa zameriavajú na tvorbu a volanie funkcií, manipuláciu s parametrami vrátane *args a **kwargs, anonymné funkcie lambda, rekurziu, ošetrovanie chýb a čítanie/zápis rôznych typov súborov v Pythone.
Niektoré môžu vyžadovať väčšiu kreativitu a iné sú skôr krátke cvičenia, aby si porozumel(a) fungovaniu týchto konceptov. Cieľom je upevniť si kľúčové pojmy a zautomatizovať základné operácie, napr. použitie funkcií, písanie a čítanie súborov či zachytávanie výnimiek.
V rámci týchto úloh nepoužívaj žiadne pokročilé knižnice (napr. NumPy).
1. Funkcia na validáciu rodného čísla¶
Zadanie:
- Napíš funkciu
validate_id(id_str: str) -> bool, ktorá skontroluje, či zadaný reťazecid_strzodpovedá formátu rodného čísla (napr.123456/7890). - Pravidlá (zjednodušene):
- Musí mať 7 číslic, potom
"/", potom 4 číslice (spolu 11 znakov). - Žiadne iné znaky, medzery atď. nie sú povolené.
- Musí mať 7 číslic, potom
- Funkcia vráti
True, ak formát sedí, inakFalse.
Inštrukcie:
- Na kontrolu formátu môžeš využiť napr.
len(), kontroluisdigit()na podreťazce. - Otestuj viacero prípadov: správny formát, rôzny počet číslic, chýbajúce
/, písmená namiesto číslic atď.
# --- TESTY ---
print(validate_id("123456/7890")) # True
print(validate_id("123456/678")) # False - zla dlzka
print(validate_id("123456-7890")) # False - zly znak
print(validate_id("123456/780a")) # False - pismeno namiesto cisla
# YOUR CODE
2. Konvertor jednotiek s prednastavenými parametrami¶
Zadanie:
- Napíš funkciu
convert_length(value, from_unit="cm", to_unit="m"), ktorá konvertuje dĺžku z jednej jednotky do druhej. - Prednastavené parametre:
from_unit="cm"(centimetre),to_unit="m"(metre).
- Funkcia podporuje konverzie medzi:
- cm ↔ m,
- cm ↔ mm,
- mm ↔ m.
- Ak
from_unitaleboto_unitnie je podporovaná hodnota, funkcia môže vyhodiťValueError.
Príklad:
print(convert_length(100)) # Predvolene z cm do m → 1.0
print(convert_length(2, "m", "cm")) # 200
print(convert_length(5, "m", "mm")) # 5000
print(convert_length(100, "km", "m")) # ValueError
Inštrukcie:
- V tele funkcie skontroluj, či
from_unitato_unitpatria do množiny{"mm", "cm", "m"}. - Potom implementuj jednoduché prepočty (napr. cm → m je delenie 100, atď.).
- Otestuj rôzne kombinácie i nepodporované jednotky (napr.
"km","in").
# YOUR CODE
3. Funkcia so *args: Zlúčenie viacerých zoznamov¶
Zadanie:
- Napíš funkciu
merge_lists(*args):- Ktorá ako ľubovoľný počet parametrov dostane zoznamy (listy).
- Vytvorí a vráti jeden zoznam, ktorý bude obsahovať všetky prvky (zachovaj poradie).
- Ak niektorý argument nie je typu list, ignoruj ho (alebo vyhoď výnimku, podľa zadania).
Inštrukcie:
- Skús aj príklad, keď funkciu voláš:
result = merge_lists([1,2], ["A","B","C"], [True, False], "xyz") print(result) # [1, 2, 'A', 'B', 'C', True, False]
- Rozhodni, či neprijateľné argumenty (ako
"xyz") ignoruješ, alebo vyvolášTypeError.
# YOUR CODE
**4. Funkcia s **kwargs: Vlastná správa používateľského profilu**¶
Zadanie:
- Napíš funkciu
create_profile(required_id, **kwargs), ktorá:- Vždy očakáva povinný parameter
required_id(napr. ID používateľa). - Ďalšie informácie (
name,age,email, ...) môžu byť ľubovoľné, odovzdané ako kľúčové argumenty dokwargs. - Vráti slovník, ktorý obsahuje napr.:
{ "id": required_id, "name": "Adam", "age": 25, "email": "adam@example.com", ... }
- Vždy očakáva povinný parameter
- Funkciu zavolaj viackrát s rôznymi kombináciami argumentov.
Príklad:
p1 = create_profile(1001, name="Adam", age=25, email="adam@example.com")
p2 = create_profile(1002, company="Google", position="Intern")
# YOUR CODE
5. Funkcia na sčítanie rôznych typov čísel (int, float) s ošetrením TypeError¶
Zadanie:
- Napíš funkciu
sum_numbers(numbers), ktorá:- Prijme 1 parameter: zoznam čísel (môžu byť int alebo float).
- Ak narazí na hodnotu, ktorá nie je číslo, vyvolá
TypeError(alebo ju preskočí – podľa preferencií).
- Vráti súčet všetkých validných čísel.
Inštrukcie:
- Otestuj napr.
sum_numbers([1, 2.5, "abc", 10]). - Skontroluj, či je prvok typu
intalebofloat(prípadne použiješisinstance(x, (int, float))).
# YOUR CODE
6. Rekurzia: Hľadanie cesty v „bludisku“¶
Zadanie¶
- Predstavte si štruktúru „bludiska“ ako vnorený slovník, kde každá kľúč/hodnota reprezentuje miestnosť a susedné miestnosti.
- Napíš rekurzívnu funkciu
find_path(maze, current_room, target_room), ktorá vráti zoznam miestností (cestu), ako sa dostať zcurrent_roomdotarget_room. - Ak cesta neexistuje, funkcia vráti
None.
Inštrukcie¶
- Použite rekurziu na prechádzanie miestností.
- Myslite na „base case“:
- Keď
current_room == target_room. - Alebo keď už daná cesta „skončila v slepej uličke“ a treba sa vrátiť.
- Keď
Príklad štruktúry¶
maze = {
"A": ["B", "C"],
"B": ["D"],
"C": [],
"D": ["E", "F"],
"E": [],
"F": ["C"]
}
- Tu
Avedie doBaC,Bvedie doD, atď.
TEST:
print(find_path(maze, "A", "E")) # Možná cesta: ['A', 'B', 'D', 'E']
print(find_path(maze, "A", "C")) # ['A', 'C']
print(find_path(maze, "C", "E")) # None, ak sa tam nedostaneme
# YOUR CODE
7. Lambda a map/filter: Spracovanie textových reťazcov¶
Zadanie¶
- Máte zoznam reťazcov (napr. slová alebo mená). Napíšte niekoľko výrazov lambda s použitím:
map(...)na transformáciu slov (napr. do veľkých písmen, pridať prefix/suffix).filter(...)na filtrovanie podľa nejakého pravidla (napr. dĺžka slova väčšia ako 5, slovo začína na písmeno „A“ atď.).
Inštrukcie¶
- Najprv si vytvorte testovací zoznam napr.
names = ["Adam", "Beáta", "Alex", "Filip", "Alexander"]. - Aplikujte
map(lambda ...)na transformáciu (napr. všetko do uppercase, pridajte „Mr./Ms.“ a pod.). - Použite
filter(lambda ...)na výber iba tých slov, ktoré spĺňajú určité kritérium. - Výsledky zobrazte alebo uložte do novej premennej.
# YOUR CODE
8. Práca s textovými súbormi: Generátor štatistík zo súboru¶
Zadanie¶
- Máte textový súbor (napr.
numbers.txt) s číslami, každý na samostatnom riadku. - Napíšte program, ktorý:
- Prečíta všetky čísla zo súboru (ošetrite
FileNotFoundError). - Spočíta ich priemer a maximum.
- Výsledky zapíše do iného súboru
stats.txtv tvare:Count: X Sum: Y Average: Z Max: M
- Prečíta všetky čísla zo súboru (ošetrite
Inštrukcie¶
- Využite kontextový manažér
with open(...) as f:. - Ošetrite prípad, že súbor neexistuje alebo je prázdny.
- Výsledný
stats.txtsi otvorte a skontrolujte.
# YOUR CODE
9. JSON: Sledovanie nákupného košíka¶
Zadanie¶
- Vytvorte (alebo si pripravte) JSON súbor
cart.json, ktorý bude obsahovať údaje o produktoch v nákupnom košíku, napr.:{ "cart": [ {"name": "Banány", "price": 1.09, "quantity": 3}, {"name": "Mlieko", "price": 0.79, "quantity": 2} ] }
- Napíšte program, ktorý:
- Načíta tento súbor do Python dict štruktúry.
- Vypíše celkovú sumu košíka (súčet
price * quantitypre všetky položky). - Umožní pridať novú položku (pomocou vstupu od používateľa), ktorá sa následne dá doplniť do
cart.json.- Meno produktu, cena, počet kusov.
- Ak súbor neexistuje, nech sa vytvorí s prázdnou štruktúrou (ošetrenie
FileNotFoundError).
Inštrukcie¶
- Testujte scenár, kde
cart.jsonexistuje aj neexistuje. - Overte, či sa údaje správne prečítajú a zapíšu.
# YOUR CODE