Top Banner

of 425

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

Zanurkuj w Pythonie

Stworzone na Wikibooks, bibliotece wolnych podrcznikw.

Wydanie I z dnia 17 lutego 2008 Copyright c 2005-2008 uytkownicy Wikibooks. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License. Udziela si zezwolenia na kopiowanie, rozpowszechnianie i/lub modykacj treci artykuw polskich Wikibooks zgodnie z zasadami Licencji GNU Wolnej Dokumentacji (GNU Free Documentation License) w wersji 1.2 lub dowolnej pniejszej opublikowanej przez Free Software Foundation; bez Sekcji Niezmiennych, Tekstu na Przedniej Okadce i bez Tekstu na Tylnej Okadce. Kopia tekstu licencji znajduje si w czci zatytuowanej GNU Free Documentation License. Dodatkowe objanienia s podane w dodatku Dalsze wykorzystanie tej ksiki. Wikibooks nie udziela adnych gwarancji, zapewnie ani obietnic dotyczcych poprawnoci publikowanych treci. Nie udziela te adnych innych gwarancji, zarwno jednoznacznych, jak i dorozumianych.

Spis treci1 Wstp 1.1 O podrczniku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Instalacja 2.1 Ktry Python jest dla ciebie najlepszy? 2.2 Python w systemie Windows . . . . . . 2.3 Python w systemie Mac OS . . . . . . . 2.4 Python w systemach Linux . . . . . . . 2.5 Instalacja ze rde . . . . . . . . . . . . 2.6 Interaktywna powoka . . . . . . . . . . 2.7 Podsumowanie . . . . . . . . . . . . . . 3 Pierwszy program 3.1 Nurkujemy . . . . . . . 3.2 Deklarowanie funkcji . . 3.3 Dokumentowanie funkcji 3.4 Wszystko jest obiektem 3.5 Wcicia kodu . . . . . . 3.6 Testowanie moduw . . 1 2 3 4 5 7 10 13 14 15 17 18 20 22 23 26 28 29 30 32 35 41 43 46 48 50 52 56 59 61 62 64 66 68

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4 Wbudowane typy danych 4.1 acuchy znakw i unikod . . . . . . . . . 4.2 Sowniki . . . . . . . . . . . . . . . . . . . 4.3 Listy . . . . . . . . . . . . . . . . . . . . . 4.4 Krotki . . . . . . . . . . . . . . . . . . . . 4.5 Deklarowanie zmiennych . . . . . . . . . . 4.6 Formatowanie acucha znakw . . . . . . 4.7 Odwzorowywanie listy . . . . . . . . . . . 4.8 czenie list i dzielenie acuchw znakw 4.9 Kodowanie znakw . . . . . . . . . . . . . 4.10 Praca z unikodem . . . . . . . . . . . . . 4.11 Podsumowanie . . . . . . . . . . . . . . . 5 Potga introspekcji 5.1 Nurkujemy . . . . . . . . . . . . . . . . 5.2 Argumenty opcjonalne i nazwane . . . . 5.3 Dwa sposoby importowania moduw . . 5.4 type, str, dir i inne wbudowane funkcje . i

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

5.5 5.6 5.7 5.8 5.9 5.10

Funkcja getattr . . . . . . . . Filtrowanie listy . . . . . . . Operatory and i or . . . . . . Wyraenia lambda . . . . . . Potga introspekcji - wszystko Podsumowanie . . . . . . . .

. . . . . . . . . . . . . . . . razem . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

73 76 78 81 84 87 89 90 93 97 99 102 105 107 109 111 113 114 118 123 126 129 133 135 137 138 139 142 146 150 152 157

6 Obiekty i klasy 6.1 Nurkujemy . . . . . . . . . . . . 6.2 Deniowanie klas . . . . . . . . . 6.3 Tworzenie instancji klasy . . . . 6.4 Klasa opakowujca UserDict . . . 6.5 Metody specjalne . . . . . . . . . 6.6 Zaawansowane metody specjalne 6.7 Atrybuty klas . . . . . . . . . . . 6.8 Funkcje prywatne . . . . . . . . . 6.9 Podsumowanie . . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

7 Wyjtki i operacje na plikach 7.1 Obsuga wyjtkw . . . . . . . . . . . . . . . . 7.2 Praca na plikach . . . . . . . . . . . . . . . . . 7.3 Ptla for . . . . . . . . . . . . . . . . . . . . . . 7.4 Korzystanie z sys.modules . . . . . . . . . . . . 7.5 Praca z katalogami . . . . . . . . . . . . . . . . 7.6 Wyjtki i operacje na plikach - wszystko razem 7.7 Wyjtki i operacje na plikach - podsumowanie . 8 Wyraenia regularne 8.1 Nurkujemy . . . . . . . . . . . . . . . . . . 8.2 Analiza przypadku: Adresy ulic . . . . . . . 8.3 Analiza przypadku: Liczby rzymskie . . . . 8.4 Skadnia ?n, m? . . . . . . . . . . . . . . . . 8.5 Rozwleke wyraenia regularne . . . . . . . 8.6 Analiza przypadku: Przetwarzanie numerw 8.7 Podsumowanie . . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . telefonw . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

9 Przetwarzanie HTML-a 9.1 Nurkujemy . . . . . . . . . . . . . . . . . . . . 9.2 Wprowadzenie do sgmllib.py . . . . . . . . . . 9.3 Wyciganie danych z dokumentu HTML . . . . 9.4 Wprowadzenie do BaseHTMLProcessor.py . . . 9.5 locals i globals . . . . . . . . . . . . . . . . . . 9.6 Formatowanie napisw w oparciu o sowniki . . 9.7 Dodawanie cudzysoww do wartoci atrybutw 9.8 Wprowadzenie do dialect.py . . . . . . . . . . . 9.9 Przetwarzanie HTML-a - wszystko razem . . . 9.10 Podsumowanie . . . . . . . . . . . . . . . . . . ii

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

159 . 160 . 166 . 169 . 172 . 175 . 179 . 181 . 183 . 187 . 190

10 Przetwarzanie XML-a 10.1 Nurkowanie . . . . . . . . . . . . 10.2 Pakiety . . . . . . . . . . . . . . 10.3 Parsowanie XML-a . . . . . . . . 10.4 Wyszukiwanie elementw . . . . 10.5 Dostp do atrybutw elementw 10.6 Podsumowanie . . . . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

191 192 200 203 207 209 211 213 214 219 224 226 227 230 234 236 237 238 241 242 245 247 249 253 258 261 264

11 Skrypty i strumienie 11.1 Abstrakcyjne rda wejcia . . . . . . . . . . . . . . . . . . 11.2 Standardowy strumie wejcia, wyjcia i bdw . . . . . . 11.3 Buforowanie odszukanego wza . . . . . . . . . . . . . . . . 11.4 Wyszukanie bezporednich elementw potomnych . . . . . . 11.5 Tworzenie oddzielnych funkcji obsugi wzgldem typu wza 11.6 Obsuga argumentw linii polece . . . . . . . . . . . . . . 11.7 Skrypty i strumienie - wszystko razem . . . . . . . . . . . . 11.8 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . 12 HTTP 12.1 Nurkujemy . . . . . . . . . . . . . . . . 12.2 Jak nie pobiera danych poprzez HTTP 12.3 Waciwoci HTTP . . . . . . . . . . . . 12.4 Debugowanie serwisw HTTP . . . . . . 12.5 Ustawianie User-Agent . . . . . . . . . . 12.6 Korzystanie z Last-Modied i ETag . . 12.7 Obsuga przekierowa . . . . . . . . . . 12.8 Obsuga skompresowanych danych . . . 12.9 HTTP - wszystko razem . . . . . . . . . 12.10Podsumowanie . . . . . . . . . . . . . . 13 SOAP 13.1 Nurkujemy . . . . . . . . . . . . . . . 13.2 Instalowanie odpowiednich bibliotek . 13.3 Pierwsze kroki z SOAP . . . . . . . . 13.4 Debugowanie serwisu sieciowego SOAP 13.5 Wprowadzenie do WSDL . . . . . . . 13.6 Introspekcja SOAP z uyciem WSDL . 13.7 Wyszukiwanie w Google . . . . . . . . 13.8 Rozwizywanie problemw . . . . . . . 13.9 Podsumowanie . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

265 . 266 . 268 . 270 . 271 . 273 . 274 . 277 . 280 . 284 285 286 288 289 293 296 299

14 Testowanie jednostkowe 14.1 Wprowadzenie do liczb rzymskich . . . . 14.2 Nurkujemy . . . . . . . . . . . . . . . . 14.3 Wprowadzenie do romantest.py . . . . . 14.4 Testowanie poprawnych przypadkw . . 14.5 Testowanie niepoprawnych przypadkw 14.6 Testowanie zdroworozsdkowe . . . . . . iii

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

15 Testowanie 2 15.1 roman.py, 15.2 roman.py, 15.3 roman.py, 15.4 roman.py, 15.5 roman.py,

etap etap etap etap etap

1 2 3 4 5

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

303 304 309 314 318 321 325 326 329 337 342 345 346 349 352 355 357 359

16 Refaktoryzacja 16.1 Obsuga bdw . . . . . . . . . . . . . . . . 16.2 Obsuga zmieniajcych si wymaga . . . . 16.3 Refaktoryzacja . . . . . . . . . . . . . . . . 16.4 Postscript . . . . . . . . . . . . . . . . . . . 16.5 Podsumowanie . . . . . . . . . . . . . . . . 16.6 Nurkujemy . . . . . . . . . . . . . . . . . . 16.7 Znajdowanie cieki . . . . . . . . . . . . . 16.8 Filtrowanie listy . . . . . . . . . . . . . . . 16.9 Odwzorowywanie listy . . . . . . . . . . . . 16.10Programowanie koncentrujce si na danych 16.11Dynamiczne importowanie moduw . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

17 Programowanie funkcyjne 361 17.1 Programowanie funkcyjne - wszystko razem . . . . . . . . . . . . . . . . 362 17.2 Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 18 Funkcje dynamiczne 18.1 Nurkujemy . . . . 18.2 plural.py, etap 1 . 18.3 plural.py, etap 2 . 18.4 plural.py, etap 3 . 18.5 plural.py, etap 4 . 18.6 plural.py, etap 5 . 18.7 plural.py, etap 6 . 18.8 Podsumowanie . . 367 368 369 372 374 376 379 381 385 387 388 391 393 397 401 404 406 407 407 407 407 407

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

19 Optymalizacja szybkoci 19.1 Nurkujemy . . . . . . . . . . . . . . . . 19.2 Korzystanie z moduu timeit . . . . . . 19.3 Optymalizacja wyrae regularnych . . 19.4 Optymalizacja przeszukiwania sownika 19.5 Optymalizacja operacji na listach . . . . 19.6 Optymalizacja operacji na napisach . . . 19.7 Podsumowanie . . . . . . . . . . . . . . A Informacje o pliku A.1 Historia . . . . . . . . . . . . . . A.2 Informacje o pliku PDF i historia A.3 Autorzy . . . . . . . . . . . . . . A.4 Graki . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

iv

B Dalsze wykorzystanie tej ksiki 409 B.1 Wstp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 B.2 Status prawny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 B.3 Wykorzystywanie materiaw z Wikibooks . . . . . . . . . . . . . . . . . 409 C GNU Free Documentation License 411

v

Rozdzia 1

Wstp

1

2

ROZDZIA 1. WSTP

1.1

O podrczniku

Podrcznik ten powstaje na podstawie ksiki Dive into Python (w wikszoci jest to tumaczenie), ktrej autorem jest Mark Pilgrim, a udostpnionej na licencji GNU Free Documentation License.

Autorzy i tumacze Mark Pilgrim (autor ksiki Dive into Python) Warszk Piotr Kie Roman Froow Andrzej Saski Adam Kubiczek

Rozdzia 2

Instalacja

3

4

ROZDZIA 2. INSTALACJA

2.1

Ktry Python jest dla ciebie najlepszy?

Witamy w Pythonie. W tym rozdziale zajmiemy si instalacj Pythona.

