Gdańsk, 2014
Czym jest Python? Python a C Struktura programu Zmienne i zarządzanie pamięcią Przykład Python to język programowania, który został zaprojektowany tak, by można było szybko tworzyć czytelne programy. Znajduje zastosowanie tam, gdzie nie ma znaczenia czas działania programu, a istotna jest możliwość szybkiego jego napisania. Możliwe jest napisanie fragmentów, które mają być szybkie, w C, i całej reszty w Pythonie.
Czym jest Python? Python a C Struktura programu Zmienne i zarządzanie pamięcią Przykład Cechy Pythona: jest językiem ogólnego przeznaczenia; jest w pełni obiektowy; umożliwia programowanie w różnych stylach (strukturalne, obiektowe, funkcyjne itd.); jest dostępny w różnych systemach operacyjnych (Windows, Linux itd.); jest językiem o wzorcowej dokumentacji, dostępnej w sieci oraz lokalnie (po instalacji); jest językiem o dynamicznym typowaniu; jest językiem interpretowanym.
Czym jest Python? Python a C Struktura programu Zmienne i zarządzanie pamięcią Przykład Po uruchomieniu interpretera można wydawać mu polecenia. Możliwe jest m.in.: obliczanie wyrażeń arytmetycznych, nawet na liczbach zespolonych; nadawanie wartości zmiennym i wykorzystanie ich w obliczeniach; przeglądanie zawartości obiektów (funkcja dir()); uruchamianie programów napisanych w Pythonie (instrukcja import).
Czym jest Python? Python a C Struktura programu Zmienne i zarządzanie pamięcią Przykład Programy napisane w Pythonie są zazwyczaj kilkukrotnie krótsze (i kilkukrotnie wolniejsze) niż ich odpowiedniki w C. Dla przykładu, funkcja napisana w C, obliczająca iloczyn skalarny float iloczyn( float u[], float v[], unsigned n ) { float il = 0; } while (n--) il += u[n] * v[n]; return il; w Pythonie przyjmie poniższą postać: def iloczyn( u,v ): return sum( [x * y for x,y in zip( u,v )] )
Czym jest Python? Python a C Struktura programu Zmienne i zarządzanie pamięcią Przykład Programy napisane w Pythonie składają się z: komentarzy; instrukcji; deklaracji. Python nie jest językiem o swobodnej składni wcięcia w kodzie są wykorzystywane do tworzenia bloków (instrukcji złożonych). Instrukcje jednakowo wcięte stanowią blok; nowy blok może pojawić się tylko w niektórych miejscach (zazwyczaj po dwukropku).
Czym jest Python? Python a C Struktura programu Zmienne i zarządzanie pamięcią Przykład Komentarze rozpoczynają się od znaku #, a kończą wraz z końcem wiersza. Wyrażenie składające się wyłącznie z napisu jest traktowane przez interpreter Pythona niemal tak samo jak komentarz. Instrukcje kończą się średnikiem lub znakiem nowej linii; jeżeli instrukcja ma być kontynuowana w następnej linii, należy na końcu bieżącej linii postawić \. Deklaracji wymagają wyłącznie funkcje oraz klasy.
Czym jest Python? Python a C Struktura programu Zmienne i zarządzanie pamięcią Przykład Python sam zarządza pamięcią programista nie musi przydzielać ani nie zwalnia pamięci. Aby utworzyć zmienną, należy nadać jej wartość. Zostanie ona usunięta automatycznie, gdy nie będzie już dłużej potrzebna. Można wymusić usunięcie zmiennej w konkretnym miejscu, pisząc del nazwa-zmiennej. Zmienne utworzone w trakcie wykonywania funkcji są lokalne; wszystkie pozostałe są domyślnie globalne. Aby uzyskać dostęp do zmiennej globalnej x, należy napisać global x.
Czym jest Python? Python a C Struktura programu Zmienne i zarządzanie pamięcią Przykład Poniższy program oblicza sumę dwóch liczb całkowitych: #!/usr/bin/env python3 # -*- coding: utf-8 -*- if name == " main ": a,b = input( "Podaj a: " ),input( "Podaj b: " ) suma = int( a ) + int( b ) print( "Suma =",suma )
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Wartości logiczne są przechowywane przez zmienne typu bool. Mogą one przyjmować wyłącznie wartości True lub False. Każde wyrażenie ma wartość logiczną wyrażenie jest fałszywe wtedy i tylko wtedy, gdy jego wartość jest równa: None lub False; 0, 0.0, 0j; "", (), [], {}. (Istnieją wyjątki od powyższej reguły, wrócimy do nich przy omawianiu programowania obiektowego.)
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Liczby całkowite są przechowywane przez zmienne typu int. Typ int umożliwia przechowywanie liczb dowolnej wielkości. W Pythonie serii 2 istnieją dwa typy całkowitoliczbowe: int, który jest odpowiednikiem typu long w C; long, który umożliwia przechowywanie liczb dowolnej wielkości. W Pythonie nie występuje zjawisko przekroczenia zakresu jeśli zmienna typu int zmienia wartość na nie mieszczącą się w zakresie typu int, automatycznie jej typem staje się long.
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Wartości rzeczywiste (zespolone) są przechowywane przez zmienne typu float (complex). Typ float jest odpowiednikiem typu double w C. Literały zespolone mają postać a + bj, gdzie a to część rzeczywista, a b część urojona liczby. Jeżeli z jest zmienną zespoloną, to z.real i z.imag to odpowiednio część rzeczywista i urojona tej liczby.
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Na typach liczbowych można wykonywać wszystkie podstawowe operacje arytmetyczne: dodawanie + i odejmowanie -; mnożenie * i dzielenie /; wyznaczanie reszty % i dzielenie całkowitoliczbowe //; potęgowanie **. Liczby całkowite i rzeczywiste można z sobą porównywać przy pomocy operatorów ==,!=, >, <, >= i <=. Dostępne są konwersje do typów int, float i complex: int( i ) przekształci i w liczbę typu int itd.
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Napisy w Pythonie należą do typu str. Literały tego typu można tworzyć na kilka sposobów: napisy mieszczące się w jednej linii można umieścić wewnątrz cudzysłowów lub apostrofów; napisy wielowierszowe umieszcza się wewnątrz potrójnych apostrofów lub cudzysłowów; poprzedzenie napisu literą r spowoduje, że znaki specjalne (takie jak \n) staną się zwykłymi znakami.
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Aby przekształcić wartość wyrażenia x w napis, piszemy str( x ) lub repr( x ). Tworzenie bardziej skomplikowanych napisów zbudowanych z wyrażeń umożliwia funkcja format(). Można podzielić napis na fragmenty rozdzielone podanym separatorem przy pomocy funkcji split(). Dostępna jest także funkcja join(), która łączy wiele napisów w jeden przy pomocy podanego łącznika. Napisy są tablicami, więc operacje wykonywalne na tablicach można wykonać także na napisach.
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Poniższy program drukuje wynik różnych operacji na podanych liczbach całkowitych. #!/usr/bin/env python3 # -*- coding: utf-8 -*- a = int( input( "Podaj a: " ) ) b = int( input( "Podaj b: " ) ) print( "{0} + {1} = {2}".format( a,b,a + b ) ) print( "{:d} - {:d} = {:f}".format( a,b,a - b ) ) print( "{2:d} * {0:d} = {1:d}".format( b,a * b,a ) )
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Tablice w Pythonie to struktury danych, które składają się z wielu elementów. Tablice mają typ list. W odróżnieniu od takich języków jak C, elementy tablicy w Pythonie nie muszą być tego samego typu. Tablice mają dynamiczny charakter interpreter dba o to, by zajmowały tyle miejsca w pamięci, ile jest niezbędne. Literały tablicowe tworzymy umieszczając elementy tablicy w nawiasach kwadratowych i rozdzielając je przecinkami.
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Na tablicach można wykonywać m.in. następujące operacje: przeszukiwanie x in t, x not in t, t.count( x ), t.index( x ); dostęp do elementów t[i] i podtablic t[i:j], t[i:j:k]; dodawanie oraz usuwanie elementów t.append( x ), t.insert( i,x ), t.pop(), t.remove( x ); dodawanie podtablic t.extend( x ), t += x; odwracanie t.reverse() i sortowanie t.sort(); wyznaczanie liczby elementów len( t ).
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Krotki (pary, trójki itd.) to tablice o stałym rozmiarze. Krotki należą do typu tuple. Krotki są obiektami niemodyfikowalnymi (podobnie jak napisy). Nie można zmienić wartości krotki! Krotki tworzymy umieszczając ich elementy wewnątrz nawiasów. Krotka 1-elementowa ma postać (x,). Na krotkach można wykonywać te same operacje co na tablicach, za wyjątkiem tych, które modyfikują zawartość tablicy.
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Słowniki to struktury danych, które przechowują pary klucz-wartość. Klucze muszą być obiektami niemodyfikowalnymi. Literały słownikowe umieszczamy wewnątrz nawiasów klamrowych. Klucze oddzielamy dwukropkiem od wartości; poszczególne pary klucz-wartość rozdzielamy przecinkami. Słowniki w Pythonie należą do typu dict.
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Na słownikach można wykonywać m.in. następujące operacje: przeszukiwanie k in d; dostęp do pojedynczych wartości d[k], listy kluczy d.keys(), wartości d.values() i par klucz-wartość d.items(); dodawanie oraz usuwanie elementów d[k] = w, del d[k]; wyznaczanie liczby elementów len( d ).
Wartości logiczne Liczby całkowite Liczby rzeczywiste i zespolone Napisy Listy (tablice) i krotki Słowniki Zbiory Zbiory reprezentuje w Pythonie typ set. Na zbiorach można wykonywać m.in. następujące operacje: przekształcenie listy w zbiór set( l ); dodawanie oraz usuwanie elementów s.add( e ), s.discard( e ); suma, część wspólna, różnica i różnica symetryczna zbiorów s.union( a ), s.intersection( a ), s.difference( a ), s.symmetric_difference( a ); sprawdzanie, czy zbiór jest podzbiorem/nadzbiorem innego s.issubset( a ), s.issuperset( a ); sprawdzanie, czy element należy do zbioru e in s.
Instrukcje warunkowe And, or i not Pętla while Pętla for Przetwarzanie tablic w pętli Instrukcja warunkowa w Pythonie ma jedną z poniższych postaci: if warunek: blok instrukcji elif warunek: blok instrukcji else: blok instrukcji wyrażenie1 if warunek else wyrażenie2 Zarówno else, jak i elif są opcjonalne. Klauzul elif może być dowolnie wiele.
Instrukcje warunkowe And, or i not Pętla while Pętla for Przetwarzanie tablic w pętli Operatory and, or i not umożliwiają tworzenie skomplikowanych wyrażeń warunkowych. x and y (x or y) jest równe x, jeśli x jest fałszywe (prawdziwe), lub y, w przeciwnym przypadku. Zatem z = w and x or y jest (prawie) równoważne z z = x if w else y.
Instrukcje warunkowe And, or i not Pętla while Pętla for Przetwarzanie tablic w pętli Pętla while (odpowiednik pętli while z C) ma w Pythonie następującą postać: while warunek: blok instrukcji (1) else: blok instrukcji (2) Pierwszy blok instrukcji jest wykonywany tak długo, jak długo warunek jest prawdziwy; kiedy warunek staje się fałszywy, wykonany zostaje drugi blok instrukcji i pętla się kończy.
Instrukcje warunkowe And, or i not Pętla while Pętla for Przetwarzanie tablic w pętli Instrukcja break przerywa wykonywanie pętli; blok następujący po else nie jest wtedy wykonywany. Instrukcja continue powoduje przeskok do kolejnej iteracji pętli. Klauzula else jest opcjonalna.
Instrukcje warunkowe And, or i not Pętla while Pętla for Przetwarzanie tablic w pętli Pętla for (odpowiednik pętli for z C) ma w Pythonie następującą postać: for zmienna in lista: blok instrukcji (1) else: blok instrukcji (2) Pierwszy blok instrukcji jest wykonywany dla kolejnych elementów listy; po przejrzeniu listy wykonuje się drugi blok instrukcji.
Instrukcje warunkowe And, or i not Pętla while Pętla for Przetwarzanie tablic w pętli Instrukcje break i continue działają tak samo jak w przypadku pętli while; klauzula else jest opcjonalna. Funkcja range() umożliwia iterowanie po podanym zakresie. Poniższy fragment programu sprawdza, czy n jest liczbą pierwszą. for x in range( 2,n ): if n % x == 0: print( n,"=",x,"*",n//x ) break else: print( n,"jest liczbą pierwszą" )
Instrukcje warunkowe And, or i not Pętla while Pętla for Przetwarzanie tablic w pętli Instrukcja [f( x ) for x in t] tworzy tablicę elementów postaci f( x ), gdzie x to kolejne elementy tablicy t. Instrukcja [f( x ) for x in t if g( x )] tworzy tablicę elementów postaci f( x ), gdzie x to kolejne elementy tablicy t spełniające warunek g.
Czym są wyjątki? Obsługa wyjątków Przegląd wbudowanych wyjątków to jeden ze sposobów na zgłaszanie i obsługę błędów pojawiających się w trakcie działania programu. Podstawową zaletą wyjątków jest możliwość rozdzielenia kodu odpowiedzialnego za obsługę błędów od kodu odpowiedzialnego za prawidłowe wykonanie programu. Każdy wyjątek posiada pole args, które przechowuje komunikat o błędzie (i ewentualnie inne, dodatkowe informacje związane z błędem). Komunikat o błędzie przechowywany przez wyjątek e można uzyskać przy pomocy polecenia str( e ).
Czym są wyjątki? Obsługa wyjątków Przegląd wbudowanych wyjątków Kod, w którym mogą wystąpić wyjątki, wygląda następująco: try: blok, wewnątrz którego może pojawić się wyjątek except: obsługa wyjątków else: kod wykonywany gdy wyjątek nie nastąpił finally: kod wykonywany zawsze
Czym są wyjątki? Obsługa wyjątków Przegląd wbudowanych wyjątków Klauzule else i finally są opcjonalne. Klauzul except może wystąpić dowolnie wiele. Klauzula except może mieć jedną z poniższych postaci: except: przechwytuje wszystkie wyjątki; except T: przechwytuje wyjątki typu T (i klas pochodnych); except ( T1,T2 ): przechwytuje wyjątki typu T1 i T2 (typów może być więcej); except T as v: przechwytuje wyjątki typu T i umieszcza je w zmiennej v. Można zgłaszać wyjątki przy pomocy instrukcji raise.
Czym są wyjątki? Obsługa wyjątków Przegląd wbudowanych wyjątków AssertionError pojawia się w wyniku użycia instrukcji assert z podanym fałszywym warunkiem (assert z warunkiem prawdziwym nie robi nic). EOFError pojawia się w momencie napotkania końca pliku przez funkcje wczytujące dane, takie jak input() czy read(). IOError oznacza błąd wejścia/wyjścia; może wystąpić w trakcie użycia dowolnej z funkcji operujących na plikach (omówionych dalej). SyntaxError to błąd składni. Występuje w wyniku próby załadowania niepoprawnego modułu lub użycia funkcji eval() i exec().
Czym są wyjątki? Obsługa wyjątków Przegląd wbudowanych wyjątków ImportError występuje w przypadku nieudanej próby załadowania modułu (podstawowy powód: nie udało się znaleźć modułu na dysku). KeyError oznacza, że nastąpiła próba odczytania w słowniku wartości związanej z kluczem, którego ten słownik nie zawiera. FloatingPointError to błąd w operacjach zmiennoprzecinkowych. IndexError oznacza indeks tablicy poza zakresem.
Czym są wyjątki? Obsługa wyjątków Przegląd wbudowanych wyjątków TypeError to niewłaściwy typ argumentu (występuje przy wywoływaniu funkcji). ValueError to niewłaściwa wartość argumentu; pojawia się m.in. jako efekt nieudanej konwersji napisu do liczby lub liczby do liczby innego typu. ZeroDivisionError to błąd dzielenia przez zero.
Standardowe wejście Standardowe wyjście Obsługa plików Dane z wejścia można pobierać na kilka sposobów: przy pomocy funkcji input(); przy pomocy obiektu sys.stdin. Obiekt sys.stdin umożliwia traktowanie standardowego wejścia jak pliku. W Pythonie serii 2 funkcja input() działa inaczej; do pobierania danych służy tam funkcja raw_input().
Standardowe wejście Standardowe wyjście Obsługa plików Poniższy program sumuje liczby pojawiające się na wejściu do momentu, aż się skończą. Następnie drukuje ich sumę. #!/usr/bin/env python3 # -*- coding: utf-8 -*- suma = 0 try: while True: suma += int( input() ) except EOFError: print( "Suma =",suma )
Standardowe wejście Standardowe wyjście Obsługa plików Poniższy program sumuje liczby pojawiające się na wejściu do momentu, aż się skończą. Następnie drukuje ich sumę. #!/usr/bin/env python3 # -*- coding: utf-8 -*- from sys import stdin suma = 0 for ln in stdin: suma += int( ln ) print( "Suma =",suma )
Standardowe wejście Standardowe wyjście Obsługa plików Dane można wypisywać na standardowym wyjściu na kilka sposobów: przy pomocy funkcji print(); przy pomocy obiektu sys.stdout. Obiekt sys.stdout umożliwia traktowanie standardowego wyjścia jak pliku. W Pythonie serii 2 print jest słowem kluczowym, a nie funkcją; piszemy tam print x zamiast print( x ).
Standardowe wejście Standardowe wyjście Obsługa plików Funkcja print() drukuje argumenty jeden za drugim, rozdzielając je znakiem zawartym w zmiennej sep (domyślnie jest to spacja). Następnie drukuje znak zawarty w zmiennej end (domyślnie: znak nowej linii). Wydruk następuje do pliku zawartego w zmiennej file (domyślnie: sys.stdout).
Standardowe wejście Standardowe wyjście Obsługa plików Schemat pracy z plikiem jest w Pythonie następujący: otwieramy plik funkcją open(); czytamy dane (read()), zapisujemy dane (write()); zamykamy plik funkcją close(). Po otwarciu, na pliku można wykonywać także inne operacje: przeszukiwanie, ustalanie pozycji itd.
Standardowe wejście Standardowe wyjście Obsługa plików Przy otwieraniu pliku trzeba podać nazwę oraz tryb; można określić także sposób kodowania znaków w pliku. Dane można czytać funkcją read(), readline() lub readlines(). Funkcja read() wczytuje podaną liczbę bajtów (cały plik jeśli nie podamy ilości) i zwraca je jako napis (dla plików tekstowych) lub tablicę bajtów (dla plików binarnych). W Pythonie serii 2 nie było różnicy między plikami tekstowymi a binarnymi funkcja read() zawsze zwracała napis. Dane do zapisania w pliku mają postać napisu lub tablicy bajtów.
Standardowe wejście Standardowe wyjście Obsługa plików Poniższy fragment programu zlicza liczbę linii znajdujących się w pliku dane.txt. try: f = open( "dane.txt","r" ) ln = f.readline() linie = 0 while ln: linie += 1 ln = f.readline() print( "Liczba linii =",linie ) f.close() except: pass
Standardowe wejście Standardowe wyjście Obsługa plików Poniższy fragment programu zlicza liczbę linii znajdujących się w pliku dane.txt. with open( "dane.txt","r" ) as f: ln,linie = f.readline(),0 while ln: linie += 1 ln = f.readline() print( "Liczba linii =",linie )
Deklaracja Argumenty Zwracane wyniki Wbudowane funkcje Przed użyciem funkcje muszą zostać zadeklarowane. Deklaracja funkcji ma w Pythonie następującą postać: def nazwa_funkcji( lista argumentów ): ciało funkcji Nazwa musi być unikatowa funkcji w Pythonie nie wolno przeciążać (dokładniej: nowa deklaracja funkcji o tej samej nazwie zastępuje starą). Jeżeli pierwszą instrukcją w funkcji jest napis, to staje się on jej opisem. Opis funkcji f jest dostępny w polu f. doc.
Deklaracja Argumenty Zwracane wyniki Wbudowane funkcje Określając argumenty, podajemy wyłącznie ich nazwy. Python nie sprawdza typów przekazywanych danych! Poszczególne argumenty rozdzielamy przecinkami. Można określić wartość domyślną argumentu, pisząc nazwa = wartość. Postawienie przed ostatnim argumentem znaku * spowoduje, że stanie się on tablicą, do której trafią wartości wszystkich argumentów (poza tymi, które trafią do wcześniejszych argumentów). Postawienie przed ostatnim argumentem znaku ** spowoduje, że stanie się on słownikiem, do którego trafią wartości wszystkich argumentów nazwanych.
Deklaracja Argumenty Zwracane wyniki Wbudowane funkcje Każda funkcja zwraca jakiś wynik. Jeżeli nie określimy go jawnie, to wartością zwracaną przez funkcję jest None. Instrukcja return x (return) kończy działanie funkcji i zwraca x (None) jako wynik. Można definiować funkcje anonimowe, które jako wynik zwracają wyrażenie będące ich ciałem. Definicja takiej funkcji ma postać lambda argumenty: wynik.
Deklaracja Argumenty Zwracane wyniki Wbudowane funkcje Niektóre z wbudowanych w Pythona funkcji pojawiły się już wcześniej (były to: dir(), input(), print(), sum(), bool(), int(), float() i complex()). abs() zwraca wartość bezwzględną podanej liczby. all() (any()) zwraca wartość prawdziwą wtedy i tylko wtedy, gdy wszystkie (co najmniej jeden) z argumentów są prawdziwe. chr() (ord()) zwraca znak o podanym kodzie (kod podanego znaku).
Deklaracja Argumenty Zwracane wyniki Wbudowane funkcje enumerate() użyte na liście l zwraca listę par postaci ( i,l[i] ). zip() łączy podane listy l1, l2,..., ln w listę, której elementami są n-tki ( l1[i],l2[i],...,ln[i] ). reversed() (sorted()) zwraca iterator umożliwiający przeglądanie listy w odwróconym (posortowanym) porządku.
Moduł to inaczej program w Pythonie. Aby załadować moduł znajdujący się w pliku m.py, należy skorzystać z jednej z poniższych konstrukcji: import m; elementy modułu m są dostępne w postaci m.nazwa; from m import *; elementy modułu są dostępne bez przedrostka m.. Aby załadować tylko wybrane elementy modułu, np. funkcję f, piszemy from m import f lub from m import f as g. W drugim przypadku funkcja f będzie dostępna pod nazwą g.
Niezależnie od tego, jaką metodę załadowania modułu wybierzemy, w trakcie pierwszego jego importowania wykonywana jest jego część główna. Funkcję modułu może pełnić także katalog. Musi on zawierać plik init.py, który jest wówczas traktowany jako część główna modułu. Aby załadować moduł m znajdujący się w katalogu d piszemy import d.m.
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Klasa musi zostać zadeklarowana zanim zostanie użyta. Definicja klasy w Pythonie ma postać: class nazwa_klasy: ciało klasy Ciało klasy może zawierać instrukcje inicjalizacyjne (wykonywane w momencie, w którym interpreter analizuje ciało klasy) oraz definicje metod klasy. Pustą klasę o definicji class nazwa: pass można wykorzystać do zasymulowania rekordu.
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Jeżeli pierwsza instrukcja w ciele klasy X jest napisem, to napis ten staje się opisem klasy X i jest dostępny w czasie działania programu w zmiennej X. doc. Instrukcje inicjalizacyjne można wykorzystać do stworzenia pól klasy (nazywanych w innych językach obiektowych statycznymi). Dla przykładu, poniższa klasa X class X: a = 1 b = 2 ma dwa takie pola: X.a i X.b.
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Definicja metod jest niemal taka sama jak definicja zwykłych funkcji. Jedyna różnica polega na tym, że metody zawsze mają co najmniej jeden argument i pierwszy z argumentów (nazywany zwyczajowo self) jest referencją do obiektu, dla którego ta metoda została wywołana. Dla przykładu, poniższa klasa X class X: def a( self ): pass def b( self,x ): pass ma dwie nic nie robiące metody a() i b().
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Jak tworzymy i korzystamy z instancji klas? nową instancję klasy X tworzymy pisząc zmienna = X( argumenty ), gdzie argumenty to lista argumentów inicjalizatora klasy X; jeżeli x jest instancją klasy X, to x.m( a ) wywoła dla niej metodę m i przekaże jej listę argumentów a; jeżeli x jest instancją klasy X, to x.p (x.p = w) zwróci (zmieni) wartość przechowywaną w polu p (na w). Typ zmiennej x przechowywany jest w polu x. class. Listę pól i metod zmiennej x zwraca instrukcja dir( x ).
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Uwaga! W Pythonie pola i metody są domyślnie publiczne. Nie istnieją pola/metody w pełni prywatne. Jedyne pola/metody, które mają charakter zbliżony do prywatnego, mają nazwy zaczynające się od dwóch znaków podkreślenia i kończące maksymalnie jednym znakiem podkreślenia. Tego typu pola/metody nie są widoczne poza klasą, ale można się do nich dostać stosując specjalną składnię pole p obiektu klasy X jest widoczne poza klasą pod nazwą _X p.
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Konstruktor to funkcja, która jest wywoływana w momencie tworzenia nowego obiektu. Jej zadanie polega na jego utworzeniu. Definicja konstruktora ma postać: def new ( cls,argumenty ): ciało konstruktora Pierwszym argumentem konstruktora jest klasa, której instancja ma zostać utworzona. Wartością zwracaną przez konstruktor powinien być nowo utworzony obiekt. Klasa, w której nie zadeklarujemy konstruktora, otrzymuje konstruktor domyślny, tworzący pusty obiekt. Takie zachowanie konstruktora jest pożądane niemal w 100% przypadków.
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Inicjalizator to funkcja, która jest wywoływana w momencie, gdy obiekt został już utworzony (bezpośrednio po konstruktorze). Jej celem jest zainicjalizowanie obiektu. Definicja inicjalizatora ma postać: def init ( self,argumenty ): ciało inicjalizatora Aby zainicjalizować obiekt, należy nadać wartości jego polom. Dobrym zwyczajem jest utworzenie wszystkich pól obiektu w inicjalizatorze, ale składnia języka umożliwia tworzenie ich gdziekolwiek (!).
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Uwaga! Inicjalizator nie może zwracać żadnego wyniku! Destruktor to funkcja, która jest wywoływana bezpośrednio przed usunięciem obiektu. Jej celem jest zwolnienie zasobów zajętych przez usuwany obiekt. Definicja destruktora ma postać: def del ( self ): ciało destruktora Ponieważ Python sam zarządza pamięcią, destruktory rzadko kiedy są potrzebne.
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Metody specjalne umożliwiają osiąganie rozmaitych specjalnych efektów dla klas, m.in. definiowanie operatorów działających na klasach. Metody specjalne mają nazwy rozpoczynające się od dwóch znaków podkreślenia i kończące się dwoma znakami podkreślenia. Konstruktor, inicjalizator i destruktor to przykłady metod specjalnych.
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Jakie metody specjalne są dostępne? x. repr () (x. str ()); zwraca napisową reprezentację x; jest równoważne repr( x ) (str( x )); x. lt ( y ) (x. le ( y ), x eq ( y ), x. ne ( y ), x. gt ( y ) i x. ge ( y )); operatory porównania równoważne z x < y (x <= y, x == y, x!= y, x > y, x >= y); x. bool (); sprawdza, czy x jest prawdziwe; jest równoważne bool( x ); x. call ( a ); równoważne z x( a ); x. len (); zwraca rozmiar x; jest równoważne len( x );
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie x. getitem ( k ) (x. setitem ( k,w ), x. delitem ( k )); odpowiednik operacji x[k] (x[k] = w, del x[k]); x. contains ( y ); operator przynależności; równoważne z y in x; x. add ( y ); operator sumy równoważny z x + y; niemal każdy operator arytmetyczny ma swój odpowiednik w postaci odpowiedniej funkcji; x. int () (x. float (), x. complex ()); funkcja konwertujące do typu int (float, complex); odpowiednik int( x ) (float( x ), complex( x )). (I inne powyższa lista nie jest kompletna).
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie specjalne bool () i len (), o ile zostały zdefiniowane, są wykorzystywane w trakcie ustalania, czy obiekt jest prawdziwy, czy fałszywy. Obiekt jest prawdziwy wtedy i tylko wtedy, gdy bool () ( len ()) zwróci wartość prawdziwą (niezerową).
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Klasy mogą po sobie dziedziczyć klasa pochodna dziedziczy wszystkie metody klas bazowych. Pola nie są dziedziczone. Jeżeli chcemy, by odziedziczone zostały także pola klas bazowych, to musimy w inicjalizatorze wywołać metody klas bazowych, które te pola tworzą (będą to zapewne inicjalizatory tych klas). Aby stworzyć klasę X, która dziedziczy po klasach Y, Z,... piszemy: class X( Y,Z,... ): ciało klasy
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Można sprawdzić, czy klasa X dziedziczy po Y issubclass( X,Y ) zwraca informację o tym, czy Y jest klasą bazową dla X. Można wywoływać metody z klas bazowych przy pomocy konstrukcji Klasa.Metoda( obiekt,argumenty ) albo funkcji super(). Jeżeli w kilku klasach bazowych występuje ta sama metoda, to odziedziczona zostanie wyłącznie ta, która występuje w pierwszej od lewej klasie (kolejność klas bazowych ma znaczenie!).
Definicja klasy Konstruktor, destruktor i inicjalizator Metody specjalne Dziedziczenie Jeżeli nie podamy jawnie klasy bazowej, to staje się nią object. Klasą bazową dla wyjątków jest BaseException, a wszystkie wyjątki, które nie są wbudowane w Pythona powinny dziedziczyć po klasie Exception.
Po co łączyć Pythona z C? Przygotowania Przykłady Są dwa ważne powody, dla których warto łączyć kod napisany w C z kodem napisanym w Pythonie: kod w C jest szybszy, więc fragmenty napisane w C będą szybsze niż robiące to samo fragmenty napisane w Pythonie; można wzbogacić Pythona o nowe typy danych, których nie można (lub jest bardzo trudno) napisać w Pythonie. Można zarówno napisać kod w C, który będzie potem używany przez program napisany w Pythonie, jak i napisać program w Pythonie, który zostanie wywołany z poziomu języka C.
Po co łączyć Pythona z C? Przygotowania Przykłady Program napisany w C może zostać zaimportowany przez Pythona jako moduł. Aby było to możliwe, program w C musi zostać odpowiednio przygotowany. Ujmując rzecz schematycznie, program ten musi wyglądać następująco: #include <Python.h> /* tu wstaw ciało modułu */ PyMODINIT_FUNC PyInit_nazwa_modułu( void ) { /* tu wstaw kod inicjalizujący moduł */ }
Po co łączyć Pythona z C? Przygotowania Przykłady Po przygotowaniu programu, następnym krokiem jest jego kompilacja i instalacja, najlepiej przy pomocy modułu distutils. Moduł distutils umożliwia stworzenie skryptu, którego zadaniem jest kompilacja i instalacja programu napisanego w C. Skrypt ten (w minimalnej postaci) wygląda następująco: #!/usr/bin/env python3 # -*- coding: utf-8 -*- from distutils.core import setup,extension setup( name = "nazwa modułu", \ ext_modules = [Extension( "nazwa", \ sources = ["plik źródłowy"] )] )
Po co łączyć Pythona z C? Przygotowania Przykłady Po zapisaniu powyższego skryptu pod nazwą make.py, uruchamiamy go następująco: python3 make.py build by skompilować program; python3 make.py install by zainstalować program. O ile kompilacja i instalacja się udały (instalacja może wymagać uprawnień administratora), program napisany w C będzie dostępny z poziomu Pythona jako moduł.
Po co łączyć Pythona z C? Przygotowania Przykłady Poniższy program zawiera implementację 2-wymiarowych wektorów. #include <Python.h> #include <math.h> // Obiekty typu Vector -- 2-wymiarowe wektory. typedef struct { PyObject_HEAD // część inicjalizacyjna double x, y; // współrzędne } Vector;
Po co łączyć Pythona z C? Przygotowania Przykłady // Konstruktor typu Vector. static PyObject *Vector new ( PyTypeObject *type, PyObject *args ) { return type->tp_alloc( type,0 ); } // Destruktor typu Vector. static void Vector del ( Vector *self ) { Py_TYPE( self )->tp_free( (PyObject *)self ); }
Po co łączyć Pythona z C? Przygotowania Przykłady // Inicjalizator typu Vector. static int Vector init ( Vector *self, PyObject *args ) { double x = 0.0, y = 0.0; } if (PyArg_ParseTuple( args," dd",&x,&y )) { self->x = x; self->y = y; return 0; } return -1;
Po co łączyć Pythona z C? Przygotowania Przykłady // Norma wektora. static PyObject *VectorNorm( Vector *self ) { return PyFloat_FromDouble( sqrt( self->x * self->x + self->y * self->y ) ); } // Współrzędne x i y wektora. static PyObject *VectorX( Vector *self ) { return PyFloat_FromDouble( self->x ); } static PyObject *VectorY( Vector *self ) { return PyFloat_FromDouble( self->y ); }
Po co łączyć Pythona z C? Przygotowania Przykłady // Konwersja Vector -> napis. static PyObject *Vector str ( Vector *self ) { PyObject *x = PyFloat_FromDouble( self->x ); PyObject *y = PyFloat_FromDouble( self->y ); PyObject *r = PyUnicode_FromFormat( "(%S,%S)",x,y ); Py_XDECREF( x ); Py_XDECREF( y ); return r; }
Po co łączyć Pythona z C? Przygotowania Przykłady // Lista metod klasy Vector, wraz z opisem. static PyMethodDef VectorMethods[] = { { "norm",(pycfunction)vectornorm,meth_noargs, "Return the norm." }, { "x",(pycfunction)vectorx,meth_noargs, "Return the first coordinate." }, { "y",(pycfunction)vectory,meth_noargs, "Return the second coordinate." }, { NULL } } ;
Po co łączyć Pythona z C? Przygotowania Przykłady // Opis typu Vector. static PyTypeObject VectorType = { PyVarObject_HEAD_INIT( NULL,0 ) // inicjalizacja "vector.vector", // nazwa sizeof( Vector ), // rozmiar 0, // (destructor)vector del, // destruktor 0,0,0,0,0,0,0,0,0,0, // (reprfunc)vector str, // obiekt -> napis 0,0,0, // Py_TPFLAGS_DEFAULT, // "2-dimensional vectors.", // opis
Po co łączyć Pythona z C? Przygotowania Przykłady 0,0,0,0,0,0, // VectorMethods, // metody 0,0,0,0,0,0,0, // (initproc)vector init, // inicjalizator 0, // (newfunc)vector new // konstruktor } ;
Po co łączyć Pythona z C? Przygotowania Przykłady // Opis modułu. static PyModuleDef vector_module = { PyModuleDef_HEAD_INIT, "vector", "Implementation of 2-dimensional vectors.", -1, NULL, NULL, NULL, NULL, NULL } ;
Po co łączyć Pythona z C? Przygotowania Przykłady // Inicjalizacja modułu PyMODINIT_FUNC PyInit_vector( void ) { if (PyType_Ready( &VectorType ) < 0) return NULL; PyObject* m = PyModule_Create( &vector_module ); if (m == NULL) return NULL; } Py_INCREF( &VectorType ); PyModule_AddObject( m,"vector", (PyObject *)&VectorType ); return m;
Po co łączyć Pythona z C? Przygotowania Przykłady Poniższy program pokazuje, jak z poziomu C wywołać interpreter Pythona. #include <Python.h> int main() { Py_Initialize(); PyRun_SimpleString( "from time import time,ctime\n" "print( Data:,ctime( time() ) )\n" ); Py_Finalize(); return 0; }