background image
background image

Idź do

• Spis treści
• Przykładowy rozdział

• Katalog online

• Dodaj do koszyka

• Zamów cennik

• Zamów informacje

o nowościach

• Fragmenty książek

online

Helion SA
ul. Kościuszki 1c
44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl

© Helion 1991–2010

Katalog książek

Twój koszyk

Cennik i informacje

Czytelnia

Kontakt

• Zamów drukowany

katalog

Python. Wprowadzenie.
Wydanie IV

Autor: 

Mark Lutz

Tłumaczenie: Anna Trojan, Marek Pętlicki
ISBN: 978-83-246-2694-6
Tytuł oryginału: 

Learning Python, 4th edition

Format: 172×245, stron: 1184

Poznaj język, który wykorzystuje Google i YouTube!

• Jak tworzyć i przetwarzać obiekty za pomocą instrukcji Pythona?
• Jak stworzyć strukturę kodu i wykorzystać go ponownie?
• Jak programować obiektowo w Pythonie?

Czy wiesz, dlaczego ponad milion programistów na całym świecie używa właśnie tego języka 
skryptowego? Jego atuty to niezwykła czytelność, spójność i wydajność – pewnie dlatego także
i Ty chcesz opanować słynnego Pythona. Kod napisany w tym języku można z łatwością 
utrzymywać, przenosić i używać go ponownie. Pozostaje on zrozumiały nawet wówczas, jeśli 
analizuje go ktoś, kto nie jest jego autorem. Co więcej, taki kod ma rozmiary średnio o dwie
trzecie do czterech piątych mniejsze od kodu w językach C++ czy Java, co wielokrotnie zwiększa 
wydajność pracy używających go programistów. Python obsługuje także zaawansowane 
mechanizmy pozwalające na ponowne wykorzystanie kodu, takie jak programowanie 
zorientowane obiektowo, a programy w nim napisane działają natychmiast, bez konieczności 
przeprowadzania długiej kompilacji, niezależnie od wykorzystywanej platformy.

Naukę rozpoczniesz od najważniejszych wbudowanych typów danych – liczb, list czy słowników. 
Przyjrzysz się również typom dynamicznym oraz ich interfejsom. Później poznasz instrukcje oraz 
ogólny model składni Pythona. Poszerzysz wiedzę na temat powiązanych z nim narzędzi, takich 
jak system PyDoc, a także alternatywnych możliwości tworzenia kodu. Dowiesz się wszystkiego 
na temat modułów: jak się je tworzy, przeładowuje i jak się ich używa. W końcu poznasz klasy oraz 
zagadnienia związane z programowaniem zorientowanym obiektowo i nauczysz się obsługiwać 
wyjątki. Czwarte wydanie tej książki zostało wzbogacone
o wiele nowych, ciekawych i bardzo zaawansowanych zagadnień, dzięki czemu stanowi doskonałą 
lekturę także dla zawodowców, na co dzień piszących kod w tym języku. Dzięki tej książce:

• zapoznasz się z podstawowymi typami wbudowanymi Pythona,
• nauczysz się tworzyć i przetwarzać obiekty za pomocą instrukcji Pythona, a także 

opanujesz ogólny model składni tego języka

• stworzysz strukturę kodu i wykorzystasz kod ponownie dzięki podstawowym narzędziom 

proceduralnym Pythona

• dowiesz się wszystkiego o modułach Pythona – pakietach instrukcji i funkcji oraz innych 

narzędziach zorganizowanych w większe komponenty

• odkryjesz narzędzie programowania zorientowanego obiektowo, umożliwiające 

strukturyzację kodu

• opanujesz model obsługi wyjątków i narzędzia programistyczne służące do pisania 

większych programów

• zapoznasz się z zaawansowanymi narzędziami Pythona, w tym dekoratorami, 

deskryptorami, metaklasami i przetwarzaniem tekstu Unicode

Opanuj Pythona z Markiem Lutzem – najbardziej znanym ekspertem w tej dziedzinie! 

background image

5

Spis treļci

Przedmowa .............................................................................................................................29

Czýļë I  Wprowadzenie .................................................................................. 47

1.  Pytania i odpowiedzi dotyczéce Pythona  ..................................................................49

Dlaczego ludzie uĔywajñ Pythona? 

49

JakoĈè oprogramowania 

50

WydajnoĈè programistów 

51

Czy Python jest jözykiem skryptowym? 

51

Jakie sñ zatem wady Pythona? 

53

Kto dzisiaj uĔywa Pythona? 

53

Co mogö zrobiè za pomocñ Pythona? 

55

Programowanie systemowe 

55

Graficzne interfejsy uĔytkownika 

55

Skrypty internetowe 

56

Integracja komponentów 

56

Programowanie bazodanowe 

57

Szybkie prototypowanie 

57

Programowanie numeryczne i naukowe 

57

Gry, grafika, porty szeregowe, XML, roboty i tym podobne 

58

Jakie wsparcie techniczne ma Python? 

58

Jakie sñ techniczne mocne strony Pythona? 

59

Jest zorientowany obiektowo 

59

Jest darmowy 

59

Jest przenoĈny 

60

Ma duĔe moĔliwoĈci 

61

MoĔna go äñczyè z innymi jözykami 

62

Jest äatwy w uĔyciu 

62

Jest äatwy do nauczenia siö 

62

Zawdziöcza swojñ nazwö Monty Pythonowi 

63

Jak Python wyglñda na tle innych jözyków? 

63

Podsumowanie rozdziaäu 

64

background image

6

_

 Spis treļci

SprawdĒ swojñ wiedzö — quiz 

65

SprawdĒ swojñ wiedzö — odpowiedzi 

65

2.  Jak Python wykonuje programy? ................................................................................69

Wprowadzenie do interpretera Pythona 

69

Wykonywanie programu 

71

Z punktu widzenia programisty 

71

Z punktu widzenia Pythona 

72

Warianty modeli wykonywania 

74

Alternatywne implementacje Pythona 

75

Narzödzia do optymalizacji wykonywania 

76

ZamroĔone pliki binarne 

78

Inne opcje wykonywania 

78

Przyszäe moĔliwoĈci? 

79

Podsumowanie rozdziaäu 

80

SprawdĒ swojñ wiedzö — quiz 

80

SprawdĒ swojñ wiedzö — odpowiedzi 

80

3.  Jak wykonuje siý programy? ....................................................................................... 81

Interaktywny wiersz poleceþ 

81

Interaktywne wykonywanie kodu 

82

Do czego säuĔy sesja interaktywna? 

83

Wykorzystywanie sesji interaktywnej 

85

Systemowe wiersze poleceþ i pliki 

87

Pierwszy skrypt 

87

Wykonywanie plików za pomocñ wiersza poleceþ 

88

Wykorzystywanie wierszy poleceþ i plików 

90

