You are on page 1of 27

Jezyk Python

dr in . Pawe K dzierski z e

Zaczynamy
Interpreter Python uruchamia si komenda python: e % python Python 1.6 (#1, Oct 13 2000, 01:16:18) [GCC 2.7.2.3] on linux2 Copyright (c) 1995-2000 CNRI. All Rights Reserved. Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All Rights Reserved. >>> Gotowoc do wprowadzenia (kolejnej) instrukcji sygnalizowana jest znakami >>> . Jeli pos s przednia instrukcja wymaga doko czenia, interpreter pokazuje ... (trzy kropki). W dalszych n przykadach, w ten sam sposb b d odr nia instrukcje od wynikw ich dziaania. e e z J zyk Python zosta pomylany tak, aby by prosty, zrozumiay dla czytajacego i atwy do nauczee s nia si , a jednoczenie elastyczny i zwi zy. Na przykad, zmiennych w ogle nie trzeba deklarowa e s e c wystarczy nada im wartoc: c s >>> x=15.0 >>> imie=Pawel Co wi cej, w tej samej zmiennej mo na przechowa dana dowolnego typu, wi c nie b dzie b dem e z c e e e napisanie po kolei: >>> x=2 >>> x=1.1234 >>> x=acuch znakw n 1

Nie znaczy to, ze Python nie rozr nia rodzaju danych musi to robi chocia by dlatego, ze ta z c z sama operacja, np. dodawanie, ma r ne znaczenie dla r nych typw: suma arytmetycznej dla z z liczb, aczenia dla napisw itp. Raz utworzona zmienna istnieje tak dugo, jak jest potrzebna Python sam sprzata nieu ywana z pami c. Ale prba u ycia zmiennej, ktrej nie ma, spowoduje bad (o nazwie NameError). e z Je eli instrukcja, ktra wydamy, da jaki wynik (wartoc), wartoc ta zostanie wypisana . Mo na z s s s z wi c u ywa Pythona jako kalkulatora: e z c >>> a=1 >>> a+5 6 >>> (a+5)/2.5 2.3999999999999999 Ale uwaga! Nie zawsze wynik mo e by zgodny z oczekiwaniem. We my taki przykad: z c z >>> 1/5 0 Wbrew pozorom, jest to wynik prawidowy . Poniewa Python rozpoznaje typ zmiennych po ich z zapisie, w podanym wyra eniu widzi on dwie liczby cakowite. Przy prbie dzielenia, stosuje z do nich zatem operacj dzielenia cakowitego, odrzucajac reszt . Aby uzyska dzielenie rzeczywie e c ste, co najmniej jeden operand musi by liczba rzeczywista: c >>> 1/5.0 0.2 Niestety, problem taki pojawia si jeli dane sa podawane przez u ytkownika programu, od ktrego e s z nie mo na przecie wymaga stosowania si do takich regu. Dlatego Python umo liwia zamian z z c e z e typu na wymagany przez programist . Poni sza tabelka zestawia odpowiednie funkcje: e z Funkcja Zamienia chr() wartoc cakowita na znak o odpowiednim kodzie ASCII s complex() wartoc cakowita, rzeczywista lub napisowa na zespolona s ord() znak na jego kod ASCII float() wartoc cakowita lub napisowa na rzeczywista s int() wartoc rzeczywista lub napisowa na cakowita s str() jakakolwiek wartoc na napis s eval() interpretuje wartoc napisowa tak, jak Python, i oblicza wynik s

Tylko podczas interaktywnej pracy z interpreterem. Programy w Pythonie, a tak e procedury z zewn trznych moduw, z e wypisza tylko to co jest obj te instrukcjami print. e Z punktu widzenia konwencji tego j zyka, stosujacego r nie dziaajace operatory, w zale noci od typu operandw. e z z s

A oto konkretny przykad: program prosi u ytkownika o dane (funkcja input()), nast pnie zaz e mienia typ na rzeczywisty i oblicza wynik dzielenia: >>> a = input(Podaj a: ) >>> b = input(Podaj b: ) >>> print Wynik dzielenia: , float(a)/b

1.1

Biblioteki podprogramw
Zestaw dziaa udost pnianych przez sam interpreter Pythona jest raczej skromny, nawet je eli n e z chcielibymy u ywa go tylko jako kalkulatora. Natomiast bardzo bogaty zestaw r nych funks z c z w bibliotekach podprogramw. Nawet standardowe funkcje matematyczne nie cji mo na znale c z z sa adowane bez potrzeby, aby nie zajmoway pami ci. Aby z nich skorzysta , trzeba wczyta e c c odpowienia bibliotek (modu) Pythona: e >>> import math >>> math.sin(math.pi/2) 1.0 Instrukcja import su y wanie do tego, aby zaadowa do pami ci interpretera zadana bibliotek z s c e e podprogramw. Mo na to zrobi tak jak powy ej, ale jak wida , korzystanie z zawartoci moduu z c z c s nie jest wtedy zbyt wygodne, bo trzeba u ywa skadni modu.funkcja() lub modu.staa. Dlaz c tego cz sto aduje si z wybranego muduu albo wszystko hurtem, albo tylko wybrane elementy: e e >>> from math import sin,pi # Wczytaj funkcj sin() i staa pi e >>> sin(pi/2) 1.0 >>> from math import * # aduj wszystkie obiekty moduu math >>> cos(pi) -1.0 Wszystko od znaku # do ko ca linii jest traktowane jako komentarz (czyli po prostu ignorowane). n W rzeczywistoci, mo na bardzo atwo tworzy wasne moduy. Jeli zapiszesz kod Pythona w s z c s pliku z rozszerzeniem .py, np. funkcje.py, to wydanie w interpreterze komendy >>> import funkcje wystarcza, aby mc z niego korzysta (jeszcze do tego wrcimy). c Standardowa instalacja Pythona zawiera dziesiatki r nych moduw, zawierajace od podprogra z mw audiomedialnych do procedur obsugi plikw zip. Przykad poni ej aduje z moduu string z funkcj do konwersji wielkoci liter i pokazuje jej zastosowanie: e s

Moduu string u yem dla prostoty przykadu. W rzeczywistoci, jest on przestarzay, bo wszystkie funkcje operujace z s na napisach sa dost pne bezporednio w samych napisach (patrz rozdzia 2.1). e s

>>> from string import capwords >>> capwords(JaKI TAKI napis) s Jaki\266 Taki Napis Przykad ten pokazuje co jeszcze: wartoci b dace a cuchami znakw wypisywane sa w apos s e n strofach i ze znakami nie-ASCII zamienionymi na kody numeryczne.

1.2

Formatowanie wynikw
Na wypisywaniu ostatnio obliczonej wartoci przez Python nie mo na polega : z jednej strony, s z c nie zawsze wyglad b dzie nam odpowiada, z drugiej za, wartoci te nie sa wypisywane, jeli e s s s uruchamia si program zapisany w pliku (tzn. nie jest wpisywany interakcyjnie). Dlatego do wye prowadzania wynikw nale y u ywa wbudowanej instrukcji print: z z c >>> print "Cze" sc Czec s >>> a,b,c = 1,2,3 >>> print "Wynik:", a+5 Wynik: 6 >>> print Wspczynniki: a=%d, b=%d, c=%d % (a,b,c) Wspczynniki: a=1, b=2, c=3 Stop. Ten przykad jest doc skondensowany i ilustruje kilka rzeczy na raz: s Mo na przypisywa wartoci kilku zmiennym jednoczenie (linia 3); z c s s Napisy mo na wpisywa w apostrofach lub cudzysowach. Jest to bardzo wygodne: z c >>> print Przykad "a" Przykad "a" >>> print "Przykad b" Przykad b Do wstawiania wartoci w napis mo na u y pl formatowanych %d oraz operatora % s z z c (patrz dwie ostatnie linie). Wyjanienia wymaga to ostatnie. Operator % jest operatorem dwuargumentowym, ktrego lewym s argumentem jest ciag znakw, a prawym dane do sformatowania i wstawienia w ten ciag znakw. Wynikiem jest tak e ciag znakw, w ktrym pola oznaczone znakami % w lewym argumencie zoz stay zastapione odpowiednio sformatowanymi wartociami danych z prawego argumentu. Jeli s s danych jest wi cej ni jedna, trzeba je wzia w nawias (aby byy potraktowane jako jeden argue z c ment). 4

Oznaczenia pl sa podobne jak w j zyku C . Po znaku % mo e wystapi liczba cakowita okre e z c slajaca docelowa szerokoc pola dodatnia oznacza dosuni cie wartoci do prawej strony pola, s e s ujemna do lewej. Jeli wartocia do wstawienia jest liczba rzeczywista, mo na oprcz szeros s z koci pola poda (po kropce) liczb miejsc po przecinku. Wzorzec pola jest zako czony litera s c e n okrelajaca typ wpisywanej wartoci. Podane w tabeli 1 przykady powinny wyjani reszt . s s s c e Tablica 1: Formatowanie danych za pomoca operatora %. W przykadzie szstym od dou, podana szerokoc pola (2) jest za maa, dlatego zostaje zignorowana. W wynikowych a cuchach znakw s n zaznaczono spacje. Kod typu wartoci s Przykad Wynik c (znakowa) %4c % 65 A %-4c % 66 B %4d % 65 65 d, i (cakowita dziesi tna) e %04d % 65 0065 %-4i % 65 65 %e % 250 2.500000e+02 e, E (rzeczywista wykadnicza) %.3e % 250 2.500e+02 %10.1E % 250 2.5E+02 %f % 250 250.000000 f (rzeczywista zmiennoprzecinkowa) %10.3f % 250 250.000 %.2f % 250 250.00 %-10.3f % 250 250.000 %-5.0f % 3.14159 3 %g % 250 250 g, G (jak f lub e) %g % 250.01 250.01 %g % 2500000 2.5e+06 %2o % 250 372 o (cakowita semkowa) %05o % 250 00372 %5s % bis bis s (ciag znakw) %-5s % bis bis x, X (cakowita szesnastkowa) %x % 250 fa %04X % 250 00FA

1.3

Zestaw survival poskramiacza we y z


Zeby si umie odnale c w gaszczu moduw, podprogramw i innych obiektw j zyka Python, e c z e niezwykle pomocne sa dwie rzeczy: wbudowana funkcja dir() oraz a cuchy dokumentacji obiek n tw __doc__. Wynikiem funkcji dir() jest lista nazw atrybutw podanego obiektu (w Pythonie prawie wszystko jest obiektem):

R nice sa jednak istotne. Python dokona konwersji typu wyprowadzanej wartoci na odpowiedni dla typu pola, z s natomiast C nie.

>>> import math >>> dir(math) [__doc__, __name__, acos, asin, atan, atan2, ceil, cos, cosh, e, exp, fabs, floor, fmod, frexp, hypot, ldexp, log, log10, modf, pi, pow, sin, sinh, sqrt, tan, tanh] W powy szym przykadzie, uzyskalimy list nazw wszystkich obiektw z moduu math. Wi kz s e e szoc z nich to nazwy funkcji matematycznych dostarczanych przez ten modu. Dwa specjalne s atrybuty: __doc__ i __name__ wyst puja w prawie ka dym obiekcie (oprcz liczb). Pierwszy e z z nich to skrcona dokumentacja obiektu, drugi za to po prostu jego nazwa: s >>> print math.__doc__ This module is always available. It provides access to the mathematical functions defined by the C standard. >>> dir(math.acos) [__doc__, __name__, __self__] >>> print math.acos.__doc__ acos(x) Return the arc cosine of x. dir() i __doc__ zast puja map i kompas. Niestety, chocia Python jest w stanie zapewni , ze e e z c ka dy obiekt b dzie mia atrybut __doc__, to nie napisze dokumentacji za programist . Dlatego z e e cz ste sa takie obiekty, ktrych __doc__ nie ma zadnej wartoci. e s

1.4

Wasne programy i moduy


Stworzenie osobnego programu w Pythonie jest bardzo proste. Wystarczy kolejne instrukcje, tak jak podaje si je interpreterowi, zapisa w zwykym pliku tekstowym. Standardowym rozszerzee c niem dla takich plikw jest .py pod Unixem nie trzeba tego przestrzega , ale pod Windows c wanie po rozszerzeniu rozpoznawana jest zawartoc pliku. Oczywicie, mo na programy pisa s s s z c zarwno w vi jak i w Notatniku, jednak pod obydwoma systemami polecam SciTE (ktry w wersji dla Linuxa potrzebuje bibliotek GTK+, ale sa one standardowo dost pne we wszystkich nowszych e dystrybucjach). Dla dobrze znajacych edytor vi, prawdopodobnie najlepsza alternatywa b dzie vim e z ustawionym podwietlaniem skadni dla Pythona. Jest jeszcze i Emacs, ktry podobno potra s wszystko :). OK, przejdzmy do rzeczy. Utaro si , ze pierwszy program robi tylko tyle: e print Czec wiecie s s Wa niejsze jest to, jak go uruchomi . Powiedzmy, ze zapisalimy go w pliku hello.py, wtedy z c s : uruchomienie programu wygladaoby tak

