7         LEKCJA 7 - OBIEKTY, METODY, MODUŁY, FUNKCJE MATEMATYCZNE

7.1        Podstawy podejścia obiektowego

Włączmy tryb interaktywny Pythona.

Python jest językiem zorientowanym obiektowo. By w pełni korzystać z jego możliwości, musimy zatem nauczyć się podstaw podejścia obiektowego.

Zasadniczą koncepcją w podejściu obiektowym do programowania jest połączenie w całość danych oraz algorytmów, które na tych danych operują. Takie połączenie danych i algorytmów nazywamy obiektem.

Obiekt posiada pewne własności, czyli dane oraz pewne metody, czyli algorytmy do przetwarzania tych danych.

W języku Python dostęp do właściwości i metod określonego obiektu uzyskujemy stawiając kropkę po jego nazwie. Metody od właściwości odróżniamy po tym, że jako funkcje muszą mieć na końcu nawiasy okrągłe.

Zbiór obiektów o tych samych własnościach i metodach nazywamy klasą.

 

Dla przykładu stwórzmy zmienną zespoloną z:

 

>>> z=3+2j

>>> z

(3+2j)

 

Klasa liczb zespolonych complex posiada dwie właściwości real i imag przechowujące część rzeczywistą i część urojoną liczby:

 

>>> z.real

3.0

>>> z.imag

2.0

     

Klasa liczb zespolonych complex posiada także metodę conjugate( ) pozwalającą wyliczyć liczbę sprzężoną do przechowywanej:

 

>>> z.conjugate()

(3-2j)

>>> z*z.conjugate()

(13+0j)

7.2        Metody operujące na napisach

Wyjątkowo dużo metod posiada klasa string. Metody te służą do różnego typu konwersji i formatowania napisów.

Na początek stwórzmy zmienną napisową s:

 

>>> s="to jest NAPIS"

>>> s

'to jest NAPIS'

 

Metoda capitalize( ) służy do nadania napisowi formatu jak w zdaniu, to jest zmiany pierwszej litery na dużą, a pozostałych na małe:

 

>>> s.capitalize()

'To jest napis'

 

Metoda center( ) służy do wyśrodkowania napisu w polu o podanej długości. Domyślnie pole dopełniane jest znakiem spacji:

 

>>> s.center(32)
'         to jest NAPIS          '
>>> s.center(64)
'                         to jest NAPIS                          '

 

Możemy jednak podać inny znak wypełnienia (jako drugi parametr metody):

 

>>> s.center(64,'*')
'*************************to jest NAPIS**************************'
        

Metoda count( ) oblicza ile razy określony ciąg znaków występuje w napisie:

 

>>> s.count('t')

2

>>> (s*10).count(s)

10

 

Metoda find( ) odnajduje pierwsze wystąpienie określonego ciąg znaków w napisie:

 

>>> s.find('NAPIS')

8

 

Jeżeli szukanego ciągu w napisie nie ma, zwracana jest wartość -1:

 

>>> s.find('napis')

-1

 

Metoda isdigit( ) sprawdza, czy napis zawiera tylko cyfry:

 

>>> s.isdigit( )

False

>>> '18'.isdigit()

True

>>> '18.2'.isdigit()

False

 

Metoda join( ) łączy wszystkie elementy sekwencji podanej jako parametr w pojedynczy napis, wstawiając pomiędzy nie napis dla którego wywołujemy metodę:

 

>>> ' '.join(['ala','ma','kota'])

'ala ma kota'

>>> ','.join(['ala','ma','kota'])

'ala,ma,kota'

>>> s.join(['***']*5)

'***to jest NAPIS***to jest NAPIS***to jest NAPIS***to jest NAPIS***'

 

Metoda lower( ) zamienia wszystkie duże litery w napisie na małe:

 

>>> s.lower()

'to jest napis'

     

Metoda replace( ) zamienia wszystkie wystąpienia określonego ciąg znaków w napisie na inny ciąg:

 

>>> s.replace('NAPIS','tekst')

'to jest tekst'

>>> s.replace(' ','---')

'to---jest---NAPIS'

 

Metoda rfind( ) odnajduje ostatnie wystąpienie określonego ciąg znaków w napisie:

 

>>> s.rfind('NAPIS')