Skrypty wykonywalne Uniksa (#!) 

91

Klikniöcie ikony pliku 

92

Klikniöcie ikony w systemie Windows 

93

Sztuczka z funkcjñ input 

94

Inne ograniczenia klikania ikon 

95

Importowanie i przeäadowywanie moduäów 

96

Wiöcej o moduäach — atrybuty 

98

Uwagi na temat uĔywania instrukcji import i reload 

100

Wykorzystywanie exec do wykonywania plików moduäów 

101

Interfejs uĔytkownika IDLE 

102

Podstawy IDLE 

103

Korzystanie z IDLE 

105

Zaawansowane opcje IDLE 

106

Inne IDE 

107

Inne opcje wykonywania kodu 

108

Osadzanie wywoäaþ 

108

ZamroĔone binarne pliki wykonywalne 

109

Uruchamianie kodu w edytorze tekstowym 

110

background image

Spis treļci

_

7

Jeszcze inne moĔliwoĈci uruchamiania 

110

Przyszäe moĔliwoĈci 

110

Jakñ opcjö wybraè? 

111

Podsumowanie rozdziaäu 

112

SprawdĒ swojñ wiedzö — quiz 

113

SprawdĒ swojñ wiedzö — odpowiedzi 

113

SprawdĒ swojñ wiedzö — èwiczenia do czöĈci pierwszej 

114

Czýļë II  Typy i operacje  ..................................................................................117

4.  Wprowadzenie do typów obiektów Pythona  ...........................................................119

Po co korzysta siö z typów wbudowanych? 

120

NajwaĔniejsze typy danych w Pythonie 

121

Liczby 

122

ãaþcuchy znaków 

124

Operacje na sekwencjach 

124

NiezmiennoĈè 

126

Metody specyficzne dla typu 

126

Otrzymanie pomocy 

127

Inne sposoby kodowania äaþcuchów znaków 

128

Dopasowywanie wzorców 

129

Listy 

130

Operacje na sekwencjach 

130

Operacje specyficzne dla typu 

130

Sprawdzanie granic 

131

ZagnieĔdĔanie 

131

Listy skäadane 

132

Säowniki 

133

Operacje na odwzorowaniach 

134

ZagnieĔdĔanie raz jeszcze 

134

Sortowanie kluczy — pötle for 

136

Iteracja i optymalizacja 

137

Brakujñce klucze — testowanie za pomocñ if 

138

Krotki 

139

Czemu säuĔñ krotki? 

140

Pliki 

140

Inne narzödzia podobne do plików 

142

Inne typy podstawowe 

142

Jak zepsuè elastycznoĈè kodu 

143

Klasy zdefiniowane przez uĔytkownika 

144

I wszystko inne 

145

Podsumowanie rozdziaäu 

145

SprawdĒ swojñ wiedzö — quiz 

146

SprawdĒ swojñ wiedzö — odpowiedzi 

146

background image

8

_

 Spis treļci

5.  Typy liczbowe  ............................................................................................................ 149

Podstawy typów liczbowych Pythona 

149

Literaäy liczbowe 

150

Wbudowane narzödzia liczbowe 

151

Operatory wyraĔeþ Pythona 

152

Liczby w akcji 

156

Zmienne i podstawowe wyraĔenia 

157

Formaty wyĈwietlania liczb 

158

Porównania — zwykäe i äñczone 

160

Dzielenie — klasyczne, bez reszty i prawdziwe 

161

Precyzja liczb caäkowitych 

164

Liczby zespolone 

165

Notacja szesnastkowa, ósemkowa i dwójkowa 

165

Operacje poziomu bitowego 

167

Inne wbudowane narzödzia liczbowe 

168

Inne typy liczbowe 

170

Typ liczby dziesiötnej 

170

Typ liczby uäamkowej 

172

Zbiory 

176

WartoĈci Boolean 

181

Dodatkowe rozszerzenia numeryczne 

182

Podsumowanie rozdziaäu 

183

SprawdĒ swojñ wiedzö — quiz 

183

SprawdĒ swojñ wiedzö — odpowiedzi 

184

6.  Wprowadzenie do typów dynamicznych ................................................................. 185

Sprawa brakujñcych deklaracji typu 

185

Zmienne, obiekty i referencje 

186

Typy powiñzane sñ z obiektami, a nie ze zmiennymi 

187

Obiekty sñ uwalniane 

188

Referencje wspóädzielone 

190

Referencje wspóädzielone a modyfikacje w miejscu 

191

Referencje wspóädzielone a równoĈè 

193

Typy dynamiczne sñ wszödzie 

194

Podsumowanie rozdziaäu 

194

SprawdĒ swojñ wiedzö — quiz 

195

SprawdĒ swojñ wiedzö — odpowiedzi 

195

7.  Ĥaħcuchy znaków  ...................................................................................................... 197

Literaäy äaþcuchów znaków 

199

ãaþcuchy znaków w apostrofach i cudzysäowach sñ tym samym 

200

Sekwencje ucieczki reprezentujñ bajty specjalne 

200

Surowe äaþcuchy znaków blokujñ sekwencje ucieczki 

203

Potrójne cudzysäowy i apostrofy kodujñ äaþcuchy znaków

bödñce wielowierszowymi blokami 

204

background image

Spis treļci

_

9

ãaþcuchy znaków w akcji 

205

Podstawowe operacje 

206

Indeksowanie i wycinki 

207

Narzödzia do konwersji äaþcuchów znaków 

210

Modyfikowanie äaþcuchów znaków 

213

Metody äaþcuchów znaków 

214

Przykäady metod äaþcuchów znaków — modyfikowanie 

215

Przykäady metod äaþcuchów znaków — analiza skäadniowa tekstu 

218

Inne znane metody äaþcuchów znaków w akcji 

219

Oryginalny moduä string (usuniöty w 3.0) 

220

WyraĔenia formatujñce äaþcuchy znaków 

221

Zaawansowane wyraĔenia formatujñce 

222

WyraĔenia formatujñce z uĔyciem säownika 

224

Metoda format 

225

Podstawy 

225

UĔycie kluczy, atrybutów i przesuniöè 

226

Formatowanie specjalizowane 

227

Porównanie z wyraĔeniami formatujñcymi 

229

Po co nam kolejny mechanizm formatujñcy? 

232

Generalne kategorie typów 

235

Typy z jednej kategorii wspóädzielñ zbiory operacji 

235

Typy zmienne moĔna modyfikowaè w miejscu 

236

Podsumowanie rozdziaäu 

236

SprawdĒ swojñ wiedzö — quiz 

236

SprawdĒ swojñ wiedzö — odpowiedzi 

237

8.  Listy oraz sĥowniki .....................................................................................................239

Listy 

239

Listy w akcji 

241

Podstawowe operacje na listach 

241

Iteracje po listach i skäadanie list 

242

Indeksowanie, wycinki i macierze 

243

Modyfikacja list w miejscu 

244

Säowniki 

248

Säowniki w akcji 

249

Podstawowe operacje na säownikach 

250

Modyfikacja säowników w miejscu 

251

Inne metody säowników 

252

Przykäad z tabelñ jözyków programowania 

253

Uwagi na temat korzystania ze säowników 

254

Inne sposoby tworzenia säowników 

257

Zmiany dotyczñce säowników w 3.0 

258

Podsumowanie rozdziaäu 

264

SprawdĒ swojñ wiedzö — quiz 

264

SprawdĒ swojñ wiedzö — odpowiedzi 

264

background image

10

_

 Spis treļci

9.  Krotki, pliki i pozostaĥe .............................................................................................. 267

Krotki 

267

Krotki w akcji 

268

Dlaczego istniejñ listy i krotki? 

271

Pliki 

271

Otwieranie plików 

272

Wykorzystywanie plików 

273

Pliki w akcji 

274

Inne narzödzia powiñzane z plikami 

280

Raz jeszcze o kategoriach typów 

281

ElastycznoĈè obiektów 

282

Referencje a kopie 

283

Porównania, równoĈè i prawda 

285

Porównywanie säowników w Pythonie 3.0 

287

Znaczenie True i False w Pythonie 

288

Hierarchie typów Pythona 

290

Obiekty typów 

291

Inne typy w Pythonie 

291

Puäapki typów wbudowanych 

292

Przypisanie tworzy referencje, nie kopie 

292

Powtórzenie dodaje jeden poziom zagäöbienia 

293

Uwaga na cykliczne struktury danych 

293

Typów niezmiennych nie moĔna modyfikowaè w miejscu 

294

Podsumowanie rozdziaäu 

294

SprawdĒ swojñ wiedzö — quiz 

294

SprawdĒ swojñ wiedzö — odpowiedzi 

295

SprawdĒ swojñ wiedzö — èwiczenia do czöĈci drugiej 

295

Czýļë III Instrukcje i skĥadnia ........................................................................ 299

10.  Wprowadzenie do instrukcji Pythona  ...................................................................... 301

Raz jeszcze o strukturze programu Pythona 

301

Instrukcje Pythona 

301

Historia dwóch if 

303

Co dodaje Python 

304

Co usuwa Python 

304

Skñd bierze siö skäadnia indentacji? 

306

Kilka przypadków specjalnych 

308

Szybki przykäad — interaktywne pötle 

310

Prosta pötla interaktywna 

310

Wykonywanie obliczeþ na danych uĔytkownika 

311

Obsäuga bäödów za pomocñ sprawdzania danych wejĈciowych 

312

Obsäuga bäödów za pomocñ instrukcji try 

313

Kod zagnieĔdĔony na trzy poziomy gäöbokoĈci 

314

background image

Spis treļci

_

11

Podsumowanie rozdziaäu 

315

SprawdĒ swojñ wiedzö — quiz 

315

SprawdĒ swojñ wiedzö — odpowiedzi 

315

11.  Przypisania, wyraŜenia i wyļwietlanie .....................................................................317

Instrukcje przypisania 

317

Formy instrukcji przypisania 

318

Przypisanie sekwencji 

319

Rozszerzona skäadnia rozpakowania sekwencji w 3.0 

322

Przypisanie z wieloma celami 

325

Przypisania rozszerzone 

326

Reguäy dotyczñce nazw zmiennych 

329

Instrukcje wyraĔeþ 

332

Instrukcje wyraĔeþ i modyfikacje w miejscu 

333

Polecenia print 

334

Funkcja print Pythona 3.0 

334

Instrukcja print w Pythonie 2.6 

337

Przekierowanie strumienia wyjĈciowego 

338

WyĈwietlanie niezaleĔne od wersji 

341

Podsumowanie rozdziaäu 

343

SprawdĒ swojñ wiedzö — quiz 

344

SprawdĒ swojñ wiedzö — odpowiedzi 

344

12.  Testy if i reguĥy skĥadni  .............................................................................................345

Instrukcje if 

345

Ogólny format 

345

Proste przykäady 

346

Rozgaäözienia kodu 

346

Reguäy skäadni Pythona 

348

Ograniczniki bloków — reguäy indentacji 

349

Ograniczniki instrukcji — wiersze i kontynuacje 

351

Kilka przypadków specjalnych 

352

Testy prawdziwoĈci 

353

WyraĔenie trójargumentowe if/else 

355

Podsumowanie rozdziaäu 

356

SprawdĒ swojñ wiedzö — quiz 

357

SprawdĒ swojñ wiedzö — odpowiedzi 

358

13.  Pýtle while i for ..........................................................................................................359

Pötle while 

359

Ogólny format 

360

Przykäady 

360

Instrukcje break, continue, pass oraz else w pötli 

361

Ogólny format pötli 

361

Instrukcja pass 

361

background image

12

_

 Spis treļci

Instrukcja continue 

363

Instrukcja break 

363

Instrukcja else 

364

Pötle for 

365

Ogólny format 

365

Przykäady 

367

Techniki tworzenia pötli 

372

Pötle liczników — while i range 

373

Przechodzenie niewyczerpujñce — range i wycinki 

374

Modyfikacja list — range 

375

Przechodzenie równolegäe — zip oraz map 

376

Generowanie wartoĈci przesuniöcia i elementów — enumerate 

379

Podsumowanie rozdziaäu 

380

SprawdĒ swojñ wiedzö — quiz 

380

SprawdĒ swojñ wiedzö — odpowiedzi 

380

14.  Iteracje i skĥadanie list — czýļë 1.  .............................................................................383

Pierwsze spojrzenie na iteratory 

383

Protokóä iteracyjny, iteratory plików 

384

Kontrola iteracji — iter i next 

386

Inne iteratory typów wbudowanych 

388

Listy skäadane — wprowadzenie 

390

Podstawy list skäadanych 

390

Wykorzystywanie list skäadanych w plikach 

391

Rozszerzona skäadnia list skäadanych 

392

Inne konteksty iteracyjne 

393

Nowe obiekty iterowane w Pythonie 3.0 

397

Iterator range() 

397

Iteratory map(), zip() i filter() 

398

Kilka iteratorów na tym samym obiekcie 

399

Iteratory widoku säownika 

400

Inne zagadnienia zwiñzane z iteratorami 

402

Podsumowanie rozdziaäu 

402

SprawdĒ swojñ wiedzö — quiz 

402

SprawdĒ swojñ wiedzö — odpowiedzi 

403

15.  Wprowadzenie do dokumentacji ..............................................................................405

đródäa dokumentacji Pythona 

405

Komentarze ze znakami # 

406

Funkcja dir 

406

ãaþcuchy znaków dokumentacji — __doc__ 

407

PyDoc — funkcja help 

410

PyDoc — raporty HTML 

412

Zbiór standardowej dokumentacji 

415

Zasoby internetowe 

415

Publikowane ksiñĔki 

416

background image

Spis treļci

_

13

Czösto spotykane problemy programistyczne 

417

Podsumowanie rozdziaäu 

419

SprawdĒ swojñ wiedzö — quiz 

419

SprawdĒ swojñ wiedzö — odpowiedzi 

419

çwiczenia do czöĈci trzeciej 

420

Czýļë IV Funkcje ............................................................................................ 423

16.  Podstawy funkcji  .......................................................................................................425

Po co uĔywa siö funkcji? 

426

Tworzenie funkcji 

426

Instrukcje def 

428

Instrukcja def uruchamiana jest w czasie wykonania 

428

Pierwszy przykäad — definicje i wywoäywanie 

429

Definicja 

429

Wywoäanie 

430

Polimorfizm w Pythonie 

430

Drugi przykäad — przecinajñce siö sekwencje 

431

Definicja 

432

Wywoäania 

432

Raz jeszcze o polimorfizmie 

433

Zmienne lokalne 

433

Podsumowanie rozdziaäu 

434

SprawdĒ swojñ wiedzö — quiz 

434

SprawdĒ swojñ wiedzö — odpowiedzi 

434

17.  Zakresy .......................................................................................................................437

Podstawy zakresów w Pythonie 

437

Reguäy dotyczñce zakresów 

438

Rozwiñzywanie konfliktów w zakresie nazw — reguäa LEGB 

440

Przykäad zakresu 

441

Zakres wbudowany 

442

Instrukcja global 

443

Minimalizowanie stosowania zmiennych globalnych 

445

Minimalizacja modyfikacji dokonywanych pomiödzy plikami 

446

Inne metody dostöpu do zmiennych globalnych 

447

Zakresy a funkcje zagnieĔdĔone 

448

Szczegóäy dotyczñce zakresów zagnieĔdĔonych 

449

Przykäad zakresu zagnieĔdĔonego 

449

Instrukcja nonlocal 

455

Podstawy instrukcji nonlocal 

455

Instrukcja nonlocal w akcji 

456

Czemu säuĔñ zmienne nielokalne? 

458

Podsumowanie rozdziaäu 

462

background image

14

_

 Spis treļci

SprawdĒ swojñ wiedzö — quiz 

462

SprawdĒ swojñ wiedzö — odpowiedzi 

463

18.  Argumenty  .................................................................................................................465

Podstawy przekazywania argumentów 

465

Argumenty a wspóädzielone referencje 

466

Unikanie modyfikacji zmiennych argumentów 

468

Symulowanie parametrów wyjĈcia 

469

Specjalne tryby dopasowania argumentów 

470

Podstawy 

470

Skäadnia dopasowania 

471

Dopasowywanie argumentów — szczegóäy 

472

Przykäady ze säowami kluczowymi i wartoĈciami domyĈlnymi 

473

Przykäad dowolnych argumentów 

475

Argumenty mogñce byè tylko säowami kluczowymi z Pythona 3.0 

479

Przykäad z funkcjñ obliczajñcñ minimum 

482

Peäne rozwiñzanie 

483

Dodatkowy bonus 

484

Puenta 

485

Uogólnione funkcje dziaäajñce na zbiorach 

485

Emulacja funkcji print z Pythona 3.0 

486

Wykorzystywanie argumentów mogñcych byè tylko säowami kluczowymi 

487

Podsumowanie rozdziaäu 

488

SprawdĒ swojñ wiedzö — quiz 

489

SprawdĒ swojñ wiedzö — odpowiedzi 

490

19.  Zaawansowane zagadnienia dotyczéce funkcji  ...................................................... 491

Koncepcje projektowania funkcji 

491

Funkcje rekurencyjne 

493

Sumowanie z uĔyciem rekurencji 

493

Implementacje alternatywne 

494

Pötle a rekurencja 

495

Obsäuga dowolnych struktur 

496

Obiekty funkcji — atrybuty i adnotacje 

497

PoĈrednie wywoäania funkcji 

497

Introspekcja funkcji 

498

Atrybuty funkcji 

499

Adnotacje funkcji w Pythonie 3.0 

499

Funkcje anonimowe — lambda 

501

WyraĔenia lambda 

501

Po co uĔywa siö wyraĔenia lambda? 

503

Jak äatwo zaciemniè kod napisany w Pythonie 

504

ZagnieĔdĔone wyraĔenia lambda a zakresy 

505

Odwzorowywanie funkcji na sekwencje — map 

507

Narzödzia programowania funkcyjnego — filter i reduce 

508

background image

Spis treļci

_

15

Podsumowanie rozdziaäu 

510

SprawdĒ swojñ wiedzö — quiz 

510

SprawdĒ swojñ wiedzö — odpowiedzi 

510

20.  Iteracje i skĥadanie list — czýļë 2. ............................................................................. 513

Listy skäadane, podejĈcie drugie — narzödzia funkcyjne 

513

Listy skäadane kontra map 

514

Dodajemy warunki i pötle zagnieĔdĔone — filter 

515

Listy skäadane i macierze 

517

Zrozumieè listy skäadane 

518

Iteratorów ciñg dalszy — generatory 

520

Funkcje generatorów — yield kontra return 

520

WyraĔenia generatorów — iteratory spotykajñ zäoĔenia 

524

Funkcje generatorów kontra wyraĔenia generatorów 

525

Generatory sñ jednorazowymi iteratorami 

526

Emulacja funkcji zip i map za pomocñ narzödzi iteracyjnych 

527

Generowanie wyników we wbudowanych typach i klasach 

531

Podsumowanie obiektów skäadanych w 3.0 

533

Zrozumieè zbiory i säowniki skäadane 

534

Rozszerzona skäadnia zbiorów i säowników skäadanych 

534

Pomiary wydajnoĈci implementacji iteratorów 

535

Moduä mytimer 

536

Skrypt mierzñcy wydajnoĈè 

536

Pomiary czasu 

537

Alternatywne moduäy mierzñce wydajnoĈè 

539

Inne sugestie 

543

Puäapki zwiñzane z funkcjami 

544

Lokalne nazwy sñ wykrywane w sposób statyczny 

544

WartoĈci domyĈlne i obiekty mutowalne 

546

Funkcje niezwracajñce wyników 

548

Funkcje zagnieĔdĔone a zmienne modyfikowane w pötli 

548

Podsumowanie rozdziaäu 

548

SprawdĒ swojñ wiedzö — quiz 

549

SprawdĒ swojñ wiedzö — odpowiedzi 

549

SprawdĒ swojñ wiedzö — èwiczenia do czöĈci czwartej 

550

Czýļë V Moduĥy ............................................................................................. 553

21.  Moduĥy — wprowadzenie  ........................................................................................555

Po co uĔywa siö moduäów? 

555

Architektura programu w Pythonie 

556

Struktura programu 

556

Importowanie i atrybuty 

557

Moduäy biblioteki standardowej 

558

background image

16

_

 Spis treļci

Jak dziaäa importowanie 

559

1. Odnalezienie moduäu 

560

2. (Ewentualne) Kompilowanie 

560

3. Wykonanie 

561

ćcieĔka wyszukiwania moduäów 

561

Konfiguracja ĈcieĔki wyszukiwania 

563

Wariacje ĈcieĔki wyszukiwania moduäów 

564

Lista sys.path 

564

Wybór pliku moduäu 

565

Zaawansowane zagadnienia zwiñzane z wyborem moduäów 

566

Podsumowanie rozdziaäu 

566

SprawdĒ swojñ wiedzö — quiz 

567

SprawdĒ swojñ wiedzö — odpowiedzi 

568

22.  Podstawy tworzenia moduĥów .................................................................................569

Tworzenie moduäów 

569

UĔycie moduäów 

570

Instrukcja import 

570

Instrukcja from 

571

Instrukcja from * 

571

Operacja importowania odbywa siö tylko raz 

571

Instrukcje import oraz from sñ przypisaniami 

572

Modyfikacja zmiennych pomiödzy plikami 

573

RównowaĔnoĈè instrukcji import oraz from 

573

Potencjalne puäapki zwiñzane z uĔyciem instrukcji from 

574

Przestrzenie nazw moduäów 

575

Pliki generujñ przestrzenie nazw 

576

Kwalifikowanie nazw atrybutów 

577

Importowanie a zakresy 

578

ZagnieĔdĔanie przestrzeni nazw 

579

Przeäadowywanie moduäów 

580

Podstawy przeäadowywania moduäów 

581

Przykäad przeäadowywania z uĔyciem reload 

581

Podsumowanie rozdziaäu 

582

SprawdĒ swojñ wiedzö — quiz 

583

SprawdĒ swojñ wiedzö — odpowiedzi 

584

23.  Pakiety moduĥów .......................................................................................................585

Podstawy importowania pakietów 

585

Pakiety a ustawienia ĈcieĔki wyszukiwania 

586

Pliki pakietów __init__.py 

586

Przykäad importowania pakietu 

588

Instrukcja from a instrukcja import w importowaniu pakietów 

589

Do czego säuĔy importowanie pakietów? 

590

Historia trzech systemów 

590

background image

Spis treļci

_

17

Wzglödne importowanie pakietów 

593

Zmiany w Pythonie 3.0 

593

Podstawy importów wzglödnych 

594

Do czego säuĔñ importy wzglödne? 

595

Zakres importów wzglödnych 

597

Podsumowanie reguä wyszukiwania moduäów 

598

Importy wzglödne w dziaäaniu 

598

Podsumowanie rozdziaäu 

603

SprawdĒ swojñ wiedzö — quiz 

604

SprawdĒ swojñ wiedzö — odpowiedzi 

604

24.  Zaawansowane zagadnienia zwiézane z moduĥami  .............................................. 607

Ukrywanie danych w moduäach 

607

Minimalizacja niebezpieczeþstw uĔycia from * — _X oraz __all__ 

608

Wäñczanie opcji z przyszäych wersji Pythona 

608

Mieszane tryby uĔycia — __name__ oraz __main__ 

609

Testy jednostkowe z wykorzystaniem __name__ 

610

UĔycie argumentów wiersza poleceþ z __name__ 

611

Modyfikacja ĈcieĔki wyszukiwania moduäów 

613

Rozszerzenie as dla instrukcji import oraz from 

614

Moduäy sñ obiektami — metaprogramy 

615

Importowanie moduäów za pomocñ äaþcucha znaków nazwy 

617

Przechodnie przeäadowywanie moduäów 

618

Projektowanie moduäów 

621

Puäapki zwiñzane z moduäami 

622

W kodzie najwyĔszego poziomu kolejnoĈè instrukcji ma znaczenie 

622

Instrukcja from kopiuje nazwy, jednak äñcza juĔ nie 

623

Instrukcja from * moĔe zaciemniè znaczenie zmiennych 

624

Funkcja reload moĔe nie mieè wpäywu na obiekty importowane

za pomocñ from 

624

Funkcja reload i instrukcja from a testowanie interaktywne 

625

Rekurencyjne importowanie za pomocñ from moĔe nie dziaäaè 

626

Podsumowanie rozdziaäu 

627

SprawdĒ swojñ wiedzö — quiz 

627

SprawdĒ swojñ wiedzö — odpowiedzi 

628

SprawdĒ swojñ wiedzö — èwiczenia do czöĈci piñtej 

628

Czýļë VI Klasy i programowanie zorientowane obiektowo ........................631

25.  Programowanie zorientowane obiektowo ..............................................................633

Po co uĔywa siö klas? 

634

Programowanie zorientowane obiektowo z dystansu 

635

Wyszukiwanie dziedziczenia atrybutów 

635

Klasy a instancje 

637

background image

18

_

 Spis treļci

Wywoäania metod klasy 

638

Tworzenie drzew klas 

638

Programowanie zorientowane obiektowo oparte jest na ponownym

wykorzystaniu kodu 

641

Podsumowanie rozdziaäu 

643

SprawdĒ swojñ wiedzö — quiz 

644

SprawdĒ swojñ wiedzö — odpowiedzi 

644

26.  Podstawy tworzenia klas  ..........................................................................................647

Klasy generujñ wiökszñ liczbö obiektów instancji 

647

Obiekty klas udostöpniajñ zachowania domyĈlne 

648

Obiekty instancji sñ rzeczywistymi elementami 

648

Pierwszy przykäad 

649

Klasy dostosowuje siö do wäasnych potrzeb przez dziedziczenie 

651

Drugi przykäad 

652

Klasy sñ atrybutami w moduäach 

653

Klasy mogñ przechwytywaè operatory Pythona 

654

Trzeci przykäad 

655

Po co przeciñĔa siö operatory? 

657

Najprostsza klasa Pythona na Ĉwiecie 

658

Klasy a säowniki 

660

Podsumowanie rozdziaäu 

662

SprawdĒ swojñ wiedzö — quiz 

662

SprawdĒ swojñ wiedzö — odpowiedzi 

663

27.  Bardziej realistyczny przykĥad ..................................................................................665

Krok 1. — tworzenie instancji 

666

Tworzenie konstruktorów 

666

Testowanie w miarö pracy 

667

Wykorzystywanie kodu na dwa sposoby 

668

Krok 2. — dodawanie metod 

669

Tworzenie kodu metod 

671

Krok 3. — przeciñĔanie operatorów 

673

Udostöpnienie wyĈwietlania 

674

Krok 4. — dostosowanie zachowania do wäasnych potrzeb
za pomocñ klas podrzödnych 

675

Tworzenie klas podrzödnych 

675

Rozszerzanie metod — niewäaĈciwy sposób 

676

Rozszerzanie metod — wäaĈciwy sposób 

676

Polimorfizm w akcji 

678

Dziedziczenie, dostosowanie do wäasnych potrzeb i rozszerzenie 

679

Programowanie zorientowane obiektowo — idea 

680

Krok 5. — dostosowanie do wäasnych potrzeb takĔe konstruktorów 

680

Programowanie zorientowane obiektowo jest prostsze, niĔ siö wydaje 

682

Inne sposoby äñczenia klas 

683

background image

Spis treļci

_

19

Krok 6. — wykorzystywanie narzödzi do introspekcji 

684

Specjalne atrybuty klas 

686

Uniwersalne narzödzie do wyĈwietlania 

687

Atrybuty instancji a atrybuty klas 

688

RozwaĔania na temat nazw w klasach narzödzi 

689

Ostateczna postaè naszych klas 

690

Krok 7. i ostatni — przechowanie obiektów w bazie danych 

691

Obiekty pickle i shelve 

691

Przechowywanie obiektów w bazie danych za pomocñ shelve 

692

Interaktywne badanie obiektów shelve 

694

Uaktualnianie obiektów w pliku shelve 

695

Przyszäe kierunki rozwoju 

697

Podsumowanie rozdziaäu 

699

SprawdĒ swojñ wiedzö — quiz 

699

SprawdĒ swojñ wiedzö — odpowiedzi 

700

28.  Szczegóĥy kodu klas ................................................................................................... 703

Instrukcja class 

703

Ogólna forma 

703

Przykäad 

704

Metody 

706

Przykäad metody 

707

Wywoäywanie konstruktorów klas nadrzödnych 

708

Inne moĔliwoĈci wywoäywania metod 

708

Dziedziczenie 

708

Tworzenie drzewa atrybutów 

709

Specjalizacja odziedziczonych metod 

710

Techniki interfejsów klas 

711

Abstrakcyjne klasy nadrzödne 

712

Abstrakcyjne klasy nadrzödne z Pythona 2.6 oraz 3.0 

713

Przestrzenie nazw — caäa historia 

714

Pojedyncze nazwy — globalne, o ile nie przypisane 

715

Nazwy atrybutów — przestrzenie nazw obiektów 

715

Zen przestrzeni nazw Pythona — przypisania klasyfikujñ zmienne 

715

Säowniki przestrzeni nazw 

718

ãñcza przestrzeni nazw 

720

Raz jeszcze o äaþcuchach znaków dokumentacji 

722

Klasy a moduäy 

723

Podsumowanie rozdziaäu 

724

SprawdĒ swojñ wiedzö — quiz 

724

SprawdĒ swojñ wiedzö — odpowiedzi 

724

background image

20

_

 Spis treļci

29.  PrzeciéŜanie operatorów  .......................................................................................... 727

Podstawy 

727

Konstruktory i wyraĔenia — __init__ i __sub__ 

728

Czösto spotykane metody przeciñĔania operatorów 

728

Indeksowanie i wycinanie — __getitem__ i __setitem__ 

730

Wycinki 

730

Iteracja po indeksie — __getitem__ 

731

Obiekty iteratorów — __iter__ i __next__ 

733

Iteratory zdefiniowane przez uĔytkownika 

734

Wiele iteracji po jednym obiekcie 

735

Test przynaleĔnoĈci — __contains__, __iter__ i __getitem__ 

737

Metody __getattr__ oraz __setattr__ przechwytujñ referencje do atrybutów 

740

Inne narzödzia do zarzñdzania atrybutami 

741

Emulowanie prywatnoĈci w atrybutach instancji 

741

Metody __repr__ oraz __str__ zwracajñ reprezentacje äaþcuchów znaków 

742

Metoda __radd__ obsäuguje dodawanie prawostronne i modyfikacjö w miejscu 

745

Dodawanie w miejscu 

746

Metoda __call_ przechwytuje wywoäania 

747

Interfejsy funkcji i kod oparty na wywoäaniach zwrotnych 

748

Porównania — __lt__, __gt__ i inne 

750

Metoda __cmp__ w 2.6 (usuniöta w 3.0) 

750

Testy logiczne — __bool__ i __len__ 

751

Destrukcja obiektu — __del__ 

752

Podsumowanie rozdziaäu 

754

SprawdĒ swojñ wiedzö — quiz 

755

SprawdĒ swojñ wiedzö — odpowiedzi 

755

30.  Projektowanie z uŜyciem klas ................................................................................... 757

Python a programowanie zorientowane obiektowo 

757

PrzeciñĔanie za pomocñ sygnatur wywoäaþ (lub bez nich) 

758

Programowanie zorientowane obiektowo i dziedziczenie — zwiñzek „jest” 

759

Programowanie zorientowane obiektowo i kompozycja — zwiñzki typu „ma” 

760

Raz jeszcze procesor strumienia danych 

762

Programowanie zorientowane obiektowo a delegacja — obiekty „opakowujñce” 

765

Pseudoprywatne atrybuty klas 

767

Przeglñd znieksztaäcania nazw zmiennych 

767

Po co uĔywa siö atrybutów pseudoprywatnych? 

768

Metody sñ obiektami — z wiñzaniem i bez wiñzania 

770

Metody niezwiñzane w 3.0 

772

Metody zwiñzane i inne obiekty wywoäywane 

773

Dziedziczenie wielokrotne — klasy mieszane 

775

Tworzenie klas mieszanych 

776

Klasy sñ obiektami — uniwersalne fabryki obiektów 

785

Do czego säuĔñ fabryki? 

787

background image

Spis treļci

_

21

Inne zagadnienia zwiñzane z projektowaniem 

788

Podsumowanie rozdziaäu 

788

SprawdĒ swojñ wiedzö — quiz 

789

SprawdĒ swojñ wiedzö — odpowiedzi 

789

31.  Zaawansowane zagadnienia zwiézane z klasami  .................................................. 791

Rozszerzanie typów wbudowanych 

791

Rozszerzanie typów za pomocñ osadzania 

792

Rozszerzanie typów za pomocñ klas podrzödnych 

793

Klasy w nowym stylu 

795

NowoĈci w klasach w nowym stylu 

796

Zmiany w modelu typów 

797

Zmiany w dziedziczeniu diamentowym 

801

NowoĈci w klasach w nowym stylu 

805

Sloty 

805

WäaĈciwoĈci klas 

809

PrzeciñĔanie nazw — __getattribute__ i deskryptory 

811

Metaklasy 

811

Metody statyczne oraz metody klasy 

811

Do czego potrzebujemy metod specjalnych? 

812

Metody statyczne w 2.6 i 3.0 

812

Alternatywy dla metod statycznych 

814

UĔywanie metod statycznych i metod klas 

815

Zliczanie instancji z uĔyciem metod statycznych 

817

Zliczanie instancji z metodami klas 

818

Dekoratory i metaklasy — czöĈè 1. 

820

Podstawowe informacje o dekoratorach funkcji 

820

Przykäad dekoratora 

821

Dekoratory klas i metaklasy 

822

Dalsza lektura 

823

Puäapki zwiñzane z klasami 

824

Modyfikacja atrybutów klas moĔe mieè efekty uboczne 

824

Modyfikowanie mutowalnych atrybutów klas równieĔ moĔe mieè

efekty uboczne 

825

Dziedziczenie wielokrotne — kolejnoĈè ma znaczenie 

826

Metody, klasy oraz zakresy zagnieĔdĔone 

827

Klasy wykorzystujñce delegacjö w 3.0 — __getattr__ i funkcje wbudowane 

829

Przesadne opakowywanie 

829

Podsumowanie rozdziaäu 

830

SprawdĒ swojñ wiedzö — quiz 

830

SprawdĒ swojñ wiedzö — odpowiedzi 

830

SprawdĒ swojñ wiedzö — èwiczenia do czöĈci szóstej 

831

background image

22

_

 Spis treļci

Czýļë VII Wyjétki oraz narzýdzia ................................................................. 839

32.  Podstawy wyjétków .................................................................................................. 841

Po co uĔywa siö wyjñtków? 

841

Role wyjñtków 

842

Wyjñtki w skrócie 

843

DomyĈlny program obsäugi wyjñtków 

843

Przechwytywanie wyjñtków 

844

Zgäaszanie wyjñtków 

845

Wyjñtki zdefiniowane przez uĔytkownika 

845

Dziaäania koþcowe 

846

Podsumowanie rozdziaäu 

847

SprawdĒ swojñ wiedzö — quiz 

849

SprawdĒ swojñ wiedzö — odpowiedzi 

849

33.  Szczegóĥowe informacje dotyczéce wyjétków  ........................................................ 851

Instrukcja try/except/else 

851

CzöĈci instrukcji try 

853

CzöĈè try/else 

855

Przykäad — zachowanie domyĈlne 

856

Przykäad — przechwytywanie wbudowanych wyjñtków 

857

Instrukcja try/finally 

857

Przykäad — dziaäania koþczñce kod z uĔyciem try/finally 

858

Poäñczona instrukcja try/except/finally 

859

Skäadnia poäñczonej instrukcji try 

860

ãñczenie finally oraz except za pomocñ zagnieĔdĔania 

861

Przykäad poäñczonego try 

862

Instrukcja raise 

863

Przekazywanie wyjñtków za pomocñ raise 

864

ãaþcuchy wyjñtków w Pythonie 3.0 — raise from 

865

Instrukcja assert 

865

Przykäad — wyäapywanie ograniczeþ (ale nie bäödów!) 

866

MenedĔery kontekstu with/as 

867

Podstawowe zastosowanie 

867

Protokóä zarzñdzania kontekstem 

868

Podsumowanie rozdziaäu 

870

SprawdĒ swojñ wiedzö — quiz 

871

SprawdĒ swojñ wiedzö — odpowiedzi 

871

34.  Obiekty wyjétków  .....................................................................................................873

Wyjñtki — powrót do przyszäoĈci 

874

Wyjñtki oparte na äaþcuchach znaków znikajñ 

874

Wyjñtki oparte na klasach 

875

Tworzenie klas wyjñtków 

875

background image

Spis treļci

_

23

Do czego säuĔñ hierarchie wyjñtków? 

877

Wbudowane klasy wyjñtków 

880

Kategorie wbudowanych wyjñtków 

881

DomyĈlne wyĈwietlanie oraz stan 

882

Wäasne sposoby wyĈwietlania 

883

Wäasne dane oraz zachowania 

884

Udostöpnianie szczegóäów wyjñtku 

884

Udostöpnianie metod wyjñtków 

885

Podsumowanie rozdziaäu 

886

SprawdĒ swojñ wiedzö — quiz 

886

SprawdĒ swojñ wiedzö — odpowiedzi 

886

35.  Projektowanie z wykorzystaniem wyjétków ...........................................................889

ZagnieĔdĔanie programów obsäugi wyjñtków 

889

Przykäad — zagnieĔdĔanie przebiegu sterowania 

891

Przykäad — zagnieĔdĔanie skäadniowe 

891

Zastosowanie wyjñtków 

893

Wyjñtki nie zawsze sñ bäödami 

893

Funkcje mogñ sygnalizowaè warunki za pomocñ raise 

893

Zamykanie plików oraz poäñczeþ z serwerem 

894

Debugowanie z wykorzystaniem zewnötrznych instrukcji try 

895

Testowanie kodu wewnñtrz tego samego procesu 

895

Wiöcej informacji na temat funkcji sys.exc_info 

896

Wskazówki i puäapki dotyczñce projektowania wyjñtków 

897

Co powinniĈmy opakowaè w try 

897

Jak nie przechwytywaè zbyt wiele — unikanie pustych except i wyjñtków 

898

Jak nie przechwytywaè zbyt maäo — korzystanie z kategorii

opartych na klasach 

900

Podsumowanie jñdra jözyka Python 

901

Zbiór narzödzi Pythona 

901

Narzödzia programistyczne przeznaczone do wiökszych projektów 

902

Podsumowanie rozdziaäu 

906

SprawdĒ swojñ wiedzö — quiz 

906

SprawdĒ swojñ wiedzö — odpowiedzi 

906

SprawdĒ swojñ wiedzö — èwiczenia do czöĈci siódmej 

907

Czýļë VIII Zagadnienia zaawansowane  ...................................................... 909

36.  Ĥaħcuchy znaków Unicode oraz ĥaħcuchy bajtowe  ..................................................911

Zmiany w äaþcuchach znaków w Pythonie 3.0 

912

Podstawy äaþcuchów znaków 

913

Kodowanie znaków 

913

Typy äaþcuchów znaków Pythona 

915

Pliki binarne i tekstowe 

916

background image

24

_

 Spis treļci

ãaþcuchy znaków Pythona 3.0 w akcji 

918

Literaäy i podstawowe wäaĈciwoĈci 

918

Konwersje 

919

Kod äaþcuchów znaków Unicode 

920

Kod tekstu z zakresu ASCII 

921

Kod tekstu spoza zakresu ASCII 

921

Kodowanie i dekodowanie tekstu spoza zakresu ASCII 

922

Inne techniki kodowania äaþcuchów Unicode 

923

Konwersja kodowania 

925

ãaþcuchy znaków Unicode w Pythonie 2.6 

925

Deklaracje typu kodowania znaków pliku Ēródäowego 

928

Wykorzystywanie obiektów bytes z Pythona 3.0 

929

Wywoäania metod 

929

Operacje na sekwencjach 

930

Inne sposoby tworzenia obiektów bytes 

931

Mieszanie typów äaþcuchów znaków 

931

Wykorzystywanie obiektów bytearray z Pythona 3.0 (i 2.6) 

932

Wykorzystywanie plików tekstowych i binarnych 

935

Podstawy plików tekstowych 

935

Tryby tekstowy i binarny w Pythonie 3.0 

936

Brak dopasowania typu i zawartoĈci 

938

Wykorzystywanie plików Unicode 

939

Odczyt i zapis Unicode w Pythonie 3.0 

939

Obsäuga BOM w Pythonie 3.0 

941

Pliki Unicode w Pythonie 2.6 

943

Inne zmiany narzödzi äaþcuchów znaków w Pythonie 3.0 

944

Moduä dopasowywania wzorców re 

944

Moduä danych binarnych struct 

945

Moduä serializacji obiektów pickle 

947

Narzödzia do analizy skäadniowej XML 

948

Podsumowanie rozdziaäu 

951

SprawdĒ swojñ wiedzö — quiz 

952

SprawdĒ swojñ wiedzö — odpowiedzi 

952

37.  Zarzédzane atrybuty  .................................................................................................955

Po co zarzñdza siö atrybutami? 

955

Wstawianie kodu wykonywanego w momencie dostöpu do atrybutów 

956

WäaĈciwoĈci 

957

Podstawy 

957

Pierwszy przykäad 

958

Obliczanie atrybutów 

959

Zapisywanie wäaĈciwoĈci w kodzie za pomocñ dekoratorów 

960

Deskryptory 

961

Podstawy 

962

Pierwszy przykäad 

964

Obliczone atrybuty 

966

background image

Spis treļci

_

25

Wykorzystywanie informacji o stanie w deskryptorach 

967

Powiñzania pomiödzy wäaĈciwoĈciami a deskryptorami 

968

Metody __getattr__ oraz __getattribute__ 

970

Podstawy 

971

Pierwszy przykäad 

973

Obliczanie atrybutów 

974

Porównanie metod __getattr__ oraz __getattribute__ 

975

Porównanie technik zarzñdzania atrybutami 

976

Przechwytywanie atrybutów wbudowanych operacji 

979

Powrót do menedĔerów opartych na delegacji 

983

Przykäad — sprawdzanie poprawnoĈci atrybutów 

986

Wykorzystywanie wäaĈciwoĈci do sprawdzania poprawnoĈci 

986

Wykorzystywanie deskryptorów do sprawdzania poprawnoĈci 

988

Wykorzystywanie metody __getattr__ do sprawdzania poprawnoĈci 

990

Wykorzystywanie metody __getattribute__ do sprawdzania poprawnoĈci 

991

Podsumowanie rozdziaäu 

992

SprawdĒ swojñ wiedzö — quiz 

992

SprawdĒ swojñ wiedzö — odpowiedzi 

993

38.  Dekoratory  .................................................................................................................995

Czym jest dekorator? 

995

Zarzñdzanie wywoäaniami oraz instancjami 

996

Zarzñdzanie funkcjami oraz klasami 

996

Wykorzystywanie i definiowanie dekoratorów 

997

Do czego säuĔñ dekoratory? 

997

Podstawy 

998

Dekoratory funkcji 

998

Dekoratory klas 

1002

ZagnieĔdĔanie dekoratorów 

1004

Argumenty dekoratorów 

1006

Dekoratory zarzñdzajñ takĔe funkcjami oraz klasami 

1006

Kod dekoratorów funkcji 

1007

ćledzenie wywoäaþ 

1007

MoĔliwoĈci w zakresie zachowania informacji o stanie 

1009

Uwagi na temat klas I — dekorowanie metod klas 

1012

Mierzenie czasu wywoäania 

1017

Dodawanie argumentów dekoratora 

1019

Kod dekoratorów klas 

1021

Klasy singletona 

1021

ćledzenie interfejsów obiektów 

1023

Uwagi na temat klas II — zachowanie wiökszej liczby instancji 

1027

Dekoratory a funkcje zarzñdzajñce 

1028

Do czego säuĔñ dekoratory? (raz jeszcze) 

1029

BezpoĈrednie zarzñdzanie funkcjami oraz klasami 

1031

Przykäad — atrybuty „prywatne” i „publiczne” 

1033

Implementacja atrybutów prywatnych 

1033

background image

26

_

 Spis treļci

Szczegóäy implementacji I 

1035

Uogólnienie kodu pod kñtem deklaracji atrybutów jako publicznych 

1036

Szczegóäy implementacji II 

1038

Znane problemy 

1039

W Pythonie nie chodzi o kontrolö 

1043

Przykäad: Sprawdzanie poprawnoĈci argumentów funkcji 

1044

Cel 

1044

Prosty dekorator sprawdzajñcy przedziaäy dla argumentów pozycyjnych 

1045

Uogólnienie kodu pod kñtem säów kluczowych i wartoĈci domyĈlnych 

1047

Szczegóäy implementacji 

1050

Znane problemy 

1052

Argumenty dekoratora a adnotacje funkcji 

1053

Inne zastosowania — sprawdzanie typów (skoro nalegamy!) 

1054

Podsumowanie rozdziaäu 

1055

SprawdĒ swojñ wiedzö — quiz 

1056

SprawdĒ swojñ wiedzö — odpowiedzi 

1056

39.  Metaklasy ..................................................................................................................1061

Tworzyè metaklasy czy tego nie robiè? 

1061

Zwiökszajñce siö poziomy magii 

1062

Wady funkcji pomocniczych 

1064

Metaklasy a dekoratory klas — runda 1. 

1066

Model metaklasy 

1068

Klasy sñ instancjami obiektu type 

1068

Metaklasy sñ klasami podrzödnymi klasy type 

1070

Protokóä instrukcji class 

1071

Deklarowanie metaklas 

1071

Tworzenie metaklas 

1073

Prosta metaklasa 

1073

Dostosowywanie tworzenia do wäasnych potrzeb oraz inicjalizacja 

1074

Pozostaäe sposoby tworzenia metaklas 

1074

Instancje a dziedziczenie 

1077

Przykäad — dodawanie metod do klas 

1078

Röczne rozszerzanie 

1078

Rozszerzanie oparte na metaklasie 

1080

Metaklasy a dekoratory klas — runda 2. 

1081

Przykäad — zastosowanie dekoratorów do metod 

1084

Röczne Ĉledzenie za pomocñ dekoracji 

1084

ćledzenie metaklas oraz dekoratorów 

1085

Zastosowanie dowolnego dekoratora do metod 

1086

Metaklasy a dekoratory klas — runda 3. 

1088

Podsumowanie rozdziaäu 

1091

SprawdĒ swojñ wiedzö — quiz 

1092

SprawdĒ swojñ wiedzö — odpowiedzi 

1092

background image

Spis treļci

_

27

Dodatki .........................................................................................................1093

Dodatek A Instalacja i konfiguracja ................................................................................... 1095

Instalowanie interpretera Pythona 

1095

Czy Python jest juĔ zainstalowany? 

1095

Skñd pobraè Pythona 

1096

Instalacja Pythona 

1097

Konfiguracja Pythona 

1098

Zmienne Ĉrodowiskowe Pythona 

1098

Jak ustawiè opcje konfiguracyjne? 

1100

Opcje wiersza poleceþ Pythona 

1103

Uzyskanie pomocy 

1104

Dodatek B Rozwiézania ëwiczeħ podsumowujécych poszczególne czýļci ksiéŜki  .........1105

CzöĈè I Wprowadzenie 

1105

CzöĈè II Typy i operacje 

1107

CzöĈè III Instrukcja i skäadnia 

1112

CzöĈè IV Funkcje 

1114

CzöĈè V Moduäy 

1121

CzöĈè VI Klasy i programowanie zorientowane obiektowo 

1125

CzöĈè VII Wyjñtki oraz narzödzia 

1132

Skorowidz ............................................................................................................................1139

background image

119

ROZDZIAĤ 4.

Wprowadzenie

do typów obiektów Pythona

Niniejszy rozdziaä rozpoczyna naszñ wycieczkö po jözyku Python. W pewnym sensie w Pytho-
nie „robi siö coĈ z róĔnymi rzeczami”. To „coĈ” ma postaè operacji (dziaäaþ), takich jak doda-
wanie czy konkatenacja, natomiast „róĔne rzeczy” to obiekty, na których wykonuje siö owe
operacje. W tej czöĈci ksiñĔki skupimy siö wäaĈnie na owych „róĔnych rzeczach”, jak równieĔ
na tym, co mogñ z nimi robiè nasze programy.

Mówiñc  bardziej  formalnym  jözykiem,  w  Pythonie  dane  przybierajñ  postaè  obiektów  —  albo
wbudowanych obiektów udostöpnianych przez Pythona, albo obiektów tworzonych za pomocñ
Pythona  lub  innych  narzödzi  zewnötrznych,  takich  jak  biblioteki  rozszerzeþ  jözyka  C.  Choè
definicjö tö nieco póĒniej rozbudujemy, obiekty sñ generalnie fragmentami pamiöci z warto-
Ĉciami i zbiorami powiñzanych operacji.

PoniewaĔ obiekty sñ najbardziej podstawowym elementem Pythona, ten rozdziaä rozpoczniemy
od przeglñdu obiektów wbudowanych w sam jözyk.

Tytuäem wstöpu warto jednak najpierw ustaliè, jak niniejszy rozdziaä wpisuje siö w caäoĈè
Pythona. Programy napisane w Pythonie moĔna rozbiè na moduäy, instrukcje, wyraĔenia
i obiekty — w nastöpujñcy sposób:

 

1. 

Programy skäadajñ siö z moduäów.

 

2. 

Moduäy zawierajñ instrukcje.

 

3. 

Instrukcje zawierajñ wyraĔenia.

 

4. 

WyraĔenia tworzñ i przetwarzajñ obiekty.

Omówienie moduäów zamieszczone w rozdziale 3. uwzglödnia najwyĔszy poziom w tej hie-
rarchii. Rozdziaäy tej czöĈci ksiñĔki odwoäujñ siö do najniĔszego jej poziomu, czyli wbudowanych
obiektów oraz wyraĔeþ, które tworzy siö w celu korzystania z tych obiektów.

background image

120

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

Po co korzysta siý z typów wbudowanych?

Osoby uĔywajñce jözyków niĔszego poziomu, takich jak C czy C++, wiedzñ, Ĕe wiökszoĈè ich
pracy polega na implementowaniu obiektów — znanych równieĔ jako struktury danych — tak
by  reprezentowaäy  one  komponenty  w  dziedzinie  naszej  aplikacji.  Konieczne  jest  rozplano-
wanie struktur pamiöci, zarzñdzanie przydzielaniem pamiöci czy zaimplementowanie procedur
wyszukiwania i dostöpu. Te zadania sñ tak Ĕmudne (i podatne na bäödy), na jakie wyglñdajñ,
i zazwyczaj odciñgajñ programistö od prawdziwych celów programu.

W typowych programach napisanych w Pythonie wiökszoĈè tej przyziemnej pracy nie jest
konieczna. PoniewaĔ Python udostöpnia typy obiektów jako nieodäñcznñ czöĈè samego jözyka,
zazwyczaj  nie  istnieje  koniecznoĈè  kodowania  implementacji  obiektów  przed  rozpoczöciem
rozwiñzywania prawdziwych problemów. Tak naprawdö, o ile oczywiĈcie nie mamy potrzeby
korzystania ze specjalnych metod przetwarzania, które nie sñ dostöpne w obiektach wbudo-
wanych, prawie zawsze lepiej bödzie skorzystaè z gotowego typu obiektu, zamiast tworzyè
wäasny. PoniĔej znajduje siö kilka przyczyn takiego stanu rzeczy.

Obiekty wbudowane sprawiajñ, Ĕe programy äatwo siö pisze. W przypadku prostych zadaþ
obiekty wbudowane czösto wystarczñ nam do stworzenia struktur wäaĈciwych dla okre-
Ĉlonych problemów. Od röki dostöpne sñ narzödzia o sporych moĔliwoĈciach, jak zbiory
(listy) i tabele, które moĔna przeszukiwaè (säowniki). Wiele zadaþ moĔna wykonaè, korzy-
stajñc z samych obiektów wbudowanych.

Obiekty  wbudowane  sñ  komponentami  rozszerzeþ.  W  przypadku  bardziej  zaawanso-
wanych zadaþ byè moĔe nadal konieczne bödzie udostöpnianie wäasnych obiektów, wyko-
rzystywanie klas Pythona czy interfejsów jözyka C. Jednak jak okaĔe siö w dalszej czöĈci
ksiñĔki,  obiekty  implementowane  röcznie  sñ  czösto  zbudowane  na  bazie  typów  wbudo-
wanych, takich jak listy czy säowniki. Strukturö danych stosu moĔna na przykäad zaim-
plementowaè jako klasö zarzñdzajñcñ wbudowanñ listñ lub dostosowujñcñ tö listö do
wäasnych potrzeb.

Obiekty  wbudowane  czösto  sñ  bardziej  wydajne  od  wäasnych  struktur  danych.  Wbu-
dowane obiekty Pythona wykorzystujñ juĔ zoptymalizowane algorytmy struktur danych,
które zostaäy zaimplementowane w jözyku C w celu zwiökszenia szybkoĈci ich dziaäania.
Choè moĔemy samodzielnie napisaè podobne typy obiektów, zazwyczaj trudno nam bödzie
osiñgnñè ten sam poziom wydajnoĈci, jaki udostöpniajñ obiekty wbudowane.

Obiekty wbudowane sñ standardowñ czöĈciñ jözyka. W pewien sposób Python zapoĔycza
zarówno od jözyków opierajñcych siö na obiektach wbudowanych (jak na przykäad LISP),
jak i jözyków, w których to programista udostöpnia implementacje narzödzi czy wäasnych
platform  (jak  C++).  Choè  moĔna  w  Pythonie  implementowaè  wäasne,  unikalne  typy
obiektów, nie trzeba tego robiè, by zaczñè programowaè w tym jözyku. Co wiöcej, ponie-
waĔ obiekty wbudowane sñ standardem, zawsze pozostanñ one takie same. Rozwiñzania
wäasnoĈciowe zazwyczaj majñ tendencjö do zmian ze strony na stronö.

Innymi säowy, obiekty wbudowane nie tylko uäatwiajñ programowanie, ale majñ takĔe wiöksze
moĔliwoĈci i sñ bardziej wydajne od wiökszoĈci tego, co tworzy siö od podstaw. Bez wzglödu
na  to,  czy  zdecydujemy  siö  implementowaè  nowe  typy  obiektów,  obiekty  wbudowane  sta-
nowiñ podstawö kaĔdego programu napisanego w Pythonie.

background image

Po co korzysta siý z typów wbudowanych?

_

121

NajwaŜniejsze typy danych w Pythonie

W tabeli 4.1 zaprezentowano przeglñd wbudowanych obiektów Pythona wraz ze skäadniñ
wykorzystywanñ do kodowania ich literaäów — czyli wyraĔeþ generujñcych te obiekty.

1

 Nie-

które  z  typów  powinny  dla  osób  znajñcych  inne  jözyki  programowania  wyglñdaè  znajomo.
Liczby i äaþcuchy znaków reprezentujñ, odpowiednio, wartoĈci liczbowe i tekstowe. Pliki
udostöpniajñ natomiast interfejsy säuĔñce do przetwarzania plików przechowywanych na
komputerze.

Tabela 4.1. Przeglñd obiektów wbudowanych Pythona

Typ obiektu

Przykĥadowy literaĥ (tworzenie)

Liczby

1234

3.1415

3+4j

Decimal

Fraction

Ĥaħcuchy znaków

'mielonka'

"Brian"

b'a\x01c'

Listy

[1, [2, 'trzy'], 4]

Sĥowniki

{'jedzenie': 'mielonka', 'smak': 'mniam'}

Krotki

(1,'mielonka', 4, 'U')

Pliki

myfile = open('jajka', 'r')

Zbiory

set('abc')

{'a', 'b', 'c'}

Inne typy podstawowe

Wartoļci 

Boolean

, typy, 

None

Typy jednostek programu

Funkcje, moduĥy, klasy (czýļë IV, V i VI ksiéŜki)

Typy powiézane z implementacjé

Kod skompilowany, ļlady stosu (czýļë IV i VII ksiéŜki)

Tabela 4.1 nie jest kompletna, poniewaĔ wszystko, co przetwarzamy w programie napisanym
w Pythonie, jest tak naprawdö rodzajem obiektu. Kiedy na przykäad wykonujemy w Pytho-
nie dopasowanie tekstu do wzorca, tworzymy obiekty wzorców, natomiast kiedy tworzymy
skrypty sieciowe, wykorzystujemy obiekty gniazd. Te pozostaäe typy obiektów tworzy siö
przede wszystkim za pomocñ importowania i wykorzystywania moduäów; kaĔdy z nich wiñĔe
siö z pewnym typem zachowania.

Jak zobaczymy w dalszych czöĈciach ksiñĔki, jednostki programów, takie jak funkcje, moduäy
i klasy, takĔe sñ w Pythonie obiektami — sñ one tworzone za pomocñ instrukcji oraz wyraĔeþ,
takich jak 

def

class

import

 czy 

lambda

, i moĔna je swobodnie przekazywaè w skryptach

bñdĒ  przechowywaè  w  innych  obiektach.  Python  udostöpnia  równieĔ  zbiór  typów  powiñza-
nych  z  implementacjñ
,  takich  jak  obiekty  skompilowanego  kodu,  które  sñ  zazwyczaj  bardziej
przedmiotem zainteresowania osób tworzñcych narzödzia niĔ twórców aplikacji. Zostanñ one
omówione w póĒniejszych czöĈciach ksiñĔki.

Pozostaäe typy obiektów z tabeli 4.1 nazywane sñ zazwyczaj typami podstawowymi, poniewaĔ
sñ one tak naprawdö wbudowane w sam jözyk. Oznacza to, Ĕe istnieje okreĈlona skäadnia wyra-
Ĕeþ säuĔñca do generowania wiökszoĈci z nich. Na przykäad kiedy wykonamy poniĔszy kod:

>>> 'mielonka'

                                                       

1

W niniejszej ksiñĔce pojöcie literaä oznacza po prostu wyraĔenie, którego skäadnia generuje obiekt — czasami
nazywane równieĔ staäñ. Warto zauwaĔyè, Ĕe „staäa” nie oznacza wcale obiektów czy zmiennych, które nigdy
nie mogñ byè zmienione (czyli pojöcie to nie ma zwiñzku z 

const

 z jözyka C++ czy okreĈleniem „niezmienny”

[ang. immutable] z Pythona — zagadnienie to omówione zostanie w dalszej czöĈci rozdziaäu).

background image

122

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

z technicznego punktu widzenia wykonujemy wäaĈnie wyraĔenie z literaäem, które generuje
i zwraca nowy obiekt äaþcucha znaków. Istnieje specyficzna skäadnia Pythona, która tworzy ten
obiekt. Podobnie wyraĔenie umieszczone w nawiasach kwadratowych tworzy listö, a w nawia-
sach klamrowych — säownik. Choè — jak siö niedäugo okaĔe — w Pythonie nie istnieje dekla-
rowanie typu, skäadnia wykonywanego wyraĔenia okreĈla  typy tworzonych i wykorzystywa-
nych obiektów. WyraĔenia generujñce obiekty, jak te z tabeli 4.1, to wäaĈnie miejsca, z których
pochodzñ typy obiektów.

Co równie waĔne: kiedy tworzymy jakiĈ obiekt, wiñĔemy go z okreĈlonym zbiorem operacji.
Na äaþcuchach znaków moĔna wykonywaè tylko operacje dostöpne dla äaþcuchów znaków,
natomiast na listach — tylko te dla list. Jak siö za chwilö okaĔe, Python jest jözykiem z typami
dynamicznymi
 (to znaczy automatycznie przechowuje za nas informacje o typach, zamiast wyma-
gaè kodu z deklaracjñ), jednak jego typy sñ silne (to znaczy na obiekcie moĔna wykonaè tylko
te operacje, które sñ poprawne dla okreĈlonego typu).

Z funkcjonalnego punktu widzenia typy obiektów z tabeli 4.1 sñ bardziej ogólne i majñ wiök-
sze moĔliwoĈci, niĔ bywa to w innych jözykach. Jak siö okaĔe, juĔ same listy i säowniki majñ
wystarczajñco duĔe moĔliwoĈci, by zlikwidowaè wiökszoĈè pracy zwiñzanej z  obsäugñ zbio-
rów i wyszukiwania w jözykach niĔszego poziomu. Listy udostöpniajñ uporzñdkowane zbio-
ry innych obiektów, natomiast säowniki przechowujñ obiekty i ich klucze. Oba typy danych
mogñ byè zagnieĔdĔane, mogñ rosnñè i kurczyè siö na Ĕyczenie oraz mogñ zawieraè obiekty
dowolnego typu.

W kolejnych rozdziaäach szczegóäowo omówimy poszczególne typy obiektów zaprezentowane
w  tabeli  4.1.  Zanim  jednak  zagäöbimy  siö  w  szczegóäy,  najpierw  przyjrzyjmy  siö  podstawo-
wym  obiektom  Pythona  w  dziaäaniu.  Pozostaäa  czöĈè  rozdziaäu  zawiera  przeglñd  operacji,
które bardziej dokäadnie omówimy w kolejnych rozdziaäach. Nie naleĔy oczekiwaè, Ĕe zosta-
nie  tutaj  zaprezentowane  wszystko  —  celem  niniejszego  rozdziaäu  jest  tylko  zaostrzenie  ape-
tytu i wprowadzenie pewnych kluczowych koncepcji. Najlepszym sposobem na rozpoczöcie
czegoĈ jest… samo rozpoczöcie, zatem czas zabraè siö za prawdziwy kod.

Liczby

Dla osób, które zajmowaäy siö juĔ programowaniem czy tworzeniem skryptów, niektóre typy
danych z tabeli 4.1 bödñ wyglñdaäy znajomo. Nawet dla osób niemajñcych nic wspólnego z pro-
gramowaniem liczby wyglñdajñ doĈè prosto. Zbiór podstawowych obiektów Pythona obejmuje
typowe rodzaje liczb: caäkowite (liczby bez czöĈci uäamkowej), zmiennoprzecinkowe  (w przy-
bliĔeniu liczby z przecinkiem), a takĔe bardziej egzotyczne typy liczbowe (liczby zespolone
z liczbami urojonymi, liczby staäoprzecinkowe, liczby wymierne z mianownikiem i licznikiem,
a takĔe peäne zbiory).

Choè oferujñ kilka bardziej zaawansowanych opcji, podstawowe typy liczbowe Pythona sñ…
wäaĈnie podstawowe. Liczby w Pythonie obsäugujñ normalne dziaäania matematyczne. Znak 

+

wykonuje dodawanie, znak 

*

 mnoĔenie, natomiast 

**

 potögowanie.

>>> 123 + 222                                # Dodawanie liczb caäkowitych
345
>>> 1.5 * 4                                  # MnoĔenie liczb zmiennoprzecinkowych
6.0
>>> 2 ** 100                                 # 2 do potögi 100
1267650600228229401496703205376

background image

Liczby

_

123

Warto  zwróciè  uwagö na  wynik  ostatniego dziaäania. Typ liczby caäkowitej  Pythona  3.0  auto-
matycznie udostöpnia dodatkowñ precyzjö dla tak duĔych liczb, kiedy jest to potrzebne (w Pytho-
nie 2.6 osobny typ däugiej liczby caäkowitej w podobny sposób obsäugiwaä liczby zbyt duĔe
dla zwykäego typu liczby caäkowitej). MoĔna na przykäad w Pythonie obliczyè 2 do potögi
1000000 jako liczbö caäkowitñ (choè pewnie lepiej byäoby nie wyĈwietlaè wyniku tego dziaäa-
nia — z ponad trzystoma tysiñcami cyfr bödziemy musieli trochö poczekaè!).

>>> len(str(2 ** 1000000))                  # Ile cyfr bödzie w naprawdö DUēEJ liczbie?
301030

Kiedy zaczniemy eksperymentowaè z liczbami zmiennoprzecinkowymi, z pewnoĈciñ natkniemy
siö na coĈ, co na pierwszy rzut oka moĔe wyglñdaè nieco dziwnie:

>>> 3.1415 * 2                              # repr: jako kod
6.2830000000000004
>>> print(3.1415 * 2)                       # str: w postaci przyjaznej dla uĔytkownika
6.283

Pierwszy wynik nie jest bäödem — to kwestia sposobu wyĈwietlania. Okazuje siö, Ĕe kaĔdy
obiekt moĔna wyĈwietliè na dwa sposoby — z peänñ precyzjñ (jak w pierwszym wyniku powy-
Ĕej) oraz w formie przyjaznej dla uĔytkownika (jak w drugim wyniku). Pierwsza postaè znana
jest jako 

repr

 obiektu (jak w kodzie), natomiast druga jest przyjaznñ dla uĔytkownika 

str

. RóĔ-

nica ta zacznie mieè znaczenie, kiedy przejdziemy do uĔywania klas. Na razie, kiedy coĈ bödzie
dziwnie wyglñdaäo, naleĔy wyĈwietliè to za pomocñ wywoäania wbudowanej instrukcji 

print

.

Poza wyraĔeniami w Pythonie znajduje siö kilka przydatnych moduäów liczbowych. Moduäy
sñ po prostu pakietami dodatkowych narzödzi, które musimy zaimportowaè, by móc z nich
skorzystaè.

>>> import math
>>> math.pi
3.1415926535897931
>>> math.sqrt(85)
9.2195444572928871

Moduä 

math

 zawiera bardziej zaawansowane narzödzia liczbowe w postaci funkcji, natomiast

moduä 

random

 wykonuje generowanie liczb losowych, a takĔe losowe wybieranie (tutaj z listy

Pythona omówionej w dalszej czöĈci rozdziaäu):

>>> import random
>>> random.random()
0.59268735266273953
>>> random.choice([1, 2, 3, 4])
1

Python zawiera równieĔ bardziej egzotyczne obiekty liczb, takie jak liczby zespolone, liczby
staäoprzecinkowe, liczby wymierne, a takĔe zbiory i wartoĈci Boolean (logiczne). MoĔna rów-
nieĔ znaleĒè róĔne dodatkowe rozszerzenia na licencji open source (na przykäad dla matryc
czy wektorów). Szczegóäowe omówienie tych typów zostawimy sobie na póĒniej.

Jak na razie omawialiĈmy Pythona w funkcji prostego kalkulatora. ēeby jednak oddaè sprawie-
dliwoĈè jego typom wbudowanym, warto przejĈè do omówienia äaþcuchów znaków.

background image

124

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

Ĥaħcuchy znaków

ãaþcuchy  znaków  (ang.  strings)  wykorzystywane  sñ  do  przechowywania  informacji  teksto-
wych, a takĔe dowolnych zbiorów bajtów. Sñ pierwszym przykäadem tego, co w Pythonie
znane jest pod nazwñ sekwencji — czyli uporzñdkowanych zbiorów innych obiektów. Sekwen-
cje zachowujñ porzñdek zawieranych elementów od lewej do prawej strony. Elementy te sñ
przechowywane i pobierane zgodnie z ich pozycjñ wzglödnñ. Mówiñc dokäadnie, äaþcuchy zna-
ków to sekwencje äaþcuchów skäadajñcych siö z pojedynczych znaków. Pozostaäe typy sekwencji
to omówione póĒniej listy oraz krotki.

Operacje na sekwencjach

Jako sekwencje äaþcuchy znaków obsäugujñ operacje zakäadajñce pozycyjne uporzñdkowanie
elementów. JeĈli na przykäad mamy äaþcuch czteroznakowy, moĔemy zweryfikowaè jego däu-
goĈè za pomocñ wbudowanej funkcji 

len

 i pobraè jego elementy za pomocñ wyraĔeþ indek-

sujñcych:

>>> S = 'Mielonka'
>>> len(S)                                 # DäugoĈè
8
>>> S[0]                                   # Pierwszy element w S, indeksowanie rozpoczyna siö od zera
'M'
>>> S[1]                                   # Drugi element od lewej
'i'

W Pythonie indeksy zakodowane sñ jako wartoĈè przesuniöcia od poczñtku äaþcucha, dlatego
rozpoczynajñ siö od zera. Pierwszy element znajduje siö pod indeksem 0, kolejny pod indek-
sem 1 i tak dalej.

Warto tutaj zwróciè uwagö na przypisanie äaþcucha znaków do zmiennej o nazwie 

S

. Szcze-

góäowe omówienie tego, jak to dziaäa, odäoĔymy na póĒniej (zwäaszcza do rozdziaäu 6.), nato-
miast warto wiedzieè, Ĕe zmiennych Pythona nigdy nie trzeba deklarowaè z wyprzedzeniem.
Zmienna tworzona jest, kiedy przypisujemy do niej wartoĈè; moĔna do niej przypisaè dowolny
typ obiektu i zostanie zastñpiona swojñ wartoĈciñ, kiedy pojawi siö w wyraĔeniu. Przed uĔy-
ciem  jej  wartoĈci  musi  najpierw  zostaè  przypisana.  Na  cele  niniejszego  rozdziaäu  wystarczy
nam wiedza, Ĕe by móc zapisaè obiekt w celu póĒniejszego uĔycia, musimy przypisaè ten
obiekt do zmiennej.

W Pythonie moĔna równieĔ indeksowaè od koþca — indeksy dodatnie odliczane sñ od lewej
strony do prawej, natomiast ujemne od prawej do lewej:

>>> S[-1]                                  # Pierwszy element od koþca S
'a'
>>> S[-2]                                  # Drugi element od koþca S
'k'

Z formalnego punktu widzenia indeks ujemny jest po prostu dodawany do rozmiaru äaþcu-
cha znaków, dziöki czemu dwie poniĔsze operacje sñ równowaĔne (choè pierwszñ äatwiej jest
zapisaè, a trudniej siö w niej pomyliè):

>>> S[-1]                                  # Ostatni element w S
'a'
>>> S[len(S)-1]                            # Indeks ujemny zapisany w trudniejszy sposób
'a'

background image

Ĥaħcuchy znaków

_

125

Warto zauwaĔyè, Ĕe w nawiasach kwadratowych moĔemy wykorzystaè dowolne wyraĔenie,
a nie tylko zakodowany na staäe literaä liczbowy. W kaĔdym miejscu, w którym Python ocze-
kuje wartoĈci, moĔna uĔyè literaäu, zmiennej lub dowolnego wyraĔenia. Skäadnia Pythona jest
w tym zakresie bardzo ogólna.

Poza prostym indeksowaniem zgodnie z pozycjñ sekwencje obsäugujñ równieĔ bardziej ogólnñ
formö indeksowania znanñ jako wycinki (ang. slice). Polega ona na ekstrakcji caäej czöĈci (wycinka)
za jednym razem, jak na przykäad:

>>> S                                        # ãaþcuch z oĈmioma znakami
'Mielonka'
>>> S[1:3]                                   # Wycinek z S z indeksami od 1 do 2 (bez 3)
'ie'

Wycinki najäatwiej jest sobie wyobraziè jako sposób pozwalajñcy na ekstrakcjö caäej kolumny
z äaþcucha znaków za jednym razem. Ich ogólna forma, 

X[I:J]

, oznacza: „Zwróè wszystko z 

X

 od

przesuniöcia 

I

 aĔ do przesuniöcia 

J

, ale bez niego”. Wynik zwracany jest w nowym obiekcie.

Druga operacja z listingu wyĔej zwraca na przykäad wszystkie znaki w äaþcuchu znaków 

S

 od

przesuniöcia 1 do przesuniöcia 2 (czyli 3–1) jako nowy äaþcuch znaków. Wynikiem jest wycinek
skäadajñcy siö z dwóch znaków znajdujñcych siö w Ĉrodku äaþcucha 

S

.

W wycinku lewñ granicñ jest domyĈlnie zero, natomiast prawñ — däugoĈè sekwencji, z której
coĈ wycinamy. Dziöki temu moĔna spotkaè róĔne warianty uĔycia wycinków:

>>> S[1:]                                    # Wszystko poza pierwszym znakiem (1:len(S))
'ielonka'
>>> S                                        # ãaþcuch S siö nie zmieniä
'Mielonka'
>>> S[0:7]                                   # Wszystkie elementy bez ostatniego
'Mielonk'
>>> S[:7]                                    # To samo co S[0:7]
'Mielonk'
>>> S[:-1]                                   # Wszystkie elementy bez ostatniego w äatwiejszej postaci
'Mielonk'
>>> S[:]                                     # CaäoĈè S jako kopia najwyĔszego poziomu (0:len(S))
'Mielonka'

Warto zwróciè uwagö na to, Ĕe do ustalenia granic wycinków mogñ równieĔ zostaè wykorzy-
stane ujemne wartoĈci przesuniöcia. Widaè równieĔ, Ĕe ostatnia operacja w rezultacie kopiuje
caäy äaþcuch znaków. Jak siö okaĔe póĒniej, kopiowanie äaþcucha znaków nie ma sensu, jednak
to polecenie moĔe siö przydaè w przypadku sekwencji takich, jak listy.

Wreszcie tak samo jak pozostaäe sekwencje, äaþcuchy znaków obsäugujñ równieĔ konkatenacjö
(ang. concatenation) z uĔyciem znaku 

+

 (äñczñcñ dwa äaþcuchy znaków w jeden), a takĔe powtó-

rzenie (ang. repetition), czyli zbudowanie nowego äaþcucha znaków poprzez powtórzenie innego:

>>> S
'Mielonka'
>>> S + 'xyz'                                # Konkatenacja
'Mielonkaxyz'
>>> S                                        # S pozostaje bez zmian
'Mielonka'
>>> S * 8                                    # Powtórzenie
'MielonkaMielonkaMielonkaMielonkaMielonkaMielonkaMielonkaMielonka'

Warto  zwróciè  uwagö  na  to,  Ĕe  znak  plusa  (

+

)  oznacza  coĈ  innego  w  przypadku  róĔnych

obiektów — dodawanie dla liczb, a konkatenacjö dla äaþcuchów znaków. Jest to wäaĈciwoĈè
Pythona, którñ w dalszej czöĈci ksiñĔki bödziemy nazywali polimorfizmem. Oznacza to, Ĕe kaĔda

background image

126

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

operacja  uzaleĔniona jest  od  typu  obiektów,  na  jakich  siö  jñ  wykonuje.  Jak  siö  okaĔe  przy
okazji omawiania typów dynamicznych, polimorfizm odpowiada za zwiözäoĈè i elastycznoĈè
kodu napisanego w Pythonie. PoniewaĔ typy nie sñ ograniczone, operacja napisana w Pythonie
moĔe  zazwyczaj  automatycznie  dziaäaè  na  wielu  róĔnych  typach  obiektów,  o  ile  obsäugujñ
one zgodny z niñ interfejs (jak operacja

+

powyĔej). W Pythonie jest to bardzo waĔna koncepcja,

do której jeszcze powrócimy.

Niezmiennoļë

Warto zauwaĔyè, Ĕe w poprzednich przykäadach Ĕadna operacja wykonana na äaþcuchu zna-
ków nie zmieniäa oryginalnego äaþcucha. KaĔda operacja na äaþcuchach znaków zdefiniowana
jest w taki sposób, by w rezultacie zwracaè nowy äaþcuch znaków, poniewaĔ äaþcuchy sñ
w Pythonie niezmienne (ang. immutable). Nie mogñ byè zmienione w miejscu juĔ po utworzeniu.
Nie moĔna na przykäad zmieniè äaþcucha znaków, przypisujñc go do jednej z jego pozycji.
MoĔna jednak zawsze stworzyè nowy äaþcuch znaków i przypisaè go do tej samej nazwy
(zmiennej). PoniewaĔ Python czyĈci stare obiekty w miarö przechodzenia dalej (o czym prze-
konamy siö nieco póĒniej), nie jest to aĔ tak niewydajne, jak mogäoby siö wydawaè.

>>> S
'Mielonka'
>>> S[0] = 'z'                               # Niezmienne obiekty nie mogñ byè modyfikowane
...pominiĂto tekst bĪĂdu...
TypeError: 'str' object does not support item assignment

>>> S = 'z' + S[1:]                          # MoĔna jednak tworzyè wyraĔenia budujñce nowe obiekty
>>> S
'zielonka'

KaĔdy obiekt Pythona klasyfikowany jest jako niezmienny (niemodyfikowalny) bñdĒ zmienny
(modyfikowalny). WĈród typów podstawowych niezmienne sñ liczby, äaþcuchy znaków oraz
krotki. Listy i säowniki moĔna dowolnie zmieniaè w miejscu. NiezmiennoĈè moĔna wykorzystaè
do zagwarantowania, Ĕe obiekt pozostanie staäy w czasie caäego cyklu dziaäania programu.

Metody specyficzne dla typu

KaĔda z omówionych dotychczas operacji na äaþcuchach znaków jest tak naprawdö operacjñ
na sekwencjach, która bödzie dziaäaäa na innych typach sekwencji Pythona, w tym na listach
i krotkach. Poza tymi wspólnymi dla sekwencji operacjami äaþcuchy znaków obsäugujñ równieĔ
wäasne operacje dostöpne w formie metod (funkcji doäñczanych do obiektu i wywoäywanych
za pomocñ odpowiedniego wyraĔenia).

Metoda 

find

 jest na przykäad podstawowñ operacjñ dziaäajñcñ na podäaþcuchach znaków

(zwraca ona wartoĈè przesuniöcia przekazanego podäaþcucha znaków lub 

-1

, jeĈli podäaþcuch

ten nie jest obecny). Metoda 

replace

 säuĔy z kolei do globalnego odszukiwania i zastöpowania.

>>> S.find('ie')                             # Odnalezienie przesuniöcia podäaþcucha
1
>>> S
'Mielonka'

>>> S.replace('ie', 'XYZ')                   # Zastñpienie wystñpieþ podäaþcucha innym
'MXYZlonka'
>>> S
'Mielonka'

background image

Ĥaħcuchy znaków

_

127

I znów, mimo Ĕe w metodach äaþcucha znaków wystöpuje nazwa zmiennej, nie zmieniamy
oryginalnych  äaþcuchów  znaków,  lecz  tworzymy  nowe.  PoniewaĔ  äaþcuchy  znaków  sñ  nie-
zmienne, trzeba to robiè wäaĈnie w taki sposób. Metody äaþcuchów znaków to pierwsza pomoc
w przetwarzaniu tekstu w Pythonie. Inne dostöpne metody pozwalajñ dzieliè äaþcuch znaków
na podäaþcuchy w miejscu wystñpienia ogranicznika (co przydaje siö w analizie skäadniowej),
zmieniaè wielkoĈè liter, sprawdzaè zawartoĈè äaþcuchów znaków (cyfry, litery  i  inne  znaki)
lub usuwaè biaäe znaki (ang. whitespace) z koþca äaþcucha.

>>> line = 'aaa,bbb,ccccc,dd'
>>> line.split(',')                          # Podzielenie na ograniczniku na listö podäaþcuchów
['aaa', 'bbb', 'ccccc', 'dd']
>>> S = 'mielonka'
>>> S.upper()                                # Konwersja na wielkie litery
'MIELONKA'

>>> S.isalpha()                              # Sprawdzenie zawartoĈci: isalpha, isdigit
True

>>> line = 'aaa,bbb,ccccc,dd\n'
>>> line = line.rstrip()                     # Usuniöcie biaäych znaków po prawej stronie
>>> line
'aaa,bbb,ccccc,dd'

ãaþcuchy znaków obsäugujñ równieĔ zaawansowane operacje zastöpowania znane jako forma-
towanie
, dostöpne zarówno w postaci wyraĔeþ (oryginalne rozwiñzanie), jak i wywoäania metody
äaþcuchów znaków (nowoĈè w wersjach 2.6 oraz 3.0):

>>> '%s, jajka i %s' % ('mielonka', 'MIELONKA!')       # WyraĔenie formatujñce (wszystkie wersje)
'mielonka, jajka i MIELONKA!'
>>> '{0}, jajka i {1}'.format('mielonka', 'MIELONKA!') # Metoda formatujñca (2.6, 3.0)
'mielonka, jajka i MIELONKA!'

Jedna uwaga: choè operacje na sekwencjach sñ uniwersalne, metody takie nie sñ — choè nie-
które typy wspóädzielñ pewne nazwy metod. Metody äaþcuchów znaków dziaäajñ wyäñcznie
na äaþcuchach znaków i na niczym innym. Generalnie zbiór narzödzi Pythona skäada siö
z warstw — uniwersalne operacje, które dostöpne sñ dla wiökszej liczby typów danych, wystö-
pujñ jako wbudowane funkcje lub wyraĔenia (na przykäad 

len(X), X[0]

), natomiast operacje

specyficzne dla okreĈlonego typu sñ wywoäaniami metod (jak 

aString.upper()

). Odnalezienie

odpowiednich narzödzi w tych kategoriach stanie siö bardziej naturalne z czasem, natomiast
w kolejnym podrozdziale znajduje siö kilka wskazówek przydatnych juĔ teraz.

Otrzymanie pomocy

Metody wprowadzone w poprzednim podrozdziale sñ reprezentatywnñ, choè doĈè niewielkñ
próbkñ tego, co dostöpne jest dla äaþcuchów znaków. Generalnie w niniejszej ksiñĔce omówienie
metod obiektów nie jest kompletne. W celu uzyskania wiökszej liczby szczegóäów zawsze moĔna
wywoäaè wbudowanñ funkcjö 

dir

, która zwraca listö wszystkich atrybutów dostöpnych dla

danego obiektu. PoniewaĔ metody sñ atrybutami obiektów, zostanñ na tej liĈcie wyĈwietlone.
Zakäadajñc,  Ĕe  zmienna 

S

  nadal  jest  äaþcuchem  znaków,  oto  jej  atrybuty  w  Pythonie  3.0

(w wersji 2.6 nieznacznie siö one róĔniñ):

>>> dir(S)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
´'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
´'__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
´'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',

background image

128

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

´'__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__',
´'__subclasshook__', '_formatter_field_name_split', '_formatter_parser',
´'capitalize', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',
´'format', 'index', 'isalnum','isalpha', 'isdecimal', 'isdigit', 'isidentifier',
´'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join',
´'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex',
´'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith',
´'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

Nazwy z dwoma znakami 

_

 nie bödñ nas raczej interesowaè aĔ do póĒniejszej czöĈci ksiñĔki,

kiedy bödziemy omawiaè przeciñĔanie operatorów w klasach. Reprezentujñ one implementa-
cjö obiektu äaþcucha znaków i sñ dostöpne w celu uäatwienia dostosowania obiektu do wäasnych
potrzeb. Ogólna reguäa jest taka, Ĕe podwójne znaki 

_

 na poczñtku i koþcu to konwencja wyko-

rzystywana w Pythonie do szczegóäów implementacyjnych. Nazwy bez tych znaków sñ meto-
dami, które moĔna wywoäywaè na äaþcuchach znaków.

Funkcja 

dir

 podaje same nazwy metod. ēeby dowiedzieè siö, co te metody robiñ, moĔna prze-

kazaè je do funkcji 

help

.

>>> help(S.replace)
Help on built-in function replace:

replace(...)
   S.replace (old, new[, count]) -> str
   Return a copy of S with all occurrences of substring old replaced by new. If the
   ´optional argument count is given, only the first count occurrences are replaced.

Funkcja 

help

 jest jednym z kilku interfejsów do systemu kodu udostöpnianego wraz z Pytho-

nem i znanego pod nazwñ PyDoc — narzödzia säuĔñcego do pobierania dokumentacji z obiek-
tów. W dalszej czöĈci ksiñĔki pokaĔemy, Ĕe PyDoc moĔe równieĔ zwracaè swoje raporty
w formacie HTML.

MoĔna równieĔ próbowaè uzyskaè pomoc dla caäego äaþcucha znaków (na przykäad 

help(S)

),

jednak  w  rezultacie  otrzymamy  wiöcej,  niĔ  chcielibyĈmy  zobaczyè,  to  znaczy  informacje
o kaĔdej metodzie äaþcuchów znaków. Lepiej jest pytaè o okreĈlonñ  metodö,  jak  na  listingu
powyĔej.

Wiöcej szczegóäowych informacji moĔna równieĔ znaleĒè w dokumentacji biblioteki standardo-
wej Pythona lub publikowanych komercyjnie ksiñĔkach, jednak to 

dir

 oraz 

help

 sñ w Pythonie

pierwszym Ēródäem pomocy.

Inne sposoby kodowania ĥaħcuchów znaków

Dotychczas przyglñdaliĈmy siö operacjom na sekwencjach na przykäadzie äaþcuchów znaków,
a  takĔe  metodom  przeznaczonym  dla  tego  typu  danych.  Python  udostöpnia  równieĔ  róĔne
sposoby kodowania äaþcuchów znaków, które bardziej szczegóäowo omówione zostanñ nieco
póĒniej.  Przykäadowo  znaki  specjalne  moĔna  reprezentowaè  jako  sekwencje  ucieczki  z  uko-
Ĉnikiem lewym.

>>> S = 'A\nB\tC'                            # \n to koniec wiersza, \t to tabulator
>>> len(S)                                   # KaĔde jest jednym znakiem
5

>>> ord('\n')                                # \n jest bajtem z wartoĈciñ binarnñ 10 w ASCII
10

background image

Ĥaħcuchy znaków

_

129

>>> S = 'A\0B\0C'                            # \0, binarny bajt zerowy, nie koþczy äaþcucha znaków
>>> len(S)
5

Python  pozwala  na  umieszczanie  äaþcuchów  znaków  zarówno  w  cudzysäowach,  jak  i  apo-
strofach (oznaczajñ one to samo). Zawiera równieĔ wielowierszowñ postaè literaäu äaþcucha
znaków umieszczanñ w trzech cudzysäowach lub trzech apostrofach. Kiedy uĔyta zostanie ta
forma, wszystkie wiersze sñ ze sobñ äñczone, a w miejscu zäamania wiersza dodawane sñ odpo-
wiednie znaki zäamania wiersza. Jest to pewna konwencja syntaktyczna, która przydaje siö do
osadzania kodu HTML czy XML w skrypcie Pythona.

>>> msg = """ aaaaaaaaaaaaa
bbb'''bbbbbbbbbb""bbbbbbb'bbbb
cccccccccccccc"""
>>> msg
'\naaaaaaaaaaaaa\nbbb\'\'\'bbbbbbbbbb""bbbbbbb\'bbbb\ncccccccccccccc'

Python obsäuguje równieĔ „surowy” literaä äaþcucha znaków wyäñczajñcy mechanizm ucieczki
z  ukoĈnikiem  lewym  (rozpoczyna  siö  on  od  litery 

r

),  a  takĔe  format  Unicode  obsäugujñcy

znaki miödzynarodowe. W wersji 3.0 podstawowy typ äaþcucha znaków 

str

 obsäuguje takĔe

znaki Unicode (co ma sens, biorñc pod uwagö, Ĕe tekst ASCII jest po prostu czöĈciñ Unicode),
natomiast typ 

bytes

 reprezentuje surowe äaþcuchy bajtowe. W Pythonie 2.6 Unicode jest odröb-

nym typem, natomiast 

str

 obsäuguje zarówno äaþcuchy oĈmiobitowe, jak i dane binarne.

W wersji 3.0 zmieniäy siö takĔe pliki zwracajñce i przyjmujñce 

str

 dla tekstu i 

bytes

 dla danych

binarnych. Ze wszystkimi specjalnymi formami äaþcuchów znaków spotkamy siö w kolejnych
rozdziaäach.

Dopasowywanie wzorców

Zanim przejdziemy dalej, warto odnotowaè, Ĕe Ĕadna z metod äaþcuchów znaków nie obsäu-
guje przetwarzania tekstu opartego na wzorcach. Dopasowywanie wzorców tekstowych jest
zaawansowanym narzödziem pozostajñcym poza zakresem niniejszej ksiñĔki, jednak osoby
znajñce  inne  skryptowe  jözyki  programowania  pewnie  bödñ  zainteresowane  tym,  Ĕe  dopaso-
wywanie wzorców w Pythonie odbywa siö z wykorzystaniem moduäu o nazwie 

re

. Moduä ten

zawiera analogiczne wywoäania dla wyszukiwania, dzielenia czy zastöpowania, jednak dziöki
uĔyciu wzorców do okreĈlania podäaþcuchów znaków moĔemy byè o wiele bardziej ogólni.

>>> import re
>>> match = re.match('Witaj,[ \t]*(.*)Robinie', 'Witaj, sir   Robinie')
>>> match.group(1)
'sir '

PowyĔszy przykäad szuka podäaþcucha znaków zaczynajñcego siö od säowa 

Witaj,

, po którym

nastöpuje od zera do wiökszej liczby tabulatorów lub spacji, po nich dowolne znaki, które bödñ
zapisane jako dopasowana grupa, a na koþcu säowo 

Robinie

. Kiedy taki podäaþcuch zostanie

odnaleziony, jego czöĈci dopasowane przez czöĈci wzorca umieszczone w nawiasach dostöpne
sñ jako grupy. PoniĔszy wzorzec wybiera na przykäad trzy grupy rozdzielone ukoĈnikami
prawymi:

>>> match = re.match('/(.*)/(.*)/(.*)', '/usr/home/drwal')
>>> match.groups()
('usr', 'home', 'drwal')

Dopasowywanie  wzorców  samo  w  sobie  jest  doĈè  zaawansowanym  narzödziem  do  prze-
twarzania tekstu, natomiast w Pythonie udostöpniana jest nawet obsäuga jeszcze bardziej

background image

130

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

zaawansowanych technik przetwarzania tekstu i jözyka, w tym analizy skäadniowej XML
i analizy jözyka naturalnego. DoĈè jednak informacji o äaþcuchach znaków — czas przejĈè do
kolejnego typu danych.

Listy

Obiekt listy jest w Pythonie najbardziej ogólnym rodzajem sekwencji dostöpnym w tym jözyku.
Listy to uporzñdkowane pod wzglödem pozycji zbiory  obiektów dowolnego typu; nie  majñ
one ustalonej wielkoĈci. Sñ równieĔ zmienne (ang. mutable) — w przeciwieþstwie do äaþcuchów
znaków listy moĔna modyfikowaè w miejscu, przypisujñc coĈ do odpowiednich wartoĈci prze-
suniöcia, a takĔe za pomocñ róĔnych metod.

Operacje na sekwencjach

PoniewaĔ listy sñ sekwencjami, obsäugujñ wszystkie operacje na sekwencjach przedstawione
przy okazji omawiania äaþcuchów znaków. Jedynñ róĔnicñ jest to, Ĕe wynikiem zazwyczaj sñ
listy, a nie äaþcuchy znaków. Majñc na przykäad listö trzyelementowñ:

>>> L = [123, 'mielonka', 1.23]              # Trzyelementowa lista z elementami róĔnego typu
>>> len(L)                                   # Liczba elementów listy
3

moĔemy jñ zindeksowaè, sporzñdziè  z niej wycinki i  wykonaè  pozostaäe  operacje  zaprezento-
wane na przykäadzie äaþcuchów znaków:

>>> L[0]                                     # Indeksowanie po pozycji
123

>>> L[:-1]                                   # Wycinkiem listy jest nowa lista
[123, 'mielonka']

>>> L + [4, 5, 6]                            # Konkatenacja takĔe zwraca nowñ listö
[123, 'mielonka', 1.23, 4, 5, 6]

>>> L                                        # Oryginalna lista pozostaje bez zmian
[123, 'mielonka', 1.23]

Operacje specyficzne dla typu

Listy Pythona powiñzane sñ z tablicami obecnymi w innych jözykach programowania, jednak
zazwyczaj majñ wiöksze moĔliwoĈci. Przede wszystkim nie majñ Ĕadnych ograniczeþ odno-
Ĉnie typów danych — przykäadowo lista z listingu powyĔej zawiera trzy obiekty o zupeänie
róĔnych typach (liczbö caäkowitñ, äaþcuch znaków i liczbö zmiennoprzecinkowñ). Co wiöcej,
wielkoĈè listy nie jest okreĈlona. Oznacza to, Ĕe moĔe ona rosnñè i kurczyè siö zgodnie z potrze-
bami i w odpowiedzi na operacje specyficzne dla list.

>>> L.append('NI')                           # RoĈniöcie: dodanie obiektu na koþcu listy
>>> L
[123, 'mielonka', 1.23, 'NI']

>>> L.pop(2)                                 # Kurczenie siö: usuniöcie obiektu ze Ĉrodka listy
1.23

>>> L                                        # "del L[2]" równieĔ usuwa element z listy
[123, 'mielonka', 'NI']

background image

Listy

_

131

Na powyĔszym listingu metoda 

append

 rozszerza rozmiar listy i wstawia na jej koþcu element.

Metoda 

pop

 (lub jej odpowiednik, instrukcja 

del

) usuwa nastöpnie element znajdujñcy siö na

pozycji o podanej wartoĈci przesuniöcia, co sprawia, Ĕe lista siö kurczy. Pozostaäe metody list
pozwalajñ na wstawienie elementu w dowolnym miejscu listy (

insert

) czy usuniöcie elementu

o podanej wartoĈci (

remove

). PoniewaĔ listy sñ zmienne, wiökszoĈè ich metod zmienia obiekt

listy w miejscu, a nie tworzy nowy obiekt.

>>> M = ['bb', 'aa', 'cc']
>>> M.sort()
>>> M
['aa', 'bb', 'cc']

>>> M.reverse()
>>> M
['cc', 'bb', 'aa']

Zaprezentowana  wyĔej  metoda  listy  o  nazwie 

sort

  porzñdkuje  listö  w  kolejnoĈci  rosnñcej,

natomiast metoda 

reverse

 odwraca jñ. W obu przypadkach lista modyfikowana jest w sposób

bezpoĈredni.

Sprawdzanie granic

Choè listy nie majñ ustalonej wielkoĈci, Python nie pozwala na odnoszenie siö do elementów,
które nie istniejñ. Indeksowanie poza koþcem listy zawsze jest bäödem, podobnie jak przypi-
sywanie elementu poza jej koþcem.

>>> L
[123, 'mielonka', 'NI']

>>> L[99]
...pominiĂto tekst bĪĂdu...
IndexError: list index out of range

>>> L[99] = 1
...pominiĂto tekst bĪĂdu...
IndexError: list assignment index out of range

Takie rozwiñzanie jest celowe, poniewaĔ zazwyczaj bäödem jest próba przypisania elementu
poza koþcem listy (szczególnie paskudne jest to w jözyku C, który nie sprawdza bäödów w tak
duĔym stopniu jak Python). Zamiast w odpowiedzi po cichu powiökszaè listö, Python zgäasza
bäñd. By powiökszyè listö, naleĔy zamiast tego wywoäaè odpowiedniñ metodö, takñ jak 

append

.

ZagnieŜdŜanie

Jednñ z miäych wäaĈciwoĈci podstawowych typów danych w Pythonie jest obsäuga dowolnego
zagnieĔdĔania. MoĔliwe jest zagnieĔdĔanie tych obiektów w dowolnej kombinacji i na dowolnñ
gäöbokoĈè (czyli moĔna na przykäad utworzyè listö zawierajñcñ säownik, który z kolei zawiera
kolejnñ listö). BezpoĈrednim zastosowaniem tej wäaĈciwoĈci jest reprezentowanie w Pythonie
macierzy czy, inaczej, tablic wielowymiarowych. Lista mieszczñca zagnieĔdĔone listy doskonale
siö sprawdzi w prostych aplikacjach:

>>> M = [[1, 2, 3],                # Macierz 3x3 w postaci list zagnieĔdĔonych
         [4, 5, 6],                # Kod moĔe siö rozciñgaè na kilka wierszy, jeĈli znajduje siö w nawiasach
         [7, 8, 9]]
>>> M
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

background image

132

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

PowyĔej zakodowaliĈmy listö zawierajñcñ trzy inne listy. W rezultacie otrzymujemy reprezen-
tacjö macierzy liczb 3×3. Dostöp do takiej struktury moĔna uzyskaè na wiele sposobów:

>>> M[1]                                     # Pobranie drugiego wiersza
[4, 5, 6]

>>> M[1][2]                                  # Pobranie drugiego wiersza, a z niego trzeciego elementu
6

Pierwsza operacja pobiera caäy drugi wiersz, natomiast druga pobiera trzeci element z tego wier-
sza. ãñczenie ze sobñ indeksów wciñga nas coraz gäöbiej i gäöbiej w zagnieĔdĔonñ strukturö.

2

Listy skĥadane

Poza operacjami dla sekwencji i metodami list Python zawiera bardziej zaawansowanñ ope-
racjö znanñ pod nazwñ list skäadanych (ang. list comprehension), która Ĉwietnie siö przydaje do
przetwarzania struktur takich, jak nasza macierz. PrzypuĈèmy na przykäad, Ĕe potrzebujemy
pobraè drugñ kolumnö naszej prostej macierzy. ãatwo jest za pomocñ zwykäego indeksowania
pobieraè wiersze, poniewaĔ macierz przechowywana jest wierszami. Podobnie äatwo jest pobraè
kolumnö za pomocñ wyraĔenia listy skäadanej:

>>> col2 = [row[1] for row in M]             # Zebranie elementów z drugiej kolumny
>>> col2
[2, 5, 8]

>>> M                                        # Macierz pozostaje bez zmian
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Listy skäadane pochodzñ z notacji zbiorów. SäuĔñ do budowania nowej listy poprzez wyko-
nanie wyraĔenia na kaĔdym elemencie po kolei, jeden po drugim, od lewej strony do prawej.
Listy skäadane kodowane sñ w nawiasach kwadratowych (by podkreĈliè fakt, Ĕe tworzñ listö)
i skäadajñ siö z wyraĔenia i konstrukcji pötli, które dzielñ ze sobñ nazwö zmiennej (tutaj 

row

).

PowyĔsza lista skäadana oznacza mniej wiöcej: „Zwróè 

row[1]

 dla kaĔdego wiersza w macie-

rzy 

M

 w nowej liĈcie”. Wynikiem jest nowa lista zawierajñca drugñ kolumnö macierzy.

Listy skäadane mogñ w praktyce byè bardziej skomplikowane:

>>> [row[1] + 1 for row in M]                # Dodanie 1 do kaĔdego elementu w drugiej kolumnie
[3, 6, 9]

>>> [row[1] for row in M if row[1] % 2 == 0] # Odfiltrowanie elementów nieparzystych
[2, 8]

Pierwsza  operacja  z  listingu  powyĔej  dodaje  1  do  kaĔdego  pobranego  elementu,  natomiast
druga wykorzystuje wyraĔenie 

if

 do odfiltrowania liczb nieparzystych z wyniku, uĔywajñc

do tego reszty z dzielenia (wyraĔenia z 

%

). Listy skäadane tworzñ nowe listy wyników, jednak

mogñ równieĔ zostaè wykorzystane do iteracji po dowolnym obiekcie, na którym jest to moĔliwe.
Listing poniĔej prezentuje uĔycie list skäadanych do przejĈcia zakodowanej listy wspóärzödnych
oraz äaþcucha znaków:

                                                       

2

Taka struktura macierzy jest dobra dla zadaþ na maäñ skalö, jednak w przypadku powaĔniejszego przetwarzania
liczb lepiej bödzie skorzystaè z jednego z rozszerzeþ liczbowych do Pythona, takiego jak system NumPy na licencji
open source. Takie narzödzia sñ w stanie przechowywaè i przetwarzaè duĔe macierze o wiele bardziej wydajnie od
zagnieĔdĔonej struktury list. O NumPy mówi siö, Ĕe zmienia Pythona w darmowy i bardziej zaawansowany odpo-
wiednik systemu MatLab, a organizacje takie, jak NASA, Los Alamos czy JPMorgan Chase wykorzystujñ to narzö-
dzie w swojej pracy naukowej i finansowej. Wiöcej informacji na ten temat moĔna znaleĒè w Internecie.

background image

Sĥowniki

_

133

>>> diag = [M[i][i] for i in [0, 1, 2]]      # Pobranie przekñtnej z macierzy
>>> diag
[1, 5, 9]

>>> doubles = [c * 2 for c in 'mielonka']    # Powtórzenie znaków w äaþcuchu
>>> doubles
['mm', 'ii', 'ee', 'll', 'oo', 'nn', 'kk', 'aa']

Listy skäadane i pokrewne konstrukcje, takie jak funkcje wbudowane 

map

 oraz 

filter

, sñ trochö

zbyt  zaawansowane,  by  omawiaè  je  teraz  bardziej  szczegóäowo.  NajwaĔniejsze  w  tym  krót-
kim wprowadzeniu jest to, Ĕe Python zawiera zarówno narzödzia podstawowe, jak i bardziej
zaawansowane. Listy skäadane sñ opcjonalne, jednak w praktyce czösto okazujñ siö przydatne
i nierzadko pozwalajñ zyskaè na szybkoĈci przetwarzania. Dziaäajñ na kaĔdym typie danych
bödñcym sekwencjñ, a takĔe na pewnych typach, które sekwencjami nie sñ. Wrócimy do nich
w dalszej czöĈci ksiñĔki.

Jako zapowiedĒ tego, co bödzie dalej, moĔemy napisaè, Ĕe w nowszych wersjach Pythona skäad-
nia zäoĔeþ w nawiasach moĔe byè wykorzystywana do tworzenia generatorów produkujñcych
wyniki na Ĕñdanie (wbudowana funkcja 

sum

 sumuje na przykäad elementy w sekwencji):

>>> G = (sum(row) for row in M)             # Utworzenie generatora sum wierszy
>>> next(G)                                 # iter(G) nie jest tu wymagane
6
>>> next(G)                                 # Wykonanie protokoäu iteracji
15

Funkcja wbudowana 

map

 wykonuje podobne zadanie, generujñc wyniki wykonania funkcji dla

elementów. Opakowanie jej w wywoäanie 

list

 wymusza zwrócenie wszystkich wartoĈci

w Pythonie 3.0.

>>> list(map(sum, M))                       # Wykonanie funkcji sum dla elementów M
[6, 15, 24]

W Pythonie 3.0 skäadniö zäoĔeþ moĔna takĔe wykorzystaè do tworzenia zbiorów oraz säowników:

>>> {sum(row) for row in M}                 # Utworzenie zbioru sum wierszy
{24, 6, 15}
>>> {i : sum(M[i]) for i in range(3)}       # Utworzenie tabeli klucz-wartoĈè sum wierszy
{0: 6, 1: 15, 2: 24}

Tak naprawdö listy, zbiory oraz säowniki moĔna w wersji 3.0 tworzyè za pomocñ zäoĔeþ:

>>> [ord(x) for x in 'mieloonka']           # Lista numerów porzñdkowych znaków
[109, 105, 101, 108, 111, 111, 110, 107, 97]
>>> {ord(x) for x in 'mieloonka'}           # Zbiory usuwajñ duplikaty
{97, 101, 105, 107, 108, 109, 110, 111}
>>> {x: ord(x) for x in 'mieloonka'}        # Klucze säownika sñ unikalne
{'a': 97, 'e': 101, 'i': 105, 'k': 107, 'm': 109, 'l': 108, 'o': 111, 'n': 110}

By jednak zrozumieè obiekty, takie jak generatory, zbiory oraz säowniki, musimy przejĈè nieco
dalej.

Sĥowniki

Säowniki sñ w Pythonie czymĈ zupeänie innym — nie sñ zupeänie sekwencjami, sñ za to znane
jako odwzorowania (ang. mapping). Odwzorowania sñ równieĔ zbiorami innych obiektów, jednak
obiekty te przechowujñ po kluczu, a nie ich pozycji wzglödnej. Odwzorowania nie zachowujñ

background image

134

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

Ĕadnej niezawodnej kolejnoĈci od lewej do prawej strony, po prostu äñczñ klucze z powiñza-
nymi z nimi wartoĈciami. Säowniki, jedyny typ odwzorowania w zbiorze typów podstawowych
Pythona, sñ równieĔ zmienne — mogñ byè modyfikowane w miejscu i podobnie do list, mogñ
rosnñè i kurczyè siö na Ĕyczenie.

Operacje na odwzorowaniach

Kiedy säowniki zapisze siö w formie literaäów, znajdujñ siö w nawiasach klamrowych i skäadajñ
siö z serii par 

kluczwartoŁð

. Säowniki sñ przydatne wtedy, gdy chcemy powiñzaè zbiór

wartoĈci z kluczami — na przykäad opisaè wäaĈciwoĈci czegoĈ. RozwaĔmy na przykäad poniĔszy
säownik skäadajñcy siö z trzech elementów (których kluczami bödñ 

jedzenie

iloŁð

 i 

kolor

):

>>> D = {'jedzenie': 'Mielonka', 'iloĿî': 4, 'kolor': 'róşowy'}

W  celu  zmiany  wartoĈci  powiñzanych  z  kluczami  säownik  moĔna  zindeksowaè  po  kluczu.
Operacja indeksowania säownika wykorzystuje tö samñ skäadniö co wykorzystywana w sekwen-
cjach, jednak elementem znajdujñcym siö w nawiasach kwadratowych jest klucz, a nie pozycja
wzglödna.

>>> D['jedzenie']                            # Pobranie wartoĈci klucza "jedzenie"
'Mielonka'

>>> D['iloĿî'] += 1                          # Dodanie 1 do wartoĈci klucza "iloĈè"
>>> D
{'jedzenie': 'Mielonka', 'kolor': 'róšowy', 'iloŁð': 5}

Choè forma literaäu z nawiasami klamrowymi jest czasami uĔywana, czöĈciej widzi siö säow-
niki tworzone w inny sposób. PoniĔszy przykäad rozpoczyna siö od pustego säownika, który
jest nastöpnie wypeäniany po jednym kluczu na raz. W przeciwieþstwie do przypisania poza
granicami listy, co jest zakazane, przypisania do nowych kluczy säownika tworzñ te klucze.

>>> D = {}
>>> D['imiĀ'] = 'Robert'                     # Tworzenie kluczy przez przypisanie
>>> D['zawód'] = 'programista'
>>> D['wiek'] = 40

>>> D
{'wiek': 40, 'zawód': 'programista', 'imiĂ': 'Robert'}

>>> print(D['imiĀ'])
Robert

PowyĔej wykorzystaliĈmy klucze jako nazwy pól w spisie opisujñcym kogoĈ. W innych zasto-
sowaniach säowniki mogñ  byè równieĔ wykorzystywane do zastöpowania operacji wyszuki-
wania — zindeksowanie säownika po kluczu jest czösto najszybszñ metodñ zakodowania
wyszukiwania  w  Pythonie.  Jak  dowiemy  siö  póĒniej,  säowniki  moĔna  takĔe  tworzyè  przez
przekazywanie argumentów bödñcych säowami kluczowymi do nazwy typu, jak w przykäadzie

dict(imiĂ='Robert', zawód='programista', wiek=40)

 tworzñcym ten sam säownik.

ZagnieŜdŜanie raz jeszcze

W  poprzednim  przykäadzie  säownik  wykorzystaliĈmy  do  opisania  hipotetycznej  osoby  za
pomocñ trzech kluczy. ZaäóĔmy jednak, Ĕe informacje sñ bardziej zäoĔone. Byè moĔe konieczne
bödzie zanotowanie imienia i nazwiska, a takĔe kilku zawodów czy tytuäów. Prowadzi to do

background image

Sĥowniki

_

135

innego zastosowania zagnieĔdĔania obiektów w praktyce. PoniĔszy säownik — zakodowany
od razu jako literaä — zawiera bardziej ustrukturyzowane informacje:

>>> rec = {'dane osobowe': {'imiĀ': 'Robert', 'nazwisko': 'Zielony'},
           'zawód': ['programista', 'inşynier'],
           'wiek': 40.5}

W  powyĔszym  przykäadzie  znowu  mamy  na  górze  säownik  z  trzema  kluczami  (o  kluczach

dane osobowe

zawód

 oraz 

wiek

), natomiast wartoĈci stajñ siö nieco bardziej skomplikowane.

ZagnieĔdĔony säownik z danymi osobowymi moĔe pomieĈciè kilka informacji, natomiast
zagnieĔdĔona lista z zawodem mieĈci kilka ról i moĔna jñ w przyszäoĈci rozszerzyè. Dostöp
do elementów tej struktury moĔna uzyskaè w podobny sposób jak w przypadku pokazanej
wczeĈniej macierzy, jednak tym razem indeksami bödñ klucze säownika, a nie wartoĈci prze-
suniöcia listy.

>>> rec['dane osobowe']                      # 'dane osobowe' to zagnieĔdĔony säownik
{'nazwisko': 'Zielony', 'imiĂ': 'Robert'}

>>> rec['dane osobowe']['nazwisko']          # Indeksowanie zagnieĔdĔonego säownika
'Zielony'

>>> rec['zawód']                             # 'zawód' to zagnieĔdĔona lista
['programista', 'inšynier']
>>> rec['zawód'][-1]                         # Indeksowanie zagnieĔdĔonej listy
'inšynier'

>>> rec['zawód'].append('leĿniczy')          # Rozszerzenie listy zawodów Roberta
>>> rec
{'wiek': 40.5, 'zawód': ['programista', 'inšynier', 'leŁniczy'], 'dane osobowe':
´{'nazwisko': 'Zielony', 'imiĂ': 'Robert'}}

Warto zwróciè uwagö na to, jak ostatnia operacja rozszerza osadzonñ listö z zawodami. Ponie-
waĔ lista zawodów jest fragmentem pamiöci oddzielnym od zawierajñcego jñ säownika, moĔe
dowolnie rosnñè i kurczyè siö (rozkäad pamiöci obiektów omówiony zostanie w dalszej czöĈci
ksiñĔki).

Prawdziwym powodem pokazania tego  przykäadu  jest  chöè  zademonstrowania  elastycznoĈci
podstawowych  typów  obiektów  Pythona.  Jak  widaè,  zagnieĔdĔanie  pozwala  na  budowanie
skomplikowanych struktur informacji w sposób äatwy i bezpoĈredni. Zbudowanie podobnej
struktury w jözyku niskiego poziomu, takim jak C, byäoby Ĕmudne i wymagaäoby o wiele wiök-
szej iloĈci kodu. MusielibyĈmy zaprojektowaè i zadeklarowaè ukäad struktury i tablic, wypeäniè
je wartoĈciami i wreszcie poäñczyè wszystko ze sobñ. W Pythonie wszystko to dzieje siö auto-
matycznie — jedno wyraĔenie tworzy za nas caäñ zagnieĔdĔonñ strukturö obiektów. Tak
naprawdö jest to jedna z najwaĔniejszych zalet jözyków skryptowych, takich jak Python.

Co  równie  waĔne,  w  jözyku  niĔszego  poziomu  musielibyĈmy  uwaĔnie  czyĈciè  przestrzeþ
zajmowanñ przez obiekty, które jej juĔ däuĔej nie potrzebujñ. W Pythonie, kiedy znika ostat-
nia referencja do obiektu (na przykäad gdy do zmiennej przypisze siö coĈ innego), caäe miejsce
w pamiöci zajmowane przez tö strukturö obiektu jest automatycznie zwalniane.

>>> rec = 0                                  # Miejsce zajmowane przez obiekt zostaje odzyskane

Z technicznego punktu widzenia Python korzysta z czegoĈ, co znane jest pod nazwñ czyszczenia
pamiöci
 (ang. garbage collection). NieuĔywana pamiöè jest czyszczona w miarö wykonywania pro-
gramu, co zwalnia nas z odpowiedzialnoĈci za zarzñdzanie takimi szczegóäami w naszym kodzie.
W Pythonie miejsce to jest odzyskiwane natychmiast, kiedy tylko zniknie ostatnia referencja do

background image

136

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

obiektu. W dalszej czöĈci ksiñĔki omówimy tö kwestiö bardziej szczegóäowo. Na razie powinna
nam wystarczyè wiedza, Ĕe moĔemy swobodnie korzystaè z obiektów, bez koniecznoĈci trosz-
czenia siö o tworzenie dla nich miejsca w pamiöci i zwalnianie go.

3

Sortowanie kluczy — pýtle for

Säowniki,  bödñc  odwzorowaniami,  obsäugujñ  jedynie  dostöp  do  elementów  po  ich  kluczu.
Obsäugujñ jednak równieĔ operacje specyficzne dla tego typu z wywoäaniami metod przydat-
nymi w wielu czösto spotykanych sytuacjach.

Jak wspomniano wczeĈniej, poniewaĔ säowniki nie sñ sekwencjami, nie zachowujñ Ĕadnej kolej-
noĈci elementów od lewej do prawej strony. Oznacza to, Ĕe jeĈli utworzymy säownik i wyĈwie-
tlimy jego zawartoĈè, klucze mogñ zostaè zwrócone w innej kolejnoĈci, niĔ je wpisaliĈmy.

>>> D = {'a': 1, 'b': 2, 'c': 3}
>>> D
{'a': 1, 'c': 3, 'b': 2}

Co jednak moĔna zrobiè, kiedy potrzebne nam jest wymuszenie okreĈlonej kolejnoĈci elemen-
tów säownika? Jednym z czösto spotykanych rozwiñzaþ jest tu pobranie listy kluczy za pomocñ
metody säownika 

keys

, posortowanie tej listy za pomocñ metody listy 

sort

, a nastöpnie przej-

Ĉcie  wyników  za  pomocñ  pötli 

for

.  NaleĔy  pamiötaè  o  dwukrotnym  naciĈniöciu  przycisku

Enter po utworzeniu poniĔszego kodu pötli — zgodnie z informacjami z rozdziaäu 3. pusty wiersz
oznacza  w  sesji  interaktywnej  „dalej”,  natomiast  w  niektórych  interfejsach  znak  zachöty  siö
zmienia.

>>> Ks = list(D.keys())                      # Nieuporzñdkowana lista kluczy
>>> Ks
['a', 'c', 'b']

>>> Ks.sort()                                # Posortowana lista kluczy
>>> Ks
['a', 'b', 'c']

>>> for key in Ks:                           # Iteracja przez posortowane klucze
       print(key, '=>', D[key])              # <== Tutaj naleĔy dwukrotnie nacisnñè Enter

a => 1
b => 2
c => 3

Ten  proces  skäada  siö  jednak  z  trzech  etapów,  natomiast  jak  zobaczymy  w  kolejnych  roz-
dziaäach, w nowszych wersjach Pythona moĔna go wykonaè w jednym etapie — dziöki now-
szej funkcji wbudowanej o nazwie 

sorted

. Wywoäanie 

sorted

 zwraca wynik i sortuje róĔne

typy obiektów; w tym przypadku automatycznie sortuje klucze säownika.

>>> D
{'a': 1, 'c': 3, 'b': 2}

>>> for key in sorted(D):

                                                       

3

Jedna  uwaga:  naleĔy  pamiötaè,  Ĕe  utworzony  przed  chwilñ  spis 

rec

  mógäby  byè  prawdziwym  wpisem  do

bazy danych, gdybyĈmy uĔyli systemu trwaäoĈci obiektów (ang. object persistence) Pythona — äatwego sposobu
przechowywania obiektów Pythona w plikach lub bazach danych dostöpnych za pomocñ klucza. Nie bödziemy
teraz omawiaè szczegóäów tego rozwiñzania; po wiöcej informacji na ten temat naleĔy siögnñè do omówionych
w dalszej czöĈci ksiñĔki moduäów 

pickle

 oraz 

shelve

.

background image

Sĥowniki

_

137

       print(key, '=>', D[key])

a => 1
b => 2
c => 3

Poza zaprezentowaniem säowników powyĔszy przypadek posäuĔyä nam jako pretekst do wpro-
wadzenia pötli 

for

 dostöpnej w Pythonie. Pötla 

for

 jest prostym i wydajnym sposobem przej-

Ĉcia wszystkich elementów sekwencji i wykonania bloku kodu dla kaĔdego elementu po kolei.
Zdefiniowana przez uĔytkownika zmienna pötli (tutaj: 

key

) wykorzystana jest do referencji do

aktualnie przechodzonego elementu. Wynikiem tego kodu jest wyĈwietlenie kluczy i wartoĈci
säownika w kolejnoĈci posortowanej po kluczach.

Pötla 

for

, a takĔe jej bardziej ogólny kuzyn — pötla 

while

, sñ podstawowymi sposobami kodo-

wania powtarzalnych zadaþ w skryptach jako instrukcji. Tak naprawdö jednak pötla 

for

, a takĔe

jej krewniak — listy skäadane, to operacja na sekwencjach. Zadziaäa na kaĔdym obiekcie bödñ-
cym sekwencjñ, podobnie do list skäadanych — a nawet na pewnych obiektach, które sekwen-
cjami nie sñ. PoniĔej widaè przykäad przechodzenia znaków w äaþcuchu i wyĈwietlenia wersji
kaĔdego z tych znaków napisanego wielkñ literñ.

>>> for c in 'mielonka':
       print(c.upper())

M
I
E
L
O
N
K
A

Pötla 

while

 Pythona jest narzödziem bardziej ogólnym i nie jest ograniczona do przechodzenia

sekwencji:

>>> x = 4
>>> while x > 0:
       print('mielonka!' * x)
       x -= 1
mielonka!mielonka!mielonka!mielonka!
mielonka!mielonka!mielonka!
mielonka!mielonka!
mielonka!

Instrukcje, skäadnia i narzödzia powiñzane z pötlami omówione zostanñ bardziej szczegóäowo
w dalszej czöĈci ksiñĔki.

Iteracja i optymalizacja

JeĈli pötla 

for

 z poprzedniego podrozdziaäu przypomina nam omówione wczeĈniej wyraĔe-

nie z listami skäadanymi, tak wäaĈnie powinno byè — oba sñ ogólnymi narzödziami iteracyj-
nymi. Tak naprawdö oba rozwiñzania bödñ dziaäaäy na kaĔdym obiekcie zgodnym z protokoäem
iteracji
 — rozpowszechnionñ w Pythonie koncepcjñ, która oznacza fizycznie przechowywanñ
sekwencjö w pamiöci czy obiekt generujñcy jeden element na raz w kontekĈcie operacji iteracji.
Obiekt mieĈci siö w tej drugiej kategorii, jeĈli odpowiada na wbudowane wywoäanie 

iter

obiektem, który posuwa siö naprzód w odpowiedzi na 

next

. WyraĔenie skäadane generatora,

które widzieliĈmy wczeĈniej, jest takim wäaĈnie typem obiektu.

background image

138

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

Na temat protokoäu iteracji bödö miaä wiöcej do powiedzenia w dalszej czöĈci ksiñĔki. Na razie
naleĔy pamiötaè, Ĕe kaĔde narzödzie Pythona, które przeglñda obiekt od lewej do prawej strony,
wykorzystuje protokóä iteracji. Dlatego wäaĈnie wywoäanie 

sorted

 wykorzystane wyĔej dziaäa

bezpoĈrednio na säowniku. Nie musimy wywoäywaè metody 

keys

 w celu otrzymania sekwen-

cji, poniewaĔ säowniki poddajñ siö iteracji, a 

next

 zwraca w ich przypadku kolejne klucze.

Oznacza to takĔe, Ĕe kaĔde wyraĔenie list skäadanych — jak poniĔsze, obliczajñce kwadrat
z listy liczb:

>>> squares = [x ** 2 for x in [1, 2, 3, 4, 5]]
>>> squares
[1, 4, 9, 16, 25]

zawsze moĔe zostaè zapisane w kodzie jako odpowiednik pötli 

for

 tworzñcej listö röcznie —

poprzez dodanie do niej kolejnych przechodzonych elementów:

>>> squares = []
>>> for x in [1, 2, 3, 4, 5]:                # To robi lista skäadana
       squares.append(x ** 2)                # Wewnötrznie wykonujñ protokóä iteracji

>>> squares
[1, 4, 9, 16, 25]

Lista skäadana, a takĔe powiñzane z niñ narzödzia programowania funkcjonalnego, takie jak

map

 oraz 

filter

, zazwyczaj bödñ obecnie dziaäaäy szybciej od pötli 

for

 (byè moĔe nawet dwa

razy  szybciej)  —  ta  cecha  moĔe  mieè  znaczenie  w  przypadku  wiökszych  zbiorów  danych.
Mimo to warto podkreĈliè, Ĕe pomiar wydajnoĈci moĔe byè w Pythonie doĈè podchwytliwy,
poniewaĔ jözyk ten tak duĔo optymalizuje, a wydajnoĈè zmienia siö z wydania na wydanie.

NajwaĔniejszñ reguäñ jest w Pythonie kodowanie w sposób prosty oraz czytelny i martwienie
siö o wydajnoĈè dopiero póĒniej, kiedy sam program juĔ dziaäa i przekonamy siö, Ĕe wydaj-
noĈè jest dla nas rzeczywistym problemem. NajczöĈciej kod bödzie wystarczajñco szybki. JeĈli
musimy w nim trochö pomajstrowaè pod kñtem wydajnoĈci, Python zawiera narzödzia, które
mogñ  nam  w  tym  pomóc,  w  tym  moduäy 

time

timeit

  i 

profile

.  Wiöcej  informacji  na  ten

temat znajduje siö w dalszej czöĈci ksiñĔki, a takĔe w dokumentacji Pythona.

Brakujéce klucze — testowanie za pomocé if

Zanim  przejdziemy  dalej,  warto  odnotowaè  jeszcze  jednñ  kwestiö  dotyczñcñ  säowników.
Choè moĔemy przypisaè wartoĈè do nowego klucza w celu rozszerzenia säownika, próba pobra-
nia nieistniejñcego klucza jest bäödem.

>>> D
{'a': 1, 'c': 3, 'b': 2}

>>> D['e'] = 99                              # Przypisanie nowego klucza rozszerza säownik
>>> D
{'a': 1, 'c': 3, 'b': 2, 'e': 99}

>>> D['f']                                   # Referencja do nieistniejñcego klucza jest bäödem
...pominiĂto tekst bĪĂdu...
KeyError: 'f'

Tego  wäaĈnie  oczekujemy  —  zazwyczaj  pobieranie  czegoĈ,  co  nie  istnieje,  jest  bäödem  pro-
gramistycznym. Jednak w pewnych ogólnych programach nie zawsze bödziemy w momencie
pisania kodu wiedzieè, jakie klucze bödñ obecne. W jaki sposób moĔna sobie poradziè w takim
przypadku i uniknñè bäödów? Jednym z rozwiñzaþ jest sprawdzenie tego zawczasu. WyraĔenie

background image

Krotki

_

139

säownika 

in

 pozwala na sprawdzenie istnienia klucza i odpowiednie zachowanie w zaleĔnoĈci

od wyniku tego sprawdzenia — dziöki instrukcji 

if

. Tak jak w przypadku 

for

, naleĔy pamiötaè

o dwukrotnym naciĈniöciu przycisku Enter w celu wykonania instrukcji 

if

 w sesji interaktywnej.

>>> 'f' in D
False

>>> if not 'f' in D:
       print('nie ma')

nie ma

Na temat instrukcji 

if

 i ogólnej skäadni instrukcji powiemy wiöcej nieco póĒniej, jednak forma

wykorzystywana w kodzie powyĔej jest doĈè prosta. Instrukcja skäada siö ze säowa 

if

, po nim

nastöpuje wyraĔenie, którego wynik interpretowany jest jako prawdziwy lub faäszywy, a nastöp-
nie blok kodu do wykonania, jeĈli wyraĔenie bödzie prawdziwe. W peänej formie instrukcja

if

 moĔe równieĔ zawieraè instrukcjö 

else

 z przypadkiem domyĈlnym, a takĔe jednñ lub wiök-

szñ liczbö instrukcji 

elif

 (od „else if”) sprawdzajñcych inne testy. Jest to podstawowe narzö-

dzie wyboru w Pythonie, a takĔe sposób kodowania logiki w skryptach.

Istniejñ inne sposoby tworzenia säowników, które pozwalajñ na unikniöcie prób uzyskania
dostöpu do nieistniejñcych kluczy, w tym metoda 

get

 (warunkowe indeksowanie z wartoĈciñ

domyĈlnñ),  w  Pythonie  2.X  metoda 

has_key

  (w  wersji  3.0  juĔ  niedostöpna),  instrukcja 

try

(narzödzie, z którym spotkamy siö w rozdziale 10. przy okazji przechwytywania wyjñtków
i  radzenia  sobie  z  nimi),  a  takĔe  wyraĔenie 

if

/

else

  (instrukcja 

if

  zmieszczona  w  jednym

wierszu). PoniĔej znajduje siö kilka przykäadów:

>>> value = D.get('x', 0)                  # Indeks, ale z wartoĈciñ domyĈlnñ
>>> value
0
>>> value = D['x'] if 'x' in D else 0      # Forma wyraĔenia if/else
>>> value
0

Szczegóäowe  informacje  na  temat  tych  alternatywnych  rozwiñzaþ  odäoĔymy  jednak  do  jed-
nego z kolejnych rozdziaäów. Teraz czas przejĈè do omawiania krotek.

Krotki

Obiekt krotki (ang. tuple) jest w przybliĔeniu listñ, której nie moĔna zmodyfikowaè. Krotki sñ
sekwencjami, podobnie do list, jednak sñ teĔ niezmienne — tak jak äaþcuchy znaków. Z punktu
widzenia skäadni kodowane sñ w zwykäych nawiasach, a nie w nawiasach kwadratowych.
Krotki obsäugujñ dowolne typy danych, zagnieĔdĔanie i zwykäe operacje na sekwencjach.

>>> T = (1, 2, 3, 4)                         # Krotka z 4 elementami
>>> len(T)                                   # DäugoĈè krotki
4

>> T + (5, 6)                                # Konkatenacja
(1, 2, 3, 4, 5, 6)

>>> T[0]                                     # Indeksowanie i wycinki
1

Krotki majñ w Pythonie 3.0 dwie metody wywoäywalne specyficzne dla tego typu — nie jest
ich zatem tak wiele jak w przypadku list.

background image

140

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

>>> T.index(4)                             # Metody krotek — 4 znajduje siö na wartoĈci przesuniöcia 3
3
>>> T.count(4)                             # 4 pojawia siö raz
1

Podstawowñ wyróĔniajñcñ cechñ krotek jest to, Ĕe po utworzeniu nie moĔna ich zmodyfikowaè.
Oznacza to, Ĕe sñ sekwencjami niezmiennymi.

>>> T[0] = 2                               # Krotki sñ niezmienne
...pominiĂto tekst bĪĂdu...
TypeError: 'tuple' object does not support item assignment

Tak jak listy i säowniki, krotki obsäugujñ obiekty o mieszanych typach i zagnieĔdĔanie, jednak nie
rosnñ i nie kurczñ siö, poniewaĔ sñ niezmienne.

>>> T = ('mielonka', 3.0, [11, 22, 33])
>>> T[1]
3.0
>>> T[2][1]
22
>>> T.append(4)
AttributeError: 'tuple' object has no attribute 'append'

Czemu sĥuŜé krotki?

Po  co  nam  zatem  typ  podobny  do  listy,  który  obsäuguje  mniejszñ  liczbö  operacji?  Szczerze
mówiñc, w praktyce krotki nie sñ uĔywane tak czösto jak listy, jednak ich niezmiennoĈè jest
ich zaletñ. Kiedy w programie przekazujemy zbiór obiektów w postaci listy, obiekty te mogñ
siö w dowolnym momencie zmieniè. W przypadku uĔycia krotki zmieniè siö nie mogñ. Krotki
nakäadajñ pewne ograniczenia w zakresie integralnoĈci, które przydajñ siö w programach wiök-
szych od pisanych tutaj. O krotkach powiemy jeszcze w dalszej czöĈci ksiñĔki. Najpierw jednak
omówmy nasz ostatni gäówny typ podstawowy, czyli pliki.

Pliki

Obiekty  plików  sñ  w  Pythonie  gäównym  interfejsem  do  plików  zewnötrznych  znajdujñcych
siö na komputerze. Sñ typem podstawowym, jednak nieco innym od pozostaäych. Nie istnieje
Ĕadna  skäadnia  literaäu  säuĔñca  do  ich  tworzenia.  Zamiast  tego  w  celu  utworzenia  obiektu
wywoäuje siö wbudowanñ funkcjö 

open

, przekazujñc nazwö pliku zewnötrznego jako äaþcuch

znaków wraz z äaþcuchem okreĈlajñcym tryb przetwarzania. By na przykäad utworzyè plik wyj-
Ĉciowy, naleĔy przekazaè jego nazwö wraz z äaþcuchem znaków 

'w'

  okreĈlajñcym  tryb  prze-

twarzania umoĔliwiajñcy zapis danych:

>>> f = open('data.txt', 'w')           # Utworzenie nowego pliku w trybie do zapisu
>>> f.write('Witaj,\n')                 # Zapisanie do niego äaþcuchów bajtów
6
>>> f.write('Brian\n')                  # Zwraca liczbö zapisanych bajtów w Pythonie 3.0
6
>>> f.close()                           # Zamkniöcie pliku i wyczyszczenie bufora wyjĈciowego na dysku

PowyĔszy kod tworzy plik w katalogu bieĔñcym i zapisuje do niego tekst (nazwa pliku moĔe
byè  peänñ  ĈcieĔkñ  do  katalogu,  jeĈli  potrzebny  jest  nam  dostöp  do  pliku  znajdujñcego  siö
w innym miejscu komputera). By wczytaè z powrotem to, co napisaliĈmy, naleĔy ponownie

background image

Pliki

_

141

otworzyè plik, tym razem w trybie przetwarzania 

'r'

, w celu odczytania danych tekstowych

(jest  to  wartoĈè  domyĈlna,  jeĈli  pominiemy  tryb  w  wywoäaniu).  Nastöpnie  naleĔy  wczytaè
zawartoĈè pliku do äaþcucha znaków i wyĈwietliè go. ZawartoĈè pliku jest zawsze dla naszego
skryptu äaþcuchem znaków, bez wzglödu na typ danych umieszczonych w pliku.

>>> f = open('data.txt')                     

# 'r'

 jest domyĈlnym trybem przetwarzania

>>> text = f.read()                          # Wczytanie caäego pliku do äaþcucha znaków
>>> text
'Witaj,\nBrian\n'

>>> print(text)                              # Instrukcja print interpretuje znaki sterujñce
Witaj,
Brian

>>> text.split()                             # ZawartoĈè pliku jest zawsze äaþcuchem znaków
['Witaj,', 'Brian']

Inne metody plików obsäugujñ dodatkowe wäaĈciwoĈci, których nie mamy teraz czasu omawiaè.
Obiekty  plików  udostöpniajñ  na  przykäad  wiökszñ  liczbö  sposobów  odczytywania  i  zapisy-
wania (

read

 przyjmuje opcjonalny rozmiar w bajtach, 

readLine

 wczytuje po jednym wierszu

naraz), a takĔe inne narzödzia (

seek

 przechodzi do nowej pozycji pliku). Jak jednak zoba-

czymy  póĒniej,  najlepszym  obecnie  sposobem  na  wczytanie  pliku  jest  niewczytywanie  go  —
pliki udostöpniajñ iterator, który automatycznie wczytuje wiersz po wierszu w pötlach 

for

 oraz

innych kontekstach.

Z peänym zbiorem metod plików spotkamy siö w dalszej czöĈci ksiñĔki, a osoby juĔ teraz
chcñce przyjrzeè siö tym metodom mogñ wywoäaè funkcjö 

dir

 dla dowolnego otwartego pliku

oraz funkcjö 

help

 dla dowolnej ze zwróconych nazw metod:

>>> dir(f)
...pominiĂto wiele nazw...
'buffer', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty',
´'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline',
´'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write',
´'writelines']