Ktry Python jest dla ciebie najlepszy?Aby mc korzysta z Pythona, najpierw naley go zainstalowa. A moe ju go mamy? Jeeli posiadasz konto na jakimkolwiek serwerze, istnieje due prawdopodobiestwo, e Python jest tam ju zainstalowany. Wiele popularnych dystrybucji Linuksa standardowo instaluje ten jzyk programowania. Systemy Mac OS X 10.2 i nowsze posiadaj dosy okrojon wersj Pythona dostpnego jedynie z poziomu linii polece. Zapewne bdziesz chcia zainstalowa wersj, ktra da Ci wicej moliwoci. Windows domylnie nie zawiera adnej wersji Pythona, ale nie zaamuj si! Istnieje wiele sposobw, by w atwy sposb zainstalowa Pythona w tym systemie operacyjnym. Jak widzisz, wersje Pythona s dostpne na wiele platform i systemw operacyjnych. Moemy zdoby Pythona zarwno dla Windowsa, Mac OS, Mac OS X, wszystkich wariantw Uniksa, w tym Linuksa czy Solarisa, jak i dla Amigi, OS/2, BeOSa, czy te innych systemw, o ktrych najprawdopodobniej nawet nie syszae. Co najwaniejsze, program napisany w Pythonie na jednej platformie, przy zachowaniu niewielkiej dozy ostronoci, zadziaa na jakiejkolwiek innej. Moesz na przykad rozwija swj program pod Windowsem, a nastpnie przenie go do Linuksa. Wracajc do pytania rozpoczynajcego sekcj, Ktry Python jest dla ciebie najlepszy?. Odpowied jest jedna: jakikolwiek, ktry moesz zainstalowa na posiadanym komputerze.

2.2. PYTHON W SYSTEMIE WINDOWS

5

2.2

Python w systemie Windows

Python w WindowsieW Windowsie mamy par sposobw zainstalowania Pythona. Firma ActiveState tworzy instalator Pythona zwany ActivePython. Zawiera on kompletn wersje Pythona, IDE z bardzo dobrym edytorem kodu oraz kilka rozszerze dla Windowsa, ktre zapewniaj dostp do specycznych dla Windowsa usug, API oraz rejestru. ActivePython mona pobra nieodpatnie, ale nie jest produktem Open Source. Wydawany jest kilka miesicy po wersji oryginalnej. Drug opcj jest instalacja ocjalnej wersji Pythona, rozprowadzanej przez ludzi, ktrzy rozwijaj ten jzyk. Jest to wersja oglnodostpna, Open Source i zawsze najnowsza. Instalacja ActivePythona Oto procedura instalacji ActivePythona: 1. cigamy ActivePythona ze strony http://www.activestate.com/Products/ ActivePython/. 2. Jeeli uywamy Windows 95/98/ME/NT4/2000, bdziemy musieli najpierw zainstalowa Windows Installer 2.0 dla Windowsa 95/98/Me lub Windows Installer 2.0 dla Windowsa NT4/2000 . 3. Klikamy dwukrotnie na cignity plik ActivePython-(pobrana wersja)-win32-ix86.msi 4. Przechodzimy wszystkie kroki instalatora. 5. Po zakoczeniu instalacji wybieramy Start->Programy->ActiveState ActivePython 2.2->PythonWin IDE. Zobaczymy wtedy ekran z napisem podobnym do poniszego: PythonWin 2.2.2 (#37, Nov 26 2002, 10:24:37) [MSC 32 bit (Intel)] on win32. Portions Copyright 1994-2001 Mark Hammond ([email protected]) see Help/About PythonWin for further copyright information. >>> Instalacja Pythona z Python.org 1. Pobieramy z http://www.python.org/ftp/python/ najnowsz wersj instalatora dla Windowsa, ktry oczywicie bdzie mia rozszerzenie .exe. 2. Klikamy dwukrotnie na instalatorze Python-2.xxx.yyy.msi. Nazwa zalee bdzie od cignitej wersji Pytona. 3. Jeeli uywamy Windows 95/98/ME/NT4/2000, bdziemy musieli najpierw zainstalowa Windows Installer 2.0 dla Windowsa 95/98/Me lub Windows Installer 2.0 dla Windowsa NT4/2000 . 4. Przechodzimy przez wszystkie kroki instalatora. 5. Jeeli nie mamy uprawnie administratora, moemy wybra Advanced Options, a nastpnie Non-Admin Install.

6

ROZDZIA 2. INSTALACJA 6. Po zakoczeniu instalacji, wybieramy Start->Programy->Python 2.x->IDLE (Python GUI). Zobaczymy ekran z napisem podobnym do poniszego:

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. **************************************************************** Personal firewall software may warn about the connection IDLE makes to its subprocess using this computers internal loopback interface. This connection is not visible on any external interface and no data is sent to or received from the Internet. **************************************************************** IDLE 1.2.1 >>>

2.3. PYTHON W SYSTEMIE MAC OS

7

2.3

Python w systemie Mac OS