Oczywicie, niezale nie od metody uruchomienia, Python musi by wczeniej zainstalowany w systemie. s z c s

python hello.py Komend t nale aloby wpisa w okienku DOS pod Windows lub z poziomu shella w Unixie. e e z c Istnieje jednak wygodniejszy sposb. Pod Windows, nale y skojarzy typ pliku .py z interpreterem z c Pythona przy pierwszej prbie otworzenia pliku z takim rozszerzeniem, pojawi si okienko z e pytaniem Jakiego programu u y do otwarcia tego pliku. Wybr interpretera Pythona domylnie z c s spowoduje powstanie odpowiedniego skojarzenia, tak ze nast pnym razem podwjne klikni cie od e e razu uruchomi program. Pod Uniksem, robi si to troch inaczej . Po pierwsze, trzeba nada plikowi prawa wykonywania: e e c chmod +x hello.py Oprcz tego, w pierwszej linii pliku powinna znale c si informacja, gdzie szuka interpretera dla z e c z reszty tekstu w pliku (pena scie ka dost pu po znakach #!), np. taka: e #!/usr/local/bin/python Tutaj pojawia si jednak drobny problem r ne dystrybucje Linuxa (i inne Unixy) maja r ne e z z poglady na to, gdzie instalowa opcjonalne oprogramowanie. Zeby zapewni lepsza przenonoc c c s s mi dzy r nymi maszynami, lepiej jest poda pierwsza linijk programu w formie: e z c e #!/usr/bin/env python z Zapewni to znalezienie interpretera gdziekolwiek, o ile tylko jest w jednym z katalogw w scie ce (tzn. zmiennej srodowiska $PATH). Jeli zamierzamy utworzy nie program, ale modu Pythona (czyli zestaw podprogramw), nie s c sa potrzebne zadne dodatkowe operacje. Komenda import hello potraktuje pierwszy znaleziony plik hello.py jako modu Pythona, tj. zaaduje go do pami ci interpretera i wykona zawarte w e nim instrukcje. Wystarczy, ze plik ten znajdzie si w ktrym z katalogw wskazywanych przez e s zmienna srodowiska $PYTHONPATH lub w katalogu bie acym. z Jak sprawi , aby Twoje moduy i podprogramy miay wewn trzna dokumentacj (__doc__), opic e e suj w sekcji 5.2 na stronie 23. e

Dane w Pythonie. Wprowadzanie i operowanie danymi.


Trzy r ne typy danych byy wprowadzone przy okazji dotychczasowych przykadw, mianowicie z liczby cakowite, rzeczywiste oraz a cuchy znakw. Wprawdzie typw danych si nie deklaruje, n e ale interpreter Pythona musi je rozr nia inaczej przecie dodaje si liczby, a inaczej a cuchy z c z e n

Graczne systemy obsugi u ytkownika dla Linuxa, takie jak GNOME i KDE, tak e umo liwiaja stworzenie skojarze z z z n typu pliku z odpowiednim programem i ikona.

znakw. Rozpoznawanie typu danej jest doc proste i zale y od tego, jak jest zapisana. Ciag tylko s z cyfr b dzie potraktowany jako liczba cakowita. Mo e ona by poprzedzona znakiem (+/), zerem e z c (co oznacza notacj semkowa) lub sekwencja 0x (zero iks) oznaczajaca notacj szesnastkowa: e e >>> +17 17 >>> 017 15 >>> -0x17 -23 Ciag cyfr zawierajacy kropk dziesi tna lub/i wykadnik (po literze e lub E) jest rozpoznawany jako e e liczba rzeczywista (zawsze w notacji dziesi tnej). Natomiast a cuchy znakw musza wystapi w e n c apostrofach lub cudzysowach (i po tym wanie sa rozpoznawane): s >>> 10.0100 10.01 >>> 1e1 10.0 >>> -1e10 -10000000000.0 >>> +314.15E-02 3.1415 >>> "Dana napisowa" Dana napisowa Istnieje jeszcze jeden sposb podawania danych typu a cuchowego, mianowicie mi dzy potrjn e nymi cudzysowami. Umo liwia on w prosty i wygodny sposb podawanie wielu linii tekstu: z >>> opis="""To jest przykad ... tekstu, ktry rozciaga si e ... na kilka linii.""" >>> print opis To jest przykad tekstu, ktry rozciaga si e na kilka linii. Znaki ... wypisywane sa przez interpreter Pythona i sygnalizuja, ze oczekuje on na kontynu acj poprzedniej instrukcji. e

2.1

Dane sa obiektami!
Wynalezienie poj cia obiektu zupenie zmienio sposb mylenia programistw. Na czym zatem e s polega jego u ytecznoc? z s Pierwsza zaleta programowania obiektowego jest zwiazanie danych z podprogramami, ktre je przetwarzaja. Wydaje si to mao znaczace, ale niezwykle uprocio prac , szczeglnie nad du ymi e s e z programami. Ot starszej generacji j zyki tzw. strukturalne, pozwalajac tworzy biblioteki podz e c programw i wasnych typw danych, zaniedbyway problem wygodnego z nich korzystania i modykacji. Po pierwsze, trudno zapami ta jakie funkcje dostarcza du a biblioteka, do czego ka da e c z z z nich su y i jak jej u ywa . Po drugie, jeli chcemy zmodykowa jaki zo ony typ danych, na z z c s c s z ktrym operuja podprogramy z tej biblioteki, wymaga to poprawienia praktycznie wszystkich tych podprogramw. W podejciu obiektowym, wszystkie zwiazane ze soba dane oraz podprogramy do operacji na nich s (zwane metodami) sa zebrane w jeden obiekt. Python idzie tu jeszcze krok dalej: ka dy obiekt z . Ju samo to uatwia zycie: je li np. zastanawiasz si , jakie zawiera tak e swoja dokumentacj z e z s e masz narz dzia do operowania napisami, znajdziesz je w ka dym obiekcie typu a cuchowego, i e z n ka de z nich powinno by samo-udokumentowane: z c >>> dir() [capitalize, center, count, endswith, expandtabs, find, index, isdigit, islower, isspace, istitle, isupper, join, ljust, lower, lstrip, replace, rfind, rindex, rjust, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper] >>> print .lower.__doc__ S.lower() -> string Return a copy of the string S converted to lowercase.

2.2

Struktury danych, czyli dlaczego wygodnie jest programowac w Pythonie


Kompilowane j zyki programowania z reguy wymagaja jawnej deklaracji wszystkich typw dae nych i zmiennych, z ktrych b da korzysta . Ma to nieocenione zalety z punktu widzenia szybkoci e c s i efektywnoci gotowego programu, ktry nie musi zawiera kodu odpowiedzialnego za sprawdzas c nie typu, formatu czy poprawnoci danych ani doboru odpowiednich operacji. Ponadto, niezb dne s e struktury danych moga zosta stworzone dokadnie na miar zadania. c e Zalety te sa jednak kosztowne z punktu widzenia programisty, bowiem du a cz sc jego czasu z e pochania zaprojektowanie, zaprogramowanie i przetestowanie odpowiednich struktur danych. Jest to koszt w wielu przypadkach zupenie niepotrzebny, jako ze zwykle wa niejsza jest efektywnoc z s pracy czowieka, a nie programu.

Obiektami sa tak e podprogramy i biblioteki podprogramw (moduy). z

I tu wanie otwiera si pole do popisu dla gotowych, uniwersalnych struktur danych dostarczanych s e przez j zyki interpretowane. W Pythonie, dost pne sa cztery rodzaje takich struktur: e e a cuchy (ang. string). Podawane w cudzysowach lub apostrofach. Zwykle nazywam je n napisami, bo przechowywanie napisw to ich najcz stsze zastosowanie. Jednak nie jest to e zadnym ograniczeniem a cuch jest po prostu dowolnej dugoci ciagiem dowolnych baj n s tw. Zlepki (ang. tuple). Zlepek jest to kilka danych (dowolnego typu) wymienionych kolejno w nawiasach okragych. Zlepki w Pythonie stosuje si zwykle tam, gdzie skadniowo musi e znale c si jedna dana, a chcemy mie acznie kilka pierwszym przypadkiem, kiedy si z e c e z tym spotkalimy, by prawy operand operatora % do formatowania napisw. s Listy (ang. list). Listy to tak e poaczenia (sekwencje) danych, ktre moga by tego samego z c lub r nych typw. Podawane sa w nawiasach kwadratowych. z Sowniki (ang. dictionary). Jest to najbardziej zaawansowana struktura danych. Jej zaleta jest to, ze ka da dana pami tana w sowniku ma wasny unikalny klucz, b dacy jej identykato z e e rem. Wprawdzie elementy zlepku lub listy sa ponumerowane, ale sownik ma ta zalet , ze e klucz mo e by dowolnego typu. W rzeczywistoci klucz tak e jest dana powoduje to, z c s z ze sowniki sa bardziej uniwersalne ni np. rekordy w Pascalu. Na przykad, sownik mo na z z wykorzysta do aczenia danych w pary. Sowniki z kolei rozpoznawane sa po nawiasach c klamrowych. Ka dy z tych typw nadaje si do innych celw, i ka dy ma inny zestaw metod warto porwna z e z c wyniki komend dir(), dir(()), dir([]) i dir({}). Jednak mi dzy a cuchami, zlepkami i e n listami istnieje znaczace podobie stwo, wszystkie trzy sa bowiem tzw. sekwencjami. n

2.3

Sekwencje, indeksy i klucze


Sekwencja to typ danej, ktrej elementy maja okrelona kolejnoc i okrelone numery porzadkowe s s s (indeksy). Numery te zaczynaja si zawsze od zera. Dla ka dej sekwencji, mo na odwoa si do e z z c e jej dowolnego elementu podajac jego indeks (niezale nie od rodzaju sekwencji, indeksy zawsze z umieszcza si w nawiasach kwadratowych): e >>> z = (a, 12, 0.001) # Zlepek trzech danych >>> l1 = [] # Pusta lista >>> l2 = [ala, ola] # Lista dwch napisw >>> print z[0], z[2], l2[1] a 0.001 ola >>> nap = JAKI NAPIS # acuch te jest sekwencja S n z >>> nap[2] K 10

O indeksach sekwencji najwygodniej jest myle w ten sposb, jak gdyby numeroway one przes c grdki mi dzy elementami, natomiast dotyczyy elementw na prawo od danej przegrdki. W ten e sposb atwo jest sobie wyobrazi , ze indeks [0] oznacza pierwszy element sekwencji (na prawo c od zerowej przegrdki). Mo na tak e liczy od ko ca (jeli podany indeks jest ujemny) indeks z z c n s [-1] dotyczy zatem elementu ostatniego (tego za przegrdka pierwsza od ko ca). n Indeksowanie sekwencji pozwala jednak na wi cej: mo na podawa zakresy indeksw (z dwue z c kropkiem): >>> napis = Ala ma kota >>> lista = [a, b, 1, 2] >>> print napis[0:3], napis[-4:] Ala kota >>> lista[2:] [1, 2] >>> lista[:-2] [a, b] Zakresy le a jakby mi dzy podanymi przegrdkami, zatem [1:-1] oznacza pod-sekwencj elez e e mentw od drugiego do przedostatniego. Opuszczenie w zakresie lewego indeksu oznacza zakres od poczatku sekwencji, opuszczenie prawego do ko ca. Powszechny zatem w Pythonie idiom n [:] oznacza zakres od poczatku do ko ca; jest wi c najprostszym sposobem na uzyskanie kopii n e oryginalnej sekwencji (zakres jest zawsze sekwencja tego samego typu). Do zakresw mo na nawet u y instrukcji przypisania. Przypisanie takie powoduje wymienienie z z c caego podzakresu na nowy, przy czym nie musi si zgadza ani typ, ani nawet liczba elementw: e c >>> >>> [2, >>> >>> [1, lista = [1, 2, 3, 4] lista[1:3] 3] lista[1:3] = [napis] lista napis, 4]

Warto jeszcze zauwa y , ze u ywanie zakresw jest cz sto bezpieczniejsze ni pojedynczych inz c z e z deksw, poniewa odwoanie si do nieistniejacego elementu sekwencji jest w Pythonie b dem. z e e We my taki przykad: z >>> napis=TEST >>> napis[5] # Nie ma piatego elementu! Traceback (innermost last): File "<stdin>", line 1, in ? IndexError: string index out of range >>> napis[5:6] # To samo znaczenie co przedtem 11

Najbardziej u yteczna z sekwencji jest lista. A to z tego prostego powodu, ze tylko elementy liz . W zadnej innej sekwencji nie sty mo na dowolnie zmienia , dodawa , usuwa , przestawia itd z c c c c mo na nawet podmieni pojedynczego elementu: z c >>> napis=napis prbny >>> napis[0] = N # Nie da si! e Traceback (innermost last): File "<stdin>", line 1, in ? TypeError: object doesnt support item assignment >>> zlepek = (1, 2, 3) >>> zlepek[1] = 5 # To samo... Traceback (innermost last): File "<stdin>", line 1, in ? TypeError: object doesnt support item assignment >>> lista = [1, 2, 3] >>> lista[1] = a # A tak mona! z >>> lista [1, a, 3] Mwi si ze zlepki i a cuchy sa typami niemutowalnymi, a listy (a tak e sowniki) sa mutowalne e n z (ang. odpowiednio mutable i immutable). Ta podstawowa r nica ma konsekwencje np. w dziaaz niu metod specycznych dla r nych typw. Wynikiem dziaania metod obiektw a cuchowych z n jest zawsze zmieniona kopia, dziaaja one zatem jako funkcje (zwracaja nowa wartoc): s >>> n=ala >>> n.upper() ALA >>> n ala Metody modykujace listy natomiast dziaaja na oryginale, tj. na obiekcie dla ktrego zostaja wywoane: >>> >>> >>> [1, l = [2, 3, 1] l.sort() l 2, 3]

Podstawowa cecha sekwencji kolejnoc elementw umo liwia wprawdzie takie sztuczki jak s z operowanie zakresami, ale w niektrych przypadkach okazuje si niewygodna. Nie mo na mie w e z c Pythonie sekwencji o indeksach nie b dacych liczbami cakowitymi, nie mo na te w sekwencji e z z zapami ta danych wyrywkowo, np. tylko pod numerami 20 i 100: e c

Tak samo mo na dowolnie zmienia elementy sownikw, jednak sownik nie jest sekwencja. z c

12

>>> dane = [] >>> dane[20] = Dana dwudziesta Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: list assignment index out of range Pomocne w takich kopotach sa wanie sowniki. U ycie w powy szym przykadzie sownika s z z wygladaoby niemal e identycznie: z >>> dane = {} >>> dane[20] = Dana dwudziesta # Dziaa! >>> dane[100] = Dana setna >>> print dane {100: Dana setna, 20: Dana dwudziesta} ale reprezentacja jest nieco inna: ka dy element sownika jest para klucz:warto, i nie obowiaz sc zuje zadna kolejnoc elementw. Klucze sownikw sa odpowiednikami indeksw sekwencji, ale s moga by dowolnego typu, nawet w tym samym sowniku. c

Instrukcje sterujace
Zgodnie z lozoa j zyka, aby nie wprowadza nadmiaru instrukcji, Python oferuje tylko trzy e c instrukcje sterujace: warunkowa if oraz p tle iteracyjna for i warunkowa while. Rozwiazanie e takie, cho cz sto krytykowane przez programistw wychowanych na innych j zykach (a co z c e e repeat until albo z case ?), ma istotne zalety czas nauki jest krtszy, a tumaczenie algorytmw na Python w du ym stopniu jednoznaczne. W poaczeniu z innymi cechami skadni j zyka, z e zwaszcza sposobem deniowania struktury kodu (blokw instrukcji o czym za chwil ), powoe duje to, ze programw w Pythonie praktycznie nie da si pisa niezrozumiale. e c

3.1

Zrb to pod warunkiem, ze. . .


Zacznijmy od instrukcji warunkowej if. Jej skadnia wyglada tak: >>> if warunek: instrukcja Chyba trudno o prostsza posta . Zwr uwag na dwukropek jest on niezb dnym elementem c c e e skadni wszystkich instrukcji sterujacych (i nie tylko). Mowiac oglniej, dwukropek oznacza, ze dalej nast puje blok instrukcji (zatem mo e by wi cej ni jedna). e z c e z Na razie, zajmijmy si jednak warunkiem. Dotychczas nie wspominaem, ze Python posiada jaki e s typ logiczny z tego prostego powodu, ze takiego nie ma. Co ciekawsze, warunek mo e by z c 13

zupenie dowolnego typu! Mimo to rozr nienie, czy warunek jest speniony (prawdziwy) czy te z z nie, jest raczej intuicyjne: Po pierwsze, dost pne sa operatory porwnania: rwne (==), r ne (!=), wi ksze (>), mnieje z e sze (<), wi ksze lub rwne (>=) itd. oraz logiczne and, or i not. Wynik ich dziaania jest e oczywicie zgodny z oczekiwaniem. W rzeczywistoci, daja one wartoc cakowita 0 (nies s s prawda) lub 1 (prawda). Jest tak e specyczny dla Pythona operator in: warunek dana in z sekwencja jest prawdziwy, jeli dana jest elementem sekwencji. s Jeli warunek jest dowolnego typu liczbowego, wartoc zerowa oznacza ze nie jest speniony s s (nieprawd ). Wartoc niezerowa jest rwnoznaczna ze spenieniem warunku. e s Jeli warunek jest innego typu, wartoc pusta jest faszywa, a dowolna inna prawdziwa. s s W szczeglnoci, warunkiem niespenionym jest pusty napis , zlepek (), pusta lista [] s lub pusty sownik {}. Natomiast uwaga napis zawierajacy cho by tylko spacje jest c warunkiem prawdziwym. Istnieje jeszcze specjalna wartoc None, nie majaca typu i oznaczajaca brak wartoci. Jest s s ona zawsze warunkiem faszywym. Jeli jednak caa lista powy szych mo liwoci jest zbyt skomplikowana przy pierwszym podejciu, s z z s s zawsze mo na sobie poradzi korzystajac tylko z operatorw wymienionych w punkcie pierwz c szym. Zwracam jednak uwag na r nic mi dzy operatorem przypisania = (ktry nadaje wartoc), e z e e s a operatorem porwnania == (ktry su y do sprawdzenia wartoci). z s A oto i kilka przykadw : >>> x,y = 1,1 >>> if x==1 and y==1: print "Obie jedynki" Obie jedynki >>> if a in Ala: print "Jest a!" Jest a! >>> if x: x+y 2 >>> if []: print l[0] # Tym razem nic >>> l = [a] >>> if l: print l[0] a Instrukcja if ma klauzul w przeciwnym razie, czyli else (po ktrym te niezb dny jest dwue z e kropek):

Z przykadw usuni to, dla oszcz dnoci miejsca, znaki . . . wypisywane przez interpreter Pythona w oczekiwaniu na e e s kontynuacj instrukcji po if. W odpowiedzi nale y wprowadzi pusta lini (Enter) objanienie znajduje si dalej e z c e s e w tekcie. s

14

>>> x = 0 >>> if x: print "X niezerowe!" ... else: print "Zero!" Zero! Zaraz po else mo e nastapi kolejna instrukcja if. Poniewa w Pythonie wanie w ten sposb z c z s buduje si instrukcje wielokrotnego wyboru (odpowiednik case w Pascalu), zdeniowane jest e dodatkowe sowo kluczowe elif, b dace skrtem od else if: e >>> ... ... ... ... if x==0: print "Zero!" elif x==1: print "Jeden!" elif x==2: print "Dwa!" elif x==3: print "Trzy!" else: print "Poddaj si!" e e

Wreszcie, pozostao wyjani jak pod kontrola instrukcji if (lub klauzul elif lub else) umieci s c s c wi cej ni jedna instrukcj , czyli blok. Python umo liwia to w sposb bardzo prosty, jednoczee z e z snie wymuszajac na programicie czytelnoc zapisu. Mianowicie, za blok instrukcji uwa ane sa s s z wszystkie linie o takim samym wci ciu (ang. indent), czyli odst pie od poczatku linii. Zatem w e e poni szym przykadzie: z >>> if x: ... print X jest niezerowe ... print ale to nie szkodzi ... obie instrukcje print zostana wykonane tylko wtedy, gdy x b dzie warunkiem spenionym. e W przypadku pracy interakcyjnej, interpreter Pythona zawsze oczekuje na kolejna lini bloku wy e pisujac wielokropek. W tej sytuacji, wpisanie linii o innym wci ciu ni reszta bloku jest traktowane e z jako bad. Zeby kontynuowa program (bez wci cia), nale y najpierw zako czy blok przez wpi c e z n c sanie pustej linii (Enter). W przypadku pisania programu w pliku tekstowym, te dodatkowe puste linie nie sa potrzebne. Zawsze jednak wci cia w kodzie w j zyku Python sa znaczace, zatem nie e e potrzebne spacje na poczatku linii (lub w wydawaoby si pustych liniach odst pw) sa traktowane e e jako b dy. e

3.2

W koo Macieju, czyli petle


Po prze wiczeniu, przy okazji instrukcji if, meandrw blokw instrukcji i warunkw logicznych c Pythona, instrukcje p tli zostay na deser. Zaczniemy od while, od razu na konkretnym przykae dzie:

15

>>> while lista: ... print lista.pop() ... Analogicznie do skadni if, tutaj tak e mamy dwukropek i po nim blok instrukcji z wci ciem. z e Instrukcje w bloku p tli while sa wykonywane tak dugo, jak dugo warunek po sowie while e jest speniony. Tutaj warunkiem jest lista (nazwa susznie sugeruje, ze chodzi mi o zmienna typu lista), jest on zatem prawdziwy wtedy, gdy lista zawiera przynajmniej jeden element. Instrukcja print lista.pop() powoduje zdj cie (usuni cie) ostatniego elementu z listy oraz jego wydruk. e e Caoc zatem spowoduje skasowanie wszystkich elementw listy, z wypisaniem ich na ekranie (od s ostatniego). P tla zako czy si wtedy, gdy lista b dzie pusta. e n e e Podany przykad reprezentuje przypadek, gdy najpierw nale y sprawdzi prawdziwoc warunku, z c s a dopiero p niej (ewentualnie) wykona odpowiednie instrukcje (lista mo e by bowiem pusta z c z c wczeniej, wi c nie byoby co usuwa ani wypisywa ). Jest to naturalne zastosowanie p tli while s e c c e tak e w innych j zykach programowania. Jednak cz stym przypadkiem jest koniecznoc najpierw z e e s wykonania instrukcji w p tli, a potem sprawdzenia warunku. e We my taka sytuacj . U ytkownik programu ma wprowadzi zestaw danych (np. wyniki pomiaz e z c rw). Liczba danych nie jest wczeniej znana to u ytkownik daje sygna, ze zako czy ich s z n podawanie (np. wpisujac zero lub pusta lini ). Zatem kod programu wczytujacy dane musi by e c wykonywany w p tli warunkowej, ale warunek zako czenia te jest wczytywany w tej samej p tli, e n z e nie mo e by zatem sprawdzony przed jej wykonaniemi . W Pythonie, odpowiedni kod wyglaz c daby tak: >>> pomiary = [] >>> while 1: # Warunek zawsze prawdziwy ... dana = raw_input(Podaj dana:) ... if not dana: break # Przerwanie ptli e ... pomiary.append(float(dana)) ... Jak wida , w takich razach korzysta si z konstrukcji while 1: i przerywa p tl instrukcja break. c e e e Rozwiazanie takie jest bardzo elastyczne, umo liwia bowiem przerwanie p tli w dowolnym miej z e scu (tutaj: przed zapami taniem zb dnej danej oznaczajacej koniec wprowadzania) lub pod r e e z nymi warunkami. Jest jeszcze instrukcja continue, powodujaca przejcie do nast pnego obrotu s e p tli (z opuszczeniem ewentualnych instrukcji poni ej). e z Pozostaa do omwienia p tla iteracyjna for dziaa nieco inaczej, ni ucza przyzwyczajenia wye z niesione z innych j zykw. Jest tak e istotna r nica mi dzy znaczeniem operatora in w konteke z z e scie p tli for i w kontekcie warunkw logicznych w if i while. Mianowicie, in jest integralnym e s elementem skadni p tli iteracyjnej, i oznacza jej wykonanie dla ka dego elementu podanej see z kwencji:

w Pascalu, su y do tego p tla repeat . . . until. z e

16

>>> for i in [1, a, nic]: ... print i ... 1 a nic Jak wida , zmienna sterujaca p tli for (tutaj: i) przyjmuje wartoci kolejnych elementw podanej c e s sekwencji. for wymaga sekwencji; mo na jej poda napis (wwczas wartociami zmiennej steruz c s jacej b da kolejne znaki), zlepek lub list . Podanej listy nie mo na jednak modykowa w p tli, e e z c e prowadzi to do nieokrelonego zachowania. Prosz dla sprawdzenia wyprbowa taka instrukcj : s e c e >>> for i in lista: lista.remove(i) # Kopoty Rozwiazaniem jest w takich razach uruchomienie p tli na kopii listy, ktra atwo uzyska u ywaja e c z c notacji zakresw: >>> for i in lista[:]: lista.remove(i) # OK Aby umo liwi wykonywanie p tli iteracyjnej dla kolejnych liczb, jak w wi kszoci innych j z c e e s e zykw, Python dostarcza funkcj standardowa range(). Su y ona do wygenerowania sekwencji e z liczb cakowitych. Mo na ja u y na kilka sposobw: z z c >>> [0, >>> [5, >>> [5, range(5) 1, 2, 3, 4] range(5,10) 6, 7, 8, 9] range(5,10,2) 7, 9] # Pi kolejnych liczb ec # Liczby od 5 do 9 # Liczby od 5 do 9 co 2

range(n) liczy od 0 do n-1, i jest to dokadnie zakres indeksw sekwencji o n elementach. W oglnoci, znaczenie parametrw funkcji range() jest podobne jak dla indeksw sekwencji s dlatego zakres od 5 do 10 oznacza sekwencj liczb 59 (przywoujac przykad przegrdek, sa to e liczby mi dzy piata a dziesiata przegrdka na licie kolejnych liczb cakowitych od zera wzwy ). e s z Sprowadzajac znw rzecz do konkretnego przykadu, poni ej ilustruj u ycie p tli for do wypisa z e z e nia elementw pewnej listy z kolejnymi numerami (standardowa funkcja len() oblicza dugoc, s tj. liczb elementw dowolnej sekwencji): e >>> for nr in range(len(lista)): ... print %3d. % (nr+1), lista[nr] ... 17

I jeszcze jeden przykad, tym razem u ycia p tli for do wypisania elementw sownika: z e >>> for klucz in slownik.keys() ... print klucz, :, slownik[klucz] ...

4
4.1

Wprowadzanie i wyprowadzanie danych. Praca z plikami.


Pytania do u ytkownika. Funkcja eval(). z
Jeli chodzi o instrukcje su ace do zapytania o dane u ytkownika, zetkn limy si ju z nimi we s z z e s e z wczeniejszych przykadach. Sa to mianowicie funkcje input() i raw_input(). W rzeczywistos sci, podstawowa jest ta druga. Obie przyjmuja opcjonalny parametr a cuchowy, ktry ma su y n z c do poinformowania u ytkownika, o jaka dana prosimy: z >>> nazw = raw_input(Podaj nazwisko: ) Podaj nazwisko: _ W powy szym przykadzie, kreseczka w drugiej linii ma symbolizowa kursor, bowiem w tym z c momencie program zatrzymuje si , czekajac na wprowadzenie odpowiedzi przez czowieka (pod e Windows, wyskoczyoby okienko dialogowe z zapytaniem). Wartocia funkcji raw_input() jest zawsze dana typu a cuchowego (napis). Jeli pytamy o dane s n s do oblicze , nale aoby zatem w programie dokona samodzielnie konwersji do odpowiedniego n z c typu, np. funkcja float(). Dla wygody, dost pna jest inteligentniejsza funkcja input(), rw e noznaczna z konstrukcja eval(raw_input()). Rzeczona inteligencja siedzi wanie w funkcji eval(). Jej dziaanie jest prawie dokadnie takie, s jak interpretera j zyka Python. Jeli podamy jej napis b dacy prawidowym wyra eniem w j zyku e s e z e Python, to zostanie ono zinterpretowane, obliczone i jego wynik b dzie wartocia funkcji. Ma to e s swoje zalety i wady. Do zalet zalicza si mo liwoci podawania wartoci od razu caych struktur e z s s danych, korzystania ze zmiennych zdeniowanych w programie, ba nawet z funkcji: >>> def suma(a,b): ... return a+b ... >>> lista = [aaa, xxx] >>> dana = input(Test: ) Test: { lista[1]: suma(3,3)*3.14 } # To wpisa uytkownik z >>> print dana {xxx: 18.84}

18

Wada jest, ze u ytkownik musi stosowa si do regu skadni Pythona. Przykadowo, napisy trzeba z c e podawa w apostrofach zeby zaznaczy , ze chodzi o typ napisowy. Nawet tak trywialna odpowied c c z u ytkownika, jak pusty a cuch (tylko klepni cie Enter), spowodowaaby spektakularna smier z n e c programu, z mao zrozumiaym dla laika komunikatem o b dzie skadniowym: e >>> x = input(Podaj dana: ) Podaj dana: Traceback (innermost last): File "<stdin>", line 1, in ? File "<string>", line 0 ^ SyntaxError: unexpected EOF while parsing

4.2

Jak korzystac z plikw?


Operacje na plikach sa w oglnym zarysie podobne, niezale ne od j zyka programowania, ponie z e wa sa one wszystkim programom udost pniane w ten sam sposb przez system operacyjny. Plik z e (zwykle) jest w programie reprezentowany przez jaka zmienna, ktra nale y skojarzy z konkrets z c z nym plikiem (przez podanie jego nazwy i ewentualnie scie ki dost pu). Aby korzysta z danych w e c pliku, lub aby do niego co zapisa , nale y najpierw plik otworzy , a po u yciu nale y go zamkna . s c z c z z c Zamkni cie pliku cz sto jest opuszczane, poniewa i tak zrobi to w ko cu system operacyjny. Nie e e z n powinno si to jednak sta nawykiem, poniewa mo e by przyczyna kopotw . e c z z c Python do tego schematu dodaje swoje trzy grosze, w znacznym stopniu upraszczajac powy sza z teori . Odczyt pliku w Pythonie mo e bowiem wyglada tak: e z c >>> dane = open(dane.dat).readlines() Mimo ze jest to tylko jedna linijka kodu, zawieraja si w niej wszystkie elementarne operacje e plikowe. Funkcja open() wykonuje dwie z nich, mianowicie skojarzenie z plikiem o nazwie dane.dat w bie acym katalogu oraz otwarcie (standardowo do odczytu). Wartocia tej funkcji z s jest instancja obiektu plikowego byaby ona wartocia zmiennej reprezentujacej plik, gdybys smy taka zmienna tutaj utworzyli. Jednak zamiast tworzy zmienna plikowa, od razu wywoujemy c dla naszego obiektu metod readlines() i to jej wynik zapami tujemy w zmiennej dane() e e b dzie to lista wszystkich linii z pliku. Poniewa sam obiekt plikowy nie zostaje zapami tany, nae z e tychmiast po wykonaniu powy szej instrukcji Python go niszczy, przedtem wykonujac operacj z e zamkni cia. e

1. System operacyjny nakada ograniczenie na liczb jednoczenie otwartych plikw; e s 2. Nie mo na by pewnym, ze wszystkie dane zostay zapisane, dopki plik nie zostanie zamkni ty, lub dopki nie z c e wykona si instrukcji flush(). e Czyli konkretna wartoc obiektu. s

19

Jak wida , doc du o dzieje si za kurtyna. Nie zawsze jednak wystarczaja rozwiazania najprostc s z e sze; cho by dlatego ze nie wszystkie pliki skadaja si z linii (tekstu). c e Podsumowujac podany przykad: Dla uatwienia (programicie) zycia, skojarzenie z plikiem oraz jego otwarcie wykonuje si s e jedna instrukcja open(). Zmienne plikowe sa obiektami. W rzeczywistoci, nie trzeba w ogle tworzy zmiennej do s c obsugi pliku wystarczy instancja obiektu plikowego. Poniewa Python z natury sprzata nieu ytki, zamkni cie pliku oraz usuni cie niepotrzebnej z z e e instancji obiektu plikowego dokonywane jest automatycznie w momencie, gdy przestanie by u ywana (np. nie jest ju pami tana w zadnej zmiennej). c z z e Funkcja open() standardowo otwiera podany plik tylko do odczytu. Jeli zamierzamy do pliku s zapisywa , nale y jako drugi parametr poda tryb otwarcia: w oznacza otwarcie do zapisu (poc z c woduje to skasowanie poprzednio zapisanych danych!), natomist a jest oznaczeniem trybu dopisywania (ang. append). Wartoc r (jak read) jest wartocia domylna drugiego parametru funkcji s s s open() (jeli nie zostanie podany). s Do zapisu danych do pliku dost pne sa dwie metody: write(), przyjmujaca parametr typu a cue n chowego, oraz writelines(), wymagajaca listy napisw. Zadna z nich nie dodaje automatycznie znakw ko ca linii, dlatego zadba o to musi programista (znak ko ca linii podaje si jako \n): n c n e >>> >>> >>> >>> >>> plik = open(wyniki.txt, a) plik.write(%10.5f%10.5f\n % (x,y)) linie = [Linia 1\n, Linia 2\n] plik.writelines(linie) plik.close() # Otwarcie do dopisywania # Zapis dwch liczb float # Zapis kilku linii # Zamknicie pliku e

4.3

Odczyt lub zapis pliku w petli


W wi kszoci przypadkw, gdy b dziemy operowa na niedu ych plikach tekstowych, wystarcza e s e c z nam metody readlines() oraz writelines(), zaprezentowane powy ej. Tutaj jednak chciabym z pokaza jak sobie radzi , gdy zapis lub odczyt wykonujemy porcjami, np. w p tli. c c e Przypucmy, ze mamy za zadanie wypisa z pliku obliczenia.txt linie zawierajace napis WYNIK:. s c Najprociej, mo na poradzi sobie tak: s z c >>> for linia in open(obliczenia.txt).readlines()): ... if linia.find(WYNIK:) >= 0: print linia i wszystko b dzie dobrze. . . przynajmniej do momentu w ktrym oka e si , ze dwugigabajtowy e z e plik obliczenia.txt nijak nie chce si zmieci w 64 MB RAM. Znacznie lepiej byoby wczye s c tywa po jednej linii: c 20