>>> help(f.seek)
...przekonaj siĂ sam!...

W  dalszej  czöĈci  ksiñĔki  zobaczymy  takĔe,  Ĕe  pliki  w  Pythonie  3.0  zachowujñ  rozróĔnienie
pomiödzy danymi tekstowymi a binarnymi. Pliki tekstowe reprezentujñ zawartoĈè w postaci
äaþcuchów  znaków  i  automatycznie  wykonujñ  kodowanie  Unicode,  natomiast  pliki  binarne
reprezentujñ zawartoĈè w postaci specjalnego typu äaþcucha bajtowego 

bytes

 i pozwalajñ na

dostöp do niezmienionej zawartoĈci. PoniĔszy fragment kodu zakäada, Ĕe w katalogu bieĔñcym
znajduje siö juĔ plik binarny.

>>> data = open('data.bin', 'rb').read()  # Otwarcie pliku binarnego
>>> data                                  # ãaþcuch bajtowy przechowuje dane binarne
b'\x00\x00\x00\x07mielonka\x00\x08'
>>> data[4:12]
b'spam'

Osoby, które bödñ miaäy do czynienia jedynie z tekstem w formacie ASCII, nie bödñ siö musiaäy
przejmowaè tym rozróĔnieniem. ãaþcuchy znaków i pliki Pythona 3.0 sñ jednak bardzo cenne,
jeĈli mamy do czynienia z aplikacjami miödzynarodowymi lub danymi bajtowymi.

