Archiwa kategorii: Moduł 3 kursu

M3 L9 Część praktyczna

Część praktyczna

Ilość zadań w obecnym module jest mniejsza niż w poprzednich, ale są one bardzie złożone i wymagają większych nakładów pracy. W miarę możliwości, do każdego z punktów należy dodać funkcje sprawdzające ich poprawność.

  1. Za pomocą list i słowników, stwórz strukturę danych symulującą sklep internetowy, z listą towarów, klientów, transakcji sprzedaży.
    1. Dodaj operacje CRUD dla przykładowej listy słowników. (np. towarów)
    2. Dodaj stan magazynowy dla każdego z produktów oraz funkcję umożliwiającą jego uzupełnianie.
    3. Dodaj funkcje odpowiadającą za zmianę stanu magazynowego podczas sprzedaży oraz blokadę transakcji, jeśli stan jest zbyt niski.
    4. Dodaj funkcję pozwalającą na zwrot towaru i usunięcie transakcji (alternatywnie, dodaj pole „status” i zmień je na „reklamacja”.
  2. Za pomocą list i słowników, stwórz strukturę danych do przechowywania informacji o przedmiotach, uczniach, nauczycielach oraz ocenach końcowych z przedmiotów (jedna ocena dla ucznia z przedmiotu)
    • Dodaj operacje CRUD dla przykładowej listy słowników (np. uczniów).
    • Dodaj funkcję wystawiającą oceny końcowe dla konkretnych uczniów, z konkretnych przedmiotów.
    • Utwórz funkcje znajdującą najlepszych i najgorszych uczniów z danego przedmiotu.
    • Utwórz funkcje znajdującą ucznia z najwyższą średnią z wszystkich przedmiotów.

M3 L8 Podsumowanie

Podsumowanie

Bazy danych zwykle obsługiwane są przez specjalistyczne narzędzia i struktury. Mimo to, tworzenie ich w obrębie języka programowania pozwoliło nam zapoznać się z budowaniem bardziej złożonych struktur danych, przykładowych operacji oraz potencjalnych problemów z tym związanych.

W szczególności istotne są tutaj zagnieżdżone typy danych oraz powiązania pomiędzy różnymi typami słowników. Profesjonalne programowanie bardzo często będzie opierało się na modelowaniu tego typu zależności oraz prawidłowej ich implementacji. Szczegółowe instrukcje mogą się różnić w zależności od języka programowania, jednak generalne zasady pozostają niezmienne i ich opanowanie jest bardzo ważne.

Warto również potraktować to jako kolejny przykład, iż programowanie polega w dużej części na odpowiednim rozplanowaniu danych i operacji, a nie pisaniu kodu „aż zadziała” lub „dopóki nie przestanie działać”. Dobrze utworzona struktura danych będzie prosta oraz łatwa do rozbudowy. Jest to kluczem w codziennej pracy, gdzie dodawanie nowych funkcjonalności to norma (i zmora) dla każdego programisty.

Moduł ten kończy teoretyczną część kursu. Tak jak w poprzednich modułach, nastąpi teraz część praktyczna, z zadaniami pozwalającymi przećwiczyć poznane informacji. Po jej zakończeniu, możemy podejść do testu, który sprawdzi całość zdobytej przez nas wiedzy.

M3 L7 Mini baza danych – ciąg dalszy 3

Mini baza danych – ciąg dalszy

Operacje CRUD to minimalny sensowny zestaw funkcjonalność dla bazy danych, ale w praktyce chcemy mieć zwykle funkcje dostosowane do konkretnych danych. Być może chcemy sprawdzić ilość powtarzających się imion. (zakładamy, że tylko kombinacja imię i nazwisko jest unikalna) Jeśli dodaliśmy pole odpowiadające za płeć, to chcemy znać liczbę kobiet i mężczyzn.

Załóżmy, iż mamy nowe pole pole pensja i chcemy obliczyć średnią:

Zadanie

1. Co, jeśli w powyższym przykładzie baza będzie pusta? Zmodyfikuj kod, by uniknąć dzielenia przez zero.

Łatwo można sobie wyobrazić podobną funkcję obliczającą całkowitą sumę zarobków, sprawdzającą kto zarabia najmniej/najwięcej, kto jest poniżej określonej wartości itd. Tego typu zagadnienia są trzonem pracy programisty, wykorzystującym całą poznaną przez nas dotychczas wiedzę dla realizacji konkretnych i praktycznych celów.

 

M3 L6 Mini baza danych – ciąg dalszy 2

Mini baza danych – ciąg dalszy

Pozostałe operacje CRUD obsługujemy w podobny sposób, korzystając ze znanych nam operacji na listach.

Odczyt wartości to zwykłe przypisanie:

Za usuwanie elementów odpowiada remove (zakładając, że wartości nie będą się powtarzać):

Aktualizacja wartości jest nieco bardziej skomplikowana. Potrzebujemy tutaj uzyskać informację o pozycji elementu listy, a następnie go zmienić. Służy do tego operacja lista.index(wartość), która poda nam położenie pierwszego znalezionego elementu.

Istnieją oczywiście inne sposoby, jednak większość z nich korzysta z bardziej zaawansowanych operacji lub narzędzi, których zastosowanie wykracza poza ramy obecnego kursu.

M3 L5 Mini baza danych – ciąg dalszy

Mini baza danych – ciąg dalszy

Samo utworzenie listy to dopiero namiastka funkcjonalności bazy danych. Każda taka struktura powinna umożliwiać obsługę czterech podstawowych operacji, zwanych CRUD.

C – create, dodanie nowych obiektów do bazy

R – read/retrieve, pobranie z bazy informacji o obiekcie (zwykle też przypisujące je do zmiennej)

U – update, aktualizacja danych o obiekcie w bazie

D – delete, usunięcie obiektu z bazy

Dla każdej z takich operacji musimy zbudować odpowiednie funkcje, które posłużą do ich wykonania. Przykładowo, dodawanie obiektu będzie korzystać ze znanej nam już operacji append.

Rozwiązanie takie poprawnie doda nową osobę, jednak dość łatwo możemy sobie wyobrazić problematyczne sytuacje, jeśli zechcemy dodać osobę o takich samych danych. Załóżmy, że dane te są unikalne i nie dodamy np. numer pesel w celu dodatkowej identyfikacji, by nie komplikować sytuacji.

W tym celu musimy dodać instrukcje warunkową, sprawdzającą czy dany rekord już występuje w naszej liście. Składnia takiego wyrażenia jest nieco inna niż dotychczas poznane:

Konstrukcja typu “if obiekt in nazwaListy” przechodzi przez kolejne pozycje zadanej listy i sprawdza czy któryś z elementów pasuje do zadanej wartości. Jeśli tak, otrzymamy True, jeśli nie, będzie to False. Możliwe jest odwrócenie tej notacji poprzez dodanie operatora logicznego NOT, np.

if osoba not in baza:

Baza.append(osoba)

M3 L4 Mini baza danych

Mini baza danych

Bazy danych są zaawansowanymi strukturami do przechowywanie informacji. Ich poziom skomplikowania znacząco wykracza poza zakres obecnego kursu. Do ich obsługi często potrzeba specjalnego oprogramowania, mają swoje własne języki programistyczne, własne typy danych, dedykowane serwery itd. Ich integracja z faktycznymi programami jest zwykle bardzo złożona i wymaga sporej wiedzy.

Nic nie stoi jednak na przeszkodzie, by wykorzystać poznane do tej pory informacje w celu utworzenia uproszczonej wersji bazy danych w obrębie naszego programu. Możemy wykorzystać do tego celu listy i przechowywać stosowne obiekty, np.

Co więcej, pozycje takiej listy możemy dodawać bez uprzedniego tworzenia zmiennych, wpisując dane bezpośrednio w trakcie przypisania wartości:

W skrajnych przypadkach możemy utworzyć całą listę w ramach przypisania. Nie jest to jednak szczególnie wygodne i czytelne – dużo wygodniejsze jest operowania na kilku danych słownikowych, które można łatwo kopiować i modyfikować.

M3 L3 Słowniki – ciąg dalszy

Słowniki – ciąg dalszy

Praktyczne zastosowanie słowników zwykle zakłada, iż utworzymy kilka tego typu danych, np. osoba1, osoba2 itd. Musimy jedynie pamiętać o używaniu innej nazwy – w przeciwnym razie nadpiszemy poprzedni słownik, dokładnie tak samo jak działa to w przypadku zmiennych.

Wiąże się to z koncepcją „programowania obiektowego”, w którym Osoba ma swoje własne zmienne, funkcje, unikalną nazwę oraz może być dowolnie modyfikowana po utworzeniu. Programy często sprowadzają się do tworzenia kolejnych instancji/bytów typu Osoba, np. Osoba Jan, Osoba Tomasz i operowaniu na nich.

Słowniki są zalążkiem takiego rodzaju programowania i mogą replikować część jego funkcjonalności. Całe zagadnienie jest jednak bardzo złożone i nie będzie poruszane w tym kursie. Warto jedynie pamiętać, iż możemy czasem odwoływać się do pojęcia obiektu i mamy wówczas na myśli taki właśnie byt jak Osoba1.

Zadania

1. Stwórz strukturę danych do przechowywania informacji o filmach, zawierającą podstawowe informacje takie jak tytuł, rok produkcji, itd.

2. Do powyższej struktury dodaj głównych aktorów i powiąż ich z odpowiednimi tytułami, w postaci listy aktorów.

3. Zaproponuj strukturę opisującą towary w sklepie internetowym, klientów oraz kilka przykładowych transakcji sprzedaży ze stosownymi informacjami (kto, co, za ile, kiedy).

M3 L2 Słowniki – ciąg dalszy

Słowniki – ciąg dalszy

Podobnie jak w przypadku list, słowniki również mogą być zagnieżdżone. Pod każdym kluczem możemy utworzyć kolejny słownik, a pod nim kolejny itd. Przykładowo:

Co więcej, możemy tam również umieszczać inne słowniki, np.

Adres1 jest wówczas traktowany jak normalna zmienna i połączony z kluczem adres. Analogicznie pod dowolny klucz możemy podstawić faktyczną zmienną.

Zadanie

1. Dodaj zmienne, które pozwolą dodać określone i niezmienne wartości dla osób, np. płeć, stan cywilny. Zrealizuj to zarówno w formie oddzielnych zmiennych, jak też i list, które można później rozwinąć.

M3 L1 Słowniki

Słowniki

W ramach kursu zapoznaliśmy się z podstawowym sposobem przechowywania danych programistycznych jakim są zmienne. Listy pozwalały nam grupować dane w jeden ciąg, ale często potrzebujemy czegoś bardziej rozbudowanego i dającego większe możliwości.

Załóżmy, że chcemy przechowywać dane osobowe o użytkowniku naszego programu – imię, nazwisko, rok urodzenia. Możemy oczywiście stworzyć trzy różne zmienne o takich właśnie nazwach, co pozwoli nam zachować dane jednej osoby. Jeśli będziemy chcieli przechować dane kilku osób, użyjemy do tego celu listy. Dość szybko jednak dojdziemy do wniosku, że rozwiązanie takie staje się bezsensowne, gdy zechcemy operować na więcej niż trzech właściwościach.

W tym celu należy skorzystać ze struktur grupujących dane (zwykle stanowiące logiczną całość):

Tworzymy tutaj nowy typ danych nazywany w Pythonie „słownikiem” – w innych językach możemy spotkać się z określeniem mapa lub hash. Pozwala on na grupowanie wartości w jedną całość poprzez utworzenie par rozdzielonych dwukropkiem. Z lewej strony dwukropka jest tzw. klucz, który pozwala na zidentyfikowanie wartości znajdującej się po prawej stronie. Kolejne takie pary muszą być oddzielone przecinkiem, a całość zamknięta jest w nawiasy klamrowe.

Jest to rozwiązanie dość podobne do list, jednak zamiast numeru pozycji stosujemy faktyczną nazwę, dzięki której łatwo rozpoznać czego dotyczą dane. Dwukropek pełni wówczas rolę podobną do przypisania wartości zmiennej. Widzimy również, że gdy już utworzymy słownik, możemy zmieniać poszczególne wartości podobnie jak modyfikuje się pozycje na liście, stosując nawiasy kwadratowe oraz operator przypisania.

Zadanie

1. Do listy danych osobowych dodaj Pesel, złożony z 8 cyfr i zaczynający się zawsze od serii zer. Zastanów się jaki rodzaj zmiennych będzie dobry do tego celu.