>>> plik = open(obliczenia.txt) >>> while 1: ... linia = plik.readline() ... if linia == : break ... if linia.find(WYNIK:) >= 0: print linia >>> plik.close() Korzystam tutaj z faktu, ze po odczytaniu ostatniej linii, funkcja readline() zwrci pusty a n cuch. Tym razem, obiekt plikowy nie zostanie automatycznie zamkni ty, dopki jest wartocia e s zmiennej plik. W dobrym stylu jest zatem jawne wywoanie metody close(). Potrzeba wykonywania w p tli operacji zapisu do pliku cz sto jest narzucona przez funkcj proe e e gramu, wykonujacego np. cykliczne obliczenia lub pomiary. Korzystajac z writelines(), trzeba wyniki gromadzi na licie, a dopiero p niej zapisywa . Pomijajac niepotrzebne marnotrawstwo c s z c pami ci, rozwiazanie takie ma t oczywista wad , ze niemo liwa jest kontrola wynikw porede e e z s nich w pliku (przez inne programy, czowieka itp.) nic nie zostanie zapisane, a do zako czenia z n roboczej p tli. Lepsze rozwiazanie problemu mogoby wyglada tak: e c >>> plik = open(wyniki.txt,w) >>> while not koniec_pomiarow(): ... plik.write( wynik_pomiaru() ) >>> plik.close() Jest to najbardziej wydajny sposb, jednak np. nie gwarantuje natychmiastowej dost pnoci zae s pisanych danych na dysku jak wyjaniaem w opisie do metody close(), nic nie zostaje tak s naprawd zapisane, a nie uzbiera si wi ksza porcja (blok o rozmiarze zwykle 512 lub 1024 baje z e e tw). Jeli zale y nam na natychmiastowym zapisie, spraw zaatwia dodanie w p tli dodatkowej s z e e instrukcji plik.flush(). Mo na jednak skorzysta z tymczasowej instancji obiektu plikowego z c otwieranego do dopisywania, a nasz przykad da si uproci : e s c >>> while not koniec_pomiarow(): ... open(wyniki.txt,a).write(wynik_pomiaru()) Tutaj znw kupujemy wygod kosztem efektywnoci: narzutem jest otwieranie i (automatyczne) e s zamykanie pliku w ka dym obrocie p tli, ale o ile mniej pisania, i okazji do zrobienia b du. z e z e