background image

142

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

Inne narzýdzia podobne do plików

Funkcja 

open

  jest  koniem  pociñgowym  dla  wiökszoĈci  czynnoĈci  zwiñzanych  z  przetwarza-

niem  plików  w  Pythonie.  Dla  bardziej  zaawansowanych  zadaþ  Python  udostöpnia  jednak
dodatkowe  narzödzia  podobne  do  plików:  potoki,  kolejki  FIFO,  gniazda,  pliki  dostöpne  po
kluczu, trwaäoĈè obiektów, pliki oparte na deskryptorze czy interfejsy do relacyjnych i zorien-
towanych obiektowo baz danych. Pliki deskryptorów obsäugujñ na przykäad blokowanie pliku
i  inne  narzödzia  niskiego  poziomu,  natomiast  gniazda  udostöpniajñ  interfejs  do  zadaþ  siecio-
wych i komunikacji miödzyprocesowej. Niewiele z tych zagadnieþ poruszymy w niniejszej
ksiñĔce, jednak osobom, które zajmñ siö programowaniem w Pythonie na powaĔnie, z pewnoĈciñ
wiele z nich siö przyda.

Inne typy podstawowe

Poza  omówionymi  dotychczas  typami  podstawowymi  istniejñ  inne,  które  mogñ  siö  zaliczaè
do tej kategorii — w zaleĔnoĈci od tego, jak szeroko jñ zdefiniujemy. Zbiory sñ na przykäad
nowym dodatkiem do jözyka, który nie jest ani odwzorowaniem, ani sekwencjñ. Zbiory to
raczej nieuporzñdkowane kolekcje unikalnych i niezmiennych obiektów. Tworzy siö je, wywo-
äujñc wbudowanñ funkcjö 

