.:: KURS PROGRAMOWANIA W JĘZYKU PYTHON ::.




- 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)


kolor 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


kolor 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)



- Metody operujące na napisach


Wyjątkowo dużo metod posiada kolor 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'



- Metody operujące na listach


Również kolor 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]



- 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



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



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



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



- Ć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).





-- back