Wasne procedury i funkcje


Do deniowania podprogramw su y w Pythonie sowo kluczowe def, po ktrym musi wystapi z c nagwek podprogramu i dwukropek, a w kolejnych liniach blok instrukcji (linie o tym samym wci ciu) skadajacych si na podprogram. W u yciu jest to znacznie prostsze ni tumaczenie: e e z z 21

>>> def suma(a,b): ... return a+b ... >>> print suma(1,2) 3 Oto i mamy funkcj , ktra oblicza i zwraca sum swoich parametrw. Instrukcja return powoduje e e zako czenie podprogramu i powoduje, ze podana wartoc b dzie wartocia tego podprogramu. Nie n s e s oznacza to wcale, ze obecnoc return jest w podprogramie obowiazkowa: s >>> def hello(): # Nawiasy konieczne nawet bez parametrw ... print Cze, wiecie! sc s ... >>> hello() # W wywoaniu rwnie z Cze, wiecie! sc s W tym przykadzie nie ma return, zatem podprogram nie zwraca zadnej wartoci. Mo na powie s z dzie , ze tym razem jest to procedura; jednak Python tak naprawd nie rozr nia mi dzy proceduc e z e rami i funkcjami. Mo na np. napisa taka hybryd : z c e >>> def dziwo(x): ... if x>0 : return x ... else: print Cze sc ktra b dzie si zachowywa jak funkcja dla dodatnich wartoci x, a jak procedura dla ujemnych. e e c s Dlatego w tekcie tym u ywam nazw funkcja, procedura i podprogram zamiennie; najcz sciej s z e . jednak b d pisa funkcja, bo tak jest najkrcej e e Instrukcji return mo na tak e u y bez podania wartoci efektem jest wtedy natychmiastowe z z z c s zako czenie podprogramu w miejscu jej u ycia. n z