set

 lub za pomocñ nowych literaäów i wyraĔeþ zbiorów z Pythona 3.0.

Obsäugujñ one zwykäe operacje matematyczne na zbiorach. Wybór nowej skäadni 

{...} 

dla

literaäów zbiorów w wersji 3.0 ma sens, poniewaĔ zbiory przypominajñ klucze säownika bez
wartoĈci.

>>> X = set('mielonka')                   # Utworzenie zbioru z sekwencji w wersjach 2.6 oraz 3.0
>>> Y = {'s', 'z', 'y', 'n', 'k', 'a'}    # Utworzenie zbioru za pomocñ nowego literaäu z wersji 3.0
>>> X, Y
({'a', 'e', 'i', 'k', 'm', 'l', 'o', 'n'}, {'a', 'k', 'n', 's', 'y', 'z'})

>>> X & Y                                 # CzöĈè wspólna zbiorów
{'a', 'k', 'n'}

>>> X | Y                                 # Suma zbiorów
{'a', 'e', 'i', 'k', 'm', 'l', 'o', 'n', 's', 'y', 'z'}

>>> X – Y                                 # RóĔnica
{'i', 'm', 'e', 'l', 'o'}

>>> {x ** 2 for x in [1, 2, 3, 4]}        # Zbiory skäadane z wersji 3.0
{16, 1, 4, 9}

