1.4.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.
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 python3
# -*- coding: utf-8 -*-
# importujemy funkcje z modułu ocenyfun zapisanego w pliku ocenyfun.py
from ocenyfun import drukuj, srednia, mediana, odchylenie
def main(args):
przedmioty = set(['polski', 'angielski']) # definicja zbioru
drukuj(przedmioty, "Lista przedmiotów zawiera: ")
print("\nAby przerwać wprowadzanie przedmiotów, naciśnij Enter.")
while True:
przedmiot = 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 = input("\nZ którego przedmiotu wprowadzisz oceny? ")
# jeżeli przedmiotu nie ma w zbiorze
if przedmiot not in przedmioty:
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(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))
return 0
if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))
|
1.4.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ć.
Informacja
W przypadku prostych programów zapisuj moduły w tym samym katalogu co program główny.
Operacje na zbiorach:
set()
– tworzy zbiór, czyli nieuporządkowany zestaw niepowtarzalnych (!) elementów;.add(x)
– pozwala dodać element x do zbioru, o ile nie jest już w zbiorze;.remove(x)
– usuwa element x ze zbioru;element (not) in zbior
– operator zawierania(not) in
sprawdza, czy podany element jest lub nie w zbiorze.
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 tym przypadku błąd przekształcenia
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("Mediana: {0:5.2f}\nOdchylenie: {1:5.2f}".format(m, o))
zastosowano formatowanie
wyświetlanych wartości. Nawiasy {}
oznaczają pola zastępowane przez wartości podane jako
argumenty metody format()
. W ciągu {0:5.2f}
pierwsza cyfra wskazuje, który argument
(numerowane od zera) metody format()
, wydrukować. Po dwukropku podajemy szerokość pola
przeznaczonego na wydruk. Po kropce – ilość miejsc po przecinku. Symbol f oznacza
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
.
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 python3
# -*- 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, end=" ")
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 = int(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 elementyz listy,
przy czym wyrażenie half = int(len(oceny) / 2)
wylicza nam indeks drugiego
ze środkowych elementów.
Informacja
Przypomnijmy: alternatywna funkcja sorted(lista)
zwraca uporządkowaną rosnąco kopię listy.
W funkcji 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.4.6.1.1. Zadania dodatkowe¶
- W konsoli Pythona utwórz listę
wyrazy
zawierającą elementy: abrakadabra i kordoba. Utwórz zbiór w1 poleceniemset(wyrazy[0])
. Oraz zbiór w2 poleceniemset(wyrazy[1])
. Wykonaj kolejno polecenia ilustrujące użycie klasycznych operatorów na zbiorach, czyli: różnica (-) , suma (|), przecięcie (część wspólna, &) i elementy unikalne (^):
>>> print(w1 – w2)
>>> print(w1 | w2)
>>> print(w1 & w2)
>>> print(w1 ^ w2)
- W pliku
ocenyfun.py
dopisz funkcję, która wyświetli wszystkie oceny oraz ich odchylenia od wartości średniej.
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: | 2022-05-22 o 19:52 w Sphinx 1.5.3 |
---|---|
Autorzy: | Patrz plik “Autorzy” |