5.1

Funkcja jako wartosc


Warto mo e zaznaczy , ze nazwa funkcji w Pythonie zachowuje si jak zwyka zmienna; tak te z c e z zostanie potraktowana, jeli opucimy nawiasy zamiast uruchomi , Python poda jej wartoc: s s c s >>> suma <function suma at 80d5380> >>> suma, 1, 2 (<function suma at 80d5380>, 1, 2)

Tak e w wielu innych j zykach, np. C, C++, podprogramy nazywa si funkcjami. z e e

22

Analogia ta jest wcale nieprzypadkowa: identykator podprogramu jest zmienna i mo na go wa z snie tak traktowa . M.in. jej wartoc, czyli sama funkcj , mo na przypisa innej zmiennej: c s e z c >>> suma = hello >>> print suma <function hello at 80d5408> >>> suma() Cze wiecie! sc s Cecha ta daje Pythonowi du a elastycznoc: np. nic nie stoi na przeszkodzie, zeby poda funkcj z s c e jako parametr innej funkcji: >>> def uruchom(a): ... a() ... >>> uruchom(hello) Cze wiecie! sc s

5.2

Wewnetrzna dokumentacja atrybut __doc__


Dobra praktyka jest opisywanie wasnych programw przynajmniej, jeli zamierza si ich u y s e z c wi cej ni raz. Oczywicie, robi si to przez komentowanie kodu, ale naprawd warto skorzysta e z s e e c z mechanizmw j zyka, i zapewni przyzwoity opis tworzonych podprogramw, obiektw, modue c w w ich atrybutach __doc__. Zwaszcza, ze robi si to bardzo atwo jeli pierwszym elemen e s tem bloku kodu obiektu jest a cuch znakw, stanie si on wartocia jego atrybutu __doc__: n e s >>> def p(): ... Procedura p() wypisuje "hello" ... print hello ... >>> print p.__doc__ Procedura p() wypisuje "hello" Oczywicie, dokumentacja mo e by du sza ni jedna linia korzysta si wtedy z potrjnych s z c z z e cudzysoww: >>> def fun(x): ... """Funkcja fun(liczba) -> liczba ... Oblicza kwadrat podanej liczby. ... """ ... return x*x 23