Dodatkowo  Python  od  niedawna  urósä  o  kilka  nowych  typów  liczbowych:  liczby  dziesiötne
(liczby zmiennoprzecinkowe o staäej precyzji) oraz liczby uäamkowe (liczby wymierne zawierajñce
licznik i mianownik). Oba typy moĔna wykorzystaè do obejĈcia ograniczeþ i niedokäadnoĈci
bödñcych nierozerwalnñ czöĈciñ arytmetyki liczb zmiennoprzecinkowych.

>>> 1 / 3                                 # Liczby zmiennoprzecinkowe (w Pythonie 2.6 naleĔy uĔyè .0)
0.33333333333333331
>>> (2/3) + (1/2)
1.1666666666666665

>>> import decimal                        # Liczby dziesiötne — staäa precyzja
>>> d = decimal.Decimal('3.141')
>>> d + 1
Decimal('4.141')
>>> decimal.getcontext().prec = 2

background image

Inne typy podstawowe

_

143

>>> decimal.Decimal('1.00') / decimal.Decimal('3.00')
Decimal('0.33')

>>> from fractions import Fraction            # Uäamki — licznik i mianownik
>>> f = Fraction(2, 3)
>>> f + 1
Fraction(5, 3)
>>> f + Fraction(1, 2)
Fraction(7, 6)

