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)
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'
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]
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
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.
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:
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.
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).