... >>> print fun.__doc__ Funkcja fun(liczba) -> liczba Oblicza kwadrat podanej liczby. W ten sam sposb dokumentuje si dowolne obiekty. Przykadowo, jeli w pliku z kodem w Pye s thonie umiecisz na poczatku opis w postaci a cucha znakw, po zaimportowaniu takiego pliku s n jako moduu, opis ten znajdzie si w jego atrybucie __doc__. e

6 7

Modu Numeric: obliczenia na tablicach liczb Modu Gnuplot: wykresy


Modu Gnuplot su y do komunikacji z zewn trznym programem o tej samej nazwie, umo liwiaz e z jac rysowanie jedno- i dwuwymiarowych wykresw z poziomu programu w Pythonie. Oczywicie, s oprcz moduu Gnuplot trzeba mie rwnie zainstalowany sam program gnuplot. Dobra nowina c z jest, ze obydwa sa dost pne dla systemw Unix oraz Windows, a nawet dla Makw. Wprawdzie e wersja Windows ma pewne ograniczenia (podstawowe jest takie, ze nie mo na jednoczenie pra z s cowa na dwch oddzielnych wykresach), ale nie sa one zbyt ucia liwe. c z

7.1

Najprostsze u ycie i sterowanie programem gnuplot z


Podstawowym elementem moduu Gnuplot jest klasa Gnuplot reprezentujaca poaczenie z pro gramem odpowiedzialnym za rysowanie wykresu. Z punktu widzenia funkcjonalnoci, mo emy s z myle o ka dym obiekcie tej klasy jako o osobnym wykresie: s c z >>> import Gnuplot >>> wykr = Gnuplot.Gnuplot() Zwracam uwag na nawiasy: powoduja one utworzenie obiektu klasy Gnuplot.Gnuplot, a wi c e e uruchomienie zewn trznego programu i nawiazanie z nim poaczenia. Instrukcja bez nawiasw, e tj. wykr=Gnuplot.Gnuplot te jest bowiem skadniowo poprawna, ale oznacza ze zmienna wykr z ma reprezentowa klas Gnuplot.Gnuplot, a nie obiekt. Prba skorzystania z takiej zmiennej c e sko czyaby si masa dziwnych b dw. n e e Obiektowi Gnuplot mo na podawa wszystkie komendy, jakie zrozumie program gnuplot, poniez c wa b da one po prostu przesane do programu: z e >>> wykr(set data style linespoints) >>> wykr(plot sin(x) title "Sinus") >>> wykr(replot "wyniki.dat" using 2:4 title "Wyniki") 24

Jest to mo liwoc wystarczajaca, jeli kto zna program gnuplot bardzo dobrze, i funkcjonalnoc z s s s s zapewniana przez modu Gnuplot mu nie wystarcza (lub/i nie chce si go uczy :). Tylko taki e c sposb byby jednak cz sto niezbyt wygodny, bo tabelk wynikw do wykresu trzebaby samemu e e zapisa do pliku (ale niektre opcje da si ustawi tylko tak). c e c Korzystanie z zestawu metod dost pnych dla obiektu Gnuplot pozwala wi kszoc zada zrealizoe e s n wa prociej i szybciej, np.: c s >>> >>> >>> >>> ... >>> >>> >>> >>> wykr.title(Tytu wykresu) wykr.xlabel(O X) # Podpis osi X s wykr.ylabel(O Y) # -- " -s Y wykr.plot(sin(x),[(x1,y1), (x2,y2), (x3,y3), ...], wyniki) # Uniwersalna procedura do wykresw wykr.replot() # Przerysowuje wykres (moe dodawa nowe dane) z c wykr.hardcopy() # Wysya wersj PostScript wykresu na drukark e e wykr.hardcopy(wydruk.ps) # Zapis wykresu do pliku wykr.clear() # Kasuje list linii na wykresie (nastpna e e # komenda zadziaa na czystym uk. wsprz.) >>> wykr.reset() # Przywraca standardowe opcje + wykr.clear() >>> wykr.splot(sin(x*y)) # Procedura do wykresw dwuwymiarowych Po szczegy oraz opis reszty metod odsyam do dir(Gnuplot.Gnuplot) i wewn trznej dokue mentacji (__doc__). Z podanych przykadw, najwa niejsze sa metody plot() oraz splot(). Obie przyjmuja dowolna z liczb parametrw, z ktrych ka dy deniuje jaki wykres. Funkcj mo na poda w postaci napie z s e z c sowej; tabelk w postaci sekwencji (zlepku, listy) par (xi , yi ) lub trjek (xi , yi , zi ), a nawet w e postaci dwuwymiarowej tablicy (array) Numerical Pythona . Dzi ki tej du ej dozie wbudowae z nej inteligencji, zrobienie nawet doc zo onego wykresu mo e sprowadzi si do jednej krtkiej s z z c e instrukcji. Jako cwiczenie, proponuj wyprbowa poni szy przykad: e c z >>> from Numeric import * >>> import Gnuplot >>> wykr=Gnuplot.Gnuplot() # Obliczenie przykadowej tabelki danych: >>> dane=zeros((2,50),Float) >>> dane[0] = arange(0,8*pi,(8./50.)*pi) >>> dane[1] = sin(dane[0]) * dane[0] >>> dane=transpose(dane) # Wykres (a waciwie trzy) s >>> wykr.plot(x,-x,dane)

W rzeczywistoci, dane tablicowe zapisywane sa do plikw tymczasowych i w tej postaci dostarczane programowi s gnuplot.

25

Warto tak e przestudiowa programy demo.py i test.py z pakietu Gnuplot. Komentarze w demo.py z c sa cakiem bogate, i chyba janiejsze ni dost pna z pakietem dokumentacja. s z e

7.2

Wiecej o operowaniu wykresami


Mo liwoc uzyskania wykresu jedna prosta instrukcja jest wygodna przy testowaniu programu z s lub wykonywaniu podr cznych oblicze . Jeli zale y nam na jakoci i przejrzystoci prezentoe n s z s s wanych wynikw, konieczna jest mo liwoc przyzwoitego opisu ka dej krzywej, doboru rodzaju z s z linii, punktw, kolorw lub stylu wykresu (np. histogramu). Osiaga si to przez stworzenie osob e nych obiektw reprezentujacych ka da seri danych, i przez nadanie tym obiektom odpowiednich z e atrybutw. Wsplna klasa takich obiektw, tak e deniowana przez modu Gnuplot, jest typ z

7.3

No dobrze, ale jak przeniesc wykres do dokumentu albo wydrukowac?


W systemie Unix, najbardziej rozpowszechnionym (i wspieranym) formatem rysunkw jest PostScript. Nieprzypadkowo, najwy sza jakoc i mo liwoci opisu wykresw z gnuplota osiaga si z s z s e wanie w tym formacie, i dlatego metoda hardcopy() pakietu Gnuplot te go u ywa: s z z >>> wykr.hardcopy(wyniki.ps) Uzyskany plik mo na albo wydrukowa (najcz sciej przez GhostScript), albo wklei w dokument z c e c LaTeX-a (np. u ywajac LyX-a). Problemem sa niestety polskie litery, jako ze gnuplot nie wspiera z znakw narodowych. Przychodza mi do gowy tylko trzy rozwiazania: Nie u ywa polskich liter (najprostszy), z c U ywa LaTeX-a i terminala latex; usuna z wynikowego pliku komendy zmieniajace font z c c na cm (Computer Modern). Poprawi program gnuplot (najlepszy :). c Metoda hardcopy() wywoana bez parametru wysya wydruk, tak e w formacie PostScript, na z standardowa drukark . Pod Unixem, wymaga to prawidowo skongurowanej komendy lpr. Nie e wiem co si dzieje pod Windows, ale prawdopodobnie mo na wysa wydruk bezporednio na e z c s drukark sekwencja komend (mo na zdeniowa wasna procedur print()): e z c e >>> >>> >>> >>> >>> wykr(set term pcl5) wykr(set output "PRN") wykr(replot) wykr(set term windows) wykr(set output) 26

Tutaj u ywam terminala pcl5, ktry powinien dziaa na wi kszoci drukarek HP i podobnych. z c e s Ostatnie dwie instrukcje przywracaja rysowanie w okienku Windows. Pracujac pod Windows, te warto zainstalowa GhostScript. Jednak w tym systemie niewielu z c u ywa LaTeX-a (chocia takowe wersje istnieja, zarwno darmowe, jak i za grube pieniadze), z z dlatego warto wiedzie jak wykres z gnuplota przeniec najlepiej w postaci wektorowej c s do innego programu, np. Worda. W windowsowej wersji gnuplota dziaa wprawdzie kopiowanie wykresu przez Schowek, ale pozostawia (moim zdaniem) sporo do zyczenia. Dlatego proponuj e poeksperymentowa samodzielnie z r nymi terminalami. Do wektorowych nale a cgm (Computer c z z Graphics Metale), corel (dla CorelDraw), dxf (format AutoCAD-a), hpgl i pcl5 (dla ploterw i drukarek Hewlett-Packard). Formaty cgm i hpgl powinny by czytane przez M$ Worda, nie wiem c jak pozostae. Odpowiednie komendy gnuplota brzmia (przykadowo): gnuplot> set terminal cgm gnuplot> set output wyniki.cgm gnuplot> replot Oczywicie, mo na to samo zrobi z poziomu Pythona. Wi cej o terminalach i ich mo liwociach s z c e z s mo na dowiedzie si u ywajac wbudowanego systemu pomocy programu Gnuplot: z c e z gnuplot> help set term

27

You might also like