Ú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_str
zodpovedá 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_unit
aleboto_unit
nie 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_unit
ato_unit
patria 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
int
alebofloat
(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_room
dotarget_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
A
vedie doB
aC
,B
vedie 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.txt
v 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.txt
si 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 * quantity
pre 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.json
existuje aj neexistuje. - Overte, či sa údaje správne prečítajú a zapíšu.
# YOUR CODE