Python zawiera takĔe wartoĈci typu Boolean (ze zdefiniowanymi obiektami 

True

 i 

False

, które

sñ tak naprawdö liczbami caäkowitymi 

1

 i 

0

 z wäasnñ logikñ wyĈwietlania). Od dawna obsäuguje

równieĔ specjalny obiekt pojemnika o nazwie 

None

, wykorzystywany najczöĈciej do inicjalizo-

wania zmiennych i obiektów.

>>> 1 > 2, 1 < 2                             # WartoĈci typu Boolean
(False, True)

>>> bool('mielonka')
True

>>> X = None                                 # Pojemnik None
>>> print(X)
None
>>> L = [None] * 100                         # Inicjalizacja listy stu None
>>> L
[None, None, None, None, None, None, None, None, None, None, None, None, None,
´...lista stu None...]

Jak zepsuë elastycznoļë kodu

Wiöcej o tych typach obiektów Pythona powiemy w dalszej czöĈci ksiñĔki, jednak jeden z nich
zasäuguje na kilka säów juĔ teraz. Obiekt typu, zwracany przez funkcjö wbudowanñ 

type

, to

obiekt dajñcy typ innego obiektu. Jego wynik róĔni siö nieco w Pythonie 3.0 z uwagi na caäkowite
zlanie siö typów i klas (coĈ, co omówimy w szóstej czöĈci ksiñĔki w kontekĈcie klas w nowym
stylu). Zakäadajñc, Ĕe 

