Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00110 005374 19042353 na godz. na dobę w sumie
Python. Szybko i prosto. Wydanie III - książka
Python. Szybko i prosto. Wydanie III - książka
Autor: Liczba stron: 472
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-3771-8 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> python - programowanie
Porównaj ceny (książka, ebook, audiobook).

Na początku, w 1989 roku, był tylko wakacyjnym projektem Guida van Rossuma. Dziś jest potężnym językiem programowania o niesamowitej wszechstronności: można się nim posłużyć do napisania skryptu ułatwiającego prace administratora sieci, stworzenia aplikacji internetowej, a także opracowania systemu głębokiego uczenia maszynowego. Co więcej, dookoła Pythona skupiła się międzynarodowa społeczność tworząca niesamowite biblioteki i frameworki, co przenosi programowanie w Pythonie na zupełnie inny poziom. Ten język ma i taką ważną zaletę, że jego nauka jest przyjemna i angażująca. Nawet początkujący programista może bardzo szybko zacząć pisać poprawny i dobrze działający kod.

Dzięki tej książce zaczniesz błyskawicznie programować w Pythonie! Pominięto tu zbędne szczegóły, a skoncentrowano się na najważniejszych dla programisty, fundamentalnych zasadach programowania: przepływie sterowania, programowaniu zorientowanym obiektowo, dostępie do plików czy obsłudze wyjątków. Liczne porady, wskazówki i obszerne przykłady pomogą Ci w opanowaniu poszczególnych zagadnień. Poza omówieniem Pythona, jego najważniejszych bibliotek, pakietów i narzędzi w tym wydaniu znajdziesz pięć nowych rozdziałów dotyczących data science. Praca z tym podręcznikiem sprawi, że szybko będziesz gotów nawet na bardzo trudne zadania - i w pełni wykorzystasz potencjał Pythona!

W tej książce między innymi:

