.:: KURS PROGRAMOWANIA W JĘZYKU PYTHON ::.
- Zbiory
Przejdźmy do trybu interaktywnego Pythona. W Pythonie możemy tworzyć tak zbiory zmienne:
>>> A=set([1,2,3])
>>> A
set([1, 2, 3])
jak i niezmienne:
>>> B=frozenset([2,3,4])
>>> B
frozenset([2, 3, 4])
Aby stworzyć zbiór pusty napiszemy:
>>> C=set()
>>> C
set([])
Zbiory zmienne mogą być powiększane i zmniejszane:
>>> A.discard(2)
>>> A
set([1, 3])
>>> A.add(5)
>>> A
set([1, 3, 5])
Zbiory niezmienne nie mogą być ani zmniejszane:
>>> B.discard(2)
Traceback (most recent call last):
File "&<pyshell#11>", line 1, in -toplevel-
B.discard(2)
AttributeError: 'frozenset' object has no attribute 'discard'
ani powiększane:
>>> B.add(7)
Traceback (most recent call last):
File "&<pyshell#12>", line 1, in -toplevel-
B.add(7)
AttributeError: 'frozenset' object has no attribute 'add'
>>>
Zbiory niezmienne mogą być kluczami w słownikach:
>>> d={B:7}
>>> d
{frozenset([2, 3, 4]): 7}
i elementami innych zbiorów:
>>> C.add(B)
>>> C
set([frozenset([2, 3, 4])])
Zbiory zmienne nie mogą być ani kluczami w słownikach:
>>> d={A:7}
Traceback (most recent call last):
File "&<pyshell#18>", line 1, in -toplevel-
d={A:7}
TypeError: set objects are unhashable
ani elementami innych zbiorów:
>>> C.add(A)
Traceback (most recent call last):
File "&<pyshell#17>", line 1, in -toplevel-
C.add(A)
TypeError: set objects are unhashable
- Operacje na zbiorach
Aby ustalić liczbę elementów zbioru piszemy:
>>> len(A)
3
>>> len(B)
3
>>> len(C)
1
Aby sprawdzić, czy dany obiekt jest elementem zbioru, piszemy:
>>> 2 in A
False
>>> 2 in B
True
>>> 5 in A
True
>>> 5 in B
False
Aby sprawdzić, czy dany obiekt nie jest elementem zbioru, piszemy:
>>> 3 not in A
False
>>> 3 not in B
False
>>> 7 not in A
True
>>> 7 not in B
True
Aby sprawdzić czy dany zbiór jest podzbiorem innego piszemy:
>>> set([1,3])<=A
True
>>> set([3,4])<=B
True
>>> set([5])<=A
True
>>> set([1,3,5])<=A
True
Lub:
>>> A.issubset(B)
False
Aby sprawdzić czy dany zbiór jest nadzbiorem innego piszemy:
>>> A>=set([1,3])
True
>>> B>=set([3,4])
True
Lub:
>>> A.issuperset(B)
False
Aby połączyć dwa zbiory piszemy:
>>> D=A | B
>>> D
set([1, 2, 3, 4, 5])
Aby określić część wspólną dwóch zbiorów piszemy:
>>> E=A & B
>>> E
set([3])
Aby określić różnicę dwóch zbiorów piszemy:
>>> A-B
set([1, 5])
>>> B-A
frozenset([2, 4])
(Typ zbioru wynikowego jest typem pierwszego ze zbiorów.) Aby określić różnicę symetryczną dwóch zbiorów piszemy:
>>> F=A^B
>>> F
set([1, 2, 4, 5])
- Przykład programu wykorzystującego zbiory
Wykorzystując zbiory rozwiążemy teraz ćwiczenie II z lekcji 7: "Napisz program "lotto.py", który wyświetli 6 losowych i nie powtarzających się liczb z zakresu od 1 do 49." Aby przejść do edycji nowego programu należy z menu File wybrać polecenie New Window. Otworzy się nowe okno, przeznaczone do edycji programu. Wybierzmy z menu File polecenie Save As. Wybieramy folder Moje dokumenty, następnie wpisujemy nazwę lotto.py.
# program losuje 6 liczb od 1 do 49
from random import choice
Wylosowane = set()
while len(Wylosowane) < 6:
Wylosowane.add(choice(range(1,50)))
for x in Wylosowane:
print x,
Wypróbujmy (F5):
>>> ================================ RESTART =============================
>>>
1 36 8 22 24 29
- Tablice
W Pythonie do przechowywania sekwencji danych identyfikowanych przez numer porządkowy używamy zwykle list (lub krotek). Szybciej działającą strukturą są tablice. W odróżnieniu od list, tablice zawierają elementy identycznego typu, a lista możliwych typów elementów jest ograniczona. Typ każdego elementu podajemy już przy tworzeniu tablicy, w postaci jednoznakowego identyfikatora. Do najbardziej popularnych zaliczamy:
c – znak
l – liczba całkowita
d – liczba zmiennopozycyjna
Tablice zdefiniowane są w module array.
Przykłady tworzenia tablic:
>>> import array
>>> a=array.array('c','Wszystko jedno')
>>> a
array('c', 'Wszystko jedno')
>>> b=array.array('l',range(1,10,2))
>>> b
array('l', [1, 3, 5, 7, 9])
>>> c=array.array('d',[1.0,3.14,6.59])
>>> c
array('d', [1.0, 3.1400000000000001, 6.5899999999999999]
- Operacje na tablicach
Aby ustalić liczbę elementów tablicy piszemy:
>>> len(a)
14
>>> len(b)
5
>>> len(c)
3
Aby dopisać nowy element do tablicy piszemy:
>>> b.append(2)
>>> b
array('l', [1, 3, 5, 7, 9, 2])
Aby dołączyć sekwencję elementów do tablicy piszemy:
>>> a.extend(' mi jest')
>>> a
array('c', 'Wszystko jedno mi jest')
Aby wstawić nowy element na wskazane miejsce w tablicy piszemy:
>>> b.insert(3,6)
>>> b
array('l', [1, 3, 5, 6, 7, 9, 2])
Aby usunąć element ze wskazanego miejsca w tablicy piszemy:
>>> del b[3]
>>> b
array('l', [1, 3, 5, 7, 9, 2])
Aby policzyć liczbę elementów o określonej wartości w tablicy piszemy:
>>> a.count('s')
3
Aby sprawdzić położenie pierwszego elementu o określonej wartości w tablicy piszemy:
>>> b.index(5)
2
(Obowiązuje numeracja od zera.) Aby usunąć z tablicy pierwszy element o określonej wartości piszemy:
>>> b.remove(5)
>>> b
array('l', [1, 3, 7, 9, 2])
Aby odwrócić kolejność elementów tablicy piszemy:
>>> c.reverse()
>>> c
array('d', [6.5899999999999999, 3.1400000000000001, 1.0])
Aby otrzymać listę zawierającą posortowane elementy tablicy piszemy:
>>> sorted(c)
[1.0, 3.1400000000000001, 6.5899999999999999]
A zatem, aby posortować tablicę, napiszemy:
>>> b=array.array('l',sorted(b))
>>> b
array('l', [1, 2, 3, 7, 9])
- Przykład programu wykorzystującego tablice
Spróbujemy teraz napisać program na obliczanie średniej arytmetycznej i odchylenia standardowego wykorzystujący tablicę. Program ten będzie:
* wczytywał od użytkownika kolejną liczbę, aż wciśnięty zostanie sam Enter, co oznacza koniec listy liczb
* wyświetlał wyliczone dla listy liczb średnią arytmetyczną i odchylenie standardowe.
Aby przejść do edycji nowego programu należy z menu File wybrać polecenie New Window. Otworzy się nowe okno, przeznaczone do edycji programu. Wybierzmy z menu File polecenie Save As. Wybieramy folder Moje dokumenty, następnie wpisujemy nazwę odchyl.py.
# program odchylenie standardowe
import array
a=array.array('d')
while True:
x=raw_input('Podaj liczbę nr '+`len(a)+1`+': ')
if not x: break;
a.append(float(x))
if len(a)<2:
print "Zbyt mało liczb!"
else:
print "Wprowadzono %i liczb(y)" % len(a)
s=0.0
for x in a:
s+=x
s/=len(a)
print "Średnia wynosi %.3f" % s
os=0.0
for x in a:
os+=(x-s)**2
os/=len(a)
print "Wariancja wynosi %.3f" % os
os**=0.5
print "Odchylenie wynosi %.3f" % os
Wypróbujmy (F5):
>>> ================================ RESTART =============================
>>>
Podaj liczbę nr 1: 5
Podaj liczbę nr 2:
Zbyt mało liczb!
Jeszcze raz (F5):
>>> ================================ RESTART =============================
>>>
Podaj liczbę nr 1: 3
Podaj liczbę nr 2: 6.2
Podaj liczbę nr 3: 3.9
Podaj liczbę nr 4:
Wprowadzono 3 liczb(y)
Średnia wynosi 4.367
Wariancja wynosi 1.816
Odchylenie wynosi 1.347
- Rekordy
Aby używać rekordów, musimy wpierw zdefiniować ich klasę. W Pythonie lista pól w rekordzie może ulec zmianie w trakcie działania programu. Dlatego możemy zdefiniować klasę jako pustą:
>>> class Adres:
pass
A następnie utworzyć rekord w tej klasie:
>>> a=Adres( )
I dowolnie go rozszerzać:
>>> a.ulica="Matejki"
>>> a.numer="14a/2"
>>> a.kod="71-128"
>>> a.miasto="Szczecin"
Aby poznać zawartość poszczególnych pól rekordu piszemy:
>>> a.ulica
'Matejki'
>>> a.numer
'14a/2'
>>> a.kod
'71-128'
>>> a.miasto
'Szczecin'
Oczywiście, odpowiednie pola muszą istnieć:
>>> a.panstwo
Traceback (most recent call last):
File "&<pyshell#148>", line 1, in -toplevel-
a.panstwo
AttributeError: Adres instance has no attribute 'panstwo'
Aby poznać zawartość wszystkich pól rekordu piszemy:
>>> a.__dict__
{'numer': '14a/2', 'miasto': 'Szczecin', 'ulica': 'Matejki', 'kod': '71-128'}
Możemy także określić listę pól już w momencie definiowania klasy, podając ich domyślne wartości:
>>> class Osoba:
imie="Jan"
nazwisko="Kowalski"
Aby stworzyć klasę opartą o inne klasy, podajemy je jako parametry:
>>> class Pracownik(Osoba, Adres):
pensja=1000.00
Otrzymana klasa Pracownik będzie miała wszystkie pola klas Osoba i Adres, a dodatkowo pole pensja. Sprawdźmy:
>>> p=Pracownik()
>>> p2=Pracownik()
>>> p2.imie="Adam"
>>> p2.ulica="Torfowa"
>>> p2.pensja=700
>>> p.imie
'Jan'
>>> p.ulica
'Matejki'
>>> p.pensja
1000.0
>>> p2.imie
'Adam'
>>> p2.ulica
'Torfowa'
>>> p2.pensja
700
Trzeba przy tym pamiętać, że __dict__ zwraca słownik tylko tych pól, których wartości różnią się od domyślnych:
>>> p2.__dict__
{'imie': 'Adam', 'pensja': 700, 'ulica': 'Torfowa'}
>>> p.__dict__
{ }
- Przykład – prosta baza danych
Rekordy są często używane w połączeniu z listami do tworzenia prostych baz danych. Spróbujemy teraz napisać program, który posłuży do przechowania listy ocen studentów z egzaminu. Aby przejść do edycji nowego programu należy z menu File wybrać polecenie New Window. Otworzy się nowe okno, przeznaczone do edycji programu. Wybierzmy z menu File polecenie Save As. Wybieramy folder Moje dokumenty, następnie wpisujemy nazwę studenci.py.
# Lista Ocen Studentów
class Student:
imie=""
nazwisko=""
ocena=0.0
studenci = []
nr = 0
while True:
naz=raw_input('Podaj nazwisko studenta nr %i (ENTER=koniec): ' % (nr+1))
if not naz: break
studenci.append(Student())
studenci[nr].nazwisko = naz
studenci[nr].imie = raw_input('Podaj imię studenta nr %i > ' % (nr+1))
studenci[nr].ocena = float(raw_input('Podaj ocenę studenta nr %i > ' % (nr+1)))
nr += 1
print
print "%-4s %-14s %-10s %7s" % ("L.p.","Nazwisko","Imię","Ocena")
for s in studenci:
print "%3i. %-14s %-10s %7.1f" % (studenci.index(s)+1,s.nazwisko, s.imie, s.ocena)
Wypróbujmy (F5):
>>> ================================ RESTART =============================
>>>
Podaj nazwisko studenta nr 1 (ENTER=koniec): Adamczak
Podaj imię studenta nr 1 > Piotr
Podaj ocenę studenta nr 1 > 3.5
Podaj nazwisko studenta nr 2 (ENTER=koniec): Gierek
Podaj imię studenta nr 2 > Franz
Podaj ocenę studenta nr 2 > 2.0
Podaj nazwisko studenta nr 3 (ENTER=koniec): Hubert
Podaj imię studenta nr 3 > Anna
Podaj ocenę studenta nr 3 > 4.5
Podaj nazwisko studenta nr 4 (ENTER=koniec):
L.p. Nazwisko Imię Ocena
1. Adamczak Piotr 3.5
2. Gierek Franz 2.0
3. Hubert Anna 4.5
- Ćwiczenia kontrolne
I. Napisz program na wyszukiwanie liczb pierwszych sitem Eratostenesa (patrz punkt 6.9) używający zbioru.
II. Rozwiń program 11.8 o sortowanie listy studentów przed jej wyświetleniem (według oceny, malejąco) metodą bąbelkową (nie używając dostępnych w Pythonie metod sortujących).