Zbiory i sÅowniki
==================================
Oceny z przedmiotów
-------------------
**ZADANIE**: Napisz program, który umożliwi wprowadzanie ocen z podanego przedmiotu ÅcisÅego (np. fizyki), nastÄpnie policzy i wyÅwietla ÅredniÄ
, medianÄ i odchylenie standardowe wprowadzonych ocen. Funkcje pomocnicze i statystyczne umieÅÄ w osobnym module.
**POJÄCIA**: *import, moduÅ, zbiór, przechwytywanie wyjÄ
tków, formatowanie napisów i danych na wyjÅciu, argumenty funkcji, zwracanie wartoÅci*.
.. raw:: html
Kod nr
.. literalinclude:: 05_oceny_03.py
:linenos:
JAK TO DZIAÅA
^^^^^^^^^^^^^^
Klauza ``from moduÅ import funkcja`` umożliwia wykorzystanie w programie funkcji zdefiniowanych w innych moduÅach i zapisanych w osobnych plikach. DziÄki temu utrzymujemy przejrzystoÅÄ programu gÅównego, a jednoczeÅnie możemy funkcje z moduÅów wykorzystywaÄ, importujÄ
c je w innych programach. Nazwa moduÅu to nazwa pliku z kodem pozbawiona jednak rozszerzenia *.py*. ModuÅ musi byÄ dostÄpny w Åcieżce przeszukiwania, aby można go byÅo poprawnie doÅÄ
czyÄ.
.. note::
W przypadku prostych programów zapisuj moduÅy w tym samym katalogu co program gÅówny.
Instrukcja ``set()`` tworzy zbiór, czyli nieuporzÄ
dkowany zestaw niepowtarzalnych (!) elementów. Instrukcje ``if przedmiot in przedmioty`` i ``if przedmiot not in przedmioty`` za pomocÄ
operatorów zawierania ``(not) in`` sprawdzajÄ
, czy podany przedmiot już jest lub nie w zbiorze. Polecenie ``przedmioty.add()`` pozwala dodawaÄ elementy do zbioru, przy czym jeżeli element jest już w zbiorze, nie zostanie dodany. Polecenie ``przedmioty.remove()`` usunnie podany jako argument element ze zbioru.
Oceny z wybranego przedmiotu pobieramy w pÄtli dopóty, dopóki użytkownik nie wprowadzi 0 (zera). Blok ``try...except`` pozwala przechwyciÄ wyjÄ
tki, czyli w naszym przypadku niemożnoÅÄ przeksztaÅcenia wprowadzonej wartoÅci na liczbÄ caÅkowitÄ
. Jeżeli funkcja ``int()`` zwróci wyjÄ
tek, wykonywane sÄ
instrukcje w bloku ``except ValueError:``, w przeciwnym razie po sprawdzeniu poprawnoÅci oceny dodajemy jÄ
jako liczbÄ zmiennoprzecinkowÄ
(typ *float*) do listy: ``oceny.append(float(ocena))``.
Metoda ``.capitalize()`` pozwala wydrukowaÄ podany napis dużÄ
literÄ
.
W funkcji ``print(...).format(s,m,o)`` zastosowano formatowanie drukowanych wartoÅci, do których odwoÅujemy siÄ w specyfikacji ``{0:5.2f}``. Pierwsza cyfra wskazuje, którÄ
wartoÅÄ z numerowanej od 0 (zera) listy, umieszczonej w funkcji ``format()``, wydrukowaÄ; np. aby wydrukowaÄ drugÄ
wartoÅÄ, trzeba by użyÄ kodu ``{1:}``.Po dwukropku podajemy szerokoÅÄ pola przeznaczonego na wydruk, po kropce iloÅÄ miejsc po przecinku, symbol *f* oznacza natomiast liczbÄ zmiennoprzecinkowÄ
staÅej precyzji.
**FUNKCJE** wykorzystywane w programie **oceny**, umieszczamy w osobnym pliku ``ocenyfun.py``.
.. raw:: html
Kod nr
.. literalinclude:: ocenyfun.py
:linenos:
JAK TO DZIAÅA
^^^^^^^^^^^^^^
Klauzula ``import math`` udostÄpnia w pliku wszystkie metody z moduÅu
matematycznego, dlatego musimy odwoÅywaÄ siÄ do nich za pomocÄ
notacji
moduÅ.funkcja, np.: ``math.sqrt()`` â zwraca pierwiastek kwadratowy.
Funkcja ``drukuj(co, kom="...")`` przyjmuje dwa argumenty, *co* â listÄ
lub zbiór, który drukujemy w pÄtli for, oraz *kom* â komunikat,
który wyÅwietlamy przed wydrukiem. Argument *kom* jest opcjonalny,
przypisano mu bowiem wartoÅÄ domyÅlnÄ
, która zostanie użyta,
jeżeli użytkownik nie poda innej w wywoÅaniu funkcji.
Funkcja ``srednia()`` do zsumowania wartoÅci ocen wykorzystuje funkcjÄ ``sum()``.
Funkcja ``mediana()`` sortuje otrzymanÄ
listÄ "w miejscu" (``oceny.sort()``), tzn. trwale zmienia porzÄ
dek elementów.
W zależnoÅci od dÅugoÅci listy zwraca wartoÅÄ ÅrodkowÄ
(dÅugoÅÄ nieparzysta)
lub ÅredniÄ
arytmetycznÄ
dwóch Årodkowych wartoÅci (dÅugoÅÄ).
Zapis ``oceny[half-1:half+1]`` wycina i zwraca dwa Årodkowe elementy
z listy, przy czym wyrażenie ``half = len(oceny)/2`` wylicza nam indeks drugiego ze Årodkowych elementów.
.. note::
Przypomnijmy: alternatywna funkcja ``sorted(lista)`` zwraca uporzÄ
dkowanÄ
rosnÄ
co kopiÄ listy.
W funkcja ``wariancja()`` pÄtla for odczytuje kolejne oceny i w kodzie ``sigma += (ocena-srednia)**2`` korzysta z operatorów skróconego dodawania (+=) i potÄgowania (**), aby wyliczyÄ sumÄ kwadratów różnic kolejnych ocen i Åredniej.
POÄWICZ SAM
^^^^^^^^^^^^^^
W konsoli Pythona utwórz listÄ ``wyrazy`` zawierajÄ
cÄ
elementy: *abrakadabra* i *kordoba*. Utwórz zbiór *w1* poleceniem ``set(wyrazy[0])``. Oraz zbiór *w2* poleceniem ``set(wyrazy[1])``. Wykonaj kolejno polecenia: ``print w1 â w2; print w1 | w2; print w1 & w2; print w1 ^ w2``. PrzykÅady te ilustrujÄ
użycie klasycznych operatorów na zbiorach, czyli: różnica (-) , suma (|), przeciÄcie (czÄÅÄ wspólna, &) i elementy unikalne (^).
W pliku ``ocenyfun.py`` dopisz funkcjÄ, która wyÅwietli wszystkie oceny oraz ich odchylenia od wartoÅci Åredniej.
SÅownik sÅówek
---------------
**ZADANIE**: Przygotuj sÅownik zawierajÄ
cy obce wyrazy oraz ich możliwe znaczenia. Pobierz od użytkownika dane w formacie: *wyraz obcy: znaczenie1, znaczenie2, ...* itd. Pobieranie danych koÅczy wpisanie sÅowa "koniec". Podane dane zapisz w pliku. Użytkownik powinien mieÄ możliwoÅÄ dodawania nowych i zmieniania zapisanych danych.
**POJÄCIA**: *sÅownik, odczyt i zapis plików, formatowanie napisów.*
.. raw:: html
Kod nr
.. literalinclude:: 06_slownik_02.py
:linenos:
JAK TO DZIAÅA
^^^^^^^^^^^^^^
SÅownik to struktura nieposortowanych danych w formacie klucz:wartoÅÄ. Kluczami sÄ
najczÄÅciej napisy, które wskazujÄ
na wartoÅci dowolnego typu, np. inne napisy, liczby, listy, tuple itd. Notacja ``oceny = { 'polski':'1,4,2', 'fizyka':'4,3,1' }`` utworzy nam sÅownik ocen z poszczególnych przedmiotów. Aby zapisaÄ coÅ w sÅowniku stosujemy notacjÄ ``oceny['biologia'] = 4,2,5``. Aby odczytaÄ wartoÅÄ używamy po prostu: ``oceny['polski']``.
W programie wykorzystujemy sÅownik, którego kluczami sÄ
obce wyrazy, natomiast wartoÅciami sÄ
listy możliwych znaczeÅ. PrzykÅadowy element naszego sÅownika wyglÄ
da wiÄc tak: ``{ 'go':'iÅÄ,pojechaÄ' }``. Natomiast ten sam element zapisany w pliku bÄdzie miaÅ format: *wyraz_obcy:znaczenie1,znaczeni2,...*. Dlatego funkcja ``otworz()`` przeksztaÅca format pliku na sÅownik, a funkcja ``zapisz()`` sÅownik na format pliku.
Funkcja ``otworz(plik)`` sprawdza za pomocÄ
funkcji ``isFile(plik)`` z moduÅu *os.path*, czy podany plik istnieje na dysku. Polecenie ``open("plik", "r")`` otwiera podany plik w trybie do odczytu. Wyrażenie ``with ... as sTxt`` zapewnia obsÅugÄ bÅÄdów podczas dostÄpu do pliku (m. in. zadba o jego zamkniÄcie) i udostÄpnia zawartoÅÄ pliku w zmiennej *sTxt*. PÄtla ``for line in sTxt:`` odczytuje kolejne linie (czyli napisy). Metoda ``.split()`` zwraca listÄ zawierajÄ
cÄ
wydzielone wedÅug podanego znaku czÄÅci ciÄ
gu, np.: ``t = line.split(":")``. OperacjÄ
odwrotnÄ
jest "sklejanie" w jeden ciÄ
g elementów listy za pomocÄ
podanego znaku, np. ``",".join(slownik[wobcy])``. Metoda ``.replace("co","czym")`` pozwala zastÄ
piÄ w ciÄ
gu wszystkie wystÄ
pienia *co â czym*., np.: ``znaczenia = t[1].replace("\n","")``.
Funkcja ``zapisz()`` otrzymuje sÅownik zawierajÄ
cy dane odczytane z pliku na dysku i dopisane przez użytkownika. W pÄtli odczytujemy klucze sÅownika, nastÄpnie tworzymy znaczenia oddzielone przecinkami i sklejamy je z wyrazem obcym za pomocÄ
dwukropka. Kolejne linie za pisujemy do pliku ``print >>file1, ":".join([wobcy,znaczenia])``, wykorzystujÄ
c operator ``>>`` i nazwÄ uchwytu pliku (*file1*).
W pÄtli gÅównej programu pobrane dane rozbite na wyraz obcy i jego znaczenia zapisujemy w liÅcie *t*. Oczyszczamy pierwszy element tej listy zawierajÄ
cy wyraz obcy (``t[0].strip().lower()``) i sprawdzamy czy nie jest to sÅowo "koniec", jeÅli tak wychodzimy z pÄtli wprowadzanie danych (``break``). W przeciwnym wypadku sprawdzamy metodÄ
``.count(":")``, czy dwukropek wystÄpuje we wprowadzonym ciÄ
gu tylko raz. JeÅli nie, format jest nieprawidÅowy, w przeciwnym razie, o ile wyrazu nie ma w sÅowniku lub gdy chcemy go przedefiniowaÄ, tworzymy listÄ znaczeÅ. Funkcja ``map(funkcja, lista)`` do każdego elementu listy stosuje podanÄ
jako argument funkcjÄ (mapowanie funkcji). W naszym przypadku każde znaczenie z listy zostaje oczyszczone przez funkcjÄ ``oczysc()``.
Na koÅcu drukujemy nasz sÅownik. Specyfikacja ``{0: <15}{1: <40}`` oznacza, że pierwszy argument umieszczony w funkcji ``format()``, drukowany ma byÄ wyrównany do lewej (<) w polu o szerokoÅci 15 znaków, drugi argument, również wyrównany do lewej, w polu o szerokoÅci 40 znaków.
POÄWICZ SAM
^^^^^^^^^^^^^^
Kod drukujÄ
cy sÅownik zamieÅ w funkcjÄ. Wykorzystaj jÄ
do wydrukowania sÅownika odczytanego z dysku i sÅownika uzupeÅnionego przez użytkownika.
Spróbuj zmieniÄ program tak, aby umożliwiaÅ usuwanie wpisów.
Dodaj do programu możliwoÅÄ uczenia siÄ zapisanych w sÅowniku sÅówek. Niech program wyÅwietla kolejne sÅowa obce i pobiera od użytkownika możliwe znaczenia. NastÄpnie powinien wyÅwietlaÄ, które z nich sÄ
poprawne.
Metryka
^^^^^^^
:Autor: Robert Bednarz
:Utworzony: |date| o |time|
.. |date| date::
.. |time| date:: %H:%M
.. raw:: html
.. include:: ../copyright.rst