Python w Mac OS XW Mac OS X moemy mie Pythona na dwa sposoby: instalujc go lub nie robic tego. Zapewne bdziesz chcia go zainstalowa. Mac OS X 10.2 i nowsze domylnie instaluj okrojon wersj Pythona dostpnego jedynie z linii polece. Jeeli nie przeszkadza Ci praca w linii polece, to pocztkowo taka wersja moe Tobie wystarczy. Jednak nie posiada ona parsera XML, wic jeli dojdziesz do rozdziau mwicego na ten temat i tak bdziesz musia zainstalowa pen wersj. Zamiast wic uywa domylnie zainstalowanej wersji, lepiej bdzie od razu zainstalowa najnowsz, a ktra te dostarczy nam wygodn, graczn powok. Uruchamianie wersji domylnie zainstalowanej z systemem 1. Otwieramy katalog /Applications 2. Otwieramy katalog Utilities 3. Klikamy dwukrotnie na Terminal, by otworzy okienko terminala, ktre zapewni nam dostp do linii polece. 4. Wpisujemy polecenie python. Powinnimy otrzyma mniej wicej takie co: Welcome to Darwin! [localhost:~] you\% python Python 2.2 (\#1, 07/14/02, 23:25:09) [GCC Apple cpp-precomp 6.14] on darwin Type "help", "copyright", "credits", or "license" for more information. >>> [press Ctrl+D to get back to the command prompt] [localhost:~] you\% Instalacja najnowszej wersji Pythona Aby to zrobi postpujemy wedug poniszych krokw: 1. cigamy obraz dysku MacPython-OSX z http://homepages.cwi.nl/~jack/ macpython/download.html. 2. Jeeli pobrany program nie zostanie uruchomiony przez przegldark, klikamy dwukrotnie na MacPython-OSX-(pobrana wersja).dmg by zamontowa obraz dysku w systemie. 3. Klikamy dwukrotnie na instalator MacPython-OSX.pkg. 4. Instalator poprosi o login i haso uytkownika z prawami administratora. 5. Przechodzimy wszystkie kroki instalatora. 6. Po zakoczonej instalacji otwieramy katalog /Applications. 7. Otwieramy katalog MacPython-2.x.

8

ROZDZIA 2. INSTALACJA 8. Klikamy dwukrotnie na PythonIDE by uruchomi Pythona.

MacPython IDE wywietli ekran powitalny, a nastpnie interaktywn powok. Jeeli jednak powoka si nie pojawi, wybieramy Window->Python Interactive (Cmd-0). Otwarte okienko powinno wyglda podobnie do tego: Python 2.3 (#2, Jul 30 2003, 11:45:28) [GCC 3.1 20020420 (prerelease)] Type "copyright", "credits" or "license" for more information. MacPython IDE 1.0.1 >>> Po instalacji najnowszej wersji, domylnie zainstalowana wersja Pythona nadal pozostanie w systemie. Podczas uruchamiania skryptw zwr uwag z jakiej wersji korzystasz. Dwie wersje Pythona w Mac OS X [localhost:~] you\% python Python 2.2 (\#1, 07/14/02, 23:25:09) [GCC Apple cpp-precomp 6.14] on darwin Type "help", "copyright", "credits", or "license" for more information. >>> [press Ctrl+D to get back to the command prompt] [localhost:~] you\% /usr/local/bin/python Python 2.3 (\#2, Jul 30 2003, 11:45:28) [GCC 3.1 20020420 (prerelease)] on darwin Type "help", "copyright", "credits", or "license" for more information. >>> [press Ctrl+D to get back to the command prompt] [localhost:~] you\% Instalacja Pythona z MacPortw Ta metoda jest najlepsza. Naley wpierw pobra i zainstalowa MacPorts (http: //www.macports.org/). Nastpnie naley odwiey porty sudo port selfupdate Potem moemy wyszukiwa interesujce nasz pakiety. Np. znalezienie wszystkich pakietw do Pythona 2.5.x: port search py25 Waciwa instalacja Pythona: sudo port install python25 Wszystkie programy instalowane t metod s skadowane w /opt/local. Warto wic doda do cieki PATH /opt/local/bin. Dobrze jest te doinstalowa setuptools, ktry daje dostp do pythonowego instalatora pakietw, skryptu easy install. sudo port install py25-setuptools

2.3. PYTHON W SYSTEMIE MAC OS

9

Przydaje si, gdy nie ma w portach pakietu dla naszej wersji Pythona, np. IPythona. Cz bibliotek mona instalowa MacPortami, a reszt za pomoc easy setup. Na przykad IPythona doinstalujemy za pomoc: sudo easy_install ipython Mona te aktualizowa pakiety: sudo easy_install -U Pylons Due i mae znaki w nazwach pakietw, w wypadku uycia easy install, nie maj znaczenia. Python w Mac OS 9 Mac OS 9 nie posiada domylnie adnej wersji Pythona, ale samodzielna instalacja jest bardzo prosta. 1. cigamy plik MacPython23full.bin z http://homepages.cwi.nl/~jack/macpython/ download.html. 2. Jeeli plik nie zostanie automatycznie rozpakowany przez przegldark, klikamy dwukrotnie na MacPython23full.bin by to zrobi. 3. Klikamy dwukrotnie instalator MacPython23full. 4. Przechodzimy wszystkie kroki instalatora. 5. Po zakoczonej instalacji otwieramy katalog /Applications. 6. Otwieramy katalog MacPython-OS9 2.x. 7. Kliknij dwukrotnie na Python IDE by uruchomi Pythona. MacPython IDE wywietli ekran powitalny, a nastpnie interaktywn powok. Jeeli jednak powoka si nie pojawi, wybieramy Window->Python Interactive (Cmd-0). Otwarte okienko powinno wyglda podobnie do tego: Python 2.3 (#2, Jul 30 2003, 11:45:28) [GCC 3.1 20020420 (prerelease)] Type "copyright", "credits" or "license" for more information. MacPython IDE 1.0.1 >>>

10

ROZDZIA 2. INSTALACJA

2.4

Python w systemach Linux

Python w dystrybucjach LinuksaInstalacja z gotowych pakietw binarnych dla konkretnej dystrybucji Linuksa jest stosunkowo prosta. Wikszo dystrybucji posiada ju zainstalowan wersj Pythona. Moesz take pokusi si o instalacj ze rde. Wiele dystrybucji Linuksa zawiera graczne narzdzia suce do instalacji oprogramowania. My jednak opiszemy, jak to zrobi w konsoli w wybranych dystrybucjach Linuksa. Python w dystrybucji Red Hat Linux Moemy zainstalowa Pythona wykorzystujc polecenie rpm: localhost:~\$ su Password: [wpisz haso roota] [root@localhost root]# wget http://python.org/ftp/python/2.3/rpms/redhat-9/ python2.3-2.3-5pydotorg.i386.rpm Resolving python.org... done. Connecting to python.org[194.109.137.226]:80... connected. HTTP request sent, awaiting response... 200 OK Length: 7,495,111 [application/octet-stream] ... [root@localhost root]# rpm -Uvh python2.3-2.3-5pydotorg.i386.rpm Preparing... ############################################ [100\%] 1:python2.3 ############################################ [100\%] [root@localhost root]# python #(1) Python 2.2.2 (\#1, Feb 24 2003, 19:13:11) [GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-4)] on linux2 Type "help", "copyright", "credits", or "license" for more information. >>> [wcinij Ctrl+D, eby wyj z programu] [root@localhost root]# python2.3 #(2) Python 2.3 (\#1, Sep 12 2003, 10:53:56) [GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-5)] on linux2 Type "help", "copyright", "credits", or "license" for more information. >>> [wcinij Ctrl+D, eby wyj z programu] [root@localhost root]# which python2.3 #(3) /usr/bin/python2.3 1. Wpisujc polecenie python zostaje uruchomiony Python. Jednak jest to starsza jego wersja, domylnie zainstalowana wraz z systemem. To nie jest to, czego chcemy. 2. Podczas pisania tej ksiki najnowsz wersj by Python 2.3. Za pomoc polecenia python2.3 uruchomimy nowsz, wanie zainstalowan wersje. 3. Jest to pena cieka do nowszej wersji Pythona, ktr dopiero co zainstalowalimy.

2.4. PYTHON W SYSTEMACH LINUX Python w dystrybucji Debian Pythona zainstalujemy wykorzystujc polecenie apt-get.

11

localhost:~$ su Password: [wpisz haso roota] localhost:~# apt-get install python Reading Package Lists... Done Building Dependency Tree... Done The following extra packages will be installed: python2.3 Suggested packages: python-tk python2.3-doc The following NEW packages will be installed: python python2.3 0 upgraded, 2 newly installed, 0 to remove and 3 not upgraded. Need to get 0B/2880kB of archives. After unpacking 9351kB of additional disk space will be used. Do you want to continue? [Y/n] Y Selecting previously deselected package python2.3. (Reading database ... 22848 files and directories currently installed.) Unpacking python2.3 (from .../python2.3_2.3.1-1_i386.deb) ... Selecting previously deselected package python. Unpacking python (from .../python_2.3.1-1_all.deb) ... Setting up python (2.3.1-1) ... Setting up python2.3 (2.3.1-1) ... Compiling python modules in /usr/lib/python2.3 ... Compiling optimized python modules in /usr/lib/python2.3 ... localhost:~# exit logout localhost:~$ python Python 2.3.1 (#2, Sep 24 2003, 11:39:14) [GCC 3.3.2 20030908 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> [wcinij Ctrl+D, eby wyj z programu] Python w dystrybucji Mandriva W konsoli z uytkownika root wpisujemy polecenie: $ su Password: [wpisz haso roota] # urpmi python Python w dystrybucji Fedora/Fedora Core Aby zainstalowa Pythona w dystrybucji Fedora/Fedora Core naley w konsoli wpisa: $ su Password: [wpisz haso roota] # yum install python

12

ROZDZIA 2. INSTALACJA

Mona te zainstalowa Pythona przy instalacji systemu, wybierajc pakiety programistyczne. Python w dystrybucji Gentoo GNU/Linux W Gentoo do instalacji Pythona moemy uy programu emerge: $ su Password: [wpisz haso roota] # emerge python

2.5. INSTALACJA ZE RDE

13

2.5

Instalacja ze rde

Instalacja ze rdeJeeli wolimy zainstalowa Pythona ze rde, bdziemy musieli pobra kod rdowy z http://www.python.org/ftp/python/. Wybieramy najnowsz wersj (najwyszy numer) i cigamy plik .tgz, a nastpnie wykonujemy standardowe komendy instalacyjne (./configure, make, make install). localhost:~\$ su Password: [wpisz haso roota] localhost:~# wget http://www.python.org/ftp/python/2.3/Python-2.3.tgz Resolving www.python.org... done. Connecting to www.python.org[194.109.137.226]:80... connected. HTTP request sent, awaiting response... 200 OK Length: 8,436,880 [application/x-tar] ... localhost:~# tar xfz Python-2.3.tgz localhost:~# cd Python-2.3 localhost:~/Python-2.3# ./configure checking MACHDEP... linux2 checking EXTRAPLATDIR... checking for --without-gcc... no ... localhost:~/Python-2.3# make gcc -pthread -c -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I. \ -I./Include -DPy\_BUILD\_CORE -o Modules/python.o Modules/python.c gcc -pthread -c -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I. \ -I./Include -DPy\_BUILD\_CORE -o Parser/acceler.o Parser/acceler.c gcc -pthread -c -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -I. \ -I./Include -DPy\_BUILD\_CORE -o Parser/grammar1.o Parser/grammar1.c ... localhost:~/Python-2.3# make install /usr/bin/install -c python /usr/local/bin/python2.3 ... localhost:~/Python-2.3# exit logout localhost:~$ which python /usr/local/bin/python localhost:~$ python Python 2.3.1 (#2, Sep 24 2003, 11:39:14) [GCC 3.3.2 20030908 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> [wcinij Ctrl+D, eby wyj z programu] localhost:~$

14

ROZDZIA 2. INSTALACJA

2.6

Interaktywna powoka

Interaktywna powokaTeraz kiedy ju mamy zainstalowanego Pythona, pewnie si zastanawiamy, co to jest ta interaktywna powoka (interactive shell ), ktr uruchomilimy? Powiedzmy tak: Python umoliwia prac na dwa sposoby. Jest interpreterem skryptw, ktre moemy uruchomi z linii polece lub, jak inne aplikacje, dwukrotnie klikajc na ikonce skryptu, a take jest interaktywn powok, dziki ktrej moemy debugowa, sprawdza dziaanie potrzebnych funkcji czy moliwoci Pythona. Moesz nawet potraktowa powok jako kalkulator! Uruchom teraz powok Pythona w odpowiedni sposb dla twojego systemu i sprawdmy co ona potra: Przykad 1.5 Pierwsze kroki w interaktywnej powoce >>> 1 + 1 2 >>> print hello world hello world >>> x = 1 >>> y = 2 >>> x + y 3 #(1) #(2) #(3)

1. Interaktywna powoka Pythona moe wylicza dowolne wyraenia matematyczne. 2. Potra wykonywa dowolne polecenia Pythona. 3. Moemy przypisa pewne wartoci do zmiennych, ktre s pamitane tak dugo, jak dugo jest uruchomiona nasza powoka (ale nie duej).

2.7. PODSUMOWANIE

15

2.7

Instalacja - podsumowanie

PodsumowanieW tym momencie powinnimy ju mie zainstalowanego Pythona. W zalenoci od platformy moesz mie zainstalowan wicej ni jedn wersj Pythona. Jeeli tak wanie jest to musisz uwaa na cieki dostpu do programu. Piszc tylko python w linii polece, moe si okaza, e nie uruchamiasz wersji, ktrej akurat potrzebujesz. By moe bdziesz musia podawa pen ciek dostpu lub odpowiedni nazw (python2.2, python2.4 itp.) Gratulujemy i witamy w Pythonie!

16

ROZDZIA 2. INSTALACJA

Rozdzia 3

Pierwszy program

17

18

ROZDZIA 3. PIERWSZY PROGRAM

3.1

Pierwszy program

Czy dostrzeglimy, e wikszo ksiek najpierw przedstawia elementarne zasady programowania, a potem opisuje, jak korzystajc z nich stworzy kompletny i dziaajcy program? My zrobimy inaczej...

NurkujemyOto kompletny, dziaajcy program w Pythonie. Prawdopodobnie jest on dla Ciebie cakowicie niezrozumiay, ale nie przejmuj si tym, poniewa zaraz przeanalizujemy go dokadnie, linia po linii. Przeczytaj go i sprawd, czy co jeste w stanie z niego zrozumie. Przykad 2.1 odbchelper.py #-*- coding: utf-8 -*def buildConnectionString(params): u"""Tworzy acuch znakw na podstawie sownika parametrw. Zwraca acuch znakw. """ return ";".join(["%s=%s" % (k, v) for k, v in params.items()]) if __name__ == "__main__": myParams = {"server":"mpilgrim", \ "database":"master", \ "uid":"sa", \ "pwd":"secret" } print buildConnectionString(myParams) Teraz uruchommy ten program i zobaczmy, co si stanie. W IDE ActivePythona w systemie Windows moemy uruchomi edytowany program wybierajc File->Run... (Ctrl-R). Wynik wywietlany jest w interaktywnym oknie.

W IDE Pythona w systemie Mac OS uruchomimy program wybierajc Python->Run window... (Cmd-R), jednak wczeniej musimy ustawi pewn wan opcj. W tym celu otwieramy plik .py w IDE, wywoujemy menu podrczne klikajc czarny trjkt w prawym grnym rogu okna i upewniamy si, e opcja Run as main jest zaznaczona.

W systemach Unix (take w Mac OS X ) moesz uruchomi program z linii polece poleceniem python odbchelper.py W wyniku uruchomienia programu otrzymujemy:

3.1. NURKUJEMY pwd=secret;database=master;uid=sa;server=mpilgrim

19

20

ROZDZIA 3. PIERWSZY PROGRAM

3.2

Deklarowanie funkcji

Deklarowanie funkcjiPython posiada funkcje, podobnie jak wiele innych jzykw programowania, lecz nie deniujemy ich w oddzielnych plikach nagwkowych (jak np. w C++), czy te nie dzielimy na sekcje interfejsu i implementacji jak w Pascalu. Jeli potrzebujemy jakiej funkcji, po prostu j deklarujemy, na przykad: def buildConnectionString(params): Sowo kluczowe def rozpoczyna deklaracj funkcji, nastpnie podajemy nazw funkcji, a potem w nawiasach parametry. Wiksz liczb parametrw podajemy po przecinkach. Jak wida funkcja nie deniuje zwracanego typu. Podczas deklarowania Pythonowych funkcji nie okrelamy, czy maj one zwraca jak warto, a nawet czy maj cokolwiek zwraca. W rzeczywistoci kada funkcja zwraca pewn warto. Jeeli w funkcji znajduje si instrukcja return, funkcja zwrci okrelon warto, wskazan za pomoc tej instrukcji. W przeciwnym wypadku, gdy dana funkcja nie posiada instrukcji return, zostanie zwrcona warto None, czyli tak zwana warto pusta, a w innych jzykach czsto okrelana jako null lub nil. W Visual Basicu funkcje (te, ktre zwracaj warto) rozpoczynaj si sowem kluczowym function, a procedury (z ang. subroutines, nie zwracaj wartoci) deklarujemy za pomoc sowa sub. W Pythonie nie ma czego takiego jak procedury. S tylko funkcje, a kada z nich zwraca warto (nawet jeeli jest to None) i wszystkie rozpoczynaj si sowem kluczowym def. Argument params nie ma okrelonego typu. W Pythonie typy zmiennych nie okrelamy w sposb jawny. Interpreter sam automatycznie rozpoznaje i ledzi typ zmiennej. W Javie, C++ i innych jzykach z typami statycznymi musimy okreli typ danych zwracany przez funkcj, a take typ kadego argumentu. W Pythonie nigdzie tego nie robimy. Bazujc na wartoci jaka zostaa przypisana zmiennej, Python sam okrela jej typ.

Typy danych w Pythonie a inne jzyki programowania Jeli chodzi o nadawanie typw, jzyki programowania mona podzieli na: statycznie typowane S to jzyki, w ktrych typy s nadawane podczas kompilacji. Wiele tego typu jzykw programowania wymaga deklarowania wszystkich zmiennych przed ich uyciem, przez podanie ich typu. Przykadami takich jzykw jest Java, czy te C. dynamicznie typowane S to jzyki, w ktrych typy zmiennych s nadawane podczas dziaania programu. VBScript i Python s jzykami dynamicznie typowanymi, poniewa nadaj one typ zmiennej podczas przypisania do niej wartoci.

3.2. DEKLAROWANIE FUNKCJI

21

silnie typowane S to jzyki, w ktrych midzy rnymi typami wida wyran granic. Jeli mamy pewn liczb cakowit, to nie moemy jej traktowa jak jaki napis bez wczeniejszego przekonwertowania jej na acuch znakw. sabo typowane S to jzyki, w ktrych moemy nie zwraca uwagi na typ zmiennej. Do takich jzykw zaliczymy VBScript. W tym jzyku moemy, przy tym nie wykonujc adnej wyranej konwersji, poczy acuch znakw 12 z liczb cakowit 3 otrzymujc acuch 123, a nastpnie potraktowa go jako liczb cakowit 123. Konwersja jest wykonywana automatycznie. Python jest jzykiem zarwno dynamicznie typowanym (poniewa nie wymaga wyranej deklaracji typu), jak i silnie typowanym (poniewa zmienne posiadaj wyranie ustalone typy, ktre nie podlegaj automatycznej konwersji).

22

ROZDZIA 3. PIERWSZY PROGRAM

3.3

Dokumentowanie funkcji

Dokumentowanie funkcjiFunkcje mona dokumentowa wstawiajc notk dokumentacyjn (ang. doc string). Przykad 2.2 Deniowanie notki dokumentacyjnej w funkcji buildConnectionString def buildConnectionString(params): u"""Tworzy acuch znakw na podstawie sownika parametrw. Zwraca acuch znakw. """ return ";".join(["%s=%s" % (k, v) for k, v in params.items()]) Trzy nastpujce po sobie cudzysowy wykorzystuje si do tworzenia cigu znakw, ktry moe zajmowa wiele linii. Wszystko co si znajduje pomidzy nimi tworzy pojedynczy acuch znakw; dotyczy to take znakw powrotu karetki i cudzysowu. Potrjne cudzysowy moemy uywa wszdzie, ale najczciej wykorzystuje si je do tworzenia notek dokumentacyjnych. Za pomoc potrjnych cudzysoww ("""...""") moemy w atwy sposb zdeniowa acuch znakw zawierajcy pojedyncze jak i podwjne cudzysowy, podobnie jak w przypadku qq/../ w Perlu. Dziki przedrostkowi u Python zapamita ten acuch znakw w taki sposb, e bdzie potra poprawnie zinterpretowa polskie litery. Wicej szczegw na ten temat dowiemy si w dalszej czci tej ksiki. W powyszym przykadzie wszystko pomidzy potrjnymi cudzysowami jest notk dokumentacyjn funkcji, czyli opisem do czego dana funkcja suy i jak j uywa. Notka dokumentacyjna, o ile istnieje, musi znale si pierwsza w denicji funkcji (czyli zaraz po dwukropku). Python nie wymaga, aby funkcja posiadaa notk dokumentacyjn, lecz powinnimy j zawsze tworzy. Uatwia ona nam, a take innym, zorientowa si w programie. Warto zaznaczy, e notka dokumentacyjna jest dostpna jako atrybut funkcji nawet w trakcie wykonywania programu. Wiele Pythonowych IDE wykorzystuje notki dokumentacyjne do inteligentnej pomocy, czyli sugerowania nazwy funkcji przy jednoczesnym wywietlaniu informacji o niej (wzitej z notki). Moe to stanowi dla nas bardzo dobr pomoc, oczywicie pod warunkiem, e notki dokumentacyjne zostay przez nas zdeniowane...

Materiay dodatkowe Materiay co prawda w jzyku angielskim, ale na pewno warto je chocia przejrze: PEP 257, na temat konwencji notek dokumentacyjnych, Python Style Guide, o tym, jak napisa dobr notk dokumentacyjn,

3.4. WSZYSTKO JEST OBIEKTEM

23

3.4

Wszystko jest obiektem

Wszystko jest obiektemWspomnielimy ju wczeniej, e funkcje w Pythonie posiadaj atrybuty, a one s dostpne podczas pracy programu. Funkcje, podobnie jak wszystko inne w Pythonie, s obiektami. Otwrzmy swj ulubiony IDE Pythona i wprowad nastpujcy kod: Przykad 2.3 Odwoywanie do napisu dokumentacyjnego funkcji buildConnectionString >>> import odbchelper #(1) >>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> print odbchelper.buildConnectionString(params) #(2) pwd=secret;database=master;uid=sa;server=mpilgrim >>> print odbchelper.buildConnectionString.__doc__ #(3) Tworzy acuch znakw na podstawie sownika parametrw. Zwraca acuch znakw.

1. Pierwsza linia importuje program odbchelper jako modu kawaek kodu, ktry moemy uywa interaktywnie. (W Rozdziale 4 zobaczymy przykady programw podzielonych na wiele moduw.) Kiedy ju zaimportujemy modu, moemy odwoa si do jego wszystkich publicznych funkcji, klas oraz atrybutw. Moduy take mog odwoywa si do jeszcze innych moduw. 2. Aby wykorzysta jak funkcj zdeniowan w zaimportowanym module, musimy przed nazw funkcji doczy nazw moduu. Nie moemy napisa buildConnectionString, lecz zamiast tego moemy da odbchelper.buildConnectionString. Jeli kiedykolwiek korzystalimy z klas w Javie, powinnimy zauway pewne podobiestwa. 3. Tym razem zamiast wywoywa funkcj, zapytalimy si o jeden z atrybutw funkcji atrybut doc . W nim Python przechowuje notk dokumentacyjn. import w Pythonie dziaa podobnie jak require w Perlu. Kiedy zaimportujemy jaki modu, odwoujemy si do jego funkcji poprzez modul.funkcja. W Perlu wyglda to troszk inaczej, piszemy modul::funkcja.

cieka przeszukiwania moduw Zanim przejdziemy dalej, naley wspomnie o ciece przeszukiwania moduw. W Pythonie przegldanych jest kilka miejsc w poszukiwaniu importowanego moduu. Generalnie przeszukiwane s wszystkie katalogi zdeniowane w sys.path. Jest to lista, ktr moemy w atwy sposb przeglda i modykowa w podobny sposb jak inne listy (jak to robi dowiemy si w kolejnych rozdziaach).

24

ROZDZIA 3. PIERWSZY PROGRAM

Przykad 2.4 cieka przeszukiwania moduw >>> import sys #(1) >>> sys.path #(2) [, /usr/local/lib/python2.2, /usr/local/lib/python2.2/plat-linux2, /usr/local/lib/python2.2/lib-dynload, /usr/local/lib/python2.2/site-packages, /usr/local/lib/python2.2/site-packages/PIL, /usr/local/lib/python2.2/ site-packages/piddle] >>> sys #(3) >>> sys.path.append(/my/new/path) #(4) 1. Zaimportowanie moduu sys spowoduje, e wszystkie jego funkcje i atrybuty staj si dostpne. 2. sys.path to lista nazw katalogw, ktre s obecnie przeszukiwane podczas importowania moduu. (Zawarto listy zalena jest od systemu operacyjnego, wersji Pythona i pooenia jego instalacji, wic na twoim komputerze moe wyglda nieco inaczej.) Python przeszuka te katalogi (w zadanej kolejnoci) w poszukiwaniu pliku .py, ktry nazywa si tak samo jak importowany modu. 3. Waciwie to troch rozminlimy si z prawd. Sytuacja jest bardziej skomplikowana, poniewa nie wszystkie moduy wystpuj jako pliki z rozszerzeniem .py. Niektre, tak jak sys s wbudowane w samego Pythona. Wbudowane moduy zachowuj si w ten sam sposb co pozostae, ale nie mamy bezporedniego dostpu do ich kodu rdowego, poniewa nie s napisane w Pythonie (modu sys napisany jest w C). 4. Kiedy dodamy nowy katalog do cieki przeszukiwania, Python przy nastpnych importach przejrzy dodatkowo dodany katalog w poszukiwaniu moduu z rozszerzeniem .py. Nowy katalog bdzie znajdowa si w ciekach szukania tak dugo, jak dugo uruchomiony bdzie interpreter. (Dowiesz si wicej o metodzie append i innych metodach list w kolejnym rozdziale). Co to jest obiekt W Pythonie wszystko jest obiektem i prawie wszystko posiada metody i atrybuty. Kada funkcja posiada wbudowany atrybut doc , ktry zwraca napis dokumentacyjny zdeniowany w kodzie funkcji. Modu sys jest obiektem, ktry posiada midzy innymi atrybut path. W dalszym cigu nie wyjanilimy jeszcze, co to jest obiekt. Kady jzyk programowania deniuje obiekt w inny sposb. W niektrych jzykach obiekt musi posiada atrybuty i metody, a w innych wszystkie obiekty mog dzieli si na rne podklasy. W Pythonie jest inaczej, niektre obiekty nie posiadaj ani atrybutw ani metod (wicej o tym w kolejnym rozdziale) i nie wszystkie obiekty dziel si na podklasy (wicej o tym w rozdziale 5). Wszystko jest obiektem w tym sensie, e moe by przypisane do zmiennej albo stanowi argument funkcji (wicej o tym w rozdziale 4). Poniewa jest to bardzo wane, wic powtrzmy to jeszcze raz: wszystko w Pythonie jest obiektem. acuchy znakw to obiekty, listy to obiekty, funkcje to obiekty, a nawet moduy to obiekty...

3.4. WSZYSTKO JEST OBIEKTEM Materiay dodatkowe

25

Python Reference Manual dokadnie opisuje, co to znaczy, e wszystko w Pythonie jest obiektem e-bot podsumowuje obiekty Pythona

26

ROZDZIA 3. PIERWSZY PROGRAM

3.5

Wcicia kodu

Wcicia koduFunkcje w Pythonie nie posiadaj sprecyzowanych pocztkw i kocw oraz adnych nawiasw sucych do zaznaczania, gdzie funkcja si zaczyna, a gdzie koczy. Jedynym separatorem jest dwukropek (:) i wcicia kodu. Przykad 2.5 Wcicia w funkcji buildConnectionString def buildConnectionString(params): u"""Tworzy acuch znakw na podstawie sownika parametrw. Zwraca acuch znakw. """ return ";".join(["%s=%s" % (k, v) for k, v in params.items()]) Bloki kodu deniujemy poprzez wcicia. Przez blok kodu rozumiemy funkcje, instrukcje if, ptle for i while i tak dalej. Wstawiajc wcicie zaczynamy blok, a koczymy go przestajc wstawia wcicia danej wielkoci. Nie ma adnych nawiasw, klamer czy sw kluczowych. Oznacza to, e biae znaki (spacje itp.) maj znaczenie i ich stosowanie musi by konsekwentne. W powyszym przykadzie kod funkcji (wczajc w to notk dokumentacyjn) zosta wcity czterema spacjami. Nie musimy stosowa konkretnie czterech spacji, jednak musimy by konsekwentni (tzn. jeli pierwsze wcicie w funkcji miao 3 spacje, to kolejne wcicia take musz mie 3 spacje). Linia bez wcicia znajdowa si bdzie poza funkcj. Przykad 2.6 Fragment kodu z wciciem po instrukcji if def fib(n): print n =, n if n > 1: return n * fib(n - 1) else: print koniec return 1 #(1) #(2) #(3) #(4)

1. Powysza funkcja, nazwana fib przyjmuje jeden argument: n. Cay kod wewntrz funkcji jest wcity. 2. Wypisywanie danych (na standardowe wyjcie) jest bardzo proste, wystarczy uy sowa kluczowego print. Wyraenie print moe przyj kady typ danych, na przykad acuchy znakw, liczby cakowite i inne wbudowane typy danych jak sowniki i listy, o ktrych dowiemy si w nastpnym rozdziale. Moemy nawet drukowa na ekran rne wartoci w jednej linii. W tym celu podajemy cig wartoci, ktre chcemy wywietli, oddzielajc je przecinkiem. Kada warto jest wtedy wywietlana w tej samej linii i oddzielona spacj (znak przecinka nie jest drukowany). Tak wic, kiedy funkcj fib wywoamy z argumentem 5, na ekranie zobaczymy . 3. Do bloku kodu zaliczamy take instrukcje if. Jeeli wyraenie za instrukcj if bdzie prawdziwe, to zostanie wykonany wcity kod znajdujcy si zaraz pod instrukcj if. W przeciwnym wypadku wykonywany jest blok else.

3.5. WCICIA KODU

27

4. Oczywicie bloki if oraz else mog skada si z wikszej iloci linii, o ile linie te maj wcicia z rwn iloci spacji. Tutaj blok else ma dwie linie. Python nie wymaga adnej specjalnej skadni dla blokw skadajcych si z wielu linii. Po prostu robimy wcicia o rwnej liczbie spacji. Po pocztkowych problemach i nietraonych porwnaniach do Fortrana, pogodzisz si z tym i zobaczysz pozytywne cechy wci. Jedn z gwnych zalet jest to, e wszystkie programy w Pythonie wygldaj podobnie, poniewa wcicia kodu s wymagane przez sam jzyk i nie zale od stylu pisania. Dziki temu jakikolwiek kod jest prostszy do czytania i zrozumienia. Python uywa znaku powrotu karetki (ang. carriage return), czyli znaku koca linii, by oddzieli instrukcje. Natomiast dwukropek i wcicia su, aby oddzieli bloki kodu. C++ oraz Java uywaj rednikw do oddzielania instrukcji, a klamry do separacji blokw kodu.

Materiay dodatkowe Python Reference Manual omawia niektre problemy zwizane z wciciami kodu. Python Style Guide mwi na temat dobrego stylu tworzenia wci.

28

ROZDZIA 3. PIERWSZY PROGRAM

3.6

Testowanie moduw

Testowanie moduwModuy Pythona to obiekty, ktre posiadaj kilka przydatnych atrybutw. Moemy ich uy do atwego testowania wasnych moduw. Oto przykad zastosowania triku if name : if __name__ == "__main__": Zwrmy uwag na dwie wane sprawy: pierwsza, e instrukcja warunkowa if nie wymaga nawiasw, a druga, e if koczy si dwukropkiem, a w nastpnych liniach wstawiamy wcity kod. Podobnie jak w jzyku C, Python uywa == dla porwnania i = dla przypisania. W przeciwiestwie do C, w Pythonie nie moemy dokonywa przypisania w dowolnych miejscach kodu, w tym w instrukcji warunkowej (np. if x = 10 nie jest poprawny). Nie ma szansy, aby przypadkowo przypisa warto do zmiennej, zamiast zastosowa porwnanie. Na czym polega zastosowany trik? Moduy to obiekty, a kady z nich posiada wbudowany atrybut name . name zaley od tego, w jaki sposb korzystamy z danego moduu. Jeeli importujemy modu, wtedy name jest nazw pliku moduu bez cieki do katalogu, czy rozszerzenia pliku. Moemy take uruchomi bezporednio modu jako samodzielny program, a wtedy name przyjmie domyln warto main . >>> import odbchelper >>> odbchelper.__name__ odbchelper Wiedzc o tym, moemy zaprojektowa test wewntrz swojego moduu, wykorzystujc do tego instrukcj if. Jeli uruchomisz bezporednio dany modu, atrybut name jest rwny main , a wic test zostanie wykonany. Podczas importu tego moduu, name przyjmie inn warto, wic test si nie uruchomi. Pomoe nam to rozwija i wyszukiwa bdy w programie (czyli debugowa), zanim dany modu zintegrujemy z wikszym programem. Aby w MacPythonie mona byo skorzysta z tego triku, naley klikn w czarny trjkt w prawym grnym rogu okna i upewni si, e zaznaczona jest opcja Run as main .

Materiay dodatkowe Python Reference Manual omawia szczegy dotyczce importowania moduw, istnieje take polskie tumaczenie.

Rozdzia 4

Wbudowane typy danych

29

30

ROZDZIA 4. WBUDOWANE TYPY DANYCH

4.1

acuchy znakw i unikod

Za moment powrcimy do naszego pierwszego programu, jednak najpierw musimy zrozumie, czym s sowniki, krotki i listy. Jeli cho troch umiesz programowa w Perlu, to pewnie masz ju pewn wiedzy na temat sownikw, czy list, ale pewnie nie wiesz, czym s krotki. Najpierw zajmiemy si jednym z najczciej uywanych typw danych, czyli acuchami znakw.

acuchy znakw i unikodacuchy znakw su do przechowywania napisu lub pewnych danych bajtowych. W Pythonie, podobnie jak w wikszoci innych jzykw programowania tworzymy acuchy znakw 1 (ang. string) poprzez umieszczenie danego tekstu w cudzysowach. Przykad 3.1 Deniowanie acucha znakw >>> text = "Nie za dugi tekst" #(1) >>> text Nie za d\xc5\x82ugi tekst #(2) >> print text Nie za dugi tekst #(3) >>> text2 = Kolejny napis, ale bez polskich liter #(4) >>> text2 Kolejny napis, ale bez polskich liter >>> text3 = Dugi tekst,\nktry po przecinku znajdzie si w nastpnej linii #(5) >>> print text3 Dugi tekst, ktry po przecinku znajdzie si w nastpnej linii >>> text4 = rTutaj znaki specjalne np.\n \t, czy te \x26 nie zostan zinterpretowane >>> print text4 Tutaj znaki specjalne np.\n \t, czy te \x26 nie zostan zinterpretowane 1. W ten sposb stworzylimy acuch znakw Nie za dugi tekst, ktry z kolei przypisalimy do zmiennej text. Zauwamy, e wewntrz acucha mog si znajdowa polskie litery. 2. Otrzymany w tym miejscu wynik na wyjciu moe si nieco rni na rnych systemach. Jest to zalene od kodowania znakw w systemie operacyjnym, z ktrego korzystamy. Komputer uruchomiony przez autorw korzysta z kodowania UTF-8. Zauwamy, e litera w systemie UTF-8 to dwa bajty "\xc5\x82". 3. Wszystko zostao adnie wypisane. Tam gdzie jest widzimy , a nie jakie krzaki. 4. acuch znakw nie musi by deklarowany w podwjnym cudzysowie, ale moe by te to pojedynczy cudzysw. 5. Znaki specjalne wstawiamy dodajc odwrotny ukonik (tzw. backslash) np. \n.1W

tym podrczniku acuchy znakw bdziemy czasami nazywali napisami.

4.1. ACUCHY ZNAKW I UNIKOD

31

6. Moemy take w stworzy acuch znakw w tzw. sposb surowy. Aby to uczyni, poprzedzamy acuch znakw liter r. Wewntrz surowego acucha znakw odwrotny ukonik nie jest interpretowany. Mona powiedzie, e znaki specjalne w takim acuchu nie s znakami specjalnymi. To co napiszemy, to bdziemy mieli. Unikod Poniewa mwimy w jzyku polskim, piszemy w tym jzyku, a ponadto czytamy w tym jzyku, zapewne chcielibymy tworzy programy, ktre dobrze sobie daj rad ze znakami tego jzyka. Doskonaym do tego rozwizaniem jest unikod (ang. unicode). Unikod przechowuje nie tylko polskie znaki, ale jest systemem reprezentowania znakw ze wszystkich jzykw wiata Przykad 3.2 Deniowanie unikodowego acucha znakw >>> text = u"Nie za dugi tekst" >>> text uNie za d\u0142ugi tekst >>> print text Nie za dugi tekst #(1) #(2)

1. Aby utworzy unikodowy napis, dodajemy przedrostek u i tyle. 2. Otrzymasz taki sam wynik. Dane przechowywane w unikodzie nie zale od systemu kodowania, z ktrego korzysta Twj komputer. Pamitamy, jak w poprzednim rozdziale powiedzielimy, e do notek dokumentacyjnych zosta dodany przedrostek u, aby Python potra poprawnie zinterpretowa polskie znaki. Wtedy wanie wykorzystalimy unikod. Przykad 3.3 Unikod w buildConnectionString def buildConnectionString(params): uTworzy acuch znakw na podstawie sownika parametrw. Zwraca acuch znakw.

32

ROZDZIA 4. WBUDOWANE TYPY DANYCH

4.2

Sowniki

SownikiJednym z wbudowanych typw s sowniki (ang. dictionary). Okrelaj one wzajemn relacj midzy kluczem, a wartoci. Sowniki w Pythonie s podobne do haszy w Perlu. W Perlu zmienne przechowujce hasz s reprezentowane zawsze przez pocztkowy znak %. W Pythonie typ danych jest automatycznie rozpoznawany. Pythonowy sownik przypomina ponadto instancj klasy Hashtable w Javie, a take instancj obiektu Scripting.Dictionary w Visual Basicu.

Deniowanie sownikw Przykad 3.4 Deniowanie sownikw >>> d = {"server":"mpilgrim", "database":"master"} >>> d {database: master, server: mpilgrim} >>> d["server"] mpilgrim >>> d["database"] master >>> d["mpilgrim"] Traceback (most recent call last): File "", line 1, in ? KeyError: mpilgrim #(1)

#(2) #(3) #(4)

1. Najpierw utworzylimy nowy sownik z dwoma elementami i przypisalimy go do zmiennej d. Kady element w sowniku jest par klucz -warto, a zbir elementw jest ograniczony nawiasem klamrowym. 2. server jest kluczem, a skojarzon z nim wartoci jest mpilgrim, do ktrej odwoujemy si poprzez d[server]. 3. database jest kluczem, a skojarzon z nim wartoci jest master, do ktrej odwoujemy si poprzez d[database]. 4. Moesz dosta si do wartoci za pomoc klucza, ale nie moesz dosta si do klucza za pomoc wartoci. Tak wic d[server] zwraca mpilgrim, ale wywoanie d[mpilgrim] sprawi, e zostanie rzucony wyjtek, poniewa mpilgrim nie jest kluczem sownika d. Modykowanie sownika Przykad 3.5 Modykowanie sownika >>> d {database: master, server: mpilgrim} >>> d["database"] = "pubs" >>> d

#(1)

4.2. SOWNIKI {database: pubs, server: mpilgrim} >>> d["uid"] = "sa" #(2) >>> d {database: pubs, uid: sa, server: mpilgrim}

33

1. Klucze w sowniku nie mog si powtarza. Przypisujc warto do istniejcego klucza, bdziemy nadpisywa starsz warto. 2. W kadej chwili moesz doda now par klucz-warto. Skadnia jest identyczna do tej, ktra modykuje istniejc warto. Czasami moe to spowodowa pewien problem. Moemy myle, e dodalimy now warto do sownika, ale w rzeczywistoci nadpisalimy ju istniejc. Zauwamy, e sownik nie przechowuje kluczy w sposb posortowany. Wydawaoby si, e klucz uid powinien si znale za kluczem server, poniewa litera s jest wczeniej w alfabecie ni u. Jednak tak nie jest. Elementy sownika znajduj si w losowej kolejnoci. W sownikach nie istnieje okrelona kolejno ukadania elementw. Nie moemy dosta si do elementw w sowniku w okrelonej, uporzdkowanej kolejnoci (np. w porzdku alfabetycznym). Oczywicie s sposoby, aby to osign, ale te sposoby nie s wbudowane w sam sownik. Pracujc ze sownikami pamitajmy, e wielko liter kluczy ma znaczenie. Przykad 3.6 Nazwy kluczy s wraliwe na wielko liter >>> d = {} >>> d["klucz"] = "warto" >>> d["klucz"] = "inna warto" #(1) >>> d {klucz: inna warto} >>> d["Klucz"] = "jeszcze inna warto" #(2) >>> d {klucz: inna warto, Klucz: jeszcze inna warto} 1. Przypisujc warto do istniejcego klucza zamieniamy star warto na now. 2. Nie jest to przypisanie do istniejcego klucza, a poniewa acuchy znakw w Pythonie s wraliwe na wielko liter, dlatego te klucz nie jest tym samym co Klucz. Utworzylimy now par klucz-warto w sowniku. Obydwa klucze mog si wydawa podobne, ale dla Pythona s zupenie inne. Przykad 3.7 Mieszanie typw danych w sowniku >>> d {bazadanych: pubs, serwer: mpilgrim, uid: sa} >>> d["licznik"] = 3 >>> d {bazadanych: pubs, serwer: mpilgrim, licznik: 3, uid: sa}

#(1)

34

ROZDZIA 4. WBUDOWANE TYPY DANYCH

>>> d[42] = "douglas" #(2) >>> d {42: douglas, bazadanych: pubs, serwer: mpilgrim, licznik: 3, uid: sa} 1. Sowniki nie s przeznaczone tylko dla acuchw znakw. Warto w sowniku moe by dowolnym typem danych: acuchem znakw, liczb cakowit, obiektem, a nawet innym sownikiem. W pojedynczym sowniku wszystkie wartoci nie musz by tego samego typu; moemy wstawi do niego wszystko, co chcemy. 2. Klucze w sowniku s bardziej restrykcyjne, ale mog by acuchami znakw, liczbami cakowitymi i kilkoma innymi typami. Klucze wewntrz jednego sownika nie musz posiada tego samego typu. Usuwanie pozycji ze sownika Przykad 3.8 Usuwanie pozycji ze sownika >>> d {licznik: 3, bazadanych: master, serwer: mpilgrim, 42: douglas, uid: sa} >>> del d[42] >>> d {licznik: 3, bazadanych: master, serwer: mpilgrim, uid: sa} >>> d.clear() >>> d {} 1. Instrukcja del kae usun okrelon pozycj ze sownika, ktra jest wskazywana przez podany klucz. 2. Instrukcja clear usuwa wszystkie pozycje ze sownika. Zbir pusty ograniczony przez nawiasy klamrowe oznacza, e sownik nie ma adnego elementu. Materiay dodatkowe How to Think Like a Computer Scientist uczy o sownikach i pokazuje, jak wykorzysta sowniki do tworzenia rzadkich macierzy. W Python Knowledge Base moemy znale wiele przykadw kodw wykorzystujcych sowniki. Python Cookbook wyjania, jak sortowa wartoci sownika wzgldem klucza. Python Library Reference opisuje wszystkie metody sownika.

4.3. LISTY

35

4.3Listy

Listy

Listy s jednym z najwaniejszych typw danych. Mona si z nimi spotka w Visual Basicu. W tym jzyku s okrelane jako tablice. Listy przypominaj tablice w Perlu. W Perlu zmienna, ktra przechowuj list rozpoczyna si od znaku @, natomiast w Pythonie nazwa moe by dowolna, poniewa Python automatycznie rozpoznaje typ.

Listy w Pythonie to co wicej ni tablice w Javie (chocia mona to traktowa jako jedno). Lepsz analogi jest klasa ArrayList, w ktrej mona przechowywa dowolny obiekt i dynamicznie dodawa nowe pozycje.

Deniowanie list Przykad 3.9 Deniowanie list >>> li = ["a", "b", "mpilgrim", "z", "przykad"] >>> li [a, b, mpilgrim, z, przykad] >>> li[0] a >>> li[4] przykad #(1)

#(2) #(3)

1. Najpierw zdeniowalimy list picioelementow. Zauwamy, e lista zachowuje swj oryginalny porzdek i nie jest to przypadkowe. Lista jest uporzdkowanym zbiorem elementw ograniczonym nawiasem kwadratowym. 2. Lista moe by uywana tak jak tablica zaczynajca si od 0. Pierwszym elementem niepustej listy o nazwie li jest zawsze li[0]. 3. Ostatnim elementem picioelementowej listy jest li[4], poniewa indeksy s liczone zawsze od 0. Przykad 3.10 Ujemne indeksy w listach >>> li [a, b, mpilgrim, z, przykad] >>> li[-1] przykad >>> li[-3] mpilgrim

#(1) #(2)

1. Za pomoc ujemnych indeksw odnosimy si do elementw idcych od koca do pocztku tzn. li[-1] oznacza ostatni element, li[-2] przedostatni, li[-3] odnosi si do 3 od koca elementu itd. Ostatnim elementem niepustej listy jest zawsze li[-1].

36

ROZDZIA 4. WBUDOWANE TYPY DANYCH 2. Jeli ciko ci zrozumie o co w tym wszystkim chodzi, moesz pomyle o tym w ten sposb: li[-n] == li[len(li) - n]. len to funkcja zwracajca ilo elementw listy. Tak wic w tym przypadku li[-3] == li[5 - 3] == li[2].

Przykad 3.11 Wycinanie list >>> li [a, b, mpilgrim, z, przyklad] >>> li[1:3] [b, mpilgrim] >>> li[1:-1] [b, mpilgrim, z] >>> li[0:3] [a, b, mpilgrim]

#(1) #(2) #(3)

1. Moesz pobra podzbir listy, ktry jest nazywany wycinkiem (ang. slice), poprzez okrelenie dwch indeksw. Zwracan wartoci jest nowa lista zawierajca wszystkie elementy z listy rozpoczynajce si od pierwszego wskazywanego indeksu (w tym przypadku li[1]) i idc w gr koczy na drugim wskazywanym indeksie, nie doczajc go (w tym przypadku li[3]). Kolejno elementw wzgldem wczeniejszej listy jest take zachowana. 2. Moemy take poda ujemn warto ktrego indeksu. Wycinanie wtedy take dobrze zadziaa. Jeli to pomoe, moemy pomyle tak: czytamy list od lewej do prawej, pierwszy indeks okrela pierwszy potrzebny element, a drugi okrela element, ktrego nie chcemy. Zwracana warto zawiera wszystko midzy tymi dwoma przedziaami. 3. Listy s indeksowane od zera tzn. w tym przypadku li[0:3] zwraca pierwsze trzy elementy listy, rozpoczynajc od li[0], a koczc na li[2], ale nie doczajc li[3]. Przykad 3.12 Skrty w wycinaniu >>> li [a, b, mpilgrim, z, przykad] >>> li[:3] [a, b, mpilgrim] >>> li[3:] [z, przykad] >>> li[:] [a, b, mpilgrim, z, przykad]

#(1) #(2) (3) #(2) (4)

1. Jeli lewy indeks wynosi 0, moemy go opuci, warto 0 jest domylna. li[:3] jest tym samym, co li[0:3] z poprzedniego przykadu. 2. Podobnie, jeli prawy indeks jest dugoci listy, moemy go pomin. Tak wic li[3:] jest tym samym, co li[3:5], poniewa lista ta posiada pi elementw. 3. Zauwamy pewn symetryczno. W picioelementowej licie li[:3] zwraca pierwsze 3 elementy, a li[3:] zwraca dwa ostatnie (a w sumie 3 + 2 = 5). W rzeczywistoci li[:n] bdzie zwraca zawsze pierwsze n elementw, a li[n:]

4.3. LISTY

37

pozosta liczb, bez wzgldu na szeroko listy (n moe by wiksze od dugoci listy). 4. Jeli obydwa indeksy zostan pominite, wszystkie elementy zostan doczone. Nie jest to jednak to samo, co oryginalna lista li. Jest to nowa lista, ktra posiada wszystkie takie same elementy. li[:] tworzy po prostu kompletn kopi listy. Dodawanie elementw do listy Przykad 3.13 Dodawanie elementw do listy >>> li [a, b, mpilgrim, z, przykad] >>> li.append("nowy") #(1) >>> li [a, b, mpilgrim, z, przykad, nowy] >>> li.insert(2, "nowy") #(2) >>> li [a, b, nowy, mpilgrim, z, przykad, nowy] >>> li.extend(["dwa", "elementy"]) #(3) >>> li [a, b, nowy, mpilgrim, z, przykad, nowy, dwa, elementy] 1. Dodajemy pojedynczy element do koca listy za pomoc metody append. 2. Za pomoc insert wstawiamy pojedynczy element do listy. Numeryczny argument jest indeksem, pod ktrym ma si znale wstawiana warto; reszta elementw, ktra znajdowaa si pod tym indeksem lub miaa wikszy indeks, zostanie przesunita o jeden indeks dalej. Zauwamy, e elementy w licie nie musz by unikalne i mog si powtarza; w przykadzie mamy dwa oddzielne elementy z wartoci nowy li[2] i li[6]. 3. Za pomoc extend czymy list z inn list. Nie moemy wywoa extend z wieloma argumentami, trzeba j wywoywa z pojedynczym argumentem list. W tym przypadku ta lista ma dwa elementy. Przykad 3.14 Rnice midzy extend a append >>> li = [a, b, c] >>> li.extend([d, e, f]) >>> li [a, b, c, d, e, f] >>> len(li) 6 >>> li[-1] f >>> li = [a, b, c] >>> li.append([d, e, f]) >>> li [a, b, c, [d, e, f]] >>> len(li) #(1)

#(2)

#(3)

#(4)

38 4 >>> li[-1] [d, e, f]

ROZDZIA 4. WBUDOWANE TYPY DANYCH

1. Listy posiadaj dwie metody extend i append, ktre wygldaj na to samo, ale w rzeczywistoci s cakowicie rne. extend wymaga jednego argumentu, ktry musi by list i dodaje kady element z tej listy do oryginalnej listy. 2. Rozpoczlimy z list trjelementow (a, b i c) i rozszerzylimy j o inne trzy elementy (d, e i f) za pomoc extend, tak wic mamy ju sze elementw. 3. append wymaga jednego argumentu, ktry moe by dowolnym typem danych. Metoda ta po prostu dodaje dany element na koniec listy. Wywoalimy append z jednym argumentem, ktry jest list z trzema elementami. 4. Teraz oryginalna lista, pierwotnie zawierajca trzy elementy, zawiera ich cztery. Dlaczego cztery? Poniewa ostatni element przed chwil do niej wstawilimy. Listy mog wewntrz przechowywa dowolny typ danych, nawet inne listy. Nie uywajmy append, jeli zamierzamy list rozszerzy o kilka elementw. Przeszukiwanie list Przykad 3.15 Przeszukiwanie list >>> li [a, b, nowy, mpilgrim, z, przykad, nowy, dwa, elementy] >>> li.index("przykad") #(1) 5 >>> li.index("nowy") #(2) 2 >>> li.index("c") #(3) Traceback (most recent call last): File "", line 1, in ? ValueError: list.index(x): x not in list >>> "c" in li #(4) False 1. index znajduje pierwsze wystpienie pewnej warto w licie i zwraca jego indeks. 2. index znajduje pierwsze wystpienie wartoci w licie. W tym przykadzie, nowy wystpuje dwa razy w li[2] i li[6], ale metoda index bdzie zawsze zwraca pierwszy indeks, czyli 2. 3. Jeli warto nie zostanie znaleziona, Python zgosi wyjtek. Takie zachowanie nie jest czsto spotykane w innych jzykach, w wielu jzykach w takich przypadkach zostaje zwrcony niepoprawny indeks. Takie zachowanie Pythona jest dosy dobrym posuniciem, poniewa umoliwia szybkie wychwycenie bdu w kodzie, a dziki temu program nie bdzie bdnie dziaa operujc na niewaciwym indeksie.

4.3. LISTY

39

4. Aby sprawdzi czy jaka warto jest w licie uywamy sowa kluczowego in, ktry zwraca True, jeli warto zostanie znaleziona lub False jeli nie. Przed wersj 2.2.1 Python nie posiada oddzielnego boolowskiego typu danych. Aby to zrekompensowa, Python mg interpretowa wikszo typw danych jako bool (czyli warto logiczn np. w instrukcjach if) wedug poniszego schematu: 0 jest faszem; wszystkie inne liczby s prawd. Pusty acuch znakw ("") jest faszem, wszystkie inne s prawd. Pusta lista ([]) jest faszem; wszystkie inne s prawd. Pusta krotka (()) jest faszem; wszystkie inne s prawd. Pusty sownik ({}) jest faszem; wszystkie inne s prawd.

Wszystkie powysze punkty stosowane s w Pythonie 2.2.1 i nowszych, ale obecnie mona take uywa typu logicznego bool, ktry moe przyjmowa warto True (prawda) lub False (fasz). Zwrmy uwag, e wartoci te, tak jak caa skadnia jzyka Python, s wraliwe na wielko liter. Usuwanie elementw z listy Przykad 3.16 Usuwanie elementw z listy >>> li [a, b, nowy, mpilgrim, z, przykad, nowy, dwa, elementy] >>> li.remove("z") >>> li [a, b, nowy, mpilgrim, przykad, nowy, dwa, elementy] >>> li.remove("nowy") >>> li [a, b, mpilgrim, przykad, nowy, dwa, elementy] >>> li.remove("c") Traceback (most recent call last): File "", line 1, in ? ValueError: list.remove(x): x not in list >>> li.pop() elementy >>> li [a, b, mpilgrim, przykad, nowy, dwa]

#(1)

#(2)

#(3)

#(4)

1. remove usuwa pierwsz wystpujc warto w licie. 2. remove usuwa tylko pierwsz wystpujc warto. W tym przypadku nowy wystpuje dwa razy, ale li.remove("nowy") usuwa tylko pierwsze wystpienie. 3. Jeli warto nie zostanie znaleziona w licie, Python wygeneruje wyjtek. Naladuje on w takich sytuacjach postpowanie metody index.

40

ROZDZIA 4. WBUDOWANE TYPY DANYCH 4. pop jest ciekaw metod, ktra wykonuje dwie rzeczy: usuwa ostatni element z listy i zwraca jego warto. Metoda ta rni si od li[-1] tym, e li[-1] zwraca jedynie warto, ale nie zmienia listy, a od li.remove(value) tym, e li.remove(value) zmienia list, ale nie zwraca wartoci.

Uywanie operatorw na listach Przykad 3.17 Operatory na listach >>> li = [a, b, mpilgrim] >>> li = li + [przykad, nowy] #(1) >>> li [a, b, mpilgrim, przykad, nowy] >>> li += [dwa] #(2) >>> li [a, b, mpilgrim, przykad, nowy, dwa] >>> li = [1, 2] * 3 #(3) >>> li [1, 2, 1, 2, 1, 2] 1. Aby poczy dwie listy, mona te skorzysta z operatora +. Za pomoc lista = lista + innalista uzyskujemy ten sam wynik, co za pomoc list.extend(innalista), ale operator + zwraca now list, podczas gdy extend zmienia tylko istniejc list. Oglnie extend jest szybszy, szczeglnie na duych listach. 2. Python posiada take operator +=. Operacja li += [dwa] jest rwnowana li.extend([dwa]). Operator += dziaa zarwno na listach, acuchach znakw jak i moe by nadpisany dla dowolnego innego typu danych. 3. Operator * zwielokrotnia podan list. li = [1, 2] * 3 jest rwnowane z li = [1, 2] + [1, 2] + [1, 2], ktre czy trzy listy w jedn. Materiay dodatkowe How to Think Like a Computer Scientist uczy podstaw zwizanych z wykorzystywaniem list, a take nawizuje do przekazywania listy jako argument funkcji. Python Tutorial pokazuje, e listy mona wykorzystywa jako stos lub kolejk. Python Knowledge Base odpowiada na czsto zadawane pytania dotyczce list, a take posiada take wiele przykadw kodw rdowych wykorzystujcych listy. Python Library Reference opisuje wszystkie metody, ktre zawiera lista.

4.4. KROTKI

41

4.4

Krotki

KrotkiKrotka (ang. tuple) jest niezmienn list. Zawarto krotki okrelamy tylko podczas jej tworzenia. Potem nie moemy ju jej zmieni. Przykad 3.18 Deniowanie krotki >>> t = ("a", "b", "mpilgrim", "z", "element") >>> t (a, b, mpilgrim, z, element) >>> t[0] a >>> t[-1] element >>> t[1:3] (b, mpilgrim) #(1)

#(2) #(3) #(4)

1. Krotki deniujemy w identyczny sposb jak list, lecz z jednym wyjtkiem zbir elementw jest ograniczony w nawiasach okrgych, zamiast w kwadratowych. 2. Podobnie jak w listach, elementy w krotce maj okrelony porzdek. S one indeksowane od 0, wic pierwszym elementem w niepustej krotce jest zawsze t[0]. 3. Ujemne indeksy id od koca krotki, tak samo jak w listach. 4. Krotki take mona wycina. Kiedy wycinamy list, dostajemy now list. Podobnie, gdy wycinamy krotk dostajemy now krotk. Przykad 3.19 Krotki nie posiadaj adnej metody >>> t (a, b, mpilgrim, z, element) >>> t.append("nowy") Traceback (most recent call last): File "", line 1, in ? AttributeError: tuple object has no attribute append >>> t.remove("z") Traceback (most recent call last): File "", line 1, in ? AttributeError: tuple object has no attribute remove >>> t.index("przyklad") Traceback (most recent call last): File "", line 1, in ? AttributeError: tuple object has no attribute index >>> "z" in t True

#(1)

#(2)

#(3)

#(4)

1. Nie mona dodawa elementw do krotki. Krotki nie posiadaj metod typu append, czy te extend.

42

ROZDZIA 4. WBUDOWANE TYPY DANYCH 2. Nie mona usuwa elementw z krotki. Nie posiadaj one ani metody remove ani metody pop. 3. Nie mona wyszukiwa elementw w krotce. Nie maj one metody index. 4. Mona jednak wykorzysta operator in, aby sprawdzi, czy krotka zawiera dany element. To w kocu do czego s te krotki przydatne? Krotki dziaaj szybciej ni listy. Jeli deniujemy stay zbir wartoci, ktry bdzie uywany tylko do iteracji, skorzystajmy z krotek zamiast z listy. Jeli chcielibymy uywa danych zabezpieczonych przed zapisem (np. po to, eby program by bezpieczniejszy), wykorzystajmy do tego krotki. Korzystajc z krotek, zamiast z list, mamy pewno, e dane w nich zawarte nie zostan nigdzie zmienione. To troch tak, jakbymy mieli gdzie ukryt instrukcj assert sprawdzajc, czy dane s stae. W przypadku, gdy nastpi prba nadpisania pewnych wartoci w krotce, program zwrci wyjtek. Pamitasz, jak powiedzielimy, e klucze w sowniku mog by acuchami znakw, liczbami cakowitymi i kilkoma innymi typami? Krotki s jednym z tych innych typw. W przeciwiestwie do list, mog one zosta uyte jako klucz w sowniku. Dlaczego? Jest to dosy skomplikowane. Klucze w sowniku musz by niezmienne. Krotki same w sobie s niezmienne, jednak jeli wewntrz krotki znajdzie si lista, to krotka ta nie bdzie moga zosta uyta jako klucz, poniewa lista jest zmienna. W takim przypadku krotka nie byaby sownikowo-bezpieczna. Aby krotka moga zosta wykorzystana jako klucz, musi ona zawiera wycznie acuchy znakw, liczby i inne sownikowo-bezpieczne krotki. Krotki uywane s do formatowania tekstu, co zobaczymy wkrtce.

Krotki mog zosta w atwy sposb przekonwertowane na listy. Wbudowana funkcja tuple, ktrej argumentem jest lista, zwraca krotk z takimi samymi elementami, natomiast funkcja list, ktrej argumentem jest krotka, zwraca list. W rezultacie tuple zamraa list, a list odmraa krotk.

Materiay dodatkowe How to Think Like a Computer Scientist uczy, czym s krotki i pokazuje, jak czy je ze sob. Python Knowledge Base pokazuje, jak posortowa krotk. Python Tutorial omawia, jak zdefniowa krotk z jednym elementem.

4.5. DEKLAROWANIE ZMIENNYCH

43

4.5

Deklarowanie zmiennych

Deklarowanie zmiennychWiemy ju troch o sownikach, krotkach i o listach, wic wrcimy do przykadowego kodu przedstawionego w rozdziale drugim, do odbchelper.py. Podobnie jak wikszo jzykw programowania Python posiada zarwno zmienne lokalne jak i globalne, cho nie deklarujemy ich w jaki wyrany sposb. Zmienne zostaj utworzone, gdy przypisujemy im pewne wartoci. Natomiast kiedy zmienna wychodzi poza zasig, zostaje automatycznie usunita. Przykad 3.20 Deniowanie zmiennej myParams if __name__ == "__main__": myParams = {"server":"mpilgrim", \ "database":"master", \ "uid":"sa", \ "pwd":"secret" \ } Zwrmy uwag na wcicia. Instrukcje warunkowe jako bloki kodu s identykowane za pomoc wci, podobnie jak funkcje. Zauwamy te, e dziki wykorzystaniu backslasha (\) moglimy przypisanie wartoci do zmiennej podzieli na kilka linii. Backslashe w Pythonie s specjalnymi znakami, ktre umoliwiaj kontynuacj danej instrukcji w nastpnej linii. Kiedy polecenie zostanie podzielone na kilka linii za pomoc znaku kontynuacji (\), nastpna linia moe zosta wcita w dowolny sposb. Python nie wemie tego wcicia pod uwag. cile mwic, wyraenia w nawiasach okrgych, kwadratowych i klamrowych (jak deniowanie sownikw) mona podzieli na wiele linii bez uywania znaku kontynuacji (\). Niektrzy zalecaj dodawa backslashe nawet wtedy, gdy nie jest to konieczne. Argumentuj to tym, e kod staje si wtedy czytelniejszy. Jest to jednak wycznie kwestia gustu. Wczeniej nigdy nie deklarowalimy adnej zmiennej o nazwie myParams, ale wanie przypisalimy do niej warto. Zachowanie to przypomina troch VBScript bez instrukcji option explicit. Na szczcie, w przeciwiestwie do VBScript, Python nie pozwala odwoywa si do zmiennych, do ktrych nie zostay wczeniej przypisane adne wartoci. Jeli sprbujemy to zrobi, Python rzuci wyjtek. Odwoywanie si do zmiennych Przykad 3.21 Odwoywanie si do niezdeniowanej zmiennej >>> x Traceback (most recent call last): File "", line 1, in ? NameError: name x is not defined >>> x = 1

44 >>> x 1

ROZDZIA 4. WBUDOWANE TYPY DANYCH

Kiedy bdziesz za to dzikowa... Wielozmienne przypisania Jednym z lepszych Pythonowych skrtw jest wielozmienne przypisanie (ang. multi-variable assignment), czyli jednoczesne (za pomoc jednego wyraenia) przypisywanie kilku wartoci do kilku zmiennych. Przykad 3.22 Przypisywanie wielu wartoci za pomoc jednego wyraenia >>> >>> >>> a >>> b >>> e v = (a, b, e) (x, y, z) = v x y z

#(1)

1. v jest krotk trzech elementw, a (x, y, z) jest krotk trzech zmiennych. Przypisujc jedn krotk do drugiej, przypisalimy kad z wartoci v do odpowiednich zmiennych (w odpowiedniej kolejnoci). Moe to zosta wykorzystane w wielu sytuacjach. Czasami chcemy przypisa pewnym zmiennym pewien zakres wartoci np. od 1 do 10. W jzyku C moemy utworzy typy wyliczeniowe (enum) poprzez rczne utworzenie listy staych i wartoci jakie przechowuj. Moe to by troch nudn i czasochonn robot, w szczeglnoci gdy wartoci s kolejnymi liczbami. W Pythonie moemy wykorzysta wbudowan funkcj range i wielozmienne przypisanie. W ten sposb z atwoci przypiszemy kolejne wartoci do wielu zmiennych. Przykad 3.23 Przypisywanie kolejnych wartoci >>> [0, >>> >>> 0 >>> 1 >>> 6 range(7) #(1) 1, 2, 3, 4, 5, 6] (PONIEDZIALEK, WTOREK, SRODA, CZWARTEK, PIATEK, SOBOTA, NIEDZIELA) = range(7) #(2) PONIEDZIALEK #(3) WTOREK NIEDZIELA

1. Wbudowana funkcja range zwraca list liczb cakowitych. W najprostszej formie funkcja ta bierze grn granic i zwraca list liczb od 0 do podanej granicy (ale ju bez niej). (Moemy take ustawi pocztkow warto rn ni 0, a krok moe by inny ni 1. Aby otrzyma wicej szczegw wykorzystaj instrukcj print range. doc .)

4.5. DEKLAROWANIE ZMIENNYCH

45

2. PONIEDZIALEK, WTOREK, SRODA, CZWARTEK, PIATEK, SOBOTA i NIEDZIELA s zmiennymi, ktre zdeniowalimy. (Ten przykad pochodzi z moduu calendar; nazwy zostay spolszczone. Modu calendar umoliwia wywietlanie kalendarzy, podobnie jak to robi Uniksowy program cal. Modu calendar przechowuje dla odpowiednich dni tygodnia odpowiednie stae.) 3. Teraz kada zmienna ma wasn warto: PONIEDZIALEK ma 0, WTOREK ma 1 itd. Wielozmienne przypisania moemy wykorzysta przy tworzeniu funkcji zwracajcych wiele wartoci w postaci krotki. Zwrcon warto takiej funkcji moemy potraktowa jako normaln krotk lub te przypisa wszystkie elementy tej krotki do osobnych zmiennych za pomoc wielozmiennego przypisania. Wiele standardowych bibliotek korzysta z tej moliwoci np. modu os, ktry omwimy w rozdziale 6. Materiay dodatkowe Python Reference Manual pokazuje przykady, kiedy mona pomin znak kontynuacji linii, a kiedy musisz go wykorzysta. How to Think Like a Computer Scientist wyjania, jak za pomoc wielozmiennych przypisa zamieni wartoci dwch zmiennych.

46

ROZDZIA 4. WBUDOWANE TYPY DANYCH

4.6

Formatowanie acucha znakw

Formatowanie acucha znakwW Pythonie moemy formatowa wartoci wewntrz acucha znakw. Chocia moemy tworzy bardzo skomplikowane wyraenia, jednak najczciej w prostych przypadkach wystarczy wykorzysta pole %s, aby wstawi pewien acuch znakw wewntrz innego. Formatowanie acucha znakw w Pythonie uywa tej samej skadni, co funkcja sprintf w jzyku C.

Przykad 3.24 Pierwsza prba formatowania acucha >>> k = "uid" >>> v = "sa" >>> "%s=%s" % (k, v) uid=sa

#(1)

1. Rezultatem wykonania tego wyraenia jest acuch znakw. Pierwsze %s zostao zastpione wartoci znajdujc si w k, a drugie wystpienie %s zostao zastpione wartoci v. Wszystkie inne znaki (w tym przypadku znak rwnoci) pozostay w miejscach, w ktrych byy. Zauwamy, e (k, v) jest krotk. Niedugo zobaczymy, do czego to moe by przydatne. Mogoby si wydawa, e formatowanie jest jedn z wielu moliwoci poczenia acuchw znakw, jednak formatowanie acucha znakw nie jest tym samym co czenie acuchw. Przykad 3.25 Formatowanie tekstu a czenie >>> uid = "sa" >>> pwd = "secret" >>> print pwd + " nie jest poprawnym hasem dla " + uid secret nie jest poprawnym hasem dla sa >>> print "%s nie jest poprawnym hasem dla %s" % (pwd, uid) secret nie jest poprawnym hasem dla sa >>> userCount = 6 >>> print "Uytkownikw: %d" % (userCount, ) Uytkownikw: 6 >>> print "Uytkownikw: " + userCount Traceback (most recent call last): File "", line 1, in ? TypeError: cannot concatenate str and int objects 1. + jest operatorem czcym acuchy znakw. 2. W tym trywialnym przypadku formatowanie daje ten sam wynik co czenie.

#(1) #(2)

#(3) (4) #(5)

4.6. FORMATOWANIE ACUCHA ZNAKW

47

3. (userCount, ) jest jednoelementow krotk. Skadnia ta wyglda troch dziwnie, jednak takie oznaczenie jest jednoznaczne i wiadomo, e chodzi o krotk. Zawsze mona docza przecinek po ostatnim elemencie listy, krotki lub sownika. Jest on jednak wymagany tylko podczas tworzenia jednoelementowej krotki. Jeli przecinek nie byby wymagany, Python nie mgby stwierdzi czy (userCount) ma by krotk, czy te tylko wartoci zmiennej userCount. 4. Formatowanie acucha znakw dziaa z liczbami cakowitymi. W tym celu uywamy %d zamiast %s. 5. Sprbowalimy poczy acuch znakw z czym, co nie jest acuchem znakw. Zosta rzucony wyjtek. W przeciwiestwie do formatowania, czenie acucha znakw moemy wykonywa jedynie na innych acuchach. Tak jak sprintf w C, formatowanie tekstu w Pythonie przypomina szwajcarski scyzoryk. Mamy mnstwo opcji do wyboru, a take wiele pl dla rnych typw wartoci. Przykad 3.26 Formatowanie liczb >>> print "Dzisiejsza cena akcji: %f" % 50.4625 #(1) Dzisiejsza cena akcji: 50.462500 >>> print "Dzisiejsza cena akcji: %.2f" % 50.4625 #(2) Dzisiejsza cena akcji: 50.46 >>> print "Zmiana w stosunku do dnia wczorajszego: %+.2f" % 1.5 Zmiana w stosunku do dnia wczorajszego: +1.50

#(3)

1. Pole formatowania %f traktuje warto jako liczb rzeczywist i pokazuje j z dokadnoci do 6 miejsc po przecinku. 2. Modykator .2 pola %f umoliwia pokazywanie wartoci rzeczywistej z dokadnoci do dwch miejsc po przecinku. 3. Mona nawet czy modykatory. Dodanie modykatora + pokazuje plus albo minus przed wartoci, w zalenoci od tego jaki znak ma liczba. Modykator .2 zosta na swoim miejscu i nadal nakazuje wywietlanie liczby z dokadnoci dwch miejsc po przecinku. Materiay dodatkowe Python Library Reference wymienia wszystkie opcje formatowania. Eective AWK Programming omawia wszystkie opcje formatowania, a take mwi o innych zaawansowanych technikach.

48

ROZDZIA 4. WBUDOWANE TYPY DANYCH

4.7

Odwzorowywanie listy

Odwzorowywanie listJedn z bardzo uytecznych cech Pythona s wyraenia listowe (ang. list comprehension), ktre pozwalaj nam w zwizy sposb odwzorowa pewn list na inn, wykonujc na kadym jej elemencie pewn funkcj. Przykad 3.27 Wprowadzenie do wyrae listowych >>> >>> [2, >>> [1, >>> >>> [2, li = [1, 9, 8, 4] [element*2 for element in li] 18, 16, 8] li 9, 8, 4] li = [elem*2 for elem in li] li 18, 16, 8] #(1) #(2) #(3)

1. Aby zrozumie o co w tym chodzi, spjrzmy na to od strony prawej do lewej. li jest list, ktr odwzorowujemy. Python przechodzi po kadym elemencie li, tymczasowo przypisujc warto kadego elementu do zmiennej element, a nastpnie wyznacza warto funkcji element*2 i wstawia wynik do nowej, zwracanej listy. 2. Wyraenia listowe nie zmieniaj oryginalnej listy. 3. Zwracany wynik moemy przypisa do zmiennej, ktr odwzorowujemy. Nie spowoduje to adnych problemw. Python tworzy now list w pamici, a kiedy operacja odwzorowywania listy dobiegnie koca, do zmiennej zostanie przypisana lista znajdujca si w pamici. W funkcji buildConnectionString zadeklarowanej w rozdziale 2 skorzystalimy z wyrae listowych: ["%s=%s" % (k, v) for k, v in params.items()] Zauwamy, e najpierw wykonujemy funkcj items, znajdujc si w sowniku params. Funkcja ta zwraca wszystkie dane znajdujce si w sowniku w postaci listy krotek. Przykad 3.28 Funkcje keys, values i items >>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params.keys() #(1) [pwd, database, uid, server] >>> params.values() #(2) [secret, master, sa, mpilgrim] >>> params.items() #(3) [(pwd, secret), (database, master), (uid, sa), (server, mpilgrim)]

4.7. ODWZOROWYWANIE LISTY

49

1. W sowniku metoda keys zwraca list wszystkich kluczy. Lista ta nie jest uporzdkowana zgodnie z kolejnoci, z jak deniowalimy sownik (pamitamy, e elementy w sowniku s nieuporzdkowane). 2. Metoda values zwraca list wszystkich wartoci. Lista ta jest zgodna z porzdkiem listy zwracanej przez metod keys, czyli dla wszystkich wartoci x zachodzi params.values()[x] == params[params.keys()[x]]. 3. Metoda items zwraca list krotek w formie (klucz, warto). Lista zawiera wszystkie dane ze sownika. Spjrzmy jeszcze raz na funkcj buildConnectionString. Przyjmuje ona list params.items(), odwzorowuje j na now list, korzystajc dla kadego elementu z formatowania acucha znakw. Nowa lista ma tyle samo elementw co params.items(), lecz kady element nowej listy jest acuchem znakw, ktry zawiera zarwno klucz, jak i skojarzon z nim warto ze sownika params. Przykad 3.29 Wyraenia listowe w buildConnectionString >>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params.items() [(server, mpilgrim), (uid, sa), (database, master), (pwd, secret)] >>> [k for k, v in params.items()] [server, uid, database, pwd] >>> [v for k, v in params.items()] [mpilgrim, sa, master, secret] >>> ["%s=%s" % (k, v) for k, v in params.items()] [server=mpilgrim, uid=sa, database=master, pwd=secret] 1. Wykonujc iteracje po licie params.items() uywamy dwch zmiennych. Zauwamy, e w ten sposb korzystamy w ptli z wielozmiennego przypisania. Pierwszym elementem params.items() jest (server, mpilgrim), dlatego te podczas pierwszej iteracji odwzorowywania listy zmienna k bdzie przechowywaa warto server, a v warto mpilgrim. W tym przypadku ignorujemy warto v, doczajc tylko warto znajdujc si w k do zwracanej listy. Otrzymamy taki sam wynik, gdy wywoamy params.keys(). 2. W tym miejscu wykonujemy to samo, ale zamiast zmiennej v ignorujemy zmienn k. Otrzymamy taki sam wynik, jakbymy wywoali params.values(). 3. Dziki temu, e przerobilimy obydwa poprzednie przykady i skorzystalimy z formatowania acucha znakw, otrzymalimy list acuchw znakw. Kady acuch znakw tej listy zawiera zarwno klucz, jak i warto pewnego elementu ze sownika. Wynik wyglda podobnie do wyjcia pierwszego programu. Ponadto porzdek zosta taki sam, jaki by w sowniku. Materiay dodatkowe Python Tutorial omawia inny sposb odwzorowywania listy za pomoc wbudowanej funkcji map. Python Tutorial pokazuje kilka przykadw, jak mona korzysta z wyrae listowych.

#(1) #(2) #(3)

50

ROZDZIA 4. WBUDOWANE TYPY DANYCH

4.8

czenie list i dzielenie acuchw znakw

czenie listy i dzielenie acuchw znakwMamy list, ktrej elementy s w formie klucz=warto. Zamy, e chcielibymy poczy je wszystkie w pojedynczy acuch. Aby to zrobi, wykorzystamy metod join obiektu typu string. Poniej zosta przedstawiony przykad czenia listy w acuch znakw, ktry wykorzystalimy w funkcji buildConnectionString: return ";".join(["%s=%s" % (k, v) for k, v in params.items()]) Zanim przejdziemy dalej zastanwmy si nad pewn kwesti. Funkcje s obiektami, acuchy znakw s obiektami... wszystko jest obiektem. Mona by byo doj do wniosku, e take zmienna jest obiektem, ale to akurat nie jest prawd. Spjrzmy na ten przykad i zauwamy, e acuch znakw ; sam w sobie jest obiektem i z niego mona wywoa metod join. Zmienne s etykietami dla obiektw. Metoda join czy elementy listy w jeden acuch znakw, a kady element w zwracanym acuchu jest oddzielony od innego separatorem. W naszym przykadzie jest nim ;, lecz moe nim by dowolny acuch znakw. Metoda join dziaa tylko z listami przechowujcymi acuchy znakw. Nie korzysta ona z adnych wymusze czy konwersji. czenie listy, ktra posiada co najmniej jeden lub wicej elementw niebdcych acuchem znakw, rzuci wyjtek.

Przykad 3.30 Wyjcie odbchelper.py >>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> ["%s=%s" % (k, v) for k, v in params.items()] [pwd=secret, database=master, uid=sa, server=mpilgrim] >>> ";".join(["%s=%s" % (k, v) for k, v in params.items()]) pwd=secret;database=master;uid=sa;server=mpilgrim Powyszy acuch znakw otrzymalimy podczas uruchamiania odbchelper.py. W Pythonie znajdziemy take metod analogiczn do metody join, ale ktra zamiast czy, dzieli acuch znakw na list. Jest to funkcja split. Przykad 3.31 Dzielenie acuchw znakw >>> li = [pwd=secret, database=master, uid=sa, server=mpilgrim] >>> s = ";".join(li) >>> s pwd=secret;database=master;uid=sa;server=mpilgrim >>> s.split(";") #(1) [pwd=secret, database=master, uid=sa, server=mpilgrim] >>> s.split(";", 1) #(2) [pwd=secret, database=master;uid=sa;server=mpilgrim] 1. split, przeciwiestwo funkcji join, dzieli acuch znakw na wieloelementow list. Separator (w przykadzie ;) nie bdzie wystpowa w adnym elemencie zwracanej listy, zostanie pominity.

4.8. CZENIE LIST I DZIELENIE ACUCHW ZNAKW

51

2. Do funkcji split moemy doda opcjonalny drugi argument, ktry okrela, na jak maksymaln liczb kawakw ma zosta podzielony acuch. (O opcjonalnych argumentach w funkcji dowiemy si w nastpnym rozdziale.) tekst.split(separator, 1) jest przydatnym spo