8

>>> 'ala ma kota'.rfind('a')

10

 

Jeżeli szukanego ciągu w napisie nie ma, zwracana jest wartość -1:

 

>>> s.rfind('napis')

-1

 

Metoda rjust( ) służy do wyrównania napisu do prawej w polu o podanej długości. Domyślnie pole dopełniane jest znakiem spacji:

 

>>> s.rjust(32)

'                   to jest NAPIS'

>>> s.rjust(64)

'                                                   to jest NAPIS'

 

Możemy jednak podać inny znak wypełnienia (jako drugi parametr metody):

 

>>> s.rjust(64,'.')

'...................................................to jest NAPIS'

     

Metoda split() tworzy listę wyrazów występujących w napisie:

 

>>> s.split()

['to', 'jest', 'NAPIS']

>>> for wyraz in s.split():

      print wyraz.capitalize().rjust(60)

 

     

                                                          To

                                                        Jest

                                                       Napis

 

Jako parametr możemy podać znak rozdzielający wyrazy (domyślnie spacja):

 

>>> '032-345-231'.split('-')

['032', '345', '231']

 

Metoda splitlines() tworzy listę linii występujących w napisie:

 

>>> ((s+'\n')*10).splitlines()

['to jest NAPIS', 'to jest NAPIS', 'to jest NAPIS', 'to jest NAPIS', 'to jest NAPIS', 'to jest NAPIS', 'to jest NAPIS', 'to jest NAPIS', 'to jest NAPIS', 'to jest NAPIS']

 

Metoda swapcase( ) odwraca wielkość liter w napisie:

 

>>> s.swapcase()

'TO JEST napis'

 

Metoda title( ) zmienia wielkość liter jak w nagłówku:

 

>>> s.title( )

'To Jest Napis'

 

Metoda upper( ) zamienia wszystkie małe litery w napisie na duże:

 

>>> s.upper()

'TO JEST NAPIS'

7.3        Metody operujące na listach

Również klasa list posiada dużo metod. Metody te służą do różnego typu modyfikacji i porządkowania list.

Na początek stwórzmy listę l:

 

>>> l=range(1,21)

>>> l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

 

Metoda append( ) dołącza do listy pojedynczy element:

 

>>> l.append(33)

>>> l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 33]

 

Metoda extend( ) dołącza do listy inną listę:

 

>>> l.extend([33,99])

>>> l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 33, 33, 99]

>>>

 

Metoda count(w) liczy ile razy występuje na liście wartość w:

 

>>> l.count(33)

2

>>> l.count(99)

1

>>> l.count(102)

0

 

Metoda index(w) znajduje pierwszą pozycję listy na której występuje wartość w:

 

>>> l.index(33)

20

 

Można ograniczyć przeszukiwanie do części listy przez podanie dodatkowo dwóch parametrów - początku i końca zakresu:

 

>>> l.index(33,21,22)

21

 

Metoda insert(i, w) wstawia na pozycję i listy wartość w:

 

>>> l.insert(5,77)

>>> l

[1, 2, 3, 4, 5, 77, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 33, 33, 99]

 

Metoda pop(i) zwraca wartość z pozycji i listy, po czym usuwa tę pozycję:

 

>>> l.pop(5)

77

>>> l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 33, 33, 99]

>>>

 

Metoda remove(w) usuwa z listy pierwszą znalezioną na liście wartość w:

 

>>> l.remove(99)

>>> l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 33, 33]

>>> l.count(33)

2

>>> l.remove(33)

>>> l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 33]

>>> l.count(33)

1

>>> l.remove(33)

>>> l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

>>> l.count(33)

0

 

Metoda reverse( ) odwraca kolejność elementów listy:

 

>>> l.reverse()

>>> l

[20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

 

Metoda sort( ) porządkuje elementy listy w kolejności rosnącej:

 

>>> l.sort()

>>> l

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

7.4        Moduły

Moduły Pythona zawierają definicje rzadziej używanych funkcji i typów danych.

Dostęp do nich uzyskujemy dzięki instrukcji import. Wpiszmy:

 

>>> import random

 

Od tej pory mamy dostęp do zawartości modułu random. Moduł ten zawiera funkcje obsługujące generowanie liczb pseudolosowych:

 

>>> random.seed()

 

Inicjalizuje generator liczb pseudolosowych. Użycie tej funkcji powinno zawsze poprzedzać losowanie jakiejkolwiek liczby.

 

>>> random.randint(1,10)

3

>>> random.randint(1,10)

1

>>> random.randint(1,10)

4

 

Funkcja randint(od, do) losuje liczbę całkowitą z zakresu od..do.

 

Zauważmy, że nazwę funkcji poprzedzamy nazwą modułu i kropką.

Otrzymamy błąd, jeżeli napiszemy po prostu:

 

>>> randint(1,10)

 

Traceback (most recent call last):

  File "<pyshell#11>", line 1, in -toplevel-

    randint(1,10)

NameError: name 'randint' is not defined

 

Możemy jednak uczynić nazwy funkcji dostępnymi bez potrzeby używania nazwy modułu poprzez użycie instrukcji from:

 

>>> from random import randint

 

Od tej pory możemy po prostu napisać:

 

>>> randint(1,10)

6

 

Ale jeżeli napiszemy

 

>>> choice(s.split())

 

Traceback (most recent call last):

  File "<pyshell#14>", line 1, in -toplevel-

    choice(s.split())

NameError: name 'choice' is not defined

 

Zamiast udostępniać po kolei nazwy poszczególnych funkcji, można zażądać wszystkich nazw (ale uwaga! nie dla każdego modułu działa to prawidłowo):

 

>>> from random import *

 

I dalej:

 

>>> choice(s.split())

'to'

 

Funkcja choice wybiera losowy element z sekwencji.

 

>>> choice(s.split())

'jest'

>>> choice(s)

'o'

>>> choice(l)

1

 

Funkcja shuffle wykonuje losową permutację sekwencji:

 

>>> shuffle(l)

>>> l

[11, 20, 1, 9, 10, 2, 14, 18, 5, 6, 15, 3, 7, 16, 17, 12, 8, 4, 19, 13]

>>> shuffle(l)

>>> l

[15, 1, 13, 14, 9, 8, 4, 10, 18, 16, 12, 3, 11, 17, 19, 7, 5, 6, 20, 2]

>>>

 

Funkcja random zwraca losową liczbę rzeczywistą z przedziału [0.0, 1.0):

 

>>> random()

0.1964729982262956

 

Funkcja uniform(a,b) zwraca losową liczbę rzeczywistą z przedziału [a, b):

 

>>> uniform(10,20)

13.952472157445552

 

Funkcja uniform(a,b) zwraca losową liczbę rzeczywistą z przedziału [a, b):

 

>>> uniform(10,20)

13.952472157445552

 

Oprócz jednostajnego, dostępne są i inne rozkłady zmiennych losowych. Np. funkcja normalvariate(mu, sigma) zwraca wartość zmiennej losowej o rozkładzie normalnym, o średniej mu i odchyleniu standardowym sigma:

 

>>> normalvariate(10,5)

4.6557086378024239

7.5        Funkcje matematyczne

Moduł math zawiera definicje najczęściej używanych funkcji matematycznych.

 

>>> from math import *

 

Funkcje modułu math operują na liczbach rzeczywistych.

Funkcja math.ceil(x) zwraca sufit liczby rzeczywistej x (najmniejszą liczbę całkowitą nie mniejszą niż x)

 

>>> ceil(2.7)

3.0

 

Funkcja math.fabs(x) zwraca wartość absolutną liczby rzeczywistej x

 

>>> fabs(-3)

3.0

 

Funkcja math.floor(x) zwraca podłogę liczby rzeczywistej x (największą liczbę całkowitą nie większą niż x)

 

>>> floor(2.7)

2.0

 

Funkcja math.modf(x) zwraca krotkę zawierającą część ułamkową i całkowitą liczby rzeczywistej x

 

>>> modf(2.5)

(0.5, 2.0)

>>> modf(2.5)[0]

0.5

 

Funkcja math.exp(x) zwraca e do potęgi x

 

>>> exp(1)

2.7182818284590451

 

Funkcja math.log(x) zwraca logarytm naturalny z x

 

>>> log(e)

1.0

 

By zmienić podstawę logarytmu podajemy drugi parametr funkcji math.log

 

>>> log(256,2)

8.0

 

Funkcja math.sqrt(x) zwraca pierwiastek kwadratowy z x

 

>>> sqrt(49)

7.0

 

Funkcja math.acos(x) zwraca w radianach arcus cosinus kąta x

 

>>> acos(1)

0.0

 

Funkcja math.asin(x) zwraca w radianach arcus sinus kąta x

 

>>> asin(0)

0.0

 

Funkcja math.atan(x) zwraca w radianach arcus tangens kąta x

 

>>> atan(0)

0.0

 

Funkcja math.cos(x) zwraca cosinus kąta x podanego w radianach

 

>>> cos(1)

0.0

 

Funkcja math.sin(x) zwraca sinus kąta x podanego w radianach

 

>>> sin(0)

0.0

 

Funkcja math.tan(x) zwraca tangens kąta x podanego w radianach

 

>>> tan(0)

0.0

 

Funkcja math.hypot(x, y) zwraca odległość punktu o współrzędnych (x, y) od początku układu (0, 0)

(długość przeciwprostokątnej dla przyprostokątnych o długościach x i y)

 

>>> hypot(3,4)

5.0

 

Funkcja math.degrees(x) zamienia miarę kąta x wyrażoną w radianach na stopnie

 

>>> degrees(pi)

180.0

 

Funkcja math.radians(x) zamienia miarę kąta x wyrażoną w stopniach na radiany

 

>>> radians(180)

3.1415926535897931

 

Jak można było zauważyć w przykładach, moduł math definuje także dwie stałe: pi oraz e.

7.6        Przykład: pisanie wyrazów wspak

Spróbujemy teraz napisać program na odwracanie poszczególnych wyrazów zdania. 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ę wspak.py.

 

# program wyświetla poszczególne wyrazy napisu wspak

t=raw_input("Wpisz dłuższy tekst >")

for w in t.split():      # dla każdego wyrazu w zdaniu

    l=list(w)            # tworzymy listę jego liter

    l.reverse()          # odwracamy jej kolejność

    print ''.join(l),    # łączymy ją w całość i wyświetlamy bez separatorów

 

Wypróbujmy:

 

>>> ================================ RESTART ================================

>>>

Wpisz dłuższy tekst >dzieckiem w kolebce kto łeb urwał hydrze

meikceizd w ecbelok otk beł ławru ezrdyh

>>>

7.7        Przykład: wyliczanie odległości między dwoma punktami na płaszczyźnie

Spróbujemy teraz napisać program do wyliczania odległości między dwoma punktami na płaszczyźnie. 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ę punkty.py.

 

# program wylicza odległość między dwoma punktami

from math import hypot

p1x,p1y = input ("Podaj współrzędne poziomą i pionową pierwszego punktu >")

p2x,p2y = input ("Podaj współrzędne poziomą i pionową drugiego punktu >")

print "Odległość między tymi punktami wynosi %.3f" % hypot(p1x-p2x,p1y-p2y)

 

Wypróbujmy:

 

>>> ================================ RESTART ================================

>>>

Podaj współrzędne poziomą i pionową pierwszego punktu >0,1

Podaj współrzędne poziomą i pionową drugiego punktu >1,0

Odległość między tymi punktami wynosi 1.414

>>> ================================ RESTART ================================

>>>

Podaj współrzędne poziomą i pionową pierwszego punktu >-1,-2

Podaj współrzędne poziomą i pionową drugiego punktu >3,1

Odległość między tymi punktami wynosi 5.000

>>>

7.8        Ćwiczenia kontrolne

I.                    Napisz program "tryg.py", który wczyta od użytkownika wielkość kąta w stopniach i wyświetli wartość czterech podstawowych funkcji trygonometrycznych (sin, cos, tg, ctg) o ile dla danego kąta jest to możliwe.

II.                 Napisz program "lotto.py", który wyświetli 6 losowych i nie powtarzających się liczb z zakresu od 1 do 49.

III.               Napisz program "wyrazy.py", który wczyta od użytkownika pewien tekst, a następnie podzieli go na zdania (zakładamy, że jednoznacznie kropka rozdziela zdania) i dla każdego zdania wyświetli ile jest w nim wyrazów (zakładamy, że spacja oddziela wyrazy w zdaniu).