Gdańsk, 2014
i plików tekstowych Użyteczne typy danych Biblioteka numeryczna Operacje systemowe i programowanie współbieżne Sieci Inne Standardowa biblioteka Pythona to ok. 200 modułów i ok. 100 podmodułów. Oferowana przez nie funkcjonalność obejmuje wiele zagadnień spotykanych w trakcie programowania. Większość z oferowanych przez moduły funkcjonalności ma postać klas, których metody realizują interesujące nas funkcje.
i plików tekstowych Użyteczne typy danych Biblioteka numeryczna Operacje systemowe i programowanie współbieżne Sieci Inne umożliwiają m.in. następujące moduły: string; formatowanie tekstu, klasyfikowanie znaków; re; wyrażenia regularne. xml i html; parsery plików xml-owych i html-owych; configparser; parser plików konfiguracyjnych; argparse; parser argumentów linii komend.
i plików tekstowych Użyteczne typy danych Biblioteka numeryczna Operacje systemowe i programowanie współbieżne Sieci Inne są możliwe dzięki następującym modułom: os.path; operacje na ścieżkach; tempfile; pliki tymczasowe; shutil; kopiowanie i przenoszenie plików, katalogów wraz z zawartością itd. sqlite3; interfejs do bazy SQLite. zlib i gzip; kompresja gzip; bz2; kompresja bz2; zipfile; kompresja zip. tarfile; pliki tar.
i plików tekstowych Użyteczne typy danych Biblioteka numeryczna Operacje systemowe i programowanie współbieżne Sieci Inne Następujące moduły zawierają rozmaite użyteczne typy danych, które nie zostały wbudowane w Pythona: datetime; data i czas; calendar; kalendarze; heapq; kolejki priorytetowe; array; tablice wartości tego samego typu liczbowego; queue; zwykłe kolejki (FIFO).
i plików tekstowych Użyteczne typy danych Biblioteka numeryczna Operacje systemowe i programowanie współbieżne Sieci Inne Obliczenia matematyczne i numeryczne wspierają m.in. następujące moduły: numbers; abstrakcyjna hierarchia liczb; math; standardowe funkcje i stałe matematyczne; cmath; standardowe funkcje matematyczne dla liczb zespolonych; decimal; ułamki dziesiętne; fractions; ułamki zwykłe; random; generowanie liczb losowych o zadanych rozkładach.
i plików tekstowych Użyteczne typy danych Biblioteka numeryczna Operacje systemowe i programowanie współbieżne Sieci Inne Dostęp do funkcji systemu operacyjnego dają następujące moduły: os; rozmaite funkcje systemowe; sys; rozmaite parametry i funkcje systemowe; time; odczyt i konwersja czasu. Możliwe jest także programowanie współbieżne, które jest wspierane przez moduły: threading; obsługa wątków; multiprocessing; obsługa wielu procesorów; subprocess; obsługa procesów potomnych.
i plików tekstowych Użyteczne typy danych Biblioteka numeryczna Operacje systemowe i programowanie współbieżne Sieci Inne Większość z popularnych usług sieciowych jest dostępna poprzez moduły Pythona: webbrowser i http; prosta przeglądarka www oraz obsługa protokołu http; urllib; dostęp do stron www poprzez adresy url; telnetlib; protokół telnet; ssl i socket; szyfrowane i zwykłe połączenia sieciowe; smtpd, smtplib, poplib, mailbox, imaplib, email; poczta elektroniczna; ftplib; protokół ftp; cgi i cgitb; skrypty CGI.
i plików tekstowych Użyteczne typy danych Biblioteka numeryczna Operacje systemowe i programowanie współbieżne Sieci Inne Oprócz wcześniej omówionych, Python wspiera także: przetwarzanie dźwięków (wave); testowanie jednostkowe (unittest); pomiar czasu wykonania programów (timeit); programowanie funkcjonalne (itertools, functools i operator); oprogramowywanie interfejsów (curses i tkinter). (I wiele, wiele innych... )
re argparse Wyrażenia regularne to napisy, które są wzorcami dla innych napisów. Na wyrażeniach regularnych wykonywane są dwie operacje: dopasowanie napisu do wzorca; modyfikacja napisu wg wzorca. Dopasowanie następuje zawsze w pierwszym możliwym miejscu i ma charakter zachłanny. Moduł re udostępnia programiście obie powyższe operacje (i kilka innych, dodatkowych).
re argparse Wyrażenia regularne są zbudowane ze znaków zwykłych i specjalnych. Podczas dopasowywania znaki zwykłe muszą wystąpić w dopasowywanym napisie, a specjalne są zastępowane przez zwykłe zgodnie z ich znaczeniem: ^ i $; oznacza początek i koniec napisu; \d, \s i.; oznaczają cyfrę, biały znak i dowolny znak; ; oznacza alternatywę tego, co poprzedza i następuje po tym znaku; \; znak następujący po \ staje się zwykłym znakiem;
re argparse [lista] ([^lista]); oznacza znak z (spoza) podanej listy znaków; {x}, {x,} i {x,y}; oznacza, że znak poprzedzający musi wystąpić dokładnie x razy, co najmniej x razy i co najmniej x ale nie więcej niż y razy;?, * i +; równoważne z {0,1}, {0,} i {1,}; ( i ); grupują ciągi znaków, po to by inne znaki specjalne można było zastosować do całej grupy; \numer; oznacza dopasowaną grupę o podanym numerze.
re argparse Moduł re udostępnia m.in. następujące funkcje: compile( w ); zwraca skompilowaną postać wyrażenia regularnego (przyśpiesza obliczenia, jeśli wielokrotnie korzystamy z tego samego wzorca); search( w,n ); zwraca informację o tym, czy napis n zawiera fragment pasujący do wzorca w; match( w,n ); zwraca informację o tym, czy napis n zawiera prefiks pasujący do wzorca w;
re argparse split( w,n ); dzieli napis n na fragmenty rozdzielone napisami pasującymi do wzorca w; findall( w,n ); zwraca wszystkie możliwe dopasowania napisu n do wzorca w; sub( w1,w2,n ); zwraca napis powstały z n poprzez zamianę wszystkich fragmentów pasujących do w1 zgodnie z zasadą opisaną w w2.
re argparse Wynikiem dopasowania jest obiekt typu MatchObject lub None, o ile dopasowanie się nie udało. Obiekty typu MatchObject mają m.in. następujące metody: group( n ); zwraca grupę dopasowaną do n-tego nawiasu (cały dopasowany fragment dla n równego 0); start( n ) i end( n ); zwraca indeks pierwszego i ostatniego znaku we fragmencie dopasowanym do n-tego nawiasu.
re argparse Poniższy program to prosty kalkulator z pamięcią. #!/usr/bin/env python3 # -*- coding: utf-8 -*- from re import search from sys import stdin zmienne = {} def wykonaj( linia ): w = "^\s*([a-z][a-z0-9]*)\s*=\s*([+-]?[0-9]+)\s*$" o = search( w,linia.lower() )
re argparse if o: zmienne[o.group( 1 )] = int( o.group( 2 ) ) else: try: print( eval( linia.lower(),zmienne ) ) except: print( "Błąd w wyrażeniu",linia ) while True: try: wykonaj( input() ) except EOFError: break
re argparse Moduł argparse ułatwia pisanie programów, które korzystają z parametrów wiersza poleceń. Zadanie programisty sprowadza się do określenia parametrów i ich opisu. Resztę robi klasa ArgumentParser znajdująca się w module argparse. Moduł argparse jest dostępny od wersji 3.2; wcześniej jego funkcje pełnił moduł optparse.
re argparse Aby skorzystać z klasy ArgumentParser należy utworzyć jej instancję, podając konstruktorowi kilka parametrów: description; napis wyświetlany przed listą parametrów; epilog; napis wyświetlany po liście parametrów; usage; opis sposobu użycia programu (domyślnie: generowany automatycznie); prog; nazwa programu (domyślnie: sys.argv[0]). (Powyższa lista obejmuje wyłącznie ważniejsze z parametrów.)
re argparse Następnie, dla każdego parametru, który nasz program ma obsługiwać, należy wywołać funkcję add_argument(), podając jej następujące informacje: nazwę parametru (lub listę nazw, w przypadku parametrów opcjonalnych, zaczynających się od znaku minusa); action; czynność wykonywana, jeśli parametr zostanie użyty (domyślnie: zapamiętanie wartości); nargs; z ilu fragmentów składa się parametr; default; wartość domyślna parametru; type; typ parametru; help; krótki opis parametru. (Powyższa lista także obejmuje tylko ważniejsze z możliwych do określenia informacji.)
re argparse Ostatnim krokiem jest wywołanie funkcji parse_args(), która: sprawdza, czy podano poprawne parametry (jeśli nie, kończy działanie programu i wyświetla odpowiednie komunikaty); ustala, jakie wartości zostały przypisane parametrom; zwraca obiekt typu Namespace, który przechowuje w odpowiednich polach wartości sparsowanych argumentów. Przekazując funkcji parse_args() obiekt x jako argument namespace można spowodować, że tworzone przez nią pola zostaną utworzone wewnątrz x-a.
re argparse Poniższy program, w zależności od podanego parametru, zwraca pierwszą lub drugą z przekazanych mu liczb. #!/usr/bin/env python3 # -*- coding: utf-8 -*- from argparse import * parser = ArgumentParser( \ description = "Program zwraca a lub b" ) parser.add_argument( "a",type = int, \ help = "pierwsza liczba" )
re argparse parser.add_argument( "b",type = int, \ help = "druga liczba" ) parser.add_argument( "-p",type = bool,default = True,\ help = "czy zwrócić pierwszą liczbę" ) argumenty = parser.parse_args() print( argumenty.a if argumenty.p else argumenty.b )
configparser csv tempfile Moduł configparser udostępnia klasę ConfigParser, której zadaniem jest parsowanie plików konfiguracyjnych. Dopuszczalne są wyłącznie pliki tekstowe, które składają się z sekcji o nagłówkach postaci [nazwa sekcji], wewnątrz których znajdują się napisy postaci zmienna = wartość lub zmienna : wartość. W nazwach sekcji rozróżniane są małe/duże litery; w nazwach zmiennych nie. Dopuszczalne są komentarze, rozpoczynające się od znaku # lub ;.
configparser csv tempfile Obiekty typu ConfigParse udostępniają m.in. następujące funkcje: sections() (options( s )); zwraca listę sekcji (zwraca listę zmiennych w sekcji s); add_section( s ) (remove_section( s )); tworzy nową (usuwa) sekcję s; has_section( s ); sprawdza, czy sekcja s istnieje; has_option( s,o ) (remove_option( s,o )); sprawdza, czy zmienna o występuje w (usuwa zmienną o z) sekcji s; get( s,o ) (set( s,o,v )); zwraca (zmienia) wartość zmiennej o z sekcji s (na v); read( f ) (write( f )); wczytuje plik o nazwie f (zapisuje konfigurację do pliku f).
configparser csv tempfile Moduł csv ułatwia parsowanie plików w formacie CSV (Comma Separated Values), które są wykorzystywane m.in. przez Excela. Klasa reader jest odpowiedzialna za odczyt plików CSV; klasa writer umożliwia zapisywanie danych w tym formacie. Plik, z którego pobieramy (do którego zapisujemy) dane podajemy jako argument konstruktora. Obiekt o typu reader jest iteratorem; każde wywołanie next( o ) zwraca kolejny wczytany wiersz (jako tablicę napisów). Obiekty typu writer posiadają metodę writerow(), która zapisuje tablicę napisów jako wiersz w pliku w formacie CSV.
configparser csv tempfile Moduł tempfile ułatwia tworzenie plików i katalogów tymczasowych. Są one tworzone w taki sposób, by przypadkiem nie usunąć żadnego z już istniejących plików/katalogów. Moduł tempfile udostępnia funkcję TemporaryDirectory(), która zwraca ścieżkę do utworzonego katalogu tymczasowego. Po wykorzystaniu, katalog wraz z zawartością zostanie automatycznie usunięty. Udostępnia on także funkcję TemporaryFile(), która zwraca obiekt, który zachowuje się jak plik i który zostanie automatycznie usunięty po zamknięciu.
multiprocessing queue threading Moduł multiprocessing ułatwia pisanie programów wieloprocesowych. Udostępnia on kilka klas, które można wykorzystać w tym celu: Process; instancje tej klasy to procesy, z których składa się program; Queue; instancje tej klasy to kolejki umożliwiające bezpieczne przekazywanie danych pomiędzy procesami; Pipe; instancje tej klasy to potoki, także wykorzystywane do bezpiecznego przekazywania danych pomiędzy procesami.
multiprocessing queue threading Nowy proces tworzymy wywołując konstruktor klasy Process i przekazując mu parametry target (procedura, którą proces będzie wykonywał) i args (argumenty przekazane do procedury). Procesy posiadają m.in. następujące metody: p.start(); uruchamia proces p; p.is_alive(); sprawdza, czy proces p nadal działa; p.join(); wstrzymuje bieżący proces do momentu, aż proces p się zakończy; p.terminate(); kończy działanie procesu p.
multiprocessing queue threading Kolejki umożliwiają wstawianie elementów na koniec (put()) i usuwanie ich z początku (get()). put() wstawia element do kolejki, o ile nie jest ona pełna; jeśli jest pełna, wstrzymuje proces do momentu, aż zwolni się miejsce. get() pobiera element z kolejki, o ile nie jest ona pusta; jeśli jest pusta, wstrzymuje proces do momentu, aż pojawi się tam jakiś element. Obie funkcje są dostępne w wersji nieblokującej (put_no_wait() i get_no_wait()); jeżeli nie można od razu pobrać/wstawić elementu, pojawia się wyjątek queue.empty/queue.full.
multiprocessing queue threading Poniższy program sortuje tablicę liczb, stosując zrównoleglone scalanie. #!/usr/bin/env python3 # -*- coding: utf-8 -*- from multiprocessing import * def sortuj( tablice ): while True: try: t1 = tablice.get_no_wait() except: return try: t2 = tablice.get_no_wait() except: tablice.put( t1 ) return tablice.put( scal( t1,t2 ) )
multiprocessing queue threading def scal( t1,t2 ): t,i1,i2 = [],0,0 while i1 < len( t1 ) and i2 < len( t2 ): if t1[i1] < t2[i2]: t.append( t1[i1] ) i1 += 1 else: t.append( t2[i2] ) i2 += 1 return \ t + (t2[i2:] if i1 == len( t1 ) else t1[i1:])
multiprocessing queue threading tablice = Queue() for i in range( 500000 ): tablice.put( [1000000 - i] ) tablice.put( [i] ) p1 = Process( target = sortuj,args = ( tablice, ) ) p2 = Process( target = sortuj,args = ( tablice, ) ) p1.start() p2.start() p1.join() p2.join() while tablice.qsize() > 1: tablice.put( scal( tablice.get(),tablice.get() ) )
multiprocessing queue threading Moduł queue udostępnia klasę Queue, którą można wykorzystać do komunikacji międzywątkowej. Moduł queue udostępnia także stosy (LifoQueue) i kolejki priorytetowe (PriorityQueue). Sposób działania kolejek modułu queue jest niemal identyczny z działaniem kolejek modułu multiprocessing (z punktu widzenia programisty te klasy są niemal identyczne).
multiprocessing queue threading Moduł threading ułatwia tworzenie programów wielowątkowych. Wątki różnią się od procesów tylko tym, że mają wspólny obszar danych. Tworzenie i korzystanie z wątków jest podobne do tworzenia i korzystania z procesów zmienia się jedynia nazwa klasy z Process na Thread.
bisect array Moduł bisect udostępnia funkcje realizujące przeszukiwanie binarne: bisect_left( t,x ); zwraca indeks pozycji, na którą powinien być wstawiony element x, aby posortowana tablica t pozostała taką; jeśli x już jest w tablicy, wskazane zostanie miejsce następujące przed pierwszym jego wystąpieniem; bisect_right( t,x ); zwraca indeks pozycji, na którą powinien być wstawiony element x, aby posortowana tablica t pozostała taką; jeśli x już jest w tablicy, wskazane zostanie miejsce następujące po ostatnim jego wystąpieniu.
bisect array Moduł array umożliwia tworzenie tablic, których wszystkie elementy mają ten sam elementarny typ. Udostępnia on klasę array, która zachowuje się jak lista, ale zużywa mniej miejsca w pamięci. Typ elementów podajemy jako argument w konstruktorze. Dopuszczalne są następujące typy: u ; znak w unikodzie; b, B, h, H, i, I, l, L ; liczba całkowita typu char, unsigned char, short, unsigned short, int, unsigned, long, unsigned long; f, d ; liczba rzeczywista typu float, double.
math/cmath random Moduły math i cmath udostępniają standardowe funkcje i stałe matematyczne operujące na liczbach rzeczywistych i zespolonych. Moduł math zawiera definicje stałych pi i e. Oprócz tego udostępnia on następujące funkcje: zaokrąglenie do bezpośrednio wyższej (ceil()) i bezpośrednio niższej liczby całkowitej (floor()); wykładnicza (exp()) i logarytmiczna (log()); pierwiastek (sqrt()); funkcje trygonometryczne (sin(), cos() itd.) i odwrotne do nich (asin(), acos() itd.);
math/cmath random funkcje hiperboliczne (acosh(), acosh() itd.); funkcje specjalne (gamma() itd.). Większość z powyższych funkcji jest dostępna w wersji dla liczb zespolonych w module cmath. Zawiera on także funkcje specyficzne dla liczb zespolonych takie, jak argument (phase()) czy też konwersja do postaci biegunowej (polar()).
math/cmath random Moduł random udostępnia rozmaite funkcje generujące liczby pseudolosowe. Należą do nich m.in.: randint( a,b ); zwraca losową liczbę całkowitą z podanego przedziału; choice( z ); zwraca losowy element zbioru z; shuffle( l ); zmienia w losowy sposób kolejność elementów listy l; sample( z,r ); zwraca próbkę r różnych losowych elementów ze zbioru z; random(); zwraca liczbę losową z przedziału [0, 1].
math/cmath random Możliwe jest także losowanie liczb zgodnie z zadanym rozkładem prawdopodobieństwa: rozkład równomierny na zadanym przedziale uniform( a,b ); rozkład beta betavariate( a,b ); rozkład gamma gammavariate( a,b ); rozkład wykładniczy expovariate( l ); rozkład normalny normalvariate( m,s ).
os i sys timeit Moduły os i sys dają programiście dostęp do rozmaitych zmiennych i funkcji systemowych. Moduł sys zawiera m.in. następujące zmienne i funkcje: argv; argumenty z linii poleceń; exit( w ); kończy działanie programu, przekazując systemowi w jako rezultat jego wykonania; path; lista katalogów, które są przeszukiwane w momencie szukania modułu do załadowania; stdin, stdout i stderr; standardowe wejście, wyjście i wyjście błędów; version; wersja używanego interpretera Pythona.
os i sys timeit Moduł os zawiera m.in. następujące zmienne i funkcje: funkcje operujące na identyfikatorze użytkownika, jego grupie, identyfikatorze procesu itd.; niskopoziomowe funkcje operujące na plikach; funkcje operujące na plikach i katalogach (chdir(), getcwd(), mkdir(), remove(), rename(), rmdir() i inne); funkcje do tworzenia procesów potomnych (execl(), fork(), kill(), nice(), spawnl() i inne).
os i sys timeit Moduł timeit udostępnia funkcję timeit, która umożliwia badanie efektywności krótkich fragmentów kodu. Aby sprawdzić, ile czasu zajmuje wykonanie interesującego nas fragmentu kodu, należy wykonać tę funkcję, przekazując jej jako argumenty kod do wykonania i liczbę powtórzeń.
os i sys timeit Poniższy program wczytuje kod, który ma zbadać, i mierzy czas jego wykonania. #!/usr/bin/env python3 # -*- coding: utf-8 -*- from timeit import timeit print( \ "Podaj kod, którego efektywność mam zmierzyć." ) print( "Czas działania kodu:", \ timeit( stmt = input(),number = 1000 ) / 1000 )