Laboratorium Python – Zadania praktyczne
Poniżej znajduje się 10 zadań laboratoryjnych z programowania w Pythonie. Każde zadanie jest zaprojektowane tak,
aby zajmowało około 30-45 minut wykonania. Zadania obejmują tematy poznane na wykładzie, od podstaw
tworzenia skryptów i funkcji, przez pracę z plikami i danymi, aż po zaawansowane
przetwarzanie tekstu, walidację i automatyzację zadań.
Zadanie 1: Kalkulator BMI z klasyfikacją
Cel:
Napisz program, który oblicza BMI (Body Mass Index) i określa kategorię wagi użytkownika na podstawie podanej wagi i wzrostu.
Scenariusz:
Pracujesz jako programista w firmie zajmującej się aplikacjami zdrowotnymi. Twoim zadaniem jest stworzenie modułu kalkulatora BMI, który przyjmie od użytkownika wagę (w kg) i wzrost (w cm), obliczy BMI według wzoru: BMI = waga / (wzrost/100)², a następnie przypisze kategorię: niedowaga (<18.5), waga prawidłowa (18.5-24.9), nadwaga (25-29.9), otyłość (≥30). Program powinien obsługiwać błędne dane wejściowe i wyświetlać czytelny raport z wynikami.
Wskazówki do wykonania:
- Użyj
input() do pobrania danych od użytkownika
- Konwertuj dane na liczby używając
float() lub int()
- Obsłuż błędy konwersji używając
try/except ValueError
- Zastosuj instrukcję warunkową
if/elif/else do klasyfikacji BMI
- Za pomocą f-strings sformatuj wyjście, np.
f"BMI: {bmi:.1f}"
- Dodaj walidację: czy waga i wzrost są w rozsądnych zakresach (np. waga 20-300 kg, wzrost 100-250 cm)
- Stwórz funkcję
oblicz_bmi(waga, wzrost) zwracającą tuple (bmi, kategoria)
- Przetestuj program dla różnych wartości wejściowych
Zadanie 2: Generator haseł losowych
Cel:
Stwórz program generujący bezpieczne hasła losowe o określonej długości i złożoności.
Scenariusz:
Twoja firma IT potrzebuje narzędzia do generowania bezpiecznych haseł dla nowych pracowników. Napisz program, który generuje losowe hasła o określonej długości (domyślnie 12 znaków), zawierające: małe litery, wielkie litery, cyfry i znaki specjalne. Użytkownik powinien mieć możliwość podania długości hasła jako argument wiersza poleceń. Program powinien wyświetlić wygenerowane hasło oraz informację o jego sile (ilość znaków każdego typu).
Wskazówki do wykonania:
- Zaimportuj moduł
string do stałych znaków: string.ascii_letters, string.digits, string.punctuation
- Użyj modułu
random lub secrets (bezpieczniejszy) do losowania
- Obsłuż argumenty wiersza poleceń używając
sys.argv lub argparse
- Sprawdź czy długość jest w zakresie 4-64 znaków
- Użyj list comprehension do generowania hasła
- Dodaj funkcję sprawdzającą siłę hasła (ilość znaków każdego typu)
- Użyj funkcji
join() do łączenia znaków w hasło
- Wyświetl statystyki hasła: ile małych, wielkich liter, cyfr, znaków specjalnych
Zadanie 3: Analizator plików tekstowych
Cel:
Napisz program analizujący plik tekstowy i generujący raport ze statystykami.
Scenariusz:
Pracujesz jako administrator systemów w firmie. Twoim zadaniem jest stworzenie narzędzia do analizy logów tekstowych. Napisz program, który przyjmuje nazwę pliku tekstowego jako argument, odczytuje jego zawartość i generuje raport zawierający: liczbę linii, liczbę słów, liczbę znaków, najczęściej występujące słowa (top 10), najdłuższą linię. Program powinien obsługiwać błędy (plik nie istnieje, pusty plik) i używać modułu collections.Counter do zliczania słów.
Wskazówki do wykonania:
- Użyj
argparse do obsługi argumentu (nazwa pliku)
- Obsłuż błąd
FileNotFoundError używając try/except
- Użyj
with open(...) do bezpiecznego odczytu pliku
- Czytaj linia po linii używając pętli
for
- Metoda
split() dzieli linię na słowa
- Użyj
Counter z modułu collections do zliczania słów
- Funkcja
strip() usuwa białe znaki z początku/końca linii
- Użyj metody
lower() do ujednolicenia wielkości liter
- Znajdź najdłuższą linię używając
max() z kluczem
- Sformatuj wyjście używając f-strings
Zadanie 4: Walidator adresów e-mail
Cel:
Stwórz program walidujący adresy e-mail i wykonujący operacje na liście e-maili.
Scenariusz:
Pracujesz w dziale IT odpowiedzialnym za bazę użytkowników. Twoim zadaniem jest stworzenie narzędzia do walidacji i zarządzania listą adresów e-mail pobraną z pliku. Program powinien: walidować każdy e-mail używając wyrażeń regularnych, oddzielić poprawne od niepoprawnych, usunąć duplikaty, zapisać wyniki do plików wyjściowych (poprawne.txt, niepoprawne.txt). Plik wejściowy zawiera jeden e-mail w linii.
Wskazówki do wykonania:
- Użyj modułu
re do wyrażeń regularnych
- Wzorzec:
r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
- Czytaj plik używając
with open() i pętli for
- Metoda
strip() usuwa znaki nowej linii
- Użyj
set() do usunięcia duplikatów
- Zapisz wyniki używając
with open("w", encoding="utf-8")
- Metoda
write() zapisuje tekst
- Pamiętaj o znaku
\n na końcu każdej linii
- Obsłuż brak pliku wejściowego
- Wyświetl podsumowanie: ile poprawnych, niepoprawnych, duplikatów usunięto
Zadanie 5: Menedżer zadań (To-Do List)
Cel:
Stwórz prosty program do zarządzania listą zadań do wykonania z zapisem do pliku JSON.
Scenariusz:
Chcesz stworzyć własny program do zarządzania zadaniami. Napisz program, który: dodaje nowe zadania, wyświetla listę zadań, oznacza zadanie jako wykonane, usuwa zadania. Dane mają być przechowywane w pliku JSON. Każde zadanie ma: tytuł, opis (opcjonalnie), status (do_zrobienia/wykonane), datę utworzenia. Program ma prosty interfejs tekstowy (menu) i obsługuje argumenty wiersza poleceń lub input().
Wskazówki do wykonania:
- Użyj modułu
json do zapisu/odczytu danych
- Struktura danych: lista słowników
[{"tytul": "...", "status": "...", ...}]
- Funkcje:
dodaj_zadanie(), wyswietl_zadania(), oznacz_wykonane(), usun_zadanie()
- Użyj instrukcji
if/elif/else do menu
- Pętla
while True do interaktywnego menu
- Funkcja
input() do pobrania wyboru użytkownika
- Konwersja indeksu (użytkownik wpisuje 1, program używa indeksu 0)
- Obsłuż przypadek pustej listy zadań
- Zapisuj po każdej operacji używając
json.dump()
- Moduł
datetime do daty utworzenia
Zadanie 6: Konwerter jednostek temperatury
Cel:
Napisz program konwertujący temperaturę między różnymi jednostkami.
Scenariusz:
Twoja firma produkuje urządzenia pomiarowe eksportowane do różnych krajów. Napisz program, który konwertuje temperaturę między jednostkami: Celsiusz (°C), Fahrenheit (°F), Kelvin (K). Program powinien obsługiwać dane wejściowe w formacie "wartość jednostka" (np. "100 C", "212 F") i wyświetlać wyniki we wszystkich jednostkach. Dodaj walidację czy wartość jest możliwa fizycznie (powyżej zera bezwzględnego). Obsłuż błędne dane wejściowe.
Wskazówki do wykonania:
- Wzory konwersji: C = (F-32)*5/9, C = K-273.15
- Funkcje:
celsiusz_na_fahrenheit(c), celsiusz_na_kelvin(c), fahrenheit_na_celsiusz(f), itd.
- Użyj
input() do pobrania danych
- Metoda
split() do rozdzielenia wartości i jednostki
- Metoda
.upper() do ujednolicenia jednostki
- Waliduj: C ≥ -273.15, F ≥ -459.67, K ≥ 0
- Obsłuż błędy używając
try/except
- Użyj wyrażeń warunkowych do wyboru wzoru konwersji
- Lista jednostek: ["C", "F", "K"]
- Formatowanie wyjścia używając f-strings z
:.2f
Zadanie 7: Przeszukiwacz plików w katalogu
Cel:
Napisz program rekursywnie przeszukujący katalog w poszukiwaniu plików według wzorca.
Scenariusz:
Pracujesz jako administrator i musisz znaleźć wszystkie pliki określonego typu w strukturze katalogów. Napisz program, który przyjmuje jako argumenty: ścieżkę do katalogu głównego, wzorzec pliku (np. "*.py", "*.txt", "*.log"), opcjonalnie maksymalną głębokość przeszukiwania. Program powinien rekursywnie przejść przez wszystkie podkatalogi i znaleźć pasujące pliki. Wyświetl pełne ścieżki znalezionych plików i podsumowanie.
Wskazówki do wykonania:
- Użyj modułu
os.walk() do rekursywnego przechodzenia katalogów
- Alternatywnie użyj
pathlib.Path.rglob()
- Obsłuż argumenty używając
sys.argv lub argparse
- Funkcja
os.path.join() do tworzenia ścieżek
- Metoda
fnmatch.filter() do dopasowywania wzorców
- Obsłuż błąd gdy katalog nie istnieje (
FileNotFoundError)
- Oblicz głębokość używając licznika w pętli
- Zatrzymaj gdy głębokość przekroczy limit używając
break
- Wyświetl wyniki w czytelnym formacie
- Podsumowanie: ile plików znaleziono
Zadanie 8: Parser logów systemowych
Cel:
Napisz program analizujący pliki logów i wykrywający niepokojące zdarzenia.
Scenariusz:
Twoim zadaniem jest stworzenie narzędzia do analizy logów bezpieczeństwa. Program powinien: odczytać plik logów, wyszukać słowa kluczowe (ERROR, WARNING, CRITICAL, FAILED), zliczyć ich wystąpienia, wyświetlić linię z kontekstem (3 linie przed i po). Program powinien przyjmować nazwę pliku jako argument i opcjonalnie poziom logowania do filtrowania. Na koniec wygeneruj raport podsumowujący.
Wskazówki do wykonania:
- Czytaj wszystkie linie do listy używając
readlines()
- Iteruj po liniach używając
enumerate() do zachowania indeksu
- Użyj wyrażeń regularnych
re.search() do wyszukiwania
- Stwórz słownik do zliczania:
licznik = {"ERROR": 0, "WARNING": 0, ...}
- Funkcja
range(start, stop) do pobrania kontekstu
- Sprawdź czy indeks jest w zakresie używając
if 0 <= idx < len(linie)
- Obsłuż brak pliku i pusty plik
- Konwertuj wielkość liter używając
.upper()
- Sformatuj raport używając f-strings
- Funkcja
in do sprawdzenia czy tekst zawiera słowo kluczowe
Zadanie 9: Gra w zgadywanie liczby
Cel:
Stwórz grę w zgadywanie losowej liczby z wykorzystaniem różnych poziomów trudności.
Scenariusz:
Chcesz stworzyć prostą grę tekstową do nauki Pythona. Napisz program, który: losuje liczbę z określonego zakresu (zależnie od poziomu), gracz zgaduje liczbę, program podpowiada "za dużo" / "za mało", liczy próby, zapisuje najlepszy wynik do pliku. Poziomy trudności: łatwy (1-50), średni (1-100), trudny (1-500). Program ma menu wyboru poziomu i opcję podglądu statystyk.
Wskazówki do wykonania:
- Użyj modułu
random.randint(a, b) do losowania liczby
- Stwórz słownik poziomów:
{"łatwy": 50, "średni": 100, "trudny": 500}
- Pętla
while do ponownego zgadywania
- Instrukcja
break do wyjścia przy poprawnym zgadnięciu
- Zmienna
proby do liczenia prób
- Moduł
json do zapisu statystyk
- Funkcja
input() do pobrania typu, isdigit() do walidacji liczby
- Instrukcja
continue do pominięcia iteracji przy błędzie
- Wyświetl komunikaty z emoji używając f-strings
- Implementuj opcję "poddaj się" i "nowa gra"
Zadanie 10: Automatyczny backup plików
Cel:
Napisz program tworzący backup wybranych plików z datą w nazwie.
Scenariusz:
Twoim zadaniem jest stworzenie narzędzia do automatycznego backupu ważnych plików. Program powinien: przyjmować listę plików/katalogów do backupu, tworzyć archiwum .zip z datą w nazwie (np. backup_2024-01-15.zip), opcjonalnie usuwać backupy starsze niż N dni. Użyj modułu shutil lub zipfile. Program ma sprawdzać czy pliki istnieją i wyświetlać postęp.
Wskazówki do wykonania:
- Użyj modułu
shutil.make_archive() do tworzenia archiwum
- Alternatywnie użyj modułu
zipfile do tworzenia archiwów ZIP
- Moduł
datetime do generowania daty w nazwie
- Funkcja
strftime("%Y-%m-%d") formatuje datę
- Sprawdź czy plik/katalog istnieje używając
os.path.exists()
- Iteruj po plikach używając pętli
for
- Moduł
os.path.isfile() i os.path.isdir()
- Funkcja
os.path.getmtime() do sprawdzenia daty modyfikacji
- Oblicz różnicę dni używając
datetime.now() - datetime.fromtimestamp()
- Usuń stare backupy używając
os.remove() lub shutil.rmtree()