Python: język elegancki, wszechstronny, elastyczny!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: The Quick Python Book, 3rd Edition Tłumaczenie: Katarzyna Bogusławska Projekt okładki: Studio Gravite / Olsztyn; Obarek, Pokoński, Pazdrijowski, Zaprucki Materiały graficzne na okładce zostały wykorzystane za zgodą Shutterstock Images LLC. ISBN: 978-83-283-3771-8 Original edition copyright © 2018 by Manning Publications Co. All rights reserved. Polish edition copyright © 2019 by HELION SA All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Helion SA ul. Kościuszki 1c, 44-100 Gliwice tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/pyszy3 Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność O autorce Przedmowa Wprowadzenie Podziękowania O książce Spis treści 15 17 19 21 23 1.1. Czemu powinienem uczyć się właśnie Pythona? 1.2. W czym Python wypada dobrze? Python jest łatwy w użyciu 1.2.1. Python jest zwięzły 1.2.2. Python jest czytelny 1.2.3. Python jest kompletny 1.2.4. Python jest wieloplatformowy 1.2.5. Python jest darmowy 1.2.6. Z czym Python sobie nie radzi? 1.3.1. 1.3.2. 1.3.3. 1.3.4. 1.3.5. Po co uczyć się Pythona 3? CZĘŚĆ I. ZACZYNAMY .................................................................................. 27 Rozdział 1. O Pythonie 29 29 30 30 30 31 32 32 32 33 33 34 34 34 34 35 36 37 37 39 39 40 41 41 42 42 44 Rozdział 2. Pierwsze kroki Instalacja Pythona Podstawy trybu interaktywnego i IDLE 2.2.1. 2.2.2. 2.2.3. Wybór pomiędzy podstawowym trybem konsolowym a IDLE Python nie jest najszybszym z języków Python nie ma największej liczby bibliotek Python nie sprawdza typów zmiennych podczas kompilacji Python słabo wspiera urządzenia mobilne Python nie wykorzystuje dobrze wielu procesorów naraz 1.3. 2.1. 2.2. 1.4. Podsumowanie Podstawowy tryb konsolowy Zintegrowane środowisko programistyczne IDLE 2.3. Używanie okna konsoli Pythona w IDLE 2.4. Witaj, świecie 2.5. Używanie konsoli do poznania możliwości Pythona Podsumowanie Poleć książkęKup książkę 6 Spis treści Rozdział 3. Przegląd najważniejszych zagadnień w Pythonie 3.1. Python w skrócie 3.2. Typy wbudowane 3.2.1. 3.2.2. 3.2.3. 3.2.4. 3.2.5. 3.2.6. 3.2.7. Liczby Listy Krotki Łańcuchy znaków Słowniki Zbiory Obiekty plików 3.3. Kontrola przepływu sterowania Instrukcja if-elif-else Pętla while Pętla for Definiowanie funkcji 3.3.1. Wartości logiczne i wyrażenia 3.3.2. 3.3.3. 3.3.4. 3.3.5. 3.3.6. Wyjątki 3.3.7. Tworzenie modułów Programowanie zorientowane obiektowo 3.4. 3.5. Podsumowanie Kontekstowa obsługa błędów i słowo kluczowe with 45 46 46 46 48 49 50 51 52 52 53 53 53 54 54 55 55 56 57 58 59 4.1. 4.2. 4.3. 4.4. Wyrażenia 4.5. Łańcuchy znaków 4.6. Liczby CZĘŚĆ II. PODSTAWY ..................................................................................61 Rozdział 4. Podstawy podstaw 63 63 Struktura wcięć i bloków 65 Zróżnicowanie komentarzy 65 Zmienne i przypisania 67 68 68 70 70 70 70 71 72 72 73 73 73 75 76 76 78 4.7. Wartość None 4.8. Uzyskiwanie danych od użytkownika 4.9. Wbudowane operatory 4.10. Podstawy stylu typowego dla Pythona Podsumowanie 4.6.1. Wbudowane funkcje liczbowe 4.6.2. 4.6.3. 4.6.4. 4.6.5. Zaawansowane funkcje liczbowe Przeliczenia liczbowe Liczby zespolone Zaawansowane funkcje na liczbach zespolonych Rozdział 5. Listy, krotki i zbiory 5.1. Listy a tablice 5.2. 5.3. Modyfikowanie list Indeksy list Poleć książkęKup książkę Spis treści 7 5.4. 5.5. Funkcja sorted Sortowanie list 5.4.1. Własne mechanizmy sortowania 5.4.2. Inne przydatne działania na listach 5.5.1. 5.5.2. 5.5.3. 5.5.4. Maksymalna i minimalna wartość elementu oraz funkcje max i min 5.5.5. 5.5.6. Wystąpienia elementu i metoda count 5.5.7. Przynależność do zbioru i operator in Konkatenacja list i operator + Inicjalizacja listy i operator * Przeszukiwanie listy i metoda index Podsumowanie działań na listach 5.6. Listy zagnieżdżone i kopie głębokie 5.7. Krotki 5.7.1. 5.7.2. 5.7.3. 5.7.4. Zbiory 5.8.1. 5.8.2. Działania na zbiorach Frozenset Podstawy krotek Jednoelementowe krotki wymagają przecinka Pakowanie i rozpakowywanie krotek Konwertowanie pomiędzy listami i krotkami 5.8. Podsumowanie Rozdział 6. Łańcuchy znaków 6.1. Łańcuchy znaków jako sekwencje znaków 6.2. 6.3. Podstawowe działania na łańcuchach znaków Znaki specjalne i znaki ucieczki 6.3.1. 6.3.2. 6.3.3. Podstawowe sekwencje specjalne Numeryczne sekwencje specjalne i znaki Unicode Drukowanie i rozwijanie łańcuchów znaków ze znakami specjalnymi 6.4. Metody łańcuchów znaków 6.4.1. Metody split i join Konwersja łańcuchów znaków na liczby 6.4.2. Usuwanie dodatkowych białych znaków 6.4.3. 6.4.4. Przeszukiwanie łańcuchów znaków 6.4.5. Modyfikowanie łańcuchów znaków 6.4.6. 6.4.7. Zmienianie łańcuchów znaków przy użyciu operacji na listach Przydatne metody i stałe 6.5. Konwersja obiektów na łańcuchy znaków 6.6. Korzystanie z metody format 6.6.1. Metoda format i parametry pozycyjne 6.6.2. Metoda format i parametry wskazywane po nazwie 6.6.3. Specyfikatory formatowania 6.7. Formatowanie łańcuchów znaków przy użyciu Korzystanie z sekwencji formatowania Parametry przekazywane przez nazwę i sekwencje formatujące 6.7.1. 6.7.2. Interpolacja łańcuchów znaków 6.8. Typ bytes 6.9. Podsumowanie 80 81 83 83 83 83 83 84 84 85 85 86 88 88 89 90 91 92 92 93 93 95 95 96 96 97 97 98 99 99 100 101 102 104 105 106 107 108 109 109 110 110 111 112 112 113 115 Poleć książkęKup książkę 8 Spis treści Rozdział 7. Słowniki Inne działania na słownikach 7.1. Czym jest słownik? 7.2. 7.3. Liczenie słów 7.4. Co może być kluczem słownika? 7.5. Macierze rzadkie 7.6. 7.7. Wydajność słowników Podsumowanie Słowniki jako pamięć podręczna Rozdział 8. Przepływ sterowania 8.1. 8.2. 8.3. Pętla while Instrukcja if-elif-else Pętla for 8.3.1. 8.3.2. 8.3.3. 8.3.4. 8.3.5. 8.3.6. Funkcja range Ograniczenie funkcji range poprzez wartość początkową i krok Używanie instrukcji break oraz continue w pętlach for Pętla for i rozpakowywanie krotek Funkcja enumerate Funkcja zip 8.4. Listy i słowniki składane 8.4.1. Wyrażenia generatora Instrukcje, bloki i wcięcia 8.5. 8.6. Wartości i wyrażenia logiczne Obiekty jako wartości logiczne 8.6.1. 8.6.2. Porównania i operatory logiczne Prosty program analizujący plik tekstowy 8.7. Podsumowanie Rozdział 9. Funkcje Podstawy definiowania funkcji 9.1. 9.2. Opcje parametrów funkcji 9.2.1. 9.2.2. 9.2.3. 9.2.4. Parametry pozycyjne Przekazywanie argumentów przez nazwę parametru Zmienna liczba argumentów Łączenie technik przekazywania argumentów Zmienne lokalne, nielokalne i globalne Przypisywanie funkcji do zmiennych 9.3. Obiekty mutowalne jako argumenty 9.4. 9.5. 9.6. Wyrażenia lambda 9.7. Funkcje generatorów 9.8. Dekoratory Podsumowanie 117 117 119 122 123 124 125 126 127 129 129 130 132 132 133 133 133 134 134 135 136 136 139 139 140 141 142 143 143 144 145 146 147 148 148 149 151 152 152 154 155 Poleć książkęKup książkę Spis treści 9 Rozdział 10. Moduły i zakresy 10.1. Czym jest moduł? 10.2. Pierwszy moduł 10.3. Instrukcja import 10.4. Ścieżka szukania modułów 10.4.1. Gdzie umieszczać własne moduły 10.5. Nazwy prywatne w modułach 10.6. Biblioteka i moduły zewnętrzne 10.7. Zasięg zmiennych i przestrzenie nazw w Pythonie Podsumowanie Rozdział 11. Programy w Pythonie 11.1. Tworzenie bardzo prostego programu 11.1.1. Uruchamianie skryptu z wiersza poleceń 11.1.2. Argumenty wiersza poleceń 11.1.3. 11.1.4. Moduł argparse 11.1.5. Używanie modułu fileinput Przekierowywanie wejścia i wyjścia skryptu 11.2. Tworzenie skryptów bezpośrednio wykonywalnych w systemie UNIX 11.3. Skrypty w systemach macOS 11.4. Możliwości wykonywania skryptów w systemach Windows 11.4.1. Uruchamianie skryptu z wiersza poleceń lub poprzez PowerShell 11.4.2. Inne możliwości w systemach Windows 11.5. Programy i moduły 11.6. Dystrybucja aplikacji w Pythonie 11.6.1. 11.6.2. 11.6.3. 11.6.4. Tworzenie programów wykonywalnych za pomocą freeze Pakiety wheel zipapp oraz pex py2exe oraz py2app Podsumowanie Rozdział 12. Praca z systemem plików 12.1. os i os.path a pathlib 12.2. Ścieżki i nazwy ścieżek Ścieżki bezwzględne i względne Poruszanie się po katalogach przy pomocy pathlib 12.2.1. 12.2.2. Bieżący katalog roboczy 12.2.3. 12.2.4. Operacje na nazwach ścieżek 12.2.5. Operacje na nazwach ścieżek przy użyciu pathlib 12.2.6. Użyteczne stałe i funkcje 12.3. Uzyskiwanie informacji o plikach 12.3.1. Uzyskiwanie informacji o plikach przy użyciu scandir 12.4. Więcej operacji w systemie plików 12.4.1. Więcej operacji w systemie plików przy użyciu pathlib 12.5. Obsługa wszystkich plików w części drzewa katalogów Podsumowanie 157 157 158 161 161 162 163 164 165 171 173 174 174 175 175 176 177 179 180 180 180 181 181 186 186 186 187 187 188 189 190 190 191 192 193 193 195 196 198 199 199 201 202 203 Poleć książkęKup książkę 10 Spis treści Rozdział 13. Pisanie i czytanie plików 13.1. Otwieranie plików i obiektów typu file 13.2. Zamykanie plików 13.3. Otwieranie plików w różnych trybach 13.4. Funkcje do czytania i pisania danych tekstowych lub binarnych 13.4.1. Używanie trybu binarnego 13.5. Czytanie i pisanie przy pomocy pathlib 13.6. Operacje wejścia/wyjścia i przekierowania 13.7. Przekierowanie binarnych struktur danych i moduł struct 13.8. Serializacja obiektów do plików 13.8.1. Argumenty przeciw serializacji 13.9. Magazynowanie obiektów przy użyciu modułu shelve Podsumowanie Rozdział 14. Wyjątki 14.1. Wstęp do wyjątków 14.1.1. Ogólna koncepcja błędów i obsługi wyjątków 14.1.2. Bardziej formalna definicja wyjątku 14.1.3. Obsługa różnych typów wyjątków 14.2. Wyjątki w Pythonie Zgłaszanie wyjątków 14.2.1. Typy wyjątków w Pythonie 14.2.2. 14.2.3. Łapanie i obsługa wyjątków 14.2.4. Definiowanie nowych wyjątków 14.2.5. Debugowanie programów przy użyciu instrukcji assert 14.2.6. Hierarchia dziedziczenia wyjątków 14.2.7. 14.2.8. 14.2.9. Kiedy używać wyjątków? Przykład: program do pisania danych na dysku w Pythonie Przykład: wyjątki w zwykłych przeliczeniach 14.3. Managery kontekstu i słowo kluczowe with Podsumowanie 205 205 206 207 207 209 210 210 213 215 217 218 220 221 221 222 224 225 225 226 228 229 230 231 232 232 233 234 235 236 15.1.1. Wykorzystanie instancji klasy jako struktury lub rekordu 15.2. Zmienne instancji 15.3. Metody 15.4. Zmienne klasy CZĘŚĆ III. ZAAWANSOWANE CECHY JĘZYKA ............................................237 239 Rozdział 15. Klasy i programowanie zorientowane obiektowo 239 240 241 241 243 244 245 246 247 248 250 15.6. Dziedziczenie 15.7. Dziedziczenie i zmienne klasowe oraz zmienne instancji 15.4.1. Zagwozdka związana ze zmiennymi klasy 15.1. Definiowanie klas 15.5. Metody statyczne i metody klas 15.5.1. Metody statyczne 15.5.2. Metody klas Poleć książkęKup książkę Spis treści 11 15.8. Powtórka: podstawy klas w Pythonie 15.9. Zmienne i metody prywatne 15.10. @property i bardziej elastyczne zmienne instancji 15.11. Zasięg i przestrzenie nazw dla instancji klas 15.12. Destruktory i zarządzanie pamięcią 15.13. Wielodziedziczenie Podsumowanie Rozdział 16. Wyrażenia regularne 16.1. Co to jest wyrażenie regularne? 16.2. Wyrażenia regularne ze znakami specjalnymi 16.3. Wyrażenia regularne i łańcuchy znaków 16.3.1. Raw stringi 16.4. Uzyskiwanie dostępu do dopasowanego tekstu w łańcuchu znaków 16.5. Zastępowanie tekstu wyrażeniem regularnym Podsumowanie Rozdział 17. Typy danych jako obiekty 17.1. Typy również są obiektami 17.2. Korzystanie z typów 17.3. Typy i klasy zdefiniowane przez użytkownika 17.4. Duck typing 17.5. Czym jest specjalny atrybut metody? 17.6. Obiekty zachowujące się jak listy 17.7. Atrybut metody __getitem__ 17.7.1. 17.7.2. Jak to działa? Implementacja kompletu funkcjonalności listy 17.8. Obiekt o wszystkich możliwościach listy 17.9. Klasy pochodne od typów wbudowanych 17.9.1. 17.9.2. Pochodne od listy Pochodne klasy UserList 17.10. Kiedy korzystać ze specjalnych atrybutów metod? Podsumowanie Rozdział 18. Pakiety 18.1. Czym jest pakiet? 18.2. Pierwszy przykład 18.3. Konkretny przykład Pliki __init__ w pakietach Podstawowe użycie pakietu matproj 18.3.1. 18.3.2. 18.3.3. Ładowanie subpakietów i submodułów Instrukcja import wewnątrz pakietów 18.3.4. 18.4. Atrybut __all__ 18.5. Właściwe korzystanie z pakietów Podsumowanie 251 253 254 255 259 260 262 263 263 264 265 266 267 270 272 273 273 274 274 276 277 278 279 280 281 281 283 283 284 285 286 287 287 288 289 291 291 291 292 293 294 295 Poleć książkęKup książkę 12 Spis treści Rozdział 19. Korzystanie z bibliotek Pythona 19.1. „Wszystko w standardzie” — biblioteka standardowa Praca z różnymi typami danych 19.1.1. 19.1.2. Operacje na plikach i pamięci 19.1.3. Dostęp do usług systemu operacyjnego 19.1.4. Korzystanie z protokołów i formatów internetu 19.1.5. Narzędzia do tworzenia i debugowania oraz usługi uruchomieniowe 19.2. Wyjście poza bibliotekę standardową 19.3. Dodawanie kolejnych bibliotek w Pythonie 19.4. Instalowanie bibliotek Pythona przy użyciu pip oraz venv 19.4.1. 19.4.2. Instalacja z flagą --user Środowiska wirtualne 19.5. PyPI (czyli The Cheese Shop) Podsumowanie 297 298 298 298 300 300 301 301 302 302 303 303 304 304 21.1. Witamy w ETL 21.2. Czytanie plików tekstowych 20.1. Problem: niekończący się napływ plików z danymi 20.2. Scenariusz: dane produktowe z piekła 20.3. Więcej organizacji 20.4. Oszczędzanie miejsca: kompresja i sprzątanie CZĘŚĆ IV. PRACA Z DANYMI ......................................................................305 307 Rozdział 20. Podstawy obsługi plików 307 308 310 311 311 312 314 315 315 316 316 318 320 322 324 324 326 326 327 328 329 329 330 331 331 21.3. Pliki Excel 21.4. Czyszczenie danych 21.4.1. Czyszczenie 21.4.2. Sortowanie Problemy i pułapki czyszczenia danych 21.4.3. 21.5.1. CSV i pliki dzielone znakami specjalnymi 21.5.2. 21.5.3. Zapisywanie plików Excel Pakowanie plików danych 21.2.1. Kodowanie tekstu: ASCII, Unicode itp. 21.2.2. Tekst nieustrukturyzowany 21.2.3. 21.2.4. Moduł csv 21.2.5. Czytanie pliku CSV jako listy słowników Pliki płaskie podzielone znakami specjalnymi 21.5. Pisanie plików z danymi 20.4.1. Kompresja 20.4.2. Sprzątanie plików Podsumowanie Rozdział 21. Procesowanie plików danych Podsumowanie Poleć książkęKup książkę Spis treści 13 Rozdział 22. Dane w sieci 22.1. Pobieranie plików 22.1.1. Korzystanie z Pythona do pobierania plików z serwera FTP 22.1.2. 22.1.3. Pobieranie plików przy użyciu SFTP Pobieranie plików przy użyciu HTTP/HTTPS 22.2. Pobieranie danych przez API 22.3. Ustrukturyzowane formaty danych 22.3.1. Dane w formacie JSON 22.3.2. Dane XML 22.4. Sczytywanie danych z sieci WWW Podsumowanie Rozdział 23. Przechowywanie plików 23.1. Relacyjne bazy danych 23.1.1. Bazodanowe API Pythona 23.2. SQLite: korzystanie z bazy danych SQLite 23.3. Używanie MySQL, PostgreSQL i innych relacyjnych baz danych 23.4. Ułatwienie pracy z bazą danych — ORM 23.4.1. 23.4.2. Wykorzystanie Alembic do zmian struktury bazy danych SQLAlchemy 23.5. Nierelacyjne bazy danych 23.6. Klucz-wartość i Redis 23.7. Dokumenty w MongoDB Podsumowanie Rozdział 24. Badanie danych 24.1. Narzędzie do badania danych 24.1.1. 24.1.2. Zalety Pythona w zakresie obsługi danych Python może być lepszy niż arkusz kalkulacyjny 24.2. Notatnik Jupyter 24.2.1. Uruchomienie jądra 24.2.2. Wykonanie kodu w komórce 24.3. Python i pandas 24.3.1. Dlaczego mógłbyś chcieć używać pandas? 24.3.2. 24.3.3. Ramki danych Instalacja pandas 24.4. Czyszczenie danych 24.4.1. Ładowanie i zachowywanie danych w pandas 24.4.2. Czyszczenie danych i ramki danych 24.5. Agregowanie danych i manipulowanie nimi 24.5.1. Łączenie ramek danych 24.5.2. Wybieranie danych 24.5.3. Grupowanie i agregacja 24.6. Obrazowanie danych 24.7. Kiedy nie używać biblioteki pandas? Podsumowanie 333 333 334 335 336 337 339 339 342 347 351 353 354 354 354 357 357 358 361 364 364 367 370 371 371 371 372 372 373 373 375 375 375 376 377 377 379 381 382 383 384 385 386 387 Poleć książkęKup książkę 14 Spis treści Studium przypadku Pobranie danych Parsowanie danych dat pomiarów Wybór stacji na podstawie długości i szerokości geograficznej Wybór stacji i uzyskanie jej metadanych Pozyskanie i sparsowanie danych pogodowych Pozyskanie danych Parsowanie danych pogodowych Zapisywanie danych pogodowych do bazy danych (opcjonalne) Wybieranie i obrazowanie danych Użycie pandas do tworzenia wykresu Dodatek A. Przewodnik po dokumentacji Pythona Dodatek B. Odpowiedzi do ćwiczeń Skorowidz 389 389 392 393 395 397 397 397 400 401 401 403 425 467 Poleć książkęKup książkę Listy, krotki i zbiory Ten rozdział zawiera omówienie:  działań na listach i indeksach list,  modyfikacji list,  sortowania,  zastosowania typowych działań na listach,  obsługi zagnieżdżonych list i głębokich kopii,  korzystania z krotek,  tworzenia i wykorzystywania zbiorów. W tym rozdziale zajmiemy się dwoma podstawowymi typami sekwencji w Pythonie — listami i krotkami. Pozornie listy mogą przypominać tablice znane z innych języków programowania, ale to tylko pierwsze wrażenie — listy są zdecydowanie bardziej ela- styczne i przedstawiają znacznie więcej możliwości niż zwykłe tablice. Krotki to listy, które nie mogą być modyfikowane. Można o nich myśleć, jak o listach z ograniczeniami czy prostym typie rekordowym. Potrzebę istnienia takiej ograniczo- nej struktury danych zarysuję w dalszej części rozdziału. Na kolejnych stronach przej- dziemy także do nowszego typu kolekcji w Pythonie — zbioru. Zbiory sprawdzają się, gdy kładziemy nacisk na zawieranie się elementu w pewnym ciągu, a nie pozycję tego obiektu. Większa część tego rozdziału poświęcona jest listom, ponieważ zrozumienie sposobu funkcjonowania list pozwala na opanowanie wiedzy dotyczącej krotek. Przy końcu rozdziału nakreślimy natomiast różnice między listami a krotkami pod względem funkcjonalności i struktury. Poleć książkęKup książkę 76 ROZDZIAŁ 5. Listy, krotki i zbiory 5.1. Listy a tablice Lista dla Pythona jest pod wieloma względami tym samym, czym tablica jest dla Javy, C czy jakiegokolwiek innego języka programowania. Jest to uporządkowana kolekcja obiektów. Tworzymy ją, zamykając w nawiasach kwadratowych ciągi oddzielonych prze- cinkami elementów, w ten sposób: # poniższy kod przypisuje trójelementową listę do x x = [1, 2, 3] Zwróć uwagę, że nie trzeba martwić się deklarowaniem listy bądź określaniem jej roz- miaru. W powyższym przykładzie tworzymy i przypisujemy listę, która rośnie i kurczy się w miarę potrzeb. Tablice w Pythonie Dostępny w Pythonie moduł array daje możliwość pracy z typizowanymi tablicami opartymi na strukturach danych języka C. Więcej informacji o tym module dostępne jest w doku- mentacji Python Library Reference, ale korzystanie z niego zaleca się tylko w przypadkach, gdy kluczowe są zaawansowane optymalizacje wykorzystania zasobów. Jeśli z kolei system wymaga złożonych obliczeń matematycznych, warto sięgnąć po pakiet NumPy, opisany w rozdziale 4. i dostępny pod adresem www.scipy.org. W przeciwieństwie do ograniczeń w wielu innych językach, listy w Pythonie mogą zawierać różne typy obiektów. Element listy może być dowolnym obiektem tego języka. Oto przykład listy zawierającej wiele elementów: # pierwszy element listy to liczba, drugi — łańcuch znaków, trzeci — inna lista x = [2, dwa , [1, 2, 3]] Prawdopodobnie najprostszą wbudowaną funkcją operującą na listach jest funkcja len, która zwraca liczbę elementów sekwencji: x = [2, dwa , [1, 2, 3]] len(x) 3 Zwróć uwagę, że funkcja len nie zlicza elementów wewnętrznej, zagnieżdżonej listy. SZYBKI TEST: LEN Co zwróciłaby funkcja len wywołana dla każdej z list poniżej: [0]; []; [[1, 3, [4, 5], 6], 7]? 5.2. Indeksy list Zrozumienie tego, jak funkcjonują indeksy list, otworzy przed Tobą wiele możliwości w Pythonie, więc poświęć nieco uwagi na przeczytanie kolejnych stron. Do elementów listy w Pythonie można odwoływać się przy użyciu tej samej notacji, co w języku C. Zarówno w Pythonie, C, jak i wielu innych językach indeksowanie listy zaczyna się od 0 — zatem odwołanie się do elementu o indeksie 0 zwróci pierwszy ele- ment na liście, odwołanie do elementu o indeksie 1 — drugi, itd. Oto kilka przykładów: Poleć książkęKup książkę 5.2. Indeksy list 77 x = [ pierwszy , drugi , trzeci , czwarty ] x[0] pierwszy x[2] trzeci Korzystanie z indeksów w Pythonie daje jednak więcej możliwości niż w C. Jeśli indeksy mają wartości ujemne, oznaczają pozycje liczone od końca listy. W ten sposób indeks –1 odnosi się do ostatniego elementu listy, –2 — przedostatniego itd. Mając w pamięci stworzoną wcześniej listę x, można bez błędu wykonać poniższe przypisania: a = x[–1] a czwarty a = x[–2] a trzeci Tam, gdzie wykorzystujemy tylko jeden indeks, można śmiało wyobrażać sobie go jako wskazanie konkretnego elementu listy. Dla bardziej skomplikowanych instrukcji popraw- niej będzie myśleć o indeksie jako o wskazaniu pozycji pomiędzy elementami. pierwszy , drugi , trzeci , czwarty ] 1 –3 2 –2 3 –1 x=[ Indeks wyrażony liczbą dodatnią Indeks wyrażony liczbą ujemną 0 –4 Nie ma to znaczenia, gdy odnosimy się do pojedynczego elementu sekwencji, ale staje się istotne w świetle możliwości wycinania list (ang. slicing), czyli mechanizmu odwo- ływania się do całego podzbioru danej listy. Zamiast pojedynczo przypisywać każdy element poprzez notację lista[indeks], możemy skorzystać ze składni lista[indeks_ początkowy: indeks_końcowy], by uzyskać podzbiór obejmujący wszystkie elementy, od tego o indeksie początkowym (włącznie) aż po indeks końcowy (wyłącznie). Poniżej kilka przykładów: x = [ pierwszy , drugi , trzeci , czwarty ] x[1:–1] [ drugi , trzeci ] x[0:3] [ pierwszy , drugi , trzeci ] x[–2:–1] [ trzeci ] Mogłoby wydawać się intuicyjne, byśmy — jeśli indeks początkowy jest liczbą większą od indeksu końcowego — otrzymali ciąg elementów w odwróconej kolejności. Tak się jednak nie stanie. Taki kod zwróci pustą listę: Poleć książkęKup książkę 78 ROZDZIAŁ 5. Listy, krotki i zbiory x[–1:2] [] Kiedy wycinamy podzbiór z listy, możemy pominąć podawanie indeksu początkowego lub indeksu końcowego. Nie podając indeksu początkowego, każemy interpreterowi zacząć od początku listy, natomiast nie podając indeksu końcowego, nakazujemy kontynuować do jej końca. x[:3] [ pierwszy , drugi , trzeci ] x[2:] [ trzeci , czwarty ] Pominięcie zarówno indeksu początkowego, jak i końcowego skutkuje stworzeniem nowej listy, zawierającej wszystkie elementy od początku do końca oryginalnej listy — dokładniej rzecz biorąc, skopiowaniem pierwotnej listy. To rozwiązanie jest przydatne, gdy potrzebujemy kopii, którą możemy modyfikować bez ryzyka modyfikacji danych w pierwotnej sekwencji. y = x[:] y[0] = 1. y [ 1. , drugi , trzeci , czwarty ] x [ pierwszy , drugi , trzeci , czwarty ] WYPRÓBUJ: WYCINANIE LIST I INDEKSY Biorąc pod uwagę to, co już wiesz o funkcji len i wycinaniu list, jak skorzystałbyś z tych dwóch narzędzi, by otrzymać drugą połowę listy o nieznanej długości? Poćwicz w konsoli Pythona, by upewnić się, że Twoje rozwiązania działają. 5.3. Modyfikowanie list Możemy posługiwać się indeksami nie tylko po to, by uzyskiwać dostęp do elementów sekwencji, ale także po to, by te elementy zmieniać. Indeks należy wtedy umieścić po lewej stronie przypisania: x = [1, 2, 3, 4] x[1] = dwa x [1, dwa , 3, 4] Mechanizm wycinania list również może zostać użyty w tym miejscu. Konstrukcja typu lista_a[indeks1:indeks2] = lista_b spowoduje, że wszystkie elementy o indeksach pomiędzy indeksem1 a indeksem2 zostaną zastąpione elementami listy_b. lista_b może mieć mniej lub więcej elementów niż określony indeksami wycinek listy_a i w takiej sytuacji długość listy_a ulegnie zmianie. Wycinania w połączeniu z przypisaniem można używać w wielu przypadkach. Spójrzmy: x = [1, 2, 3, 4] x[len(x):] = [5, 6, 7] x Doklejenie kolejnej listy na końcu listy Poleć książkęKup książkę 5.3. Modyfikowanie list 79 Usunięcie elementów z listy Doklejenie kolejnej listy na początku listy [1, 2, 3, 4, 5, 6, 7] x[:0] = [–1, 0] x [–1, 0, 1, 2, 3, 4, 5, 6, 7] x[1: –1] = [] x [–1, 7] Dodawanie pojedynczego elementu do listy jest na tyle powszechną operacją, że istnieje do jej wykonania specjalna metoda append: x = [1, 2, 3] x.append( cztery ) x [1, 2, 3, cztery ] Problem może pojawić się przy dodawaniu jednej listy do drugiej. Ta druga lista zostanie dołączona na koniec sekwencji jako pojedynczy element: x = [1, 2, 3, 4] y = [5, 6, 7] x.append(y) x [1, 2, 3, 4, [5, 6, 7]] Metoda extend jest podobna do append, z tą różnicą, że extend pozwala scalić elementy dwóch list: x = [1, 2, 3, 4] y = [5, 6, 7] x.extend(y) x [1, 2, 3, 4, 5, 6, 7] Mamy także do dyspozycji metodę insert, która umożliwia wstawienie elementu pomiędzy dwa istniejące już elementy lub na początku listy. insert wywoływana jest jako metoda obiektu listy i przyjmuje dwa argumenty. Pierwszym z nich jest indeks pozycji, pod którą wstawiony ma zostać nowy element, a drugim — sam ten element. x = [1, 2, 3] x.insert(2, witaj ) print(x) [1, 2, witaj , 3] x.insert(0, start ) print(x) [ start , 1, 2, witaj , 3] Metoda insert liczy indeksy tak, jak było to opisane wcześniej w podrozdziale 5.2 (czyli zaczynając od 0), ale wydaje się, że łatwiej myśleć o zapisie insert(n, elem) jako oznaczającym wstaw elem tuż przed n-tym elementem sekwencji. Te same możliwości co insert przedstawia także wycinanie, a zatem lista.insert(n, elem) jest równoznaczne z lista[n:n] = [elem], gdy n jest liczbą dodatnią. Używanie funkcji insert sprzyja jed- nak czytelności kodu i pozwala poradzić sobie z ujemnymi indeksami: Poleć książkęKup książkę 80 ROZDZIAŁ 5. Listy, krotki i zbiory x = [1, 2, 3] x.insert(—1, witaj ) print(x) [1, 2, witaj , 3] Instrukcja del jest preferowanym przez twórców języka sposobem usuwania elementów listy bądź jej wycinków. Nie robi ona nic ponad to, co można osiągnąć dzięki wycina- niu, ale zwykle jest łatwiejsza do zapamiętania i przeczytania. x = [ a , 2, c , 7, 9, 11] del x[1] x [ a , c , 7, 9, 11] del x[:2] x [7, 9, 11] Podsumowując, del lista[n] zrobi to samo, co lista[n:n+1] = [], podczas gdy del lista[m:n] wykona to samo, co lista[m:n] = []. Metoda remove nie jest bliźniakiem insert. O ile insert wstawi obiekt w oznaczone miejsce, remove poszuka pierwszego wystąpienia tego obiektu i usunie je: x = [1, 2, 3, 4, 3, 5] x.remove(3) x [1, 2, 4, 3, 5] x.remove(3) x [1, 2, 4, 5] x.remove(3) Traceback (most recent call last): File stdin , line 1, in module ValueError: list.remove(x): x not in list Jeśli remove nie znajdzie nic do usunięcia, zgłosi błąd. Możemy starać się złapać ten błąd przy użyciu mechanizmów obsługi błędów w Pythonie lub uniknąć jego zgłosze- nia, sprawdzając przy pomocy operatora in, czy element znajduje się na liście, zanim spróbujemy go usunąć. Metoda reverse jest nieco bardziej szczegółowym sposobem modyfikowania listy. Sprawnie pod względem wydajności odwraca kolejność elementów listy w miejscu. x = [1, 3, 5, 6, 7] x.reverse() x [7, 6, 5, 3, 1] WYPRÓBUJ: MODYFIKOWANIE LIST Zakładając, że masz listę zawierającą 10 ele- mentów, w jaki sposób przeniesiesz jej ostatnie trzy elementy z końca na początek, zacho- wując ich porządek? 5.4. Sortowanie list Listy można sortować przy użyciu standardowej dla Pythona metody sort: Poleć książkęKup książkę 5.4. Sortowanie list 81 x = [3, 8, 4, 0, 2, 1] x.sort() x [0, 1, 2, 3, 4, 8] Metoda sort operuje na liście w miejscu, czyli zmienia oryginalną listę. By posortować wartości na liście, nie zmieniając przy tym oryginału, można wybrać jedno z dwóch rozwiązań. Można użyć funkcji sorted, opisanej w punkcie 5.4.2, lub skopiować listę i na tej kopii wywołać metodę sort: x = [2, 4, 1, 3] y = x[:] y.sort() x [2, 4, 1, 3] Sortowanie sprawdzi się także dla łańcuchów znaków: x = [ życie , jest , cudowne ] x.sort() x [ cudowne , jest , życie ] Metoda sort może posortować niemal wszystko, bo Python jest w stanie niemal wszystko porównać ze sobą. Niemniej i tu znajdą się ograniczenia. Domyślny sposób sortowania używany przez metodę sort wymaga, by wszystkie elementy listy były typami dającymi się porównać. Z tego powodu, próbując sortować listę zawierającą zarówno liczby cał- kowite, jak i łańcuchy znaków, interpreter zgłosi błąd: x = [1, 2, witaj , 3] x.sort() Traceback (most recent call last): File stdin , line 1, in module TypeError: not supported between instances of str and int Da się jednak posortować w ten sposób listę list: x = [[3, 5], [2, 9], [2,3], [4, 1], [3, 2]] x.sort() x [[2, 3], [2, 9], [3, 2], [3, 5], [4, 1]] Zgodnie ze standardowymi algorytmami porównywania złożonych obiektów w Pytho- nie, elementy będące listami są najpierw sortowane rosnąco względem swojego pierw- szego elementu, następnie rosnąco względem drugiego elementu. Metoda sort jest jednak jeszcze potężniejszym narzędziem. Przyjmuje opcjonalny parametr reverse, który, jeśli zostanie ustawiony na True, posortuje listę malejąco. Co więcej, można używać własnej funkcji, która określi, jak elementy będą posortowane. 5.4.1. Własne mechanizmy sortowania By korzystać z własnych mechanizmów sortowania, musimy być w stanie definiować funkcje — a o tym jeszcze nie było mowy. W następnych akapitach opiszemy też fakt, że Poleć książkęKup książkę 82 ROZDZIAŁ 5. Listy, krotki i zbiory funkcja len(łańcuch_znaków) zwraca liczbę znaków w łańcuchu. Jednak pełniej o łańcu- chach znaków będziemy mówić dopiero w rozdziale 6. Domyślnie Python korzysta z własnych wbudowanych funkcji określających upo- rządkowanie zbioru, co wystarcza w większości zastosowań. Zdarza się jednak czasem potrzeba posortowania elementów listy w sposób inny niż domyślne zachowanie inter- pretera. Wyobraźmy sobie konieczność posortowania listy łańcuchów znaków pod względem liczby znaków w słowie, a nie alfabetycznie (co byłoby standardowym zacho- waniem języka). By osiągnąć ten cel, potrzebujemy funkcji, która zwróci klucz, z którego sort skorzy- sta do uporządkowania elementów. Do porządkowania wyrazów względem liczby zna- ków odpowiednią funkcją zwracającą klucz byłoby: def porownaj_liczbe_znakow((wyraz1): ... return len(wyraz1) Powyższa funkcja jest bardzo prosta. Przekazuje ona do metody sort długość łańcucha znaków. Dysponując taką funkcją, możemy przekazać ją do metody sort przy użyciu słowa kluczowego key. W związku z tym, że funkcje w Pytonie są obiektami, możemy przeka- zywać je jako argumenty funkcji, tak jak dowolny inny typ obiektu. Oto krótki program obrazujący różnicę pomiędzy domyślnym sortowaniem a własnym mechanizmem sor- towania: def porownaj_liczbe_znakow((wyraz1): ... return len(wyraz1) ... lista_wyrazow = [ Python , jest , lepszy , od , C ] lista_wyrazow.sort() print(lista_wyrazow) [ C , Python , jest , lepszy , od ] lista_wyrazow = [ Python , jest , lepszy , od , C ] lista_wyrazow.sort(key=porownaj_liczbe_znakow() print(lista_wyrazow) [ C , od , jest , Python , lepszy ] Pierwsza lista uporządkowana jest alfabetycznie (a w takim wypadku wielkie litery wy- stępują przed małymi), a w drugiej kolejność wyznacza rosnąca liczba znaków w słowie. Własne mechanizmy sortowania są użyteczne, ale pod względem wydajności mogą wypadać gorzej niż domyślne algorytmy. Zwykle straty są niewielkie, ale jeśli funkcja sortująca jest bardzo złożona, to jej wydajność może być niska dla list o setkach tysięcy czy milionach elementów. Miejscem, w którym należy szczególnie wystrzegać się własnych mechanizmów sor- towania, jest porządkowanie listy w kolejności malejącej. W takich sytuacjach zaleca się używanie metody sort z parametrem reverse ustawionym na True. Jeśli z jakichś powo- dów nie chcemy tego robić, nadal — pod względem wydajności — lepsze będzie posor- towanie tej listy przy użyciu sort, a następnie skorzystanie z metody reverse, by odwrócić porządek nowej listy. Obie te operacje razem — sortowanie rosnące i odwrócenie kolejności — będą o wiele szybsze niż własny algorytm sortujący. Poleć książkęKup książkę 5.5. Inne przydatne działania na listach 83 5.4.2. Funkcja sorted Listy mają wbudowaną metodę do sortowania samych siebie, ale inne iterowalne obiekty w Pythonie, jak na przykład klucze słowników, takich możliwości nie posiadają. Python ma ponadto wbudowaną funkcję sorted, która zwraca posortowaną sekwencję z dowol- nego iterowalnego obiektu. Przyjmuje ona takie same parametry key oraz reverse, co sort: x = [4, 3, 1, 2] y = sorted(x) y [1, 2, 3, 4] z = sorted(x, reverse=True) z [4, 3, 2, 1] WYPRÓBUJ: SORTOWANIE LIST Wyobraźmy sobie, że mamy do czynienia z listą, której każdy element również jest listą: [[1, 2, 3], [2, 1, 3], [4, 0, 1]]. Gdybyśmy chcieli posortować taką listę pod względem wartości drugiego elementu każdej z list tak, by otrzymać wynik w postaci [[4, 0, 1], [2, 1, 3], [1, 2, 3]], z jakiej własnej funkcji sortującej powinniśmy skorzystać i przekazać ją jako parametr key w wywołaniu sort? 5.5. Inne przydatne działania na listach Kilka innych metod list jest często używanych, ale nie pasuje do żadnej określonej kategorii. 5.5.1. Przynależność do zbioru i operator in Łatwo sprawdzić, czy wartość znajduje się na liście, dzięki operatorowi in, który zwraca wartość logiczną prawda/fałsz. Można także używać negacji not in: 3 in [1, 3, 4, 5] True 3 not in [1, 3, 4, 5] False 3 in [ jeden , dwa , trzy ] False 3 not in [ jeden , dwa , trzy ] True 5.5.2. Konkatenacja list i operator + By stworzyć listę z połączenia dwóch istniejących list, powinniśmy użyć operatora kon- katenacji list +, który pozostawia oryginalne listy nietknięte: z = [1, 2, 3] + [4, 5] z [1, 2, 3, 4, 5] 5.5.3. Inicjalizacja listy i operator * Z operatora * korzystamy, chcąc stworzyć listę o określonej wielkości zainicjalizowaną daną wartością. Operacja ta jest często stosowana przy pracy z olbrzymimi listami, których wielkość jest od początku znana. Chociaż można używać funkcji add, by dodawać Poleć książkęKup książkę 84 ROZDZIAŁ 5. Listy, krotki i zbiory elementy do listy i w ten sposób ją powiększać, lepsze wyniki osiąga się, poprawnie ini- cjalizując listę na początku programu. Lista, której wielkość nie zmienia się w trakcie pracy, nie powoduje narzutu związanego z relokacją pamięci. z = [None] * 4 z [None, None, None, None] Gdy używamy * w takim kontekście, symbol ten nazywany jest operatorem mnożenia list i powiela wskazaną listę oznaczoną liczbę razy, a następnie łączy wszystkie kopie w jedną, nową listę. Jest to przyjęta metoda tworzenia list o zdefiniowanej wielkości w Pythonie. Lista zawierająca pojedynczy element None jest powszechnie używana w tym celu, ale typ elementu inicjalizującego może być dowolny: z = [3, 1] * 2 z [3, 1, 3, 1] 5.5.4. Maksymalna i minimalna wartość elementu oraz funkcje max i min Twórcy języka wyposażyli nas w funkcje min i max w celu znalezienia najmniejszego i naj- większego elementu listy. Najczęściej stosuje się je z listami zawierającymi elementy liczbowe, ale można ich używać w odniesieniu do list dowolnych typów. Próba znale- zienia wartości minimalnej i maksymalnej w sekwencji obiektów różnych typów koń- czy się błędem, jeśli porównanie tych typów nie znajdzie wspólnej podstawy: min([3, 7, 0, –2, 11]) —2 max([4, Witaj , [1, 2]]) Traceback (most recent call last): File stdin , line 1, in module TypeError: not supported between instances of str and int 5.5.5. Przeszukiwanie listy i metoda index Jeśli mamy za zadanie znaleźć miejsce, w którym dana wartość występuje (a nie tylko dowiedzieć się, czy w ogóle występuje), możemy posłużyć się metodą index. Metoda ta przeszukuje listę w poszukiwaniu elementu odpowiadającego zadanej wartości i zwraca jego indeks: x = [1, 2, pięć , 7, –2] x.index(7) 3 x.index(5) Traceback (most recent call last): File stdin , line 1, in module ValueError: 5 is not in list Jak widać w przykładzie wyżej, odpytywanie o pozycję elementu, którego brak na liście, skutkuje błędem. Może on zostać obsłużony w sposób analogiczny do tego zgłaszanego przez funkcję remove (czyli poprzez sprawdzenie przy użyciu in przed wywołaniem index). Poleć książkęKup książkę 5.5. Inne przydatne działania na listach 85 5.5.6. Wystąpienia elementu i metoda count Metoda count również przeszukuje listę w poszukiwaniu zadanej wartości, ale zamiast zwracać jej indeks, podaje liczbę wystąpień tej wartości na liście. x = [1, 2, 2, 3, 5, 2, 5] x.count(2) 3 x.count(5) 2 x.count(4) 0 5.5.7. Podsumowanie działań na listach Jak widać, listy to przydatne struktury danych, o możliwościach wykraczających daleko ponad to, co było możliwe ze starymi, dobrymi tablicami. Operacje na listach są nie- zwykle istotne w programowaniu w Pythonie, dlatego warto podsumować je w obra- zowym zestawieniu w tabeli 5.1. Tabela 5.1. Działania na listach Działanie Opis [] len append extend insert del remove reverse sort + * min max index count sum in Tworzy pustą listę Zwraca długość listy Dodaje pojedynczy element na koniec listy Dodaje listę na koniec bieżącej listy Wstawia nowy element w oznaczone miejsce listy Usuwa element lub wycinek listy Wyszukuje i usuwa oznaczony element listy Odwraca kolejność listy w miejscu Sortuje listę w miejscu Scala dwie listy Powiela listę Zwraca minimalną wartość na liście Zwraca maksymalną wartość na liście Zwraca indeks elementu na liście Liczy liczbę wystąpień elementu na liście Sumuje elementy (o ile mogą zostać dodane) Zwraca informację o tym, czy element znajduje się na liście Przykład x = [] len(x) x.append( y ) x.extend([ a , b ]) x.insert(0, y ) del(x[0]) x.remove( y ) x.reverse() x.sort() x1 + x2 x = [ y ] * 3 min(x) max(x) x.index( y ) x.count( y ) sum(x) y in x Biegłość w posługiwaniu się wymienionymi wyżej operacjami na listach znacząco ułatwi życie każdemu programiście Pythona. SZYBKI TEST: DZIAŁANIA NA LISTACH Jaki wynik zwróci len([[1,2]] * 3)? Wskaż dwie różnice między operatorem in a metodą index. Które wywołanie zgłosi wyjątek? min([ a , b , c ]) max([1, 2, trzy ]) [1, 2, 3].count( jeden ) Poleć książkęKup książkę 86 ROZDZIAŁ 5. Listy, krotki i zbiory WYPRÓBUJ: DZIAŁANIA NA LISTACH Napisz kod bezpiecznie usuwający element z listy x wtedy i tylko wtedy, gdy element ten znajduje się na liście x. Zmień przygotowany kod tak, by usuwał element z listy, jeśli element ten występuje na liście więcej niż raz. 5.6. Listy zagnieżdżone i kopie głębokie W tym podrozdziale prezentowany jest temat nieco bardziej zaawansowany, który możesz pominąć, jeśli dopiero rozpoczynasz naukę Pythona. Listy mogą być zagnieżdżone. Jednym z zastosowań takiej konstrukcji może być reprezentowanie macierzy dwuwymiarowej. Do elementów takich macierzy można odwoływać się przy użyciu indeksów dwuwymiarowych. Z indeksów tych korzystamy w następujący sposób: m = [[0, 1, 2], [10, 11, 12], [20, 21, 22]] m[0] [0, 1, 2] m[0][1] 1 m[2] [20, 21, 22] m[2][2] 22 Mechanizm ten oczywiście rozszerza się do obsługi macierzy wielowymiarowych w sposób łatwy do przewidzenia. Najczęściej na tym można poprzestać, jeśli chodzi o posługiwanie się listami zagnież- dżonymi. Czasami jednak można napotkać pewne szczególne problemy z tymi struk- turami danych, zwłaszcza jeśli chodzi o odwoływanie się poprzez zmienną do obiektu oraz sposób, w jaki pewne obiekty (np. listy) mogą być modyfikowane (są mutowalne). Najłatwiej będzie zobrazować to przykładem: zagnieżdżona = [0] oryginalna = [zagnieżdżona, 1] oryginalna [[0], 1] Rysunek 5.1 obrazuje ten przykład. Wartość w zagnieżdżonej liście może zostać zmieniona na dwa sposoby — odnosząc się do zmiennej w liście zagnież- dżona bądź w liście oryginalna. zagnieżdżona[0] = zero oryginalna [[ zero ], 1] oryginalna[0][0] = 0 zagnieżdżona [0] oryginalna [[0], 1] Rysunek 5.1. Lista z pierwszym elementem referującym do zagnieżdżonej listy Poleć książkęKup książkę Widzieliśmy, że możemy skopiować listę, biorąc z niej pełny wycinek, czyli stosując składnię x[:]. Możemy także otrzymać kopię listy, używając operatora + lub * (np. x + [] lub x * 1). Te dwie metody wypadają nieco słabiej pod względem wydajności niż wycinanie. Jednak wszystkie trzy tworzą strukturę nazywaną płytką kopią — i najczęściej właśnie takiej kopii potrzebujemy. Jeśli jednak kopiowana lista zawiera zagnieżdżone listy, możemy potrzebować tzw. kopii głębokiej. Możemy ją uzyskać, korzystając z funkcji kopiowania głębokiego w module copy: oryginalna = [[0], 1] płytka = oryginalna[:] import copy głęboka = copy.deepcopy(oryginalna) Sięgnijmy do rysunku 5.3 celem ilustracji. Rysunek 5.2. Pierwszy element listy oryginalnej nadal jest zagnieżdżony, ale zmienna zagnieżdżona wskazuje na inną listę 5.6. Listy zagnieżdżone i kopie głębokie 87 Jednakże jeśli wartość listy zagnieżdżona zostanie ustawiona na inną listę, więź mię- dzy listami zagnieżdżona i oryginalna zostanie zerwana. zagnieżdżona = [2] oryginalna [[0], 1] Rysunek 5.2 ilustruje ten warunek. Listy, na które wskazują zmienna oryginalna oraz płytka, są połączone. Zmiana wartości na zagnież- dżonej liście z poziomu którejkolwiek z nich poskut- kuje zmianami dla obu. płytka[1] = 2 płytka [[0], 2] oryginalna [[0], 1] płytka[0][0] = zero oryginalna [[ zero ], 1] Kopia głęboka jest niezależna od oryginału i żadna zmiana dokonywana na kopii nie wpływa na oryginał. głęboka[0][0] = 5 głęboka [[5], 1] oryginalna [[ zero ], 1] Zachowanie to jest analogiczne dla wszystkich innych zagnieżdżonych obiektów, które można modyfikować (np. słowników). Rysunek 5.3. Płytka kopia nie kopiuje zagnieżdżonych list A teraz, gdy widzieliśmy już, ile potrafią listy, przejdźmy do krotek. Poleć książkęKup książkę 88 ROZDZIAŁ 5. Listy, krotki i zbiory WYPRÓBUJ: KOPIOWANIE LIST Mając poniższą listę: x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]], jaki kod należałoby przygotować, by uzyskać taką kopię, na której zmiany nie będą wpływały na zawartość listy x? 5.7. Krotki Krotki to struktury danych bardzo podobne do list, ale niepodlegające modyfikacji po utworzeniu. Wyjąwszy tę różnicę, są na tyle podobne do list, że można by zastanawiać się, po co twórcy języka w ogóle je udostępnili. Powodem jest to, że krotki w efektywny sposób pełnią funkcje, których listy nie mogą pełnić — jak na przykład stanowienie kluczy w słownikach. 5.7.1. Podstawy krotek Tworzenie krotki jest podobne do tworzenia listy i sprowadza się do przypisania ciągu wartości do zmiennej. Lista to sekwencja ujęta w nawiasy kwadratowe — [] — a krotka to z kolei sekwencja ujęta w nawiasy okrągłe — (): x = ( a , b , c ) Powyższa linia tworzy trójelementową krotkę. Po utworzeniu krotka jest tak podobna do listy, że łatwo zapomnieć, że to dwa różne typy danych: x[2] c x[1:] ( b , c ) len(x) 3 max(x) c min(x) a 5 in x False 5 not in x True Podstawowa różnica między listami a krotkami polega na tym, że krotki nie są muto- walne. Próba zmiany krotki skutkuje wyświetleniem wprowadzającego dezorientację komunikatu, który jest w Pythonie sposobem zakomunikowania, że interpreter nie wie, jak ustawić wartość elementu w krotce: x[2] = d Traceback (most recent call last): File stdin , line 1, in module TypeError: tuple object does not support item assignment Można jednak tworzyć nowe krotki na podstawie już istniejących przy użyciu opera- torów + oraz *: Poleć książkęKup książkę 5.7. Krotki 89 x + x ( a , b , c , a , b , c ) 2 * x ( a , b , c , a , b , c ) Kopię krotki możemy wykonać na wszystkie sposoby, które dostępne są dla powiela- nia list: x[:] ( a , b , c ) x * 1 ( a , b , c ) x + () ( a , b , c ) Jeśli nie czytałeś podrozdziału 5.6, możesz pominąć resztę tego akapitu. Krotki same w sobie nie mogą być zmieniane. Ale jeśli składają się z mutowalnych obiektów (np. list lub słowników), obiekty te mogą ulec zmianie, o ile ich elementy przypisane są do wła- snych zmiennych. Krotki, które zawierają mutowalne obiekty, nie mogą być używane jako klucze w słownikach. 5.7.2. Jednoelementowe krotki wymagają przecinka Przy używaniu krotek należy pamiętać o istotnej uwadze dotyczącej składni. Ponieważ nawiasy kwadratowe, w które ujmuje się listy, nie są w żaden inny sposób używane w Pythonie, jasne jest, że zapis [] oznacza pustą listę, a [1] oznacza listę z jednym ele- mentem. Jednak nie można tego samego powiedzieć o nawiasach używanych z krot- kami. Nawiasy okrągłe mogą być także stosowane do grupowania elementów w wyra- żeniach, by wymusić pewną kolejność ich interpretowania. Z tego powodu nie jest oczywiste, czy fragment kodu (x + y) w programie napisanym w Pythonie należy rozu- mieć jako polecenia dodania x oraz y i umieszczenia sumy w jednoelementowej krotce, czy też może polecenie dodania x i y, zanim wykona się jakiekolwiek inne wyrażenie sąsiadujące z nim. Taka niejasność zachodzi tylko dla jednoelementowych krotek, ponieważ krotki o większej liczbie elementów zawsze zawierają przecinki, które oddzielają elementy i wskazują, że oddzielone nimi wartości znajdują się w krotce. Aby uniknąć tej nieja- sności, Python wymaga, by po elemencie w jednoelementowej krotce umieścić prze- cinek. W przypadku pustej krotki nie mamy tego problemu — musi to być krotka, ponieważ w innym wypadku para okrągłych nawiasów pozbawiona byłaby znaczenia: x = 3 y = 4 (x + y) # Ta linia dodaje x do y 7 (x + y,) # Dodanie przecinka wskazuje, że nawiasy okrągłe oznaczają krotkę (7,) () # By stworzyć pustą krotkę, używamy pustej pary nawiasów kwadratowych () Poleć książkęKup książkę 90 ROZDZIAŁ 5. Listy, krotki i zbiory 5.7.3. Pakowanie i rozpakowywanie krotek Jako udogodnienie Python pozwala, by krotki znajdowały się po lewej stronie operatora przypisania. W takiej składni zmiennym w krotce po lewej przypisywane są wartości z krotki po prawej stronie operatora. Oto przykład: (jeden, dwa, trzy, cztery) = (1, 2, 3, 4) jeden 1 dwa 2 Powyższy przykład można zapisać jeszcze prościej, ponieważ Python rozpoznaje krotki w kontekście przypisania nawet bez okrągłych nawiasów. Wartości po prawej stronie pakowane są w krotkę, a następnie rozpakowywane do zmiennych po lewej stronie: jeden, dwa, trzy, cztery = 1, 2, 3, 4 Jedna linia kodu zastąpiła cztery: jeden = 1 dwa = 2 trzy = 3 cztery = 4 Ta metoda jest wyjątkowo użyteczna przy podmienianiu wartości w zmiennych. Zamiast pisać: temp = zmienna1 zmienna1 = zmienna2 zmienna2 = temp wystarczy krótko sformułować to w postaci: zmienna1, zmienna2 = zmienna2, zmienna1 By uprościć pracę jeszcze bardziej, Python 3 posiada rozbudowaną funkcjonalność roz- pakowywania zmiennych, która pozwala elementowi oznaczonemu * pomieścić dowolną liczbę elementów niepasujących gdzie indziej. Po raz kolejny z pomocą przyjdzie przykład: x = (1, 2, 3, 4) a, b, *c = x a, b, c (1, 2, [3, 4]) a, *b, c = x a, b, c (1, [2, 3], 4) *a, b, c = x a, b, c ([1, 2], 3, 4) a, b, c, d, *e = x a, b, c, d, e (1, 2, 3, 4, []) Poleć książkęKup książkę 5.7. Krotki 91 Zwróćmy uwagę, że zmienna oznaczona gwiazdką przechowuje nadwyżkę elementów jako listę, a w przypadku gdy nie ma nadwyżki elementów — przypisywana jest jej pusta lista. Pakowanie i rozpakowywanie może być także używane z listami: [a, b] = [1, 2] [c, d] = 3, 4 [e, f] = (5, 6) (g, h) = 7, 8 i, j = [9, 10] k, l = (11, 12) a 1 [b, c, d] [2, 3, 4] (e, f, g) (5, 6, 7) h, i, j, k, l (8, 9, 10, 11, 12) 5.7.4. Konwertowanie pomiędzy listami i krotkami Krotki można z łatwością zamienić w listy przy użyciu funkcji list, która przyjmuje dowolną sekwencję jako argument i zwraca listę z tymi samymi elementami, co orygi- nalna sekwencja. Na podobnej zasadzie listy można zamienić w krotki przy użyciu funkcji tuple, która robi to samo, tyle że zwraca krotkę, a nie listę. list((1, 2, 3, 4)) [1, 2, 3, 4] tuple([1, 2, 3, 4]) (1, 2, 3, 4) Na marginesie warto odnotować, że funkcja list jest dogodnym sposobem zamieniania łańcucha znaków na listę znaków: list( Witaj ) [ W , i , t , a , j ] Metoda ta działa, ponieważ funkcja list (tak jak i tuple) ma zastosowanie do dowolnej sekwencji w Pythonie, a łańcuch znaków jest taką właśnie sekwencją (łańcuchy znaków są szczegółowo opisane w rozdziale 6.). SZYBKI TEST: KROTKI Wyjaśnij, dlaczego poniższe manipulacje są niedozwolone, gdy x = (1, 2, 3, 4):  x.append(1),  x[1] = witaj ,  del x[2]. Gdybyśmy dysponowali krotką x = (1, 2, 3, 4), jak moglibyśmy otrzymać krotkę x posortowaną? Poleć książkęKup książkę 92 ROZDZIAŁ 5. Listy, krotki i zbiory 5.8. Zbiory Zbiór w Pythonie to nieuporządkowana kolekcja obiektów, używana wtedy, gdy przy- należność elementu do zbioru oraz niepowtarzalność elementów w kolekcji to cechy, na których najbardziej zależy programiście. Podobnie jak klucze słowników (o których więcej w rozdziale 7.), elementy zbioru muszą być niezmienne i musi być możliwe wyliczenie z nich wartości skrótu nieodwracalnego (ang. hash). Znaczy to, że liczby całkowite, zmiennoprzecinkowe i krotki mogą być elementami zbioru, ale listy, słowniki i same zbiory — nie. 5.8.1. Działania na zbiorach Oprócz operacji mających zastosowanie do kolekcji w ogólności (jak np. in, len czy iterowanie przy użyciu pętli for) zbiory mają kilka charakterystycznych tylko dla siebie działań: x = set([1, 2, 3, 1, 3, 5] x {1, 2, 3, 5} x.add(6) x {1, 2, 3, 5, 6} x.remove(5) x {1, 2, 3, 6} 1 in x True 4 in x False y = set([1, 7, 8, 9]) x | y {1, 2, 3, 6, 7, 8, 9} x y {1} x ^ y {2, 3, 6, 7, 8, 9} Zbiory można tworzyć przy użyciu funkcji set, przyjmującej jako argument np. listę Podczas zamiany sekwencji na zbiór duplikaty są usuwane pomocy tej funkcji zbioru można elementy dodawać (przy użyciu funkcji add (przy użyciu funkcji remove używane do sprawdzania przynależności elementu do zbioru operatora | operatora ^, by znaleźć różnicę symetryczną zbiorów w jednym lub drugim zbiorze, ale nie w obu. . . Po stworzeniu przy ) i usuwać ) i w ten sposób zmieniać zbiór. Słowo kluczowe in jest . Można także używać , oraz — czyli elementy występujące , by uzyskać sumę zbiorów, operatora , by otrzymać część wspólną Powyższe elementy nie wyczerpują listy działań dozwolonych na zbiorach, ale obra- zują mechanizm funkcjonowania zbiorów. Więcej informacji można uzyskać w oficjalnej dokumentacji Pythona. Poleć książkęKup książkę Podsumowanie 93 5.8.2. Frozenset Ponieważ zbiory są mutowalne i nie da się z nich wyliczyć wartości skrótu nieodwracal- nego (hash), nie mogą być elementami innych zbiorów. By zaradzić tej sytuacji, Python posiada specjalny rodzaj zbiorów — frozenset (zbiór zamrożony), który działa tak, jak zwykły zbiór, z tą różnicą, że po utworzeniu nie można go już zmodyfikować. W związku z tym, że frozenset jest typem niezmiennym i pozwalającym na policzenie wartości skrótu nieodwracalnego (hash), może być elementem innego zbioru: x = set([1, 2, 3, 1, 3, 5]) z = frozenset(x) z frozenset({1, 2, 3, 5}) z.add(6) Traceback (most recent call last): File stdin , line 1, in module AttributeError: frozenset object has no attribute add x.add(z) x {1, 2, 3, 5, frozenset({1, 2, 3, 5})} SZYBKI TEST: ZBIORY Gdybyś utworzył zbiór z poniższej listy, to ile miałby on elementów? [1, 2, 5, 1, 0, 2, 3, 1, 1, (1, 2, 3)] LABORATORIUM 5.: PRACA Z LISTAMI Podczas tego ćwiczenia mamy za zadanie wczytać z pliku zestaw odczytów temperatury (miesięczne najwyższe temperatury na lotni- sku Heathrow od roku 1948 do 2016), a następnie znaleźć pewne podstawowe informacje: najwyższe i najniższe wartości pomiarów, średnią i medianę (czyli środkową wartość pomiaru, gdy wszystkie odczyty są posortowane). Dane dotyczące odczytów temperatury znajdują się w pliku lab_05.txt w katalogu z kodem źródłowym przykładów z tego rozdziału. Ponieważ nie omawialiśmy jeszcze czytania plików, oto kod niezbędny do wczytania pliku i uzyskania jego zawartości w postaci listy: temperatury = [] with open( lab_05.txt ) as plik_wejściowy: ... for wiersz in plik_wejściowy: ... temperatury.append(int(wiersz.strip())) Należy znaleźć najniższą i najwyższą temperaturę, średnią i medianę. Użyteczne w tym celu mogą być funkcje min, max, sum, len i metoda sort. ZADANIE DODATKOWE Podaj liczbę odczytów, których wartość się nie powtarza. Podsumowanie  Listy i krotki to struktury danych oparte na zasadzie sekwencji elementów, podobnie jak łańcuchy znaków.  Listy odpowiadają tablicom istniejącym w wielu innych językach programowa- nia, ale posiadają funkcjonalność automatycznego dopasowywania długości, moż- liwość wycinania i wiele udogodnień.  Krotki są podobne do list, ale nie mogą być modyfikowane, więc zajmują mniej pamięci i mogą być kluczami w słownikach (więcej w rozdziale 7.).  Zbiory są iterowalnymi kolekcjami, ale są nieuporządkowane i nie mogą zawierać duplikatów. Poleć książkęKup książkę 94 ROZDZIAŁ 5. Listy, krotki i zbiory Poleć książkęKup książkę 467 Skorowidz Skorowidz A agregacja danych, 384 agregowanie danych, 381 Alembic, 361, 364 API, 337 pobieranie danych, 337 argumenty nazwane, 147 obiekty mutowalne, 148 pozycyjne, 147 wiersza poleceń, 175 ASCII, 316 atrybut __all__, 293 __getitem__, 279 atrybuty specjalne metod, 277, 285 B badanie danych, 371–387 baza danych MongoDB, 367 ORM, 357 Redis, 364 SQLite, 354 bazodanowe API Pythona, 354 bazy danych nierelacyjne, 364 relacyjne, 357 sieciowe, 364 zmiana struktury, 361 białe znaki, 63, 101 biblioteka, 164, 297 pandas, 375, 386 ładowanie danych, 377 zachowywanie danych, 377 pathlib, 190, 193, 201 bieżący katalog, 193 czytanie i pisanie, 210 funkcje i atrybuty, 204 operacje na nazwach ścieżek, 195 operacje w systemie plików, 201 requests, 341 standardowa, 298 bloki, 63, 136 błędy, 222 C CSV, comma-separated values, 321 czyszczenie danych, 326, 328, 377, 379 D dane, 371–387 od użytkownika, 72 studium przypadku, 389–402 w sieci, 333 XML, 342 debugowanie, 231 definiowanie funkcji, 55, 143 klas, 239 wyjątków, 224, 230 dekoratory, 154 deskryptywność, 415 destruktory, 259 długość linii, 410 dodawanie bibliotek, 302 dokumentacja, 403, 414 dostęp do dokumentacji, 403 do dopasowanego tekstu, 267 do usług, 300 do zmiennych instancji, 254 drzewo katalogów, 202 duck typing, 276 dystrybucja aplikacji, 186 działania na listach, 83 na łańcuchach znaków, na słownikach, 119 na zbiorach, 92 w systemie plików, 203, 96 204 dziedziczenie, 248, 250 E ETL, extract-transform-load, 315, 331 etykiety, 66 F format CSV, 321 JSON, 339 formatowanie, 110 łańcuchów znaków, 110 formaty internetowe, 300 frozenset, 93 FTP, File Transfer Protocol, 334 funkcja, 55 enumerate, 134 max, 84 min, 84 print, 113 range, 132 krok, 133 wartość początkowa, 133 Poleć książkęKup książkę 468 Skorowidz funkcja sorted, 83 zip, 134 funkcje definiowanie, 143 do czytania i pisania, 207 generatorów, 152 liczb zespolonych, 71 liczbowe, 70 wbudowane, 70 zaawansowane, 70 opcje parametrów, 144 ścieżek, 196 zmienna liczba argumentów, 147 G generator, 136 generowanie stron HTML, 404 getter, 254 grupowanie danych, 384 H hierarchia dziedziczenia wyjątków, 232 I IDLE, 39, 40, 41 importy, 410 indeksy list, 76 informacje o plikach, 198, 199 inicjalizacja listy, 83 instalacja, 37 bibliotek, 302 pandas, 375 instrukcja, 136 assert, 231 break, 133 class, 239 continue, 133 if-elif-else, 53, 130 import, 161, 292 try, 229 interpolacja łańcuchów znaków, 112 Jupyter, 372 J K katalog roboczy, 192 klasa UserList, 284 klasy definiowanie, 239 destruktory, 259 dziedziczenie, 248 inicjalizatory, 259 mapowanie obiektów tabel, 360 metody, 241 pochodne, 283 wielodziedziczenie, 260 zmienne, 243, 262 klauzula else, 230 klucz-wartość, 364 kodowanie tekstu, 316 komentarze, 65, 414 blokowe, 414 liniowe, 414 konsola, 42 kontenery, 66 kontrola przepływu sterowania, 53 konwencje kodowania, 73 nazewnicze, 415, 416 konwersja łańcuchów znaków, 100 obiektów, 107 kopie głębokie, 86 krotki, 49, 88 jednoelementowe, 89 konwertowanie, 91 pakowanie, 90 rozpakowywanie, 133 L liczby, 46, 68 zespolone, 70 liczenie słów, 122 lista słowników, 324 listy, 48, 76, 135 działania, 83, 85 implementacja funkcjonalności, 281 indeksy, 76 inicjalizacja, 83 minimalna wartość elementu, 84 modyfikowanie, 78 przeszukiwanie, 84 sortowanie, 80 wystąpienia elementu, 85 zagnieżdżone, 86 Ł łańcuchy znaków, 50, 68, 95 dostęp do dopasowanego tekstu, 267 drukowanie, 98 działania, 96 formatowanie, 110 interpolacja, 112 konwersja na liczby, 100 konwersja obiektów, 107 metody, 99 modyfikowanie, 104 operacje, 107 przeszukiwanie, 102 rozwijanie, 98 usuwanie białych znaków, 101 ze znakami specjalnymi, 98 zmienianie, 105 łączenie ramek danych, 382 M macierze rzadkie, 124 magazynowanie obiektów, 218 managery kontekstu, 235 mapowanie obiektowo-relacyjne, ORM, 361, 370 obiektów tabel na klasy, 360 Poleć książkęKup książkę mechanizm sortowania, 81 wyjątków, 224 metadane, 395 metoda, 241 __getitem__, 279 __init__, 262 count, 85 format, 108, 109 index, 84 join, 99 split, 99 metody specjalne atrybuty, 277, klas, 246, 247 łańcuchów znaków, 99, 285 107 prywatne, 253 statyczne, 245, 262 wirtualne, 262 moduł, 57, 157, 181 argparse, 176 csv, 322 fileinput, 177 math, 71 os, 190 os.path, 190 pickle, 220 pydoc, 404 shelve, 218, 220 struct, 213, 220 moduły liczbowe i matematyczne, nazwy prywatne, 163 obsługujące formaty internetowe, 300 obsługujące protokoły, 299 300 plików, 299 ścieżka szukania, 161 typów danych, 299 umieszczanie, 162 usług, 298 zewnętrzne, 164 związane z kodowaniem, 301 Skorowidz 469 związane z systemem operacyjnym, 300 modyfikacje bazy danych, 364 list, 78 łańcuchów znaków, 104 MongoDB, 367 skalowalność, 370 uruchomienie serwera, 368 MySQL, 357 N narzędzie Alembic, 370 do badania danych, 371 freeze, 187 pip, 302 nazewnictwo, 415 nazwy ścieżek, 190, 193 nierelacyjne bazy danych, 364 notatnik Jupyter, 372 O obiekty jako listy, 278, 281 jako wartości logiczne, 139 mutowalne, 148 plików, 52, 205 typy danych, 273 widoków, 120 obrazowanie danych, 385, 401 obsługa argumentów, 147 błędów, 56 danych, 371 plików, 202 ścieżek plików, 190 wyjątków, 222, 225, 229 odpowiedzi do ćwiczeń, 425–466 okno konsoli, 41 OOP, object-oriented programming, 58 opcje parametrów, 144 operacje na bazie sqlite3, 356 wejścia/wyjścia, 210 operator, 73 *, 83 in, 83 operatory logiczne, 140 ORM, model obiektowo- relacyjny, 357, 370 otwieranie plików, 205 P pakiet, 287, 290 matproj, 288, 291 pex, 186 py2app, 187 py2exe, 187 wheel, 186 zipapp, 186 pakiety instrukcja import, 292 korzystanie, 294 ładowanie, 291 pliki __init__, 291 pamięć operacje, 298 podręczna, 125 parametr self, 262 parametry pozycyjne, 109, 145 przekazywane przez nazwę, 109, 112 parsowanie danych, 392, 397 pętla for, 54, 132, 133 while, 54, 129 pierwszy program, 42 pisanie danych na dysku, 232 plik jedyna1.txt, 178 kolo.py, 246 l_na_n.py, 183 matematyka.py, 158 mio.py, 212 modtest.py, 164 modul_kolor.py, 277 moje_moduły.pth, 163 Poleć książkęKup książkę 470 Skorowidz plik 216 mozolne_przeliczenia.py, nonlocal.py, 150 opcje.py, 176 pliki_01.py, 309–313 prognoza.html, 349 skrypt1.py, 174–181 test.html, 347 test_zakresu.py, 168 zamień.py, 175 zk.py, 257 pliki, 198, 307 __init__, 291 archiwizacja, 311 CSV, 329, 331 danych, 315 Excel, 324, 330 JSON, 339 kompresja, 311 napływ danych, 307 odczyt, 316 odczyt formatu CSV, 324 operacje, 298 pakowanie, 331 płaskie, 320 pobieranie, 333 pomocy Windows, 405 procesowanie, 315 przechowywanie, 310 serializacja obiektów, 215 sprzątanie, 311 tekstowe, 316 tryb binarny, 209 tryby otwierania, 205, 207 XLS/XLSX, 331 z danymi, 329 zamykanie, 206 znaki specjalne, 320 pobieranie danych, 389 przez API, 337 z sieci WWW, 347 dokumentacji, 406 plików, 333 FTP, 334 HTTP/HTTPS, 336 SFTP, 335 polecenie help, 404 os.scandir, 199 pomoc, 404 porównania, 140 PostgreSQL, 357 PowerShell, 180 powłoka interaktywna, 40 preskryptywność, 416 procedura, 144 program analizujący plik tekstowy, 141 programowanie zorientowane obiektowo, OOP, 58, 239 programy, 173, 181 przekierowywanie wejścia, 175 tworzenie, 174 protokoły, 300 przechowywanie wersji, 415 przeglądanie dokumentacji, 404 przekazywanie argumentów, 148 przez nazwę parametru, 146 przekierowanie, 210, 213 wejścia, 175 przepływ sterowania, 129 przestrzenie nazw, 165, 255 przeszukiwanie listy, 84 przypisania, 65 funkcji do zmiennych, 151 puste linie, 410 PyPI, Python Package Index, 304 Python wady, 33 zalety, 30 R ramki danych, 376, 379 raw stringi, 266 Redis, 364 uruchomienie serwera, 365 wygasanie wartości, 366 rekordy, 240 relacyjne bazy danych, 353, 357 repozytorium kodu, 304 S sekwencje formatowania, 111, 112 specjalne, 97 znaków, 95 serializacja obiektów,
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Python. Szybko i prosto. Wydanie III
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: