1.5.6. 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.

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#! /usr/bin/env python
# -*- coding: utf-8 -*-

# importujemy funkcje z modułu ocenyfun zapisanego w pliku ocenyfun.py
from ocenyfun import drukuj
from ocenyfun import srednia
from ocenyfun import mediana
from ocenyfun import odchylenie

przedmioty = set(['polski', 'angielski'])  # definicja zbioru
drukuj(przedmioty, "Lista przedmiotów zawiera: ")

print "\nAby przerwać wprowadzanie przedmiotów, naciśnij Enter."
while True:
    przedmiot = raw_input("Podaj nazwę przedmiotu: ")
    if len(przedmiot):
        if przedmiot in przedmioty:  # czy przedmiot jest w zbiorze?
            print "Ten przedmiot już mamy :-)"
        przedmioty.add(przedmiot)  # dodaj przedmiot do zbioru
    else:
        drukuj(przedmioty, "\nTwoje przedmioty: ")
        przedmiot = raw_input("\nZ którego przedmiotu wprowadzisz oceny? ")
        if przedmiot not in przedmioty:  # jeżeli przedmiotu nie ma w zbiorze
            print "Brak takiego przedmiotu, możesz go dodać."
        else:
            break  # wyjście z pętli

oceny = []  # pusta lista ocen
ocena = None  # zmienna sterująca pętlą i do pobierania ocen
print "\nAby przerwać wprowadzanie ocen, podaj 0 (zero)."

while not ocena:
    try:
        ocena = int(raw_input("Podaj ocenę (1-6): "))
        if (ocena > 0 and ocena < 7):
            oceny.append(float(ocena))
        elif ocena == 0:
            break
        else:
            print "Błędna ocena."
        ocena = None
    except ValueError:
        print "Błędne dane!"

drukuj(oceny, przedmiot.capitalize() + " - wprowadzone oceny: ")
s = srednia(oceny)  # wywołanie funkcji z modułu ocenyfun
m = mediana(oceny)  # wywołanie funkcji z modułu ocenyfun
o = odchylenie(oceny, s)  # wywołanie funkcji z modułu ocenyfun
print "\nŚrednia: {0:5.2f}".format(s)
print "Mediana: {0:5.2f}\nOdchylenie: {1:5.2f}".format(m, o, )

1.5.6.1. 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.

Więcej informacji nt. formatowania danych wyjściowych: PyFormat.


Funkcje wykorzystywane w programie oceny, umieszczamy w osobnym pliku ocenyfun.py.

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! /usr/bin/env python
# -*- coding: utf-8 -*-

"""
    Moduł ocenyfun zawiera funkcje wykorzystywane w pliku 05_oceny_03.py
"""

import math  # zaimportuj moduł matematyczny


def drukuj(co, kom="Sekwencja zawiera: "):
    print kom
    for i in co:
        print i,


def srednia(oceny):
    suma = sum(oceny)
    return suma / float(len(oceny))


def mediana(oceny):
    """
    Jeżeli ilość ocen jest parzysta, medianą jest średnia arytmetyczna
    dwóch środkowych ocen. Jesli ilość  jest nieparzysta mediana równa
    się elementowi środkowemu ouporządkowanej rosnąco listy ocen.
    """
    oceny.sort()
    if len(oceny) % 2 == 0:  # parzysta ilość ocen
        half = len(oceny) / 2
        # można tak:
        # return float(oceny[half-1]+oceny[half]) / 2.0
        # albo tak:
        return float(sum(oceny[half - 1:half + 1])) / 2.0
    else:  # nieparzysta ilość ocen
        return oceny[len(oceny) / 2]


def wariancja(oceny, srednia):
    """
    Wariancja to suma kwadratów różnicy każdej oceny i średniej
    podzielona przez ilość ocen:
    sigma = (o1-s)+(o2-s)+...+(on-s) / n, gdzie:
    o1, o2, ..., on - kolejne oceny,
    s - średnia ocen,
    n - liczba ocen.
    """
    sigma = 0.0
    for ocena in oceny:
        sigma += (ocena - srednia)**2
    return sigma / len(oceny)


def odchylenie(oceny, srednia):  # pierwiastek kwadratowy z wariancji
    w = wariancja(oceny, srednia)
    return math.sqrt(w)

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.

1.5.6.1.1. Zadania dodatkowe

  • 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.

Licencja Creative Commons Materiały Python 101 udostępniane przez Centrum Edukacji Obywatelskiej na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.

Utworzony:2017-09-08 o 19:38 w Sphinx 1.4.5
Autorzy:Patrz plik “Autorzy”