1.6. Moduły i zbiory

Informacja

W tym przykładzie zobaczysz, jak korzystać z modułów, a także poznasz i wykorzystasz zbiór, kolejną obok list i krotek złożoną strukturę danych.

1.6.1. Zadanie

Napisz program oceny.py, który umożliwi wprowadzanie ocen z wybranego / wprowadzonego przedmiotu, następnie policzy i wyświetla średnią, medianę i odchylenie standardowe wprowadzonych ocen. Funkcje pomocnicze i statystyczne umieść w osobnym module.

Dane:

  • przedmiot – nazwa dodawanego przedmiotu i/lub przedmiotu, z którego będą wprowadzane oceny, ciąg znaków pobierany z klawiatury,

  • ocena – ocena pobierana z klawiatury, liczba całkowita.

Wynik:

– wypisana na ekranie średnia, mediana i odchylenie podanych ocen, np.:

Średnia:     3.62
Mediana:     3.50
Odchylenie:  1.58
Plik oceny.pyKod nr
 1from oceny_funkcje import wypisz, srednia, mediana, odchylenie
 2
 3
 4def main():
 5    przedmioty = {'polski', 'angielski'}  # definicja zbioru
 6    wypisz(przedmioty, 'Lista przedmiotów zawiera: ')
 7
 8    while True:
 9        przedmiot = input('Podaj nazwę przedmiotu (min. 2 znaki) lub ENTER, żeby zakończyć: ').strip()
10        if len(przedmiot) > 1:
11            if przedmiot not in przedmioty:  # jeżeli przedmiotu nie ma w zbiorze
12                przedmioty.add(przedmiot)  # dodaj przedmiot do zbioru
13            else:
14                print('Ten przedmiot już mamy :-)')
15        else:
16            wypisz(przedmioty, '\nTwoje przedmioty: ')
17            przedmiot = input('\nZ którego przedmiotu wprowadzisz oceny? ')
18            if przedmiot not in przedmioty:  # jeżeli przedmiotu nie ma w zbiorze
19                print('Brak takiego przedmiotu, możesz go dodać.')
20            else:
21                break  # przerwanie pętli
22
23    oceny = []  # pusta lista ocen
24    ocena = None  # zmienna sterująca pętlą i do pobierania ocen
25    while not ocena:
26        try:
27            ocena = int(input('Podaj ocenę (1-6) lub 0, aby zakończyć: '))
28            if 0 < ocena < 7:
29                oceny.append(ocena)
30            elif ocena == 0:
31                break
32            else:
33                print('Błędna ocena.')
34            ocena = None
35        except ValueError:
36            print('Błędne dane!')
37
38    wypisz(oceny, przedmiot.capitalize() + ' - wprowadzone oceny: ')
39    s = srednia(oceny)
40    m = mediana(oceny)
41    o = odchylenie(oceny, s)
42    print()
43    print(f'Średnia: {s:8.2f}')
44    print(f'Mediana: {m:8.2f}')
45    print(f'Odchylenie: {o:5.2f}')
46    return 0
47
48
49if __name__ == '__main__':
50    import sys
51    sys.exit(main())

Moduły

Moduły to pliki zawierające często wykorzystywane stałe, funkcje i klasy. Wiele modułów, tzw. wbudowanych, jest częścią standardowej instalacji Pythona, programista może również tworzyć własne moduły. Dostęp do zawartości modułu uzyskujemy dzięki importom. Nazwa modułu to nazwa pliku z kodem bez rozszerzenia .py. Moduł musi znajdować się w ścieżce przeszukiwania, aby import był udany. Przykłady:

  • import math – import całego modułu, dostęp do zawartości uzyskujemy dzięki notacji z kropką, np. math.pi lub math.sqrt(),

  • from math import pi, sqrt – import tylko wybranych elementów, których nazw używamy bezpośrednio, np.: pole = pi * r**2, c = sqrt(a**2 + b**2).

Informacja

W przypadku prostych programów zapisuj moduły w tym samym katalogu co program główny.

Zbiór

Do przechowywania nazw przedmiotów wykorzystujemy zbiór, czyli nieuporządkowany zestaw niepowtarzalnych (!) elementów. Operacje na zbiorach:

  • przedmioty = {'polski', 'angielski'} – tworzy zbiór, można również używać funkcji set(sekwencja);

  • .add(x) – dodaje element x do zbioru, jeżeli go w zbiorze nie ma;

  • element (not) in kolekcji – operator zawierania (not) in sprawdza, czy podany element jest lub nie w kolekcji, tj. liście, zbiorze, krotce (tupli) lub innej sekwencji; wynikiem jest prawda lub fałsz.

Informacja

Porządek elementów w zbiorach, inaczej niż w listach i krotkach, jest nieokreślony.

