1 Wstęp JEZYK PROGRAMOWANIA PYTHON: OPERACJE NA DANYCH TYPÓW PROSTYCH, WYPROWADZANIE WYNIKÓW E. Dyguda-Kazimierowicz Źródła Pythona są bezpłatne (proszę korzystać z wersji 2.X, np. Python 2.7), poszczególne dystrybucje zawierają interpreter, standardowe moduły, pliki pomocnicze wymagane do uruchamiania programów oraz dokumentację: http://www.python.org/download Windows wersja binarna (Windows Installer, nie zawiera źródeł): http://www.python.org/ftp/python/2.7.5/python-2.7.5.msi Linux Python często standardowo zawarty w danej dystrybucji, możliwość ściągnięcia źródeł (w języku C, wymagany kompilator) lub prekompilowanych wersji binarnych 1.1 Uruchamianie i koniec pracy: Windows menu Start/.../Python (command line) lub IDLE (Python GUI) (Integrated Development Environment - interpreter Pythona opakowany w interfejs graficzny, dodatkowe funkcje: automatyczne wcięcia, debugger, itd.); koniec pracy: Ctrl+Z, Enter Linux polecenie python; koniec pracy: Ctrl+D 1.2 Edycja kodu źródłowego Darmowe edytory dla Windows i Linux OS: edytor tekstowy vi/vim z pluginem umożliwiającym podświetlanie składni: http://www.vim.org edytor tekstowy z graficznym interfejsem SciTE: http://www.scintilla.org/scite.html 1
1.3 Język Python 1 WSTEP 1.3 Język Python Python to skryptowy język programowania obiektowego: 1. interpretowany interpreter Pythona uruchamia kod zaraz po jego wpisaniu bądź załadowaniu, brak etapów kompilacji i konsolidacji (występuje tzw. kompilacja bajtowa: program źródłowy tłumaczony jest na pośrednią postać kodu bajtowego, uruchamianego następnie przez interpreter) 2. obiektowy zawiera klasy, wyjątki, egzemplarze, metody, automatyczne zarządzanie pamięcią, dziedziczenie i przeciążanie (obiektowość jest opcjonalna, z Pythona można korzystać jak z języka proceduralnego) 3. powszechnie dostępny i darmowy 4. dynamicznie rozwijany i wspierany 5. przenośny napisany w przenośnym języku ANSI C (możliwość kompilacji i uruchamiania niezależnie od platformy systemowej, rdzeń Pythona działa wszędzie tak samo, ewentualne różnice dotyczą rozszerzeń specyficznych dla systemu; standardowy interfejs graficzny do Tk, Tkinter, działa w X Window, MS-Windows i MacOS) 6. zgodny z innymi językami prosta integracja z komponentami napisanymi w innych językach, np. w C (dzięki zastosowaniu API: Advanced Programmer Interface) 7. wydajny i prosty szereg wbudowanych typów i narzędzi, wiele dodatkowych narzędzi bibliotecznych, automatyczne zarządzanie pamięcią połączone z uproszczoną składnią i budową 8. szerokie możliwości i zastosowania od narzędzi umożliwiających administrowanie systemem, poprzez skrypty internetowe (bezpłatny serwer WWW Zope) i bazy danych, do programowania numerycznego, przetwarzania obrazów, sztucznej inteligencji... 9. przykładowe zastosowania w chemii napisane w języku Python programy pymol i bkchem 1.4 Podstawowe pojęcia: 1. elementy składowe języka programowania nazwy zmiennych, słowa kluczowe, operatory, literały i ograniczniki 2. obiekty egzemplarze dowolnego typu danych, przechowują dane, tworzone przez wyrażenia 3. wyrażenia (tworzą obiekty) i instrukcje (wykonywalne wiersze kodu działające na obiekty i uruchamiające polecenia) zbudowane są z elementów składowych (wymienionych w punkcie 1.) 2
2 NAZYWANIE I TWORZENIE ZMIENNYCH 4. moduł sekwencja instrukcji zapisana w pliku 5. program kolekcja modułów 2 Nazywanie i tworzenie zmiennych identyfikator zmiennej ciąg liter, cyfr i znaków podkreślenia (_) o dowolnej długości, zaczynający się od litery lub znaku podkreślenia, nie może być słowem kluczowym (np. and, for, def), wielkość liter jest rozróżniana tworzenie zmiennych poprzez przypisanie danej nazwie jej wartości za pomocą instrukcji przypisania (możliwe przypisanie wielokrotne); wypisanie zmiennej np. przez podanie jej nazwy # oznacza w poniższych przykładach początek komentarza, czyli tekstu ignorowanego przez interpereter >>> x = 2 >>> x 2 >>> X = Y = Z = -3.14 #ta sama wartosc wielu zmiennych >>> X -3.1400000000000001 >>> imie = "Ala" >>> imie Ala >>> a, b, c = 0.123, -100, hmmm #przypisanie wielokrotne >>> c hmmm >>> lit_1, lit_2, lit_3 = "UFO" >>> lit_2 F >>> lit_1, lit_2 = lit_2, lit_1 #zamiana wartosci zmiennych >>> lit_2 U 3
2 NAZYWANIE I TWORZENIE ZMIENNYCH zmienne przechowują odwołania do obiektów (odpowiednik wskaźników w C), tej samej zmiennej można przypisywać kolejno różne typy danych (nowe przypisanie usuwa bieżącą wartość zmiennej, do usunięcia samej zmiennej służy instrukcja del nie trzeba tego robić samodzielnie, gdyż Python automatycznie usuwa nieużywane obiekty): >>> y = 2e-3 >>> y 0.002 >>> y = "a teraz napis" >>> y a teraz napis >>> dir() #zwraca liste aktualnie zdefiniowanych nazw [ X, Y, Z, builtins, doc, name, a, b, c, imie, lit_1, lit_2, lit_3, x, y ] >>> del Y, c, lit_2 #usuwa kolejne zmienne >>> dir() [ X, Z, builtins, doc, name, a, b, imie, lit_1, lit_3, x, y ] przypisanie zmiennej wartości już istniejącego obiektu nie tworzy jego kopii, powiela tylko odwołanie do tego obiektu (obie zmienne wskazują ten sam obszar w pamięci) jednak przypisanie zmiennej A (patrz przykład poniżej) innej wartości, nie zmienia B (B zachowuje swoją wartość i położenie w pamięci, natomiast dla A tworzony jest nowy obiekt): >>> A = pi >>> B = A >>> A, B ( pi, pi ) >>> A = sigma >>> A, B ( sigma, pi ) 4
3 PROSTE TYPY WBUDOWANE LICZBOWY I NAPISOWY 3 Proste typy wbudowane liczbowy i napisowy Typ tworzonego obiektu określający dozwolone dla niego wartości i wykonywane na nim operacje, jest dynamicznie rozpoznawany po sposobie jego zapisu. Tym samym nie trzeba deklarować zmiennych ani rezerwować dla nich miejsca w pamięci. Python udostępnia szereg uniwersalnych i wydajnych typów wbudowanych, dostarczając jednocześnie specyficznych dla nich metod i funkcji. 3.1 Liczby W Pythonie dostępne są cztery typy liczbowe (uszeregowane według rosnącej złożoności): liczby całkowite (odpowiednik typu long w języku C) łańcuchy cyfr pozbawione kropki dziesiętnej (poprzedzone opcjonalnym znakiem +/-), maksymalna dokładność taka, z jaką dany kompilator C traktuje liczby long (przynajmniej 4 bajty), liczby w zapisie ósemkowym i szesnastkowym mają na początku odpowiednio zero lub 0X ( 0x ) Przykłady: 0, -333, 012, 0x20, 0X7f liczby całkowite długie zapisywane jak wyżej z dodatkową literą L ( l ) na końcu, mają nieograniczoną długość Przykłady: 12345678999l, -4294967296L, 0L liczby zmiennoprzecinkowe (odpowiednik typu double w języku C) liczby rzeczywiste zapisywane z kropką dziesiętną lub w notacji naukowej: litera E ( e ) oddziela wykładnik potęgi 10 Przykłady: 0.1, -333.333, 2., 2e3, 0.567E-13 Błąd zaokrąglenia (patrz przykład poniżej) wynika z wewnętrznego reprezentowania przez Pythona liczb dziesiętnych za pomocą systemu dwójkowego ułamki dziesiętne zwykle można tylko przybliżyć przez reprezentację dwójkową, Python zaokrągla wynik przybliżenia do 17 cyfr znaczących: >>> 0.1 0.10000000000000001 liczby zespolone postaci x + yj, gdzie x, y, J to odpowiednio liczby zmiennoprzecinkowe reprezentujące część urojoną i rzeczywistą oraz liczba urojona (pierwiastek kwadratowy z liczby -1) Przykłady: 2J, 2-3j, 4.123+0.123J 5
3.2 Operatory arytmetyczne 3 PROSTE TYPY WBUDOWANE LICZBOWY I NAPISOWY 3.2 Operatory arytmetyczne Operatory umożliwiają budowanie wyrażeń, których obliczona wartość wyświetlana jest podczas interakcyjnej pracy z interpreterem ( kalkulator ). Obiekty, na które działają operatory, to operandy. Jeżeli w wyrażeniu występują operandy o różnych typach liczbowych, następuje automatyczna konwersja wszystkich operandów do najbardziej złożonego typu. operatory jednostronne operacje na pojedynczych operandach: operator negacji, - i identyczności, + (odpowiednio: zmiana znaku operandu bądź pozostawienie go bez zmian) operatory dwustronne +, -, *, /, % i **, z czego dwa ostatnie to dzielenie z reszta (operator modulo; zwraca resztę z dzielenia) i operator potęgowania ( x**y jest równoważne funkcji pow(x,y) i oznacza x y ) Operator dzielenia / w odniesieniu do liczb całkowitych zaokrągla wynik do liczby całkowitej. Prawidłowy wynik uzyskuje się, jeśli przynajmniej jedna z liczb w wyrażeniu jest typu zmiennoprzecinkowego. >>> 1/2 0 >>> -1/2-1 >>>1.0/2, 1/float(2) (0.5, 0.5) >>> 10 % 3, 17 % 7 (1, 3) >>> 2 ** 4 16 >>> 16 ** (0.25) 2.0 >>> 2.0 ** (-4), 1.0/16 (0.0625, 0.0625) Reguły pierwszeństwa operatorów określają kolejność działań przy obliczaniu wartości złożonych wyrażeń arytmetycznych najwyżej w tej hierarchii leży operator potęgowania ( wiąże najmocniej), następnie operatory jednostronne, operatory mnożenia, dzielenia i dzielenia z resztą (te trzy mają jednakowy priorytet) oraz dodawania i odejmowania (także taki sam priorytet). Operatory łączone są od lewej do prawej (z wyjątkiem potęgowania). Określoną kolejność wykonywania działań wymusić można przez użycie nawiasów i pogrupowanie podwyrażeń. 6
3.3 Napisy 3 PROSTE TYPY WBUDOWANE LICZBOWY I NAPISOWY Każdemu operatorowi dwustronnemu odpowiada operator przypisania przyrostowego, np. +=, *=, **=. Wyrażenie x += y oznacza x = x + y (i analogicznie dla pozostałych). >>> x, y = 7.123, 3 >>> x += 10 >>> x 17.123000000000001 >>> x += y + 1 >>> x 21.123000000000001 Do przekształcania typów liczb służą funkcje: int(), long(), float(), complex(). Przekształcenie liczby zmiennoprzecinkowej do całkowitej jest jednoznaczne z utratą informacji o jej części ułamkowej: >>> int(x), long(x), complex(x) (21, 21L, (21.123000000000001+0j)) 3.3 Napisy Napisy to sekwencje znaków o dowolnej długości ograniczone cudzysłowem ("), apostrofami ( ) lub potrójnym cudzysłowem/apostrofami: ("""), ( ). Ten ostatni sposób pozwala wprowadzać bloki tekstu zajmujące więcej niż jedną linię. We wszystkich przypadkach znacznik końcowy musi być tego samego rodzaju, co początkowy. Między znaki cudzysłowu wstawiać można apostrofy i odwrotnie, natomiast w potrójnych cudzysłowach wystąpić mogą jedne i drugie. >>> napis1 = Lancuchy mozna zapisac tak >>> napis1 Lancuchy mozna zapisac tak >>> napis2 = "albo tak" >>> napis2 albo tak >>> napis3 = """ewentualnie... jeszcze inaczej""" >>> napis3 ewentualnie\njeszcze inaczej 7
3.4 Operacje na napisach 3 PROSTE TYPY WBUDOWANE LICZBOWY I NAPISOWY W ostatnim z powyższych przykładów, w trakcie wprowadzania łańcucha pojawia sie wielokropek (...) interpreter oczekuje tutaj na wpisanie kolejnej linii naszego napisu, którego koniec sygnalizuje potrójny cudzysłów zamykający. W wyświetlonym napisie napis3 miejsce końca linii wyznacza sekwencja z modyfikatorem, \n będąca tutaj znakiem nowego wiersza. Sekwencje z modyfikatorem (lewym ukośnikiem) to sposób podawania znaków nie mających odpowiednika na klawiaturze (np. t to znak tabulacji poziomej, \f przejście do nowej strony, \a dzwonek) lub innych o specjalnym znaczeniu (np. \\, \, \ wstawia odpowiednio: pojedynczy ukośnik, cudzysłów, apostrof). Wpisanie nazwy dowolnej zmiennej (lub całego wyrażenia) powoduje wyświetlenie jej wartości tylko w trybie interaktywnym interpretera. Aby uzyskać podobny efekt w programie, należy użyć instrukcji print. Instrukcja print pobiera podane jej wyrażenia, oblicza ich wartości, przekształca wynik na sformatowany łańcuch wyjściowy, który następnie wypisuje na standardowe wyjście (ekran). Kolejne wypisywane łańcuchy (czyli oddzielone przecinkami argumenty instrukcji print) oddzielane są spacjami, na końcu dodawany jest znak nowego wiersza. Sekwencje z modyfikatorem są interpretowane: >>> print napis3 ewentualnie jeszcze inaczej >>> x, y, tekst1, tekst2 = 3, 4, "Ala ma", czarnych kotow >>> print tekst1, x + y, tekst2 Ala ma 7 czarnych kotow W Pythonie nie występuje typ znakowy (pojedynczy znak to łańcuch jednopozycyjny). 3.4 Operacje na napisach Niektóre operatory omówione wcześniej jako arytmetyczne ( +, *, +=, *= ) znajdują też zastosowanie do łańcuchów (łączenie i powielanie stałych napisowych). Działanie tych samych operatorów zależy od typu ich operandów (przeciażanie operatorów): >>> x + y #sumowanie liczb 7 >>> tekst1 + " kota" #laczenie napisow Ala ma kota >>> tekst1 += jeszcze psa #przypisanie przyrostowe napisow >>> tekst1 Ala ma jeszcze psa 8
3.4 Operacje na napisach 3 PROSTE TYPY WBUDOWANE LICZBOWY I NAPISOWY >>>3 * "miau " #powtarzanie napisow miau miau miau >>> tekst2 *= 4 #powielenie przyrostowe napisow >>> tekst2 kotowkotowkotowkotow Do sprawdzenia długości łańcucha służy funkcja len() (sekwencje z modyfikatorem traktowane są jako pojedyncze znaki): >>> len(tekst2) 20 >>> len("1\n2") 3 >>> len( ) 0 Łańcuchy reprezentujące poprawne literały liczbowe mogą być przekształcone na odpowiednie typy liczbowe za pomocą wymienionych wcześniej funkcji (np. float()). Odwrotną operację (konwersję na typ napisowy) przeprowadza funkcja str(). W zbliżony sposób działa także umieszczenie obiektu, który chcemy przekształcić, w odwrotnych apostrofach, (w porównaniu z funkcją str() liczby zmiennoprzecinkowe zachowywane są tutaj z większą dokładnością): >>> float( 3e2 ) 300.0 >>> Z = 2.22-0.99j >>> str(z) (2.22-0.99j) >>> Z (2.2200000000000002-0.98999999999999999j) Sprawdzenie typu obiektów umożliwia funkcja type(): >>> type(z) #typ obiektu: liczba zespolona <type complex > >>> type( Z ) #typ obiektu: napis <type str > 9