L

 nadal jest listñ z poprzedniego podrozdziaäu:

# W Pythonie 2.6:

>>> type(L)                                 # Typy: L jest obiektem typu lista
<type 'list'>
>>> type(type(L))                           # Typy teĔ sñ obiektami
<type 'type'>

# W Pythonie 3.0:

>>> type(L)                                  # 3.0: typy sñ klasami i odwrotnie
<class 'list'>
>>> type(type(L))                            # Wiöcej na temat typów klas w rozdziale 31.
<class 'type'>

Poza  umoĔliwieniem  interaktywnego  zbadania  obiektów  w  praktyce  pozwala  to  kodowi
sprawdzaè typy przetwarzanych obiektów. W skryptach Pythona moĔna to zrobiè na przynajm-
niej trzy sposoby.

>>> if type(L) == type([]):                  # Sprawdzanie typów, skoro juĔ musimy…
       print('tak')

tak
>>> if type(L) == list:                      # UĔycie nazwy typu

background image

144

_

Rozdziaĥ 4. Wprowadzenie do typów obiektów Pythona

       print('tak')

tak
>>> if isinstance(L, list):                  # Sprawdzanie zorientowane obiektowo
       print('tak')

tak

Pokazaäem wszystkie te sposoby sprawdzania typów, jednak moim obowiñzkiem jest dodaè,
Ĕe korzystanie z nich jest prawie zawsze zäym pomysäem w programie napisanym w Pytho-
nie  (i  czösto  jest  teĔ  znakiem  rozpoznawczym  byäego  programisty  jözyka  C,  który  zaczyna
przygodö z Pythonem). Przyczyna takiego stanu rzeczy stanie siö caäkowicie zrozumiaäa dopiero
póĒniej, kiedy zaczniemy pisaè wiöksze jednostki kodu, takie jak funkcje, jednak jest to kon-
cepcja kluczowa dla Pythona (byè moĔe wröcz najwaĔniejsza ze wszystkich). Sprawdzajñc okre-
Ĉlone typy w kodzie, efektywnie niszczymy jego elastycznoĈè, ograniczajñc go do tylko jednego
typu danych. Bez takiego sprawdzania kod moĔe dziaäaè na szerokiej gamie typów danych.

Jest to powiñzane ze wspomnianñ wczeĈniej koncepcjñ polimorfizmu i ma swoje Ēródäo w braku
deklaracji  typu  w  Pythonie.  W  Pythonie,  czego  nauczymy  siö  juĔ  niedäugo,  koduje  siö  pod
kñtem interfejsów obiektów (obsäugiwanych operacji), a nie typów. Nieprzejmowanie siö kon-
kretnymi typami sprawia, Ĕe kod automatycznie moĔna zastosowaè do wielu typów danych.
KaĔdy obiekt ze zgodnym interfejsem bödzie dziaäaä bez wzglödu na typ. Choè sprawdzanie
typów jest obsäugiwane — a nawet w niektórych przypadkach wymagane — to nie jest to
„pythonowy” sposób myĈlenia. Jak siö okaĔe, sam polimorfizm jest jednñ z kluczowych kon-
cepcji stojñcych za Pythonem.

Klasy zdefiniowane przez uŜytkownika

W dalszej czöĈci ksiñĔki bödziemy bardziej szczegóäowo omawiali programowanie zorientowane
obiektowo
 w Pythonie — opcjonalnñ, lecz majñcñ duĔe moĔliwoĈci wäaĈciwoĈè tego jözyka pozwa-
lajñcñ na skrócenie czasu programowania dziöki dostosowaniu obiektów do wäasnych potrzeb.
Z  abstrakcyjnego  punktu  widzenia  klasy  definiujñ  nowe  typy  obiektów,  które  rozszerzajñ
zbiór typów podstawowych, dlatego zasäugujñ na kilka säów w tym miejscu. Powiedzmy na
przykäad, Ĕe potrzebny jest nam typ obiektu bödñcy modelem pracownika. Choè taki wäaĈnie
typ nie istnieje w Pythonie, poniĔsza zdefiniowana przez uĔytkownika klasa powinna siö
przydaè.

>>> class Worker:
       def __init__(self, name, pay):      # Inicjalizacja przy utworzeniu
          self.name = name                 # self jest nowym obiektem; name to nazwisko, a pay — päaca
          self.pay = pay
       def lastName(self):
          return self.name.split()[-1]     # Podziaä äaþcucha znaków na znakach pustych
       def giveRaise(self, percent):
          self.pay *= (1.0 + percent)      # Uaktualnienie päacy w miejscu

PowyĔsza klasa definiuje nowy rodzaj obiektu, który bödzie miaä atrybuty 

name

 (nazwisko)

pay

 (päaca) — czasami nazywane informacjami o stanie (ang. state information) — a takĔe dwa

rodzaje zachowania zakodowane w postaci funkcji (normalnie nazywanych metodami). Wywo-
äanie klasy w sposób podobny do funkcji generuje obiekty naszego nowego typu, a metody
klasy automatycznie otrzymujñ obiekt przetwarzany przez dane wywoäanie metody (w argu-
mencie 

self

).

background image

Czytaj dalej...

Podsumowanie rozdziaĥu

_

145

>>> bob = Worker('Robert Zielony', 50000)    # Utworzenie dwóch obiektów
>>> anna = Worker('Anna Czerwona', 60000)    # KaĔdy ma atrybut imienia i nazwiska oraz päacy
>>> bob.lastName()                           # Wywoäanie metody — self to bob
'Zielony'
>>> anna.lastName()                          # Teraz self to anna
'Czerwona'
>>> anna.giveRaise(.10)                      # Uaktualnienie päacy Anny
>>> anna.pay
66000.0

Domniemany obiekt 

self

 jest przyczynñ nazwania tego modelu zorientowanym obiektowo —

w funkcjach klasy zawsze istnieje domniemany podmiot. W pewnym sensie typ oparty na klasie
po prostu tworzy coĈ na bazie typów podstawowych. Zdefiniowany wyĔej obiekt 

Worker

 jest

na przykäad zbiorem äaþcucha znaków oraz liczby (odpowiednio 

name

 i 

pay

) wraz z funkcjami

odpowiedzialnymi za przetwarzanie tych wbudowanych obiektów.

Bardziej rozbudowane wyjaĈnienie kwestii klas mówi, Ĕe to ich mechanizm dziedziczenia obsäu-
guje hierarchiö oprogramowania, która pozwala na dostosowywanie programów do wäasnych
potrzeb poprzez rozszerzanie ich. Programy rozszerza siö poprzez pisanie nowych klas, a nie
modyfikowanie  tego,  co  juĔ  dziaäa.  Warto  równieĔ  wiedzieè,  Ĕe  klasy  sñ  w  Pythonie  opcjo-
nalne i w wielu przypadkach proste obiekty wbudowane, takie jak listy i säowniki, sñ czösto
lepszymi narzödziami od klas zakodowanych przez uĔytkowników. Wszystko to jednak wy-
kracza poza zakres wstöpnego omówienia typów, dlatego naleĔy uznaè to tylko za zapowiedĒ
tego, co znajduje siö dalej. Peäne informacje na temat typów zdefiniowanych przez uĔytkow-
nika i tworzonych za pomocñ klas bödzie moĔna znaleĒè w szóstej czöĈci ksiñĔki.

I wszystko inne

Jak wspomniano wczeĈniej, wszystko, co moĔemy przetworzyè w skrypcie Pythona, jest typem
obiektu,  przez  co  nasze  omówienie  nie  moĔe  byè  kompletne.  Jednak  mimo  Ĕe  wszystko
w Pythonie jest obiektem, jedynie obiekty omówione wyĔej stanowiñ zbiór obiektów podsta-
wowych  tego  jözyka.  Pozostaäe  typy  sñ  albo  obiektami  powiñzanymi  z  omówionym  póĒniej
wykonywaniem programu (jak funkcje, moduäy, klasy i skompilowany kod), albo sñ implemen-
towane  przez  funkcje  importowanych  moduäów,  a  nie  skäadniö  jözyka.  Ta  druga  kategoria
peäni zwykle role specyficzne dla okreĈlonego zastosowania — wzorców tekstowych, interfej-
sów do baz danych czy poäñczeþ sieciowych.

NaleĔy równieĔ pamiötaè, Ĕe obiekty omówione wyĔej sñ obiektami, ale niekoniecznie sñ zorien-
towane obiektowo
. Zorientowanie obiektowe zazwyczaj wymaga w Pythonie dziedziczenia
i instrukcji 

class

, z którñ spotkamy siö w dalszej czöĈci ksiñĔki. Obiekty podstawowe Pythona

sñ siäñ napödowñ prawie kaĔdego skryptu napisanego w tym jözyku, z jakim moĔna siö spotkaè,
i zazwyczaj sñ teĔ podstawñ wiökszych typów niemieszczñcych siö w tej kategorii.

Podsumowanie rozdziaĥu

I to by byäo na tyle, jeĈli chodzi o naszñ krótkñ wycieczkö po typach danych. W niniejszym
rozdziale  zawaräem  zwiözäe  wprowadzenie  do  podstawowych  typów  obiektów  w  Pythonie
wraz z omówieniem rodzajów operacji, jakie moĔna do nich zastosowaè. PrzyjrzeliĈmy siö
uniwersalnym  operacjom,  które  dziaäajñ  na  wielu  typach  obiektów  (na  przykäad  operacjom
na  sekwencjach,  takim  jak  indeksowanie  czy  wycinki),  a  takĔe  operacjom  specyficznym  dla