Przedmioty pobieramy w nieskończonej pętli warunkowej while True. Jeżeli użytkownik poda przynajmniej 2-znakową nazwę przedmiotu (if len(przedmiot) > 1:) i przedmiotu nie ma w zbiorze (if przedmiot not in przedmioty:), zostanie on dodany. W przeciwnym razie wypisujemy przedmioty zawarte w zbiorze i pobieramy nazwę przedmiotu, z którego użytkownik chce wprowadzić oceny. Jeżeli podanej nazwy nie ma w zbiorze, wypisujemy odpowiedni komunikat, jeżeli jest, przerywamy pętlę instrukcją break i przechodzimy do wprowadzania ocen.

W drugiej pętli warunkowej pobieramy oceny, 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ą do listy: oceny.append(ocena).

Metoda .capitalize() zmienia pierwszy znak napisu na wielką literę.

Do wypisania komunikatów używamy sformatowanych ciągów znaków (f-strings) i specyfikatorów formatu. Zapis {s:8.2f} oznacza, że wartość zmiennej s ma zostać wypisana w polu o szerokości 8 znaków jako liczba zmiennoprzecinkowa z dokładnością do dwóch miejsc po przecinku.

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


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

Plik oceny_funkcje.pyKod nr
 1"""
 2    Moduł oceny_funkcje zawiera funkcje wykorzystywane w pliku oceny.py
 3"""
 4
 5import math  # zaimportuj moduł matematyczny
 6
 7
 8def wypisz(sekwencja, kom='Sekwencja zawiera: '):
 9    print(kom)
10    for e in sekwencja:
11        print(e, end=' ')
12    print()
13
14
15def srednia(oceny):
16    suma = sum(oceny)
17    return suma / len(oceny)
18
19
20def mediana(oceny):
21    """
22    Jeżeli liczba ocen jest parzysta, medianą jest średnia arytmetyczna
23    dwóch środkowych ocen. Jeżeli liczba jest nieparzysta, mediana równa
24    się elementowi środkowemu uporządkowanej rosnąco listy ocen.
25    """
26    oceny.sort()  # sortowanie niemalejące
27    print(f'Oceny: {oceny}')
28    if len(oceny) % 2 == 0:  # parzysta ilość ocen
29        half = len(oceny) // 2
30        # można tak:
31        # return float(oceny[half-1]+oceny[half]) / 2
32        # albo tak:
33        return float(sum(oceny[half-1:half+1])) / 2
34    else:  # nieparzysta ilość ocen
35        return oceny[len(oceny) // 2]
36
37
38def wariancja(oceny, srednia):
39    """
40    Wariancja to suma kwadratów różnicy każdej oceny i średniej
41    podzielona przez ilość ocen:
42    suma = ((o1-s)^2+(o2-s)^2+...+(on-s)^2) / n, gdzie:
43    o1, o2, ..., on - kolejne oceny,
44    s - średnia ocen,
45    n - liczba ocen.
46    """
47    suma = 0
48    for ocena in oceny:
49        suma += (ocena - srednia)**2
50    return suma / len(oceny)
51
52
53def odchylenie(oceny, srednia):  # pierwiastek kwadratowy z wariancji
54    w = wariancja(oceny, srednia)
55    return math.sqrt(w)

Instrukcja import math udostępnia wszystkie metody z modułu matematycznego, wykorzystujemy funkcję obliczającą pierwiastek kwadratowy: math.sqrt().

Funkcja wypisz(sekwencja, kom='...') wypisuje podany komunikat, a następnie za pomocą pętli for e in sekwencja odczytuje i wypisuje elementy podanej sekwencji (zbioru, listy ip.) w jednym wierszu. Argument kom jest opcjonalny, ponieważ przypisujemy mu 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 niemalejąco otrzymaną listę „w miejscu” (oceny.sort()), tzn. trwale zmienia porządek elementów listy. Jeżeli liczba ocen jest parzysta if len(oceny) % 2 == 0:, zwraca średnią arytmetyczną dwóch środkowych wartości. Indeks drugiego ze środkowych elementów obliczamy w wyrażeniu half = len(oceny) // 2. Operator // oznacza dzielenie całkowite. Notacja wycinkowa oceny[half-1:half+1] zwraca dwa środkowe elementy z listy. Jeżeli liczba ocen jest nieparzysta, zwracamy wartość środkową: oceny[len(oceny) // 2].

W funkcji wariancja() pętla for odczytuje kolejne oceny i korzysta z operatorów skróconego dodawania (+=) i potęgowania (**), aby wyliczyć sumę kwadratów różnic kolejnych ocen i średniej: suma += (ocena - srednia)**2. Funkcja zwraca średnią arytmetyczną obliczonej sumy: suma / len(oceny).

1.6.1.1. Ćwiczenia

W konsoli Pythona utwórz listę wyrazy zawierającą elementy: abrakadabra i kordoba.

  • utwórz zbiór w1 za pomocą polecenia set(wyrazy[0]) oraz zbiór w2 za pomocą polecenia set(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 oceny_funkcje.py dopisz funkcję, która wyświetli wszystkie oceny oraz ich odchylenia od wartości średniej; wywołanie funkcji umieść w pliku oceny.py.


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:

2026-05-30 o 19:12 w Sphinx 7.3.7

Autorzy:

Robert Bednarz