Informatyka II, II tydzień 1 Język Python: operacje i obliczenia na danych typów prostych. Wyprowadzanie wyników. Wstęp: Źródła Pythona są bezpłatne (proponuję wersję 2.4.4, ewentualnie ActivePython 2.4.3.11), poszczególne dystrybucje zawierają interpreter, standardowe moduły, pliki pomocnicze wymagane do uruchamiania programów oraz dokumentację: http://www.python.org/download/ http://www.activestate.com/products/activepython/ Windows binarka (Windows Installer, nie zawiera źródeł) 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. 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+C Linux polecenie python lub idle; koniec pracy: Ctrl+D. Edycja kodu źródłowego (dostępne wersje pod Windows i Linux): edytor tekstowy vi/vim z pluginem umożliwiającym podświetlanie składni: http://www.vim.org/ edytory tekstowe z GUI: NEdit i SciTE (w obu możliwość podświetlania składni): http://www.nedit.org/ http://scintilla.sourceforge.net/scite.html Język Python 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
2 mgr inż. Edyta Dyguda 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... 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 są 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 (1)) 4. moduł sekwencja instrukcji zapisana w pliku 5. program kolekcja modułów Zmienne w języku Python: Nazywanie i tworzenie zmiennych (zmienna obszar pamięci przechowujący dane): 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
Informatyka II, II tydzień 3 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 zmienne przechowują odwołania do obiektów (odpowiednik wskaźników w C), próba użycia niezdefiniowanej zmiennej kończy się błędem, 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
4 mgr inż. Edyta Dyguda ( sigma, pi ) Proste typy wbudowane liczbowy i napisowy: Typ tworzonego obiektu (czyli struktury danych), określający dozwolone dla niego wartości i wykonywane na nim operacje, jest dynamicznie rozpoznawany po sposobie jego zapisu (nie trzeba deklarować zmiennych, rezerwować dla nich miejsca w pamięci, itd.). Python udostępnia szereg uniwersalnych i wydajnych typów wbudowanych, dostarczając jednocześnie specyficznych dla nich metod i funkcji, działających według zoptymalizowanych algorytmów. 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 niż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 "-1"). Przykłady: 2J, 2-3j, 4.123+0.123J Operatory arytmetyczne 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)
Informatyka II, II tydzień 5 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 najbliższej liczby całkowitej (w kierunku liczb ujemnych). 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ń. 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żą następujące 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))
6 mgr inż. Edyta Dyguda Napisy sekwencje znaków o dowolnej długości ograniczone cudzysłowem ("), apostrofami ( ) lub potrójnym cudzysłowem/apostrofami: ("""), ( ). Ten ostatni sposób zapisu pozwala wprowadzać bloki tekstu zajmujące więcej niż jedną linię. We wszystkich przypadkach cudzysłów końcowy musi być tego samego rodzaju co początkowy: >>> napis1 = Lancuchy mozna zapisac tak >>> napis1 Lancuchy mozna zapisac tak >>> napis2 = "albo tak" >>> napis2 albo tak >>> napis3 = """ewentualnie... jeszcze inaczej""" >>> napis3 ewentualnie\njeszcze inaczej 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). Między znaki cudzysłowu wstawiać można apostrofy i odwrotnie, natomiast w potrójnych cudzysłowach wystąpić mogą jedne i drugie (także jednocześnie). W Pythonie nie występuje typ znakowy (pojedynczy znak to łańcuch jednopozycyjny). 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 łańcuchy drukowane są bez przecinków, na końcu dodawany jest znak nowego wiersza, interpretowane są również sekwencje z modyfikatorem: >>> 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
Informatyka II, II tydzień 7 Proste operacje na napisach łączenie i powtarzanie. Operatory zdefiniowane wcześniej jako arytmetyczne ("+", "*", "+=", "*=") znajdują też zastosowanie do łańcuchów (dodawanie 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 >>>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 >