#LyX 1.1 created this file. For more info see http://www.lyx.org/ \lyxformat 218 \textclass linuxdoc \language polish \inputencoding latin2 \fontscheme default \graphics default \paperfontsize 10 \spacing single \papersize Default \paperpackage a4 \use_geometry 0 \use_amsmath 0 \paperorientation portrait \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language english \quotes_times 2 \papercolumns 1 \papersides 1 \paperpagestyle default \layout Title \added_space_top vfill \added_space_bottom vfill LWP: Lamerskie Wprowadzenie do Pythona \layout Author Artur Skura \layout Author Podziękowania dla Wojtka Warczakowskiego \layout Standard \align center gdzieniegdzie tekst modyfikował Maciej \begin_inset Quotes eld \end_inset MACiAS \begin_inset Quotes erd \end_inset Pilichowski \layout Date 03.07.2001 \layout Abstract Dokument ten przedstawia podstawowe właściwości potężnego języka, jakim jest Python. Przeznaczony jest dla nie-programistów i hobbystów. Proszę zgłaszać wszystkie błędy (zapewne jest ich mnóstwo) i nie irytować się łopatologią ;-) \layout Standard \begin_inset LatexCommand \tableofcontents{} \end_inset \layout Section Wstęp \layout Standard Wiele osób pragnąc nauczyć się programować staje przed dylematem: \begin_inset Quotes eld \end_inset Od jakiego języka programowania zacząć? \begin_inset Quotes erd \end_inset . Pytanie jest dość istotne, ponieważ negatywne nawyki, którymi przesiąknie początkujący bardzo trudno potem wykorzenić. \layout Standard Eric S. Raymond w swoim eseju \begin_inset Quotes eld \end_inset Jak zostać hackerem? \begin_inset Quotes erd \end_inset proponuje Pythona. Istnieje wiele argumentów przemawiających za wykorzystaniem tego języka. Niektóre aspekty C (np. wskaźniki) mogą sprawić początkującym wiele trudności; utrzymanie porządku w programach napisanych w Perlu staje się po pewnym czasie bardzo trudne (podobnie jest z Tcl/Tk); Java wymaga zrozumienia pewnych podstaw, a narzędzia do niej -- wymagań sprzętowych wyższych niż przeciętne... Nauka Pythona jest rozsądnym kompromisem: z jednej strony otrzymujemy język, którego stosunkowo łatwo można się nauczyć, z drugiej zaś -- potężne narzędzie używane przez profesjonalistów, w swej podstawowej postaci bardzo użyteczne wszędzie tam, gdzie np. zachodzi konieczność wykonywania skomplikowanych operacji na łańcuchach znaków. \layout Standard Twórca Pythona, Guido van Rossum, zaleca jego naukę na samym początku, przed wprowadzeniem do takich języków jak Java czy C++. Dzięku temu, po zakończeniu kursu uczeń będzie potrafił programować na przyzwoitym poziomie i rozumiał podstawy programowania obiektowego, co znacznie ułatwi mu naukę w/w języków. \layout Section Zaczynamy \layout Standard Aby zorientować się w możliwościach języka, uruchomimy interpreter Pythona: \layout Standard $ python \layout Standard Pojawi się napis podobny do poniższego: \layout Standard Python 1.5.2 (#1, Feb\SpecialChar ~ 1 2000, 16:32:16)\SpecialChar ~ [GCC egcs-2.91.66 19990314/Linux (egcs- on linux-i386 \layout Standard Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam \layout Standard >>> \layout Standard Możemy teraz wydawać polecenia, które zostaną wykonane od razu. Napiszmy: \layout Standard >>> print "Mamusiu, jak tu pięknie!" \layout Standard W rezultacie powinniśmy otrzymać napis \begin_inset Quotes eld \end_inset Mamusiu, jak tu pięknie! \begin_inset Quotes erd \end_inset . Python zazwyczaj robi dokładnie to, co mu każemy. \layout Subsection Wstępnych uwag parę \layout Subsubsection Zaczynamy gubić przykłady \layout Standard Chociaż w dalszym tekście nadal jest zachowana konwencja wpisywania poleceń bezpośrednio interpreterowi Pythona, to jednak aby oszczędzić sobie czasu i nerwów możemy korzystając w edytorze tekstu (który pozwala na zapis plików ASCII) stworzyć plik o rozszerzeniu \begin_inset Quotes eld \end_inset py \begin_inset Quotes erd \end_inset --- np. \begin_inset Quotes eld \end_inset tescik.py \begin_inset Quotes erd \end_inset . W nim możemy pisać program w Pythonie, a po zapisaniu wydać polecenie: \layout Standard python tescik.py \layout Standard Jeśli popełniliśmy tzw. głupi błąd --- literówkę --- to wracamy do edycji pliku i poprawiamy co trzeba. \layout Subsubsection Jak łatwo zauważyć... \layout Standard print x[zk]*f/u[ol],we[d[m]]*r \layout Standard Ok, to i tak nie jest jeszcze największy galimatias jaki można uczynić z kodu. Python pozwala Ci opisać takie kawałki własnymi słowami --- aby odróżnić Twój opis od kodu programu użyj znaku \begin_inset Quotes eld \end_inset # \begin_inset Quotes erd \end_inset i po nim wpisz komentarz. Np: \layout Standard # o rrrany, w ogole nie wiem co sie tutaj dzieje \layout Standard Ale tak naprawdę powinieneś pisać kod tak, aby był samodokumentujący się --- tj. aby faktycznie było \begin_inset Quotes eld \end_inset łatwo zauważyć, że... \begin_inset Quotes erd \end_inset nawet bez dodatkowego komentarza z Twojej strony. \layout Subsubsection Bo mnie się shift nacisnął... \layout Standard Jeszcze nie wiemy, jak Python działa, ale już na wstępie: \layout Standard >>> Q = 100 \layout Standard >>> print q \layout Standard dostajemy piękny błąd. Dla Pythona stanowi różnicę pisownia małymi i wielkimi literami! \layout Subsection Łańcuchy \layout Standard Zaimplementowano w nim wiele cech innych języków eliminując związane z nimi niedogodności, dzięki czemu programista może skupić się na pracy a nie na semantyce. \layout Standard Przypiszmy teraz zmiennej hejho napis \begin_inset Quotes eld \end_inset Dajcie mi kredki \begin_inset Quotes erd \end_inset : \layout Standard >>> hejho = "Dajcie mi kredki." \layout Standard >>> print hejho \layout Standard Dajcie mi kredki. \layout Standard Idźmy dalej: łączenie napisów: \layout Standard >>> hej= "Dajcie" \layout Standard >>> ho = "mi w końcu te kredki!!!" \layout Standard >>> print hej, ho \layout Standard Dajcie mi w końcu te kredki!!! \layout Standard Można też inaczej: \layout Standard >>> hej = "No, " \layout Standard >>> ho = "wreszcie!" \layout Standard >>> print hej+ho \layout Standard No, wreszcie! \layout Standard Można łączyć jeszcze bardziej: \layout Standard >>> print "Jarek powiedział:", hej+ho \layout Standard Jarek powiedział: No,Wreszcie! \layout Standard Ciekawym elementem Pythona są tzw. plasterki (ang. slices). Łańcuch znaków zostaje pocięty na \begin_inset Quotes eld \end_inset plasterki \begin_inset Quotes erd \end_inset , oznaczane nawiasami kwadratowymi. I tak łańcuch[0] oznacza pierwszy znak łańcucha, łańcuch[1] -- drugą, itd.: \layout Standard >>> lajkonik = "lajkonik" \layout Standard >>> print lajkonik[0] \layout Standard l \layout Standard >>> print lajkonik[1] \layout Standard a \layout Standard Prawda, że proste? Python idzie nieco dalej -- ogólniejsze \begin_inset Quotes eld \end_inset krojenie \begin_inset Quotes erd \end_inset polega na wskazaniu dolnego indeksu i górnego (w ten sposób dostaniemy się do fragmentu od wskazanego dolnego indeksu do górnego, \series bold ale bez niego \series default ). Jeśli opuścimy, któryś z indeksów, to Python przyjmie domyślnie skrajne wartości (odpowiednio -- 0 i dlugość łańcucha). \layout Standard Łańcuch[:2] odnosi się do pierwszych dwóch znaków łańcucha (czyli znaków o indeksie 0 i 1), zaś łańcuch[2:] -- do wszystkiego oprócz pierwszych dwóch znaków: \layout Standard >>> print lajkonik[2:] \layout Standard jkonik \layout Standard >>> print lajkonik[:2] \layout Standard la \layout Standard Jak można się domyśleć, łańcuch[1:5] zwraca od drugiego do piątego (od znaku o indeksie 1 do znaku o indeksie 4) znaku łańcucha: \layout Standard >>> print lajkonik [1:5] \layout Standard ajko \layout Standard Python na tym nie poprzestaje. Indeksować można licząc także \begin_inset Quotes eld \end_inset od tyłu \begin_inset Quotes erd \end_inset , tj. od końca łańcucha. Podajemy wtedy liczby ujemne. Np. \layout Standard >>> print lajkonik [1:-1] \layout Standard ajkoni \layout Standard Czy to jasne? Poprosiliśmy Pythona o podanie łańcucha począwszy od znaku o indeksie 1 (drugiego) do przedostatniego (indeksy ujemne łatwo się czyta dodając w myślach przed znakiem minus \begin_inset Quotes eld \end_inset długość \begin_inset Quotes erd \end_inset -- u nas \begin_inset Quotes eld \end_inset długość - 1 \begin_inset Quotes erd \end_inset ). \layout Standard Co ciekawe, łańcuchy można nie tylko dodawać -- można je również \begin_inset Quotes eld \end_inset mnożyć \begin_inset Quotes erd \end_inset : \layout Standard >>> jeden = "Nie!" \layout Standard >>> print 3*jeden \layout Standard Nie!Nie!Nie! \layout Standard Jeśli nie znamy długości stringa, a chcemy np. pozbyć się ostatniego znaku, możemy wykorzystać funkcję len(): \layout Standard >>> a="lajkonik" \layout Standard >>> print a[:(len(a)-1)] \layout Standard lajkoni \layout Subsubsection Pisanie pod lupą \layout Standard Powyżej używaliśmy polecenia print z rozmaitymi operatorami. Teraz opiszemy je nieco dokładniej. \layout Standard print "ala ma kota" \layout Standard wypisze podany tekst i wstawi znak [enter]. Jeżeli chcemy tego uniknąc musimy postawić na samym końcu podanego tekstu znak przecinka: \layout Standard print "ala ma kota", \layout Standard A teraz spróbujmy w ten sposób: \layout Standard print "ala", "ma","kota" \layout Standard Jak powinieneś zauważyć tekst zostanie wydrukowany ze spacjami pomiędzy wyrazami. Przecinek bowiem między podanymi napisami wstawia odstęp. A jeśli chcielibyśmy tego uniknąć? Voila: \layout Standard print "ala"+"ma"+"kota" \layout Standard dostaniemy zbitkę słów bez rozdzielającej spacji. \layout Subsection Liczby \layout Standard Operacje na liczbach również odbywają się w sposób intuicyjny, Rozważmy prosty przykład: \layout Standard >>> a = b = 10 \layout Standard >>> print a, b \layout Standard 10 10 \layout Standard Dwom zmiennym, a i b, przypisaliśmy wartość dziesięć. Nie ma problemu ze standardowymi operacjami na liczbach: \layout Standard >>> print a+b, a-b, a*b, a/b \layout Standard 20 0 100 1 \layout Standard Zaokrąglanie: \layout Standard >>> round(10.5) \layout Standard 11.0 \layout Standard Potęgowanie: \layout Standard >>> pow(5,2) \layout Standard 25 \layout Standard Albo i tak: \layout Standard >>> 5 ** 2 \layout Standard 25 \layout Standard Operacje bitowe (odpowiednio --- bitowe or, dopełnienie, przesunięcie w lewo): \layout Standard >>> 4|1, ~4, 4>>1 \layout Standard (5, -5, 2) \layout Standard Jeśli chcemy natomiast dokonać operacji logicznych, to musimy pisać pełnymi słowami (poniższy przykład nie ma znaczenia w sensie zdrowego rozsądku): \layout Standard >>> 4 or 2, 5 and 3 \layout Standard (4, 3) \layout Standard Konwersja między różnymi systemami: \layout Standard >>> hex(10), oct(10) \layout Standard ('0xa', '012') \layout Subsection Listy \layout Standard Listy przypominają nieco tablice w innych językach. Charakteryzują się umieszczeniem elementów w nawiasach kwadratowych. Rozważmy prosty przykład: \layout Standard >>> lista = ["Polak", "Rosjanin", "Niemiec"] \layout Standard >>> print lista \layout Standard ['Polak', 'Rosjanin', 'Niemiec'] \layout Standard Na listach możemy dokonywać standardowych operacji: dodawać nowe elementy, usuwać stare, sortować, wyłapywać fragmenty (tak jak dla napisów -- napis jest tak naprawdę listą znaków)... Jeśli wydamy polecenie dir(nazwa typu), otrzymamy listing nazw operacji, które można przeprowadzać na danym typie: \layout Standard >>> dir(lista) \layout Standard ['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] \layout Standard >>> lista.append("Maciej") \layout Standard >>> print lista \layout Standard ['Polak', 'Rosjanin', 'Niemiec', 'Maciej'] \layout Standard >>> lista.sort() \layout Standard >>> print lista \layout Standard ['Maciej', 'Niemiec', 'Polak', 'Rosjanin'] \layout Standard Co ciekawe, w Pythonie mamy dostęp do prostej \begin_inset Quotes eld \end_inset dokumentacji \begin_inset Quotes erd \end_inset używanych funkcji przy pomocy atrybutu .__doc__. Np.: \layout Standard >>> print lista.append.__doc__ \layout Standard L.append(object) -- append object to end \layout Standard ...co się przydaje, jeśli nie jesteśmy pewni, jak użyć danej funkcji: \layout Standard >>> print lista \layout Standard ['Tytus', 'Romek', 'Atomek'] \layout Standard >>> lista.insert.__doc__ \layout Standard 'L.insert(index, object) -- insert object before index' \layout Standard >>> lista.insert(1, "Szarik") \layout Standard >>> print lista\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard ['Tytus', 'Szarik', 'Romek', 'Atomek'] \layout Standard Jak widać używanie list jest o niebo prostsze niż w innych językach. \layout Subsection Zbiory (tuple) i słowniki \layout Standard Zbiór to typ danych bardzo przypominający listę, wizualnie różni się brakiem nawiasów. \layout Standard >>> kolejka = 'Jacek', 'Wacek', 'Pankracek' \layout Standard >>> print kolejka \layout Standard ('Jacek', 'Wacek', 'Pankracek') \layout Standard >>> print kolejka[1] \layout Standard Wacek \layout Standard W przeciwieństwie do list, wartości zbiorów są niezmienne: \layout Standard >>> kolejka[1] = 'Agatka' \layout Standard Traceback (innermost last): \layout Standard \SpecialChar ~ File "", line 1, in ? \layout Standard TypeError: object doesn't support item assignment \layout Standard Słowniki zaś przypominają tablice asocjacyjne: z każdą wartością jest skojarzony jakiś klucz. Kolejność w słowniku nie ma żadnego znaczenia, dlatego zwykłe indeksowanie nie zadziała. Najlepiej wyjaśnić to na przykładzie: \layout Standard >>> slownik = { 'Ania':96, 'Gosia':69} \layout Standard >>> slownik['Ania']\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard 96 \layout Standard Zobaczmy, jakich funkcji możemy użyć, by manipulować słownikami: \layout Standard >>> dir(slownik)\SpecialChar ~ \layout Standard ['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'update', 'values'] \layout Standard Keys() służy do wyświetlania kluczy: \layout Standard >>> print slownik.keys()\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard ['Ania', 'Gosia'] \layout Standard Zaś values() do wyświetlania wrtości: \layout Standard >>> print slownik.values() \layout Standard [96, 69] \layout Standard Do poszczególnych par możemy się dostać w ten sposób: \layout Standard >>> print slownik.items()[1] \layout Standard ('Gosia', 69) \layout Subsection Sterowanie programem \layout Standard ...odbywa się przy pomocy standardowych mechanizmów znanych z innych języków. Należy zauważyć, że w Pythonie indentacja ( \begin_inset Quotes eld \end_inset wcięcia \begin_inset Quotes erd \end_inset ) spełniają rolę ograniczników ({}, BEGIN..END) z innych języków. \layout Subsubsection if (jeśli) \layout Standard >>> if 2+2==4: \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print "2+2=4!" \layout Standard ... \layout Standard 2+2=4! \layout Standard Należy zwrócić uwagę na dwukropek kończący warunek oraz wcięcie poprzedzające instrukcję. \layout Subsubsection elif ( \begin_inset Quotes eld \end_inset jeśli natomiast... \begin_inset Quotes erd \end_inset ) \layout Standard >>> if 2+2==5: \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print "tego raczej nie wydrukujemy" \layout Standard ... elif 2+2==4: \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print "a to wlasnie powinnismy zobaczyc" \layout Standard ... \layout Standard Konstrukcje \begin_inset Quotes eld \end_inset if-elif-elif-... \begin_inset Quotes erd \end_inset możemy ciągnąć dość długo -- w Pythonie zastępują one znane z innych języków \begin_inset Quotes eld \end_inset case/switch \begin_inset Quotes erd \end_inset . \layout Subsubsection else ( \begin_inset Quotes eld \end_inset a jeśli nie, to... \begin_inset Quotes erd \end_inset ) \layout Standard >>> if 2+2==4: \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print "Murphy powiedziałby..." \layout Standard ... else: \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print "...że ten napis zostanie wyswietlony" \layout Standard ... \layout Standard Murphy powiedziałby... \layout Standard Ponownie warto zwrócić uwagę na wcięcia. \layout Subsubsection While ( \begin_inset Quotes eld \end_inset dopóki \begin_inset Quotes erd \end_inset ) \layout Standard >>> while (a==1): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print "OK" \layout Standard rezultat powyższego zależy od wartości a. Jeśli wcześniej ustawimy a=1, pętla będzie się ciągnąć w nieskończoność. \layout Subsubsection For ( \begin_inset Quotes eld \end_inset dla każdego x z przedziału... \begin_inset Quotes erd \end_inset ) \layout Standard For jest zaimplementowana w Pythonie w nieco specyficzny sposób: \layout Standard >>> lista = ['Tytus', 'Romek', 'Atomek'] \layout Standard >>> for i in lista: \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print i \layout Standard ... \layout Standard Tytus \layout Standard Romek \layout Standard Atomek \layout Standard Oznacza to ni mniej nie więcej: dla każdego i, przyjmującego kolejne wartości z listy lista, wykonaj instrukcję print. Natomiast standardowe przedziały tworzy się za pomocą funkcji range(): \layout Standard >>> print range(10) \layout Standard [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] \layout Standard >>> print range(5,10) \layout Standard [5, 6, 7, 8, 9] \layout Standard A cała konstrukcja wygląda następująco: \layout Standard >>> for i in range (1,4): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print "Jan Sobieski miał trzy pieski:", i \layout Standard ... \layout Standard Jan Sobieski miał trzy pieski: 1 \layout Standard Jan Sobieski miał trzy pieski: 2 \layout Standard Jan Sobieski miał trzy pieski: 3 \layout Standard Konstrukcje for i while określa się żargonowo pętlami --- mamy pętlę for i pętlę while. \layout Subsection Jeszcze o ułożeniu kodu programu \layout Subsubsection Wcięcia \layout Standard Tak jak już było to powiedziane, wcięcia mówią o \begin_inset Quotes eld \end_inset hierarchii \begin_inset Quotes erd \end_inset danego kodu --- wcięć możesz dokonywać przy pomocy spacji bądź tabulatora. Ilu spacji (tabulatorów)? Nieważne --- obyś tylko zachowywał konsekwentnie swoją własną jednostkę wcięć (piszący te słowa używa wielokrotności dwu spacji, bo uważa, iż tak ładniej, a poza tym przyzwyczaił się). \layout Standard Czy tekst programu nie jest przez to bardziej \begin_inset Quotes eld \end_inset goły \begin_inset Quotes erd \end_inset ? Być może --- ale realizuje w pełni zasadę WYSIWYG. I dużo trudniej programiście pomylić się w interpretacji zagnieżdżeń w porównaniu do innych języków. \layout Subsubsection Jednolinijkowce \layout Standard Do tej pory widziałeś tak zapisany program: \layout Standard x = 4 \layout Standard y = 10 \layout Standard z = 13 \layout Standard Można jednak zapisać je łącznie, przedzielając średnikiem: \layout Standard x = 4 ; y = 10 ; z = 13 \layout Standard Swoją drogą, gdybyś miał zwinąc taki kod: \layout Standard x = 20 \layout Standard y = 20 \layout Standard to możesz zapisać to w ten sposób: \layout Standard x = y = 20 \layout Standard ponieważ operator przypisania jest przechodni. \layout Standard Co więcej proste polecenia można także pisać po instrukcjach warunkowych i pętlach, np: \layout Standard for i in range(100): print i \layout Subsection Jeszcze o kontroli programu \layout Subsubsection break \layout Standard Polecenie to przydaje się, kiedy chcemy natychmiast przerwać wykonywanie pętli, np: \layout Standard for i in range(100): \layout Standard \SpecialChar ~ \SpecialChar ~ if i==50: \layout Standard \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ break \layout Standard \SpecialChar ~ \SpecialChar ~ print i \layout Standard Przykład kompletnie odrealniony --- niemniej jednak Python po dotarciu do i==50 zakończy wykonywanie pętli while. Polecenie \begin_inset Quotes eld \end_inset break \begin_inset Quotes erd \end_inset dotyczy tej pętli, wewnątrz najbardziej której zostało umieszczone: \layout Standard for i in range(100): \layout Standard \SpecialChar ~ \SpecialChar ~ while i \begin_inset Quotes erd \end_inset (tak jak w Pascalu) bądź jako \begin_inset Quotes eld \end_inset != \begin_inset Quotes erd \end_inset (jak w C). Mamy też do dyspozycji operatory nierówności: \begin_inset Quotes eld \end_inset < \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset > \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset <= \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset >= \begin_inset Quotes erd \end_inset , a co więcej -- możemy je łączyć, np: \layout Standard if 10<=x<=100: \layout Standard \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ ... \layout Subsubsection Kiedy wiadomo, że to prawda? \layout Standard Python dokonuje skróconego sprawdzania warunków --- jeśli w pewnym momencie okaże się, że wynik jest już ustalony, sprawdzanie jest przerywane. Np: \layout Standard >>> x = 4 \layout Standard >>> y = 5 \layout Standard >>> if (x == 4) or (y == 777): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ print "a jednak" \layout Standard Napis zostanie oczywiście wyświetlony, ale nie w tym rzecz. Zgodnie z sensem operatora \begin_inset Quotes eld \end_inset or \begin_inset Quotes erd \end_inset tylko jedna z wartości musi być prawdziwa, aby wynik także był prawdziwy. W tym przypadku \begin_inset Quotes eld \end_inset x \begin_inset Quotes erd \end_inset faktycznie jest równe 4, więc jest kompletnie nieważne co następuje po \begin_inset Quotes eld \end_inset or \begin_inset Quotes erd \end_inset . Python w tym miejscu przerywa badanie i wyświetla napis. \layout Subsection Funkcje \layout Subsubsection Podstawy \layout Standard Tworzenie funkcji w Pythonie jest bardzo proste. Zaczynają się od słowa def po którym następuje nazwa funkcji z nawiasami, w których opcjonalnie mogą się znajdować argumenty. \layout Standard >>> def dodaj(a,b): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ return a+b \layout Standard ... \layout Standard >>> dodaj(1,2) \layout Standard 3 \layout Standard Nie musimy martwić się o sposób przekazywania argumentów (?): \layout Standard >>> def zamien(a,b): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ temp=a \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ a=b \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ b=temp \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ return a,b \layout Standard ... \layout Standard >>> zamien(10,11) \layout Standard (11, 10) \layout Subsubsection Dalsze ułatwienia \layout Standard Funkcjom możemy przypisać domyślne argumenty: \layout Standard >>> def pytanie(odpowiedz="Tito"): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ return odpowiedz \layout Standard ... \layout Standard Jeśli teraz wywołamy funkcję z argumentem, zostanie on uwzględniony: \layout Standard >>> pytanie('Lenin') \layout Standard 'Lenin' \layout Standard ...a jeśli nie, przyjęta zostanie wartość domyślna: \layout Standard >>> pytanie() \layout Standard 'Tito' \layout Subsubsection Jeszcze więcej ułatwień \layout Standard Python pozwala na bardzo eleganckie przypisywanie wartości pewnym argumentom. Powiedzmy, że mamy taką oto funkcję: \layout Standard >>> def okno(x=0,y=0,szerokosc=400,wysokosc=200,ramka=1,kolor=kGranatowy,czcionk a=Times) \layout Standard I chcemy tę funkcję wywołać, ale w zasadzie wystarczają nam wartości domyślne za wyjątkiem czcionki. Oto jak możemy postąpić przy wywołaniu: \layout Standard >>> okno(czcionka=Arial) \layout Standard Na marginesie --- jeśli programowaliście kiedyś na Amidze, może dostrzeżecie pewne podobieństwo do argumentów w postaci tag-list. \layout Subsubsection Powody do zmartwień \layout Standard ...są na szczęście krótkotrwałe. Popatrzmy na poniższy przykład: \layout Standard >>> def wypelnij_liste(lista): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ lista = ["czyzby","kotek","zginal"] \layout Standard ... \layout Standard >>> lista = ["ala","ma","kotka"] \layout Standard >>> wypelnij_liste(lista) \layout Standard >>> print lista \layout Standard Jak sądzisz, co zobaczysz na ekranie? To dziwne na pozór zachowanie łatwo zrozumieć, jeśli przyjmiesz, że listy, słowniki i zbiory nie zawierają danych --- one tylko na nie \series bold wskazują \series default . Polecenie \layout Standard lista = ["ala","ma","kotka"] \layout Standard nie powoduje przechowania tych trzech napisów \series bold w \series default zmiennej lista. Napisy są przechowane w pamięci komputera, a \begin_inset Quotes eld \end_inset lista \begin_inset Quotes erd \end_inset na nie wskazuje (efekt użycia operatora przyrównania -- \begin_inset Quotes eld \end_inset = \begin_inset Quotes erd \end_inset ). Jeśli nie widzisz jeszcze różnicy, to pomyśl o tabliczce z napisem \begin_inset Quotes eld \end_inset Toruń 100km \begin_inset Quotes erd \end_inset --- taka tabliczka nie zawiera w sobie całego miasta, ona tylko nań wskazuje! \layout Standard Wywołanie funkcji nie zmienia tego obszaru pamięci (on nadal istnieje), tworzony jest jedynie nowy obszar pamięci z innymi danymi, zmienna \begin_inset Quotes eld \end_inset lista \begin_inset Quotes erd \end_inset na chwilę wskazuje na nowy obszar, po czym wracając z funkcji przywraca oryginalne wskazanie. \layout Standard Oczywiście z tego samego powodu w poniższym przykładzie zmieni się nam właścicie l futrzaka: \layout Standard >>> def wypelnij_liste(lista): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ lista[0] = "tomek" \layout Standard ... \layout Standard >>> lista = ["ala","ma","kotka"] \layout Standard >>> wypelnij_liste(lista) \layout Standard >>> print lista \layout Standard Tym razem nie ingerowaliśmy we wskazanie do danych (które miałoby i tak efekt lokalny), ale dokładnie w obszar pamięci. No dobrze, ale jak zabezpieczyć się przed zmianami na liście? To proste -- skopiować obszar danych, np. tak jak poniżej: \layout Standard >>> def wypelnij_liste(lista_arg): \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ lista = lista_arg[:]\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ # tutaj tworzymy \series bold kopię \series default argumentu \layout Standard ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ lista[0] = "tomek" \layout Standard ... \layout Standard >>> lista = ["ala","ma","kotka"] \layout Standard >>> wypelnij_liste(lista) \layout Standard >>> print lista \layout Standard Tym razem kotek nie zmienił właściciela. \layout Standard Jeśli programujesz np. w C, to może już widzisz pełną analogię między traktowaniem argumentów struktur w Pythonie, a przekazywaniem w C argumentu jako wskaźnika do danych (np. klasyczne równouprawnienie tablicy i wskaźnika do niej; w pewnym sensie rzecz jasna). W ogólności w Pythonie istnieją argumenty niemodyfikowalne (czyli odpowiadające w C przekazywaniu przez wartość) oraz modyfikowalne, zmienne (odpowiadające w C przekazywaniu przez wskaźnik). \layout Section Moduły \layout Standard Moduły zawierają wiele dodatkowych funkcji. Wraz z Pythonem dostarczanych jest wiele modułów, oferujących ogromne choć rzadko doceniane możliwości. Ładuje się je przy pomocy polecenia import. \layout Subsection string -- łańcuchy znaków \layout Standard Moduł string dostarcza wielu funkcji do manipulacji łańcuchami znaków. Zaimportujmy go: \layout Standard >>> import string \layout Standard i zobaczmy, co w sobie kryje: \layout Standard >>> dir(string) \layout Standard ['__builtins__', '__doc__', '__file__', '__name__', '_idmap', '_idmapL', '_lower', '_re', '_safe_env', '_swapcase', '_upper', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', 'expandtabs', 'find', 'hexdigits', 'index', 'index_error', 'join', 'joinfields', 'letters', 'ljust', 'lower', 'lowercase', 'lstrip', 'maketrans', 'octdigits', 'replace', 'rfind', 'rindex', 'rjust', 'rstrip', 'split', 'splitfields', 'strip', 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill'] \layout Standard Istnieją dwie możliwości: albo zaimportujemy moduł poleceniem import nazwa_moduł u, i wtedy musimy wywołuwać funkcję w postaci nazwa_modułu.nazwa_funkci, albo zaimportujemy je do użycia w sposób przezroczysty, za pomocą polecenia from nazwa_modułu import nazwa_funkcji, np.: \layout Standard >>> from string import upper \layout Standard Możemy też od razu zaimportować wszystkie: \layout Standard >>> from string import * \layout Standard Wypróbujmy kilku funkcji: \layout Standard >>> a = "Kiedy byłem mały" \layout Standard >>> print upper(a) \layout Standard KIEDY BYŁEM MAŁY \layout Standard Możemy uczynić wielką pierwszą lierę ciągu: \layout Standard >>> print capitalize(a) \layout Standard Kiedy byłem mały \layout Standard Albo każdego słowa: \layout Standard >>> print capwords(a) \layout Standard Kiedy Byłem Mały \layout Standard Uwaga: wszystkie te operacje są wykonywane na kopii łańcucha, nie na nim samym. Jeśli chcemy poddawać łańcuch dalszym modyfikacjom, najlepiej posłużyć się pomocniczymi zmiennymi. bardzo często używaną funkcją jest split(), która \begin_inset Quotes eld \end_inset rozszczepia \begin_inset Quotes erd \end_inset łańcuch znaków na wyrazy: \layout Standard >>> b=split(a)\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \layout Standard >>> print b[0], b[2] \layout Standard Kiedy mały \layout Standard Na której pozycji w łańcychu znajduje się pierwszy znak 'y'? \layout Standard >>> find(a,'y') \layout Standard 4 \layout Standard Ile razy występuje w ciągu? \layout Standard >>> count(a,'y') \layout Standard 3 \layout Subsection re i regex -- wyrażenia regularne \layout Standard Wyrażenia regularne pozwalają na odnalezienie znaków pasujących do podanego wzorca. \layout Standard >>> import re \layout Standard Znajdźmy wszystkie przypadki wystąpienia znaku 'a': \layout Standard >>> re.findall("a", 'Jacek Klucha') \layout Standard ['a', 'a'] \layout Standard ...znaku 'a' z następującym bezpośrednio po nim innym znaku: \layout Standard >>> re.findall("a.", 'Jacek Klucha') \layout Standard ['ac'] \layout Standard ...znak 'J' na początku linii: \layout Standard >>> re.findall("^J", 'Jacek Klucha') \layout Standard ['J'] \layout Standard ...ciąg 'cha' na końcu linii: \layout Standard >>> re.findall("cha$", 'Jacek Klucha') \layout Standard ['cha'] \layout Standard ...znak 'a', po nim znak z zakresu a-d, następnie 'e': \layout Standard >>> re.findall("a[a-d]e", 'Jacek Klucha') \layout Standard ['ace'] \layout Standard Czasem użyteczne jest rozbicie ciągu na elementy przy użyciu arbitralnego ogranicznika (np. przy imporcie plików CSV): \layout Standard >>> re.split("m", "Mamma mia") \layout Standard ['Ma', '', 'a ', 'ia'] \layout Standard Czasemmożna napotkać wykorzystanie przestarzałego modułu regex: \layout Standard >>> import regex \layout Standard >>> regex.match('a', 'ala') \layout Standard 1 \layout Standard >>> regex.match('b', 'ala') \layout Standard -1 \layout Subsection urllib \layout Standard urllib to bardzo przydatna biblioteka do ściągania stron WWW. Ale nie tylko. Rozpatrzmy prosty przykład: ściągnięcie strony www.tpnet.pl. \layout Standard >>> from urllib import * \layout Standard Obiekt 'link' wskazuje na metodę open() klasy URLopener, głównej klasy zdefiniow anej w urllib.py: \layout Standard >>> link = URLopener().open('http://www.tpnet.pl') \layout Standard ...czekamy chwilę. Jeśli wszystko poszło OK, po napisaniu \layout Standard >>> print link \layout Standard powinnismy otrzymać: \layout Standard ', mode 'rb' at 80b3b20>> \layout Standard Strona została ściągnięta, możemy się do niej dostać przy użyciu stadnardowej funkcji readlines: \layout Standard >>> print link.readlines() \layout Standard (oszczędźmy sobie wypisywania kodu HTML, który i tak będziemy zapewne chcieli przerobić). \layout Standard Ale to nie wszystko. Obiekt link posiada bowiem również metodę info(), pozwalającą uzyskać informacj e o połączeniu: \layout Standard >>> print link.info() \layout Standard Date: Mon, 17 Jul 2000 15:09:52 GMT \layout Standard Server: Apache/1.3.9 (Unix) \layout Standard Last-Modified: Thu, 20 Apr 2000 09:30:14 GMT \layout Standard ETag: "2983e-1a16-38fece26" \layout Standard Accept-Ranges: bytes \layout Standard Content-Length: 6678 \layout Standard Connection: close \layout Standard Content-Type: text/html \layout Standard Możemy więc napisać proste narzędzie do badania rodzaju serwera WWW ;-). Opnieważ pole info nie jest stringiem, tylko obiektem klasy Mimetools, dostajemy się do niego przy pomocy metody getheader(): \layout Standard >>> print link.info().getheader('Server') \layout Standard Apache/1.3.9 (Unix) \layout Standard A oto przykład skryptu, który wyświetli nam wszystkie tytuły wiadomości z listy dyskusyjnej LinuxPL: \layout Standard #!/usr/bin/env python \layout Standard from urllib import * \layout Standard import re \layout Standard \SpecialChar ~ \layout Standard a = URLopener().open("http://linux.cgs.pl/linuxpl/2000-07/index.html") \layout Standard #można też urllib.urlopen() \layout Standard b = a.read() \layout Standard c = re.findall(r' \backslash [linuxpl \backslash ].*.[- \backslash w]+)' \layout Standard ... \layout Standard na \layout Standard ... \layout Standard r'(?P
[- \backslash w \backslash t]+)'. \layout Standard ... \layout Standard Dalsza część tekstu zakłada, że czasem używamy KDE. A to z tego powodu, że .kderc jest jedynym plikiem w moim katalogu domowym, który z grubsza przypomina modelowy plik konfiguracyjny (obecność sekcji itd.). \layout Standard W pliku ConfigParser jest zadeklarowana klasa ConfigParser -- znajduje się tam również krótki opis metod tej klasy. Metody są funkcjami właściwymi dla danej klasy. Aby skorzystać z owych metod, musimy najpierw utworzyć obiekt należący do klasy ConfigParser (zadeklarowanej w pliku o tej samej nazwie -- stąd powtórzenie): \layout Standard a = ConfigParser.ConfigParser() \layout Standard Możemy teraz zobaczyć, jakie narzędzia mamy do dyspozycji: \layout Standard >>> dir(ConfigParser.ConfigParser) \layout Standard ['_ConfigParser__OPTCRE', '_ConfigParser__SECTCRE', '_ConfigParser__get', '_ConfigParser__read', '__doc__', '__init__', '__module__', 'add_section', 'defaults', 'get', 'getboolean', 'getfloat', 'getint', 'has_section', 'options' , 'read', 'sections'] \layout Standard Najpierw wywołamy metodę read(), która wczyta plik konfiguracyjny: \layout Standard >>> a.read('.kderc') \layout Standard Następnie sprawdźmy, jakie nagłówki zawiera nasz plik .kderc: \layout Standard >>> print a.sections() \layout Standard ['General', 'KDE', 'Standard Keys', 'WM', 'KFileDialogSettings', 'Locale'] \layout Standard Aby sprawdzić wartości, używamy metody get(). Sprawdźmy, jak się jej używa: \layout Standard >>> print a.get.__doc__ \layout Standard Get an option value for a given section. \layout Standard \SpecialChar ~ \layout Standard \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ All % interpolations are expanded in the return values, based on the \layout Standard \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ defaults passed into the constructor, unless the optional argument \layout Standard \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ `raw' is true.\SpecialChar ~ Additional substitutions may be provided using the \layout Standard \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ `vars' argument, which must be a dictionary whose contents overrides \layout Standard \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ any pre-existing defaults. \layout Standard \SpecialChar ~ \layout Standard \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ The section DEFAULT is special. \layout Standard Spróbujemy więc odczytać wartość opcji \begin_inset Quotes eld \end_inset Next \begin_inset Quotes erd \end_inset z sekcji \begin_inset Quotes eld \end_inset WM \begin_inset Quotes erd \end_inset : \layout Standard >>> print a.get("WM","Next", raw=0, vars=None) \layout Standard PageDown \layout Standard \layout Standard Chętni zainteresowani rozwinięciem wdzięcznego tematu OOP w Pythonie proszeni są o kontakt ;-) \the_end