Automatyzacja nudnych zadań z Pythonem. Nauka programowania. Wydanie II - Al Sweigart

Kup ebooka

119.00 zł
65.45 zł (59,50 zł najniższa cena z 30 dni)

-
Proszę czekać

Wprowadzenie

"W dwie godziny zrobiłeś to, na co nasza trójka zwykle potrze­bowała dwóch dni". Na początku XXI wieku mój współlokator na uniwersytecie pracował w sklepie sprzedającym sprzęt elektroniczny. Od czasu do czasu otrzy­mywali, on i współpracownicy, arkusz kalkulacyjny z cenami tysięcy produktów sprzedawanych w konkurencyjnych sklepach. Zespół składający się trzech pracowników drukował zawartość tego arkusza, a następnie dzielił między siebie ten gruby stos papieru. Następnie sprzedawcy sprawdzali na liście cenę każdego produktu oferowanego przez nich w sklepie i notowali wszystkie, które były oferowane taniej przez konkurencję. Wykonanie tego zadania zwykle zabierało kilka dni.

"Wiecie, mógłbym napisać program ułatwiający nam pracę, gdybym miał tylko oryginalny plik z arkuszem kalkulacyjnym, który drukujecie" - powiedział mój współlokator, gdy zobaczył pracowników firmy siedzących na ziemi wśród porozrzucanych kartek papieru.

Po kilku godzinach miał krótki program odczytujący z pliku ceny produktów w konkurencyjnym sklepie, odszukujący dany produkt w bazie danych sklepu oraz notujący, czy cena konkurencji jest niższa. Mój współlokator nadal był początkującym programistą i podczas pracy nad programem większość czasu poświęcił na przeglądanie dokumentacji w książce. Utworzony przez niego program wykonywał swoje zadanie w zaledwie kilka sekund, więc dzięki temu mój współlokator i jego współpracownicy w sklepie mieli tego dnia dłuższą przerwę śniadaniową.

I to jest prawdziwa potęga programowania. Komputer to wszechstronne narzędzie, które można przystosować do wykonywania niezliczonej ilości zadań. Wiele osób marnuje godziny na klikanie i wpisywanie danych w celu wykonania powtarzających się zadań. Nie mają świadomości, że ich pracę można by wykonać w ciągu dosłownie sekund, o ile będą dostępne odpowiednie polecenia.

Do kogo jest skierowana ta książka?

Oprogramowanie jest fundamentem dla wielu codziennie używanych narzędzi. Niemal każdy komunikuje się za pomocą serwisów społecznościowych, wiele osób ma smartfony z dostępem do internetu, a większość pracowników biurowych musi korzystać z komputera, aby wykonać swoją pracę. Dlatego też mamy obecnie ogromny popyt na osoby, które potrafią programować. Niezliczona ilość książek, interaktywnych samouczków internetowych oraz szkoleń obiecuje zmienić ambitnych początkujących programistów w inżynierów oprogramowania, których zarobki są sześciocyfrowe.

Ta pozycja nie jest skierowana do tego rodzaju osób, ale do wszystkich pozostałych.

Po przeczytaniu książki nie zmienisz się w profesjonalnego programistę, podobnie jak po kilku lekcjach gry na gitarze nie będzie z Ciebie gwiazda rocka. Jeśli jednak jesteś pracownikiem biurowym, administracyjnym, akademickim lub jakąkolwiek inną osobą wykorzystującą komputer w pracy bądź dla rozrywki, poznasz podstawy programowania, które pozwolą na automatyzację prostych zadań. Poniżej podałem przykłady możliwych automatyzacji.

Przeniesienie i zmiana nazwy tysięcy plików oraz sortowanie ich w katalogach. Wypełnienie formularzy internetowych bez konieczności samodzielnego wprowadzania danych. Pobieranie plików lub kopiowanie tekstu z witryny internetowej po jej uaktualnieniu. Otrzymywanie powiadomień tekstowych generowanych przez komputer. Uaktualnienie i formatowanie arkuszy kalkulacyjnych Excela. Sprawdzanie poczty elektronicznej i wysyłanie przygotowanych wcześniej odpowiedzi.

Wymienione zadania są proste, ale jednocześnie ogromnie czasochłonne, kiedy wykonują je ludzie. Równocześnie zwykle pozostają na tyle łatwe i specyficzne, że bardzo często nie ma gotowego oprogramowania pozwalającego na ich zautomatyzowane wykonywanie. Kiedy opanujesz podstawy programowania, zmusisz komputer do wykonywania tego rodzaju zadań za Ciebie.

Konwencje

Książka nie została opracowana w charakterze podręcznika, raczej ma być przewodnikiem dla początkujących. Zastosowany styl programowania jest czasami sprzeczny z najlepszymi praktykami - na przykład w niektórych programach są wykorzystywane zmienne globalne. To jednak niezbędny kompromis, aby omawiane koncepcje stały się łatwiejsze do przyswojenia przez osoby niebędące programistami. Książka jest przeznaczona dla osób tworzących kod jednorazowego użytku i dlatego nie trzeba poświęcać wiele czasu na dopracowanie jego stylu i elegancji. Skomplikowane koncepcje programistyczne, takie jak programowanie zorientowane obiektowo, listy składane i generatory, nie zostały omówione, ponieważ zwiększają poziom trudności rozwiązania, w którym je zastosowano. Doświadczeni programiści mogą dostrzegać sposoby poprawy wydajności działania przedstawionego tutaj kodu. Jednak w tej książce koncentruję się przede wszystkim na przygotowaniu programów najmniejszym możliwym wysiłkiem.

Czym jest programowanie?

W filmach oraz serialach telewizyjnych można często zobaczyć programistów wpisujących z szaloną szybkością tajemnicze strumienie zer i jedynek na jaskrawych ekranach. Jednak nowoczesne programowanie nie jest aż tak niezwykłe. Programowanie to po prostu akt wprowadzenia poleceń przeznaczonych do wykonania przez komputer. Wspomniane polecenia mogą przetwarzać pewne liczby, modyfikować tekst, wyszukiwać informacje w plikach lub komunikować się z innymi komputerami przez internet.

Wszystkie programy wykorzystują podstawowe polecenia w charakterze elementów konstrukcyjnych. Poniżej wymieniłem kilka najczęściej stosowanych.

"Zrób to, następnie zrób tamto". "Jeżeli ten warunek jest prawdziwy, podejmij tę akcję. W przeciwnym razie podejmij tamtą akcję". "Powtórz daną akcję podaną liczbę razy". "Wykonuj to zadanie tak długo, dopóki ten warunek jest prawdziwy".

Dzięki połączeniu tych elementów konstrukcyjnych można zaimplementować bardziej złożoną logikę. Przykładowo poniżej przedstawiłem instrukcje programistyczne nazywane kodem źródłowym prostego programu utworzonego w języku programowania Python. Interpreter Pythona wykonuje poszczególne wiersze kodu (niektóre wiersze są wykonywane tylko wtedy, gdy spełniony jest określony warunek, w przeciwnym razie Python wykonuje inny wiersz kodu), od początku programu aż do jego końca.

passwordFile = open('SecretPasswordFile.txt') ?
secretPassword = passwordFile.read() ?
print('Podaj hasło:') ?
typedPassword = input()
if typedPassword == secretPassword: ?
print('Masz dostęp.') ?
if typedPassword == '12345': ?
print('Takie hasło nierozważni ludzie umieszczają na walizkach.') ?
else:
print('Brak dostępu.') ?

Jeśli nawet nie wiesz nic o programowaniu, prawdopodobnie jesteś w stanie określić przeznaczenie poszczególnych wierszy kodu, po prostu patrząc na nie. Rozpoczynamy od otworzenia pliku o nazwie SecretPasswordFile.txt () oraz odczytu zapisanego w nim tajnego hasła (). Następnie użytkownik jest proszony o wpisanie hasła za pomocą klawiatury (). Oba hasła zostają porównane (). Jeżeli są jednakowe, program wyświetli na ekranie komunikat o treści Masz dostęp (). W kolejnym wierszu () program sprawdza, czy hasło to 12345. Jeżeli tak, wyświetla komunikat informujący, że wybrane hasło nie należy do najlepszych (). Jeśli natomiast porównywane hasła nie są jednakowe, program wyświetli na ekranie komunikat o treści Brak dostępu ().

Co to jest Python?

Nazwa "Python" odwołuje się do języka programowania (wraz z regułami składni dotyczącymi utworzenia poprawnego kodu Pythona) oraz interpretera Pythona, czyli oprogramowania, które odczytuje kod źródłowy (utworzony w języku Python) i wykonuje zapisane w nim polecenia. Interpreter Pythona jest dostępny bezpłatnie do pobrania z witryny https://www.python.org/, w której znajdziesz wersje dla systemów Linux, macOS i Windows.

Warto w tym miejscu dodać, że nazwa tego języka programowania pochodzi od brytyjskiej grupy komediowej Monty Python, a nie od węża. Programiści tworzący kod w tym języku są często określani mianem Pythonistów, a w dokumentacji oraz samouczkach Pythona bardzo często można znaleźć motywy związane zarówno z grupą Monty Python, jak i wężem.

Programiści nie muszą dobrze znać matematyki

Wiele osób obawia się, że nauka programowania niesie ze sobą konieczność dobrej znajomości matematyki. Jednak większość zadań związanych z programowaniem nie wymaga niczego więcej poza podstawową znajomością arytmetyki. Można wręcz stwierdzić, że dobry programista nie różni się zbyt wiele od osoby, która doskonale radzi sobie z rozwiązywaniem Sudoku.

W celu rozwiązania zadania Sudoku cyfry od 1 do 9 trzeba umieścić we wszystkich wierszach i kolumnach, przy czym pełna plansza o wielkości 9×9 pól składa się z dziewięciu wewnętrznych kwadratów o wielkości 3×3. Podczas znajdowania rozwiązania należy zastosować dedukcję oraz logikę na podstawie liczb początkowo umieszczonych na planszy. Spójrz na planszę zamieszczoną na rysunku 0.1. Ponieważ przykładowo liczba 5 znajduje się w pierwszych dwóch wierszach, więc nie może ponownie w nich wystąpić. Dlatego też w prawym górnym kwadracie musi znajdować się w trzecim wierszu. Skoro ostatnia kolumna planszy zawiera już liczbę 5, to nie można jej umieścić w polu po prawej stronie liczby 6. W trzecim wierszu wymienionego kwadratu pozostało tylko pole po lewej stronie liczby 6. Ułożenie jednego wiersza, kolumny lub wewnętrznego kwadratu dostarcza większej liczby wskazówek pomagających w rozwiązaniu całej planszy. W ten sposób najpierw wypełnisz jeden wewnętrzny kwadrat liczb od 1 do 9, później przechodzisz do następnego itd., aż do rozwiązania całej planszy Sudoku.

Rysunek 0.1. Nowa plansza Sudoku (po lewej) oraz jej rozwiązanie (po prawej). Sudoku, pomimo użycia liczb, nie wymaga dobrej znajomości matematyki. Obraz pochodzi z zasobów Wikimedia Commons

Wprawdzie Sudoku oparte jest na liczbach, ale to nie oznacza, że musisz być dobry z matematyki, aby znaleźć rozwiązanie. To samo tyczy się programowania. Podobnie jak w Sudoku, tworzenie programu polega na podzieleniu problemu na mniejsze, bardziej szczegółowe kroki. Również w trakcie debugowania programów (czyli wyszukiwania i usuwania w nich błędów) cierpliwie obserwujesz sposób działania programu, a następnie usuwasz przyczyny błędów. Tak jak ma to miejsce przy wszystkich umiejętnościach, im więcej będziesz programował, tym lepiej będziesz to robił.

Nigdy nie jest za późno na rozpoczęcie nauki programowania

Istnieje jeszcze jeden mit związany z programowaniem - wiele osób uważa, że są zbyt starzy na rozpoczęcie nauki programowania. W internecie spotkałem się z wieloma komentarzami napisanymi przez osoby, które uważały, że dla nich jest już za późno na naukę programowania, ponieważ mają na przykład 23 lata. To zdecydowanie nie jest "zbyt późno", a wiele osób zabiera się za programowanie, mając wiele więcej lat.

Aby stać się dobrym programistą, wcale nie trzeba rozpoczynać nauki jako dziecko. Mimo to wiele osób nadal tak uważa. Niestety i ja mogę się przyczyniać do tego przeświadczenia, gdy mówię innym, że zacząłem programować, będąc w szkole średniej.

Obecnie nauka programowania stała się znacznie łatwiejsza niż w latach dziewięćdziesiątych ubiegłego wieku. Dzisiaj mamy wiele książek na ten temat, lepsze wyszukiwarki internetowe, a także dużo witryn internetowych z pytaniami i odpowiedziami na tematy związane z programowaniem. Poza tym same języki programowania stały się znacznie bardziej przyjazne użytkownikom. Dlatego też wszystko to, czego nauczyłem się w zakresie programowania, będąc w szkole średniej, dzięki dzisiaj dostępnym zasobom mógłbym nauczyć się w ciągu zaledwie dziesięciu tygodni. Jak widzisz, wcale nie mam tak dużej przewagi nad osobą, która dopiero rozpoczyna przygodę z programowaniem.

Bardzo ważne znaczenie ma również odpowiednie "nastawienie" do programowania - innymi słowy zrozumienie, że umiejętności w zakresie programowania nabywa się poprzez praktykę. Nie istnieją urodzeni programiści. Jeśli dzisiaj nie potrafisz programować, to wcale nie oznacza, że nigdy nie staniesz się prawdziwym ekspertem w tej dziedzinie.

Programowanie to aktywność kreatywna

Programowanie zalicza się do zadań kreatywnych, tak jak na przykład malowanie, pisanie, robienie na drutach lub budowanie zamku z klocków Lego. Podobnie jak podczas malowania, także podczas tworzenia oprogramowania napotykasz na wiele ograniczeń, choć dostępne możliwości są praktycznie nieskończone.

Różnica między programowaniem a innymi zadaniami kreatywnymi polega na tym, że podczas programowania wszystkie niezbędne materiały znajdują się w komputerze. Nie musisz kupować żadnych dodatkowych materiałów, takich jak płótno, farba, przędza, klisze, klocki Lego, części elektroniczne i tak dalej. Dziesięcioletni komputer w zupełności wystarczy do tworzenia programów. Program po opracowaniu można kopiować praktycznie nieskończoną liczbę razy. Sweter zrobiony na drutach może w danej chwili nosić tylko jedna osoba, zaś użyteczny program można bardzo łatwo udostępnić w postaci elektronicznej całemu światu.

O tej książce

W części pierwszej książki przedstawiłem podstawowe koncepcje programistyczne Pythona, natomiast część druga to przejście do różnych zadań, których wykonywanie można zautomatyzować przy użyciu komputera. Każdy rozdział w części drugiej to projekt programów do przeanalizowania. Poniżej przedstawiłem krótkie omówienie materiału, który znajdziesz w poszczególnych rozdziałach.

Część pierwsza - "Podstawy programowania w Pythonie"

Rozdział 1. "Podstawy programowania w Pythonie" - w tym rozdziale poznasz wyrażenia, czyli najprostszy typ polecenia w Pythonie. Ponadto dowiesz się, jak używać interaktywnej powłoki Pythona w celu prowadzenia eksperymentów z kodem. Rozdział 2. "Kontrola przepływu działania programu" - w tym rozdziale wyjaśniam, jak pozwolić programowi na ustalenie, które polecenia w kodzie źródłowym powinny być wykonane. Dzięki temu program może inteligentnie reagować na różne warunki. Rozdział 3. "Funkcje" - w tym rozdziale dowiesz się, jak zdefiniować własne funkcje, z pomocą których zyskasz możliwość organizacji kodu na fragmenty łatwiejsze do zarządzania. Rozdział 4. "Listy" - w tym rozdziale omawiam typ danych, jakim są listy, i wyjaśniam, jak można organizować dane. Rozdział 5. "Słowniki i strukturyzacja danych" - w tym rozdziale przedstawiam typ danych, jakim jest słownik, i pokazuję charakteryzujące się jeszcze większymi możliwościami sposoby organizacji danych. Rozdział 6. "Operacje na ciągach tekstowych" - w tym rozdziale zajmuję się pracą z danymi tekstowymi, które w Pythonie są nazywane ciągami tekstowymi.

Część druga - "Automatyzacja zadań"

Rozdział 7. "Dopasowanie wzorca za pomocą wyrażeń regularnych" - w tym rozdziale dowiesz się, jak Python może operować ciągami tekstowymi oraz wyszukiwać w nich wzorce tekstowe za pomocą wyrażeń regularnych. Rozdział 8. "Weryfikaja danych wejściowych" - w tym rozdziale pokazuję, jak program może sprawdzać informacje przekazywane przez użytkownika i tym samym zagwarantować, że dane są dostarczane w formacie, który nie spowoduje błędów w pozostałej części programu. Rozdział 9. "Odczyt i zapis plików" - w tym rozdziale wyjaśniam, jak programy mogą odczytywać zawartość plików tekstowych oraz zapisywać informacje w plikach umieszczanych na dysku twardym. Rozdział 10. "Organizacja plików" - w tym rozdziale pokazuję, jak Python może kopiować, przenosić, zmieniać nazwę oraz usuwać ogromne ilości plików znacznie szybciej, niż zrobi to użytkownik. Ponadto poruszam temat kompresji i dekompresji plików. Rozdział 11. "Usuwanie błędów" - w tym rozdziale dowiesz się, jak wykorzystać różne oferowane przez Pythona narzędzia przeznaczone do wyszukiwania i usuwania błędów. Rozdział 12. "Pobieranie danych z internetu" - w tym rozdziale dowiesz się, jak tworzyć programy automatycznie pobierające strony internetowe i przetwarzające znajdujące się na nich informacje. Tego rodzaju działanie to web scraping. Rozdział 13. "Praca z arkuszami kalkulacyjnymi programu Excel" - w tym rozdziale zajmuję się tematem programowego przekształcania arkuszy kalkulacyjnych Excela, aby uniknąć konieczności ich odczytu. Taka możliwość okazuje się niezwykle pomocna, gdy liczba dokumentów koniecznych do przeanalizowania sięga setek lub tysięcy. Rozdział 14. "Praca z Arkuszami Google" - w tym rozdziale pokazuję, jak można za pomocą Pythona odczytywać i uaktualniać dokumenty utworzone przy użyciu popularnej aplikacji internetowej Arkusze Google. Rozdział 15. "Praca z dokumentami PDF i Worda" - w tym rozdziale dowiesz się, jak w sposób programowy odczytywać dokumenty w formatach PDF i procesora tekstu Microsoft Word. Rozdział 16. "Praca z plikami CSV i danymi JSON" - w tym rozdziale kontynuuję omówienie sposobów programowego analizowania dokumentów. Tym razem to będą pliki w formatach CVS i JSON. Rozdział 17. "Czas, harmonogram zadań i uruchamianie programów" - w tym rozdziale zobaczysz, jak w programach Pythona obsługiwana jest data i godzina. Ponadto pokazuję przygotowanie harmonogramu, aby komputer wykonywał zadania w określonym czasie. W tym rozdziale dowiesz się również, jak w programach Pythona można uruchamiać inne aplikacje, nieutworzone w Pythonie. Rozdział 18. "Wysyłanie wiadomości e-mail i tekstowych" - w tym rozdziale dowiesz się, jak opracować pogramy, które w Twoim imieniu mogą wysyłać wiadomości e-mail oraz tekstowe. Rozdział 19. "Praca z obrazami" - w tym rozdziale przedstawiam sposób programowej pracy z obrazami w formatach, takich jak JPEG i PNG. Rozdział 20. "Kontrolowanie klawiatury i myszy za pomocą automatyzacji GUI" - w tym rozdziale zajmuję się tematem programowego kontrolowania myszy i klawiatury w celu automatyzacji kliknięć i naciśnięć klawiszy. Dodatek A "Instalowanie modułów zewnętrznych" - w tym dodatku zajmuję się tematem rozszerzenia możliwości Pythona za pomocą użytecznych modułów. Dodatek B "Uruchamianie programów" - w tym dodatku dowiesz się, jak tworzone programy można uruchamiać w systemach Windows, macOS i Linux bez konieczności używania wybranego środowiska programistycznego, na przykład IDLE. Dodatek C "Odpowiedzi na pytania kontrolne" - w tym dodatku znajdują się odpowiedzi na pytania kontrolne, które zamieściłem na końcu poszczególnych rozdziałów.

Pobieranie i instalacja Pythona

Pythona można pobrać bezpłatnie dla systemów Windows, macOS i Linux ze strony https://www.python.org/downloads/. Jeżeli pobierzesz najnowszą dostępną wersję z podanej strony, wszystkie programy przedstawione w tej książce powinny działać.

Ostrzeżenie

Upewnij się, że pobrałeś Pythona w wersji 3. (na przykład 3.8.0), ponieważ programy przedstawione w książce zostały opracowane dla Pythona 3 i mogą nie działać prawidłowo (bądź nawet w ogóle) w Pythonie 2.

Na podanej wcześniej stronie znajdziesz pliki instalacyjne dla komputerów 32- i 64-bitowych działających pod kontrolą różnych systemów operacyjnych. Jeżeli Twój komputer pochodzi z roku 2007 lub późniejszego, prawdopodobnie ma architekturę 64-bitową. W przeciwnym razie korzystasz z komputera 32-bitowego. A tak możesz to sprawdzić w różnych systemach operacyjnych.

W systemie Windows wybierz Start/Panel sterownia/System, a następnie sprawdź, co zostało wyświetlone w wierszu Typ systemu: 32-bitowy lub 64-bitowy system operacyjny. W systemie macOS kliknij menu Apple, a następnie wybierz opcję Ten Mac.... W wyświetlonym oknie kliknij przycisk Raport systemowy.... Domyślnie powinna być rozwinięta sekcja Sprzęt. Teraz spójrz na wiersz Nazwa procesora. Jeżeli widzisz Intel Core Solo lub Intel Core Duo, masz komputer 32-bitowy. W przeciwnym razie (na przykład Intel Core 2 Duo) masz komputer 64-bitowy. W systemie Linux, na przykład Ubuntu, otwórz terminal i wydaj polecenie uname -m1. Odpowiedź i686 oznacza komputer 32-bitowy, natomiast x86_64 wskazuje na komputer 64-bitowy.

W systemie Windows pobierz program instalacyjny Pythona (to będzie plik o rozszerzeniu .msi) i dwukrotnie go kliknij. W celu instalacji Pythona wykonuj polecenia wyświetlane na ekranie.

Wybierz instalację dla wszystkich użytkowników i kliknij Dalej. Kliknij Dalej, aby zaakceptować ustawienia domyślne i pominąć etap dostosowania Pythona do własnych potrzeb.

W systemie macOS pobierz plik z rozszerzeniem .dmg przeznaczony dla używanej wersji systemu. Dwukrotnie kliknij plik Python.mpkg. W wyświetlonym oknie dialogowym podaj hasło użytkownika z uprawnieniami administratora.

Kiedy zawartość pakietu DMG zostanie wyświetlona w nowym oknie, dwukrotnie kliknij Python.mpkg. Teraz w wyświetlonym oknie dialogowym podaj hasło użytkownika z uprawnieniami administratora. Kliknij przycisk Dalej w oknie zatytułowanym Wstęp, a następnie przycisk Akceptuję, aby zaakceptować warunki licencji. Wybierz Macintosh HD (lub inną nazwę, którą nadałeś dyskowi twardemu) i kliknij przycisk Instaluj.

W systemie Linux instalację Pythona możesz przeprowadzić z poziomu powłoki. Przykładowo w dystrybucji Ubuntu należy wykonać poniższe kroki2.

Otwórz okno narzędzia Terminal. Wydaj polecenie sudo apt-get install python3. Wydaj polecenie sudo apt-get install idle3. Wydaj polecenie sudo apt-get install python3-pip.

Pobieranie i instalowanie edytora tekstu Mu

Interpreter Pythona to oprogramowanie pozwalające na uruchamianie gotowych programów Pythona, natomiast edytor tekstu Mu to oprogramowanie umożliwiające wpisywanie kodu programu, podobnie jak wpisujesz tekst w procesorze tekstu. Wymieniony edytor możesz pobrać z witryny https://codewith.mu/.

W systemach Windows i macOS pobierz odpowiedni program instalacyjny, a następnie uruchom go, dwukrotnie klikając ikonę pobranego pliku. Jeżeli korzystasz z systemu macOS, na ekranie zostanie wyświetlone okno, w którym musisz kliknąć ikonę edytora Mu i przeciągnąć ją na ikonę katalogu Programy. Z kolei w dystrybucji Ubuntu konieczne jest zainstalowanie Mu jako pakietu Pythona. W takim przypadku kliknij przycisk Instructions w sekcji Python Package na stronie Download Mu w podanej witrynie.

Uruchomienie edytora Mu

Po zainstalowaniu edytora Mu można go uruchomić.

W systemie Windows 7 lub nowszym należy kliknąć menu Start w lewym dolnym rogu ekranu, a następnie w polu wyszukiwania wpisać Mu, zaznaczyć Mu i nacisnąć klawisz Enter. W systemie macOS należy otworzyć okno Findera, kliknąć katalog Programy w pasku bocznym po lewej stronie, a następnie dwukrotnie kliknąć ikonę mu-editor. W systemie Linux należy wybrać opcję menu Aplikacje/Akcesoria/Terminal, a następnie wydać polecenie python3 -m mu.

W trakcie pierwszego uruchomienia Mu na ekranie zostanie wyświetlone okno zatytułowane Wybierz Tryb z opcjami Adafruit CircuitPython, BBC micro:bit, Pygame Zero i Python 3. Wybierz opcję Python 3. Wybór zawsze możesz później zmienić przez kliknięcie przycisku Tryb na pasku narzędzi edytora.

Uwaga

Aby mieć możliwość instalowania modułów zewnętrznych użytych w książce, musisz pobrać Mu w wersji 1.1.0 lub nowszej. W czasie powstawania książki 1.1.0 to wersja alfa, która na stronie Download Mu została umieszczona w oddzielnej sekcji.

Uruchomienie środowiska IDLE

W książce użyłem Mu jako edytora i powłoki interaktywnej, ale kod Pythona można tworzyć także za pomocą wielu innych programów. Przykładowo środowisko IDLE (ang. interactive development environment) jest instalowane razem z Pythonem i może służyć do tworzenia programów Pythona, np. jeśli z jakiegokolwiek powodu nie możesz zainstalować Mu. Przystępujemy teraz do uruchomienia IDLE.

W systemie Windows 7 lub nowszym kliknij menu Start w lewym dolnym rogu ekranu, a następnie w polu wyszukiwania wpisz IDLE i zaznacz IDLE (Python GUI). W systemie macOS otwórz okno Findera, kliknij Programy w pasku bocznym po lewej stronie, dwukrotnie kliknij katalog Python 3.8, a następnie dwukrotnie kliknij ikonę IDLE. W systemie Ubuntu wybierz Aplikacje/Akcesoria/Terminal, a następnie w oknie narzędzia Terminal wydaj polecenie idle3. (Być może będziesz mógł także kliknąć menu Aplikacje na górze ekranu, a następnie wybrać menu Programowanie i później IDLE 3).

Powłoka interaktywna

Po uruchomieniu edytora Mu wyświetlone na ekranie okno jest nazywane oknem edytora pliku. Kliknięcie przycisku REPL powoduje wyświetlenie okna powłoki interaktywnej. Powłoka to program pozwalający na bezpośrednie wydawanie poleceń komputerowi, podobnie jak ma to miejsce w narzędziu Terminal w systemie macOS lub w narzędziu Wiersz polecenia w Windows. Powłoka interaktywna Pythona umożliwia wydawanie poleceń wykonywanych przez interpretera Pythona.

W edytorze Mu powłoka interaktywna to panel wyświetlany w dolnej części okna, który zawiera następujące informacje.

Jupyter QtConsole 4.3.1
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit
(AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]:

Jeżeli uruchomisz środowisko IDLE, na ekranie będzie wyświetlone okno powłoki interaktywnej. Powinno być ono niemal puste i zawierać jedynie tekst podobny do przedstawionego poniżej.

Python 3. 8.0b1 (tags/v3.8.0b1:3b5deb0116, Jun 4 2019, 19:52:55) [MSC v.1916 64 bit
(AMD64)] on win32
Type "copyright", "credits" or "license" for more information.
>>>

W powłoce interaktywnej Pythona In [1]: i >>> nazywamy znakami zachęty. W przykładach przedstawionych w książce został użyty znak zachęty >>>, ponieważ jest on najczęściej spotykany. Jeżeli interpreter Pythona uruchomiłeś z poziomu narzędzia, takiego jak Terminal lub Wiersz polecenia, również zobaczysz wyświetlony znak zachęty >>>. Natomiast znak zachęty In [1]: jest stosowany w Jupyter Notebook, czyli innym popularnym edytorze do tworzenia kodu między innymi Pythona.

Przykładowo w powłoce interaktywnej po znaku zachęty >>> wpisz poniższe polecenie.

>>> print('Witaj, świecie!')

Po wpisaniu polecenia i naciśnięciu klawisza Enter powłoka interaktywna powinna natychmiast wyświetlić wygenerowaną odpowiedź, co pokazałem poniżej.

>>> print('Witaj, świecie!')
Witaj, świecie!

W ten sposób wydałeś polecenie komputerowi, który zrobił dokładnie to, co mu kazałeś!

Instalowanie modułów zewnętrznych

Niektóre z programów omówionych w książce wymagają zaimportowania pewnych modułów zewnętrznych. Część tych modułów jest dostarczana razem z Pythonem, natomiast inne zostały utworzone przez programistów niebędących w zespole rozwijającym Pythona. W dodatku A znajdziesz dokładne informacje dotyczące użycia programu pip (Windows) lub pip3 (macOS i Linux) do instalowania modułów zewnętrznych. Jeżeli nie będziesz wiedział, jak zainstalować dany moduł, zajrzyj do wymienionego dodatku.

Jak otrzymać pomoc?

Programiści uczą się, wyszukując w internecie odpowiedzi na nurtujące ich pytania. To jest zupełnie odmienne podejście do nauki niż to, do którego przywykło wiele osób - indywidualne sesje, w trakcie których nauczyciel prowadzi wykład i odpowiada na pytania. Doskonałą zaletą internetu jest to, że istnieje w nim wiele społeczności, których członkowie chętnie odpowiadają na pytania.

Nurtujące Cię pytania prawdopodobnie zostały już wcześniej zadane, a odpowiedzi na nie znajdują się w internecie. Jeżeli napotkasz komunikat błędu lub masz problem z uruchomieniem pewnego fragmentu kodu, raczej nie jesteś pierwszą osobą, która się zetknęła z danym problemem, a znalezienie rozwiązania może okazać się łatwiejsze, niż sądzisz.

Jeżeli nie jesteś o tym przekonany, to teraz celowo wprowadzimy błąd w kodzie Pythona. Dlatego też w powłoce interaktywnej wpisz '42' + 3. Nie musisz znać dokładnego sposobu działania wydanego polecenia, natomiast wygenerowane dane wyjściowe powinny być podobne do poniższych.

>>> '42' + 3
Traceback (most recent call last): ?
File "<pyshell#0>", line 1, in <module>
'42' + 3
TypeError: Can't convert 'int' object to str implicitly ?
>>>

Wygenerowany został komunikat błędu (), ponieważ Python nie zrozumiał polecenia. Fragment oznaczony jako Traceback () komunikatu błędu zawiera konkretne polecenie i numer wiersza, z którym Python ma problem. Jeżeli nie jesteś pewny znaczenia tego konkretnego komunikatu błędu, jego treść wpisz w ulubionej wyszukiwarce internetowej. W omawianym przykładzie oznacza to wpisanie "TypeError: Can't convert 'int' object to str implicitly" wraz ze znakami cudzysłowów. Otrzymasz dosłownie setki wyników prowadzących na strony zawierające wyjaśnienie komunikatu błędu i przyczyn jego powstawania, tak jak pokazałem na rysunku 0.2.

Rysunek 0.2. Wygenerowane przez wyszukiwarkę internetową Google wyniki dla podanego komunikatu błędu

Bardzo często znajdziesz inną osobę, która spotkała się z tym samym problemem. Być może ktoś już wcześniej udzielił jej odpowiedzi na pytanie dotyczące danego błędu. Nikt nie jest doskonały i nikt nie wie wszystkiego o programowaniu. Dlatego też programiści każdego dnia szukają w internecie odpowiedzi na pojawiające się pytania techniczne.

Sprytne zadawanie pytań dotyczących programowania

Jeżeli nie możesz znaleźć odpowiedzi na nurtujące Cię pytanie, spróbuj zadać je na forum internetowym, takim jak Stack Overflow (https://stackoverflow.com/), lub w sekcji "learn programming", w witrynie Reddit (https://www.reddit.com/r/learnprogramming/). Pamiętaj o istnieniu sprytnych sposobów na zadawanie pytań, które zwiększają Twoje szanse na otrzymanie odpowiedzi. Przeczytaj sekcję FAQ danego forum, aby dowiedzieć się więcej na temat poprawnego zadawania pytań.

Kiedy zadajesz pytanie z dziedziny programowania, powinieneś pamiętać o wymienionych poniżej kwestiach.

Wyjaśnij to, co chcesz zrobić, a nie jedynie to, co już zrobiłeś. Dzięki temu osoba próbująca Ci pomóc będzie wiedzieć, czy znajdujesz się na właściwej drodze. Dokładnie wskaż miejsce, w którym występuje błąd. Czy pojawia się na samym początku działania programu, czy po wykonaniu określonej czynności? W serwisach https://pastebin.com/ lub https://gist.github.com/ wklej cały komunikat błędu oraz utworzony przez Ciebie kod źródłowy programu.

Wymienione witryny internetowe ułatwiają współdzielenie się ogromną ilością kodu źródłowego z innymi osobami w internecie bez utraty jakiegokolwiek formatowania tekstu. Wygenerowany adres URL możesz później wkleić do wiadomości e-mail lub do postu publikowanego na forum. A to przykładowe fragmenty kodu opublikowane przeze mnie: https://pastebin.com/SzP2DbFx/ i https://gist.github.com/asweigart/6912168/.

Wyjaśnij, w jaki sposób próbowałeś rozwiązać problem. W ten sposób pokazujesz innym, że przynajmniej sam próbowałeś poradzić sobie z problemem. Podaj dokładną wersję używanego Pythona. (Istnieją pewne ważne różnice między interpreterami Pythona w wersjach 2. i 3.). Ponadto podaj również nazwę używanego systemu operacyjnego i jego wersję. Jeżeli błąd pojawia się po wprowadzeniu zmiany w kodzie, dokładnie wyjaśnij, na czym polega ta zmiana. Poinformuj o tym, czy jesteś w stanie odtworzyć błąd za każdym razem, gdy uruchamiasz program, czy też występuje jedynie po wykonaniu określonych czynności. W tym drugim przypadku dokładniej wyjaśnij te czynności.

Zawsze stosuj się do dobrej etykiety zachowania w internecie. Przykładowo nie publikuj pytań napisanych wielkimi literami, a także nie wysuwaj nieuzasadnionych żądań względem osób, które próbują Ci pomóc.

Więcej informacji na temat zadawania pytań związanych z problemami napotkanymi podczas programowania znajdziesz w poście bloga opublikowanym na stronie https://inventwithpython.com/blog/2018/02/02/how-to-ask-for-programming-help/. Lista najczęściej zadawanych pytań dotyczących programowania została zamieszczona na stronie https://www.reddit.com/r/learnprogramming/wiki/faq/. Podobna lista, ale dotycząca zdobycia pracy związanej z tworzeniem oprogramowania, znajduje się na stronie https://www.reddit.com/r/cscareerquestions/wiki/index/.

Uwielbiam pomagać innym w odkrywaniu Pythona. Na moim blogu pod adresem https://inventwithpython.com/blog/ znajdziesz wiele napisanych przeze mnie samouczków. Jeżeli masz pytania, napisz do mnie na adres al@inventwithpython.com. Odpowiedź możesz otrzymać znacznie szybciej, gdy pytanie zadasz na stronie https://www.reddit.com/r/inventwithpython/.

Podsumowanie

Dla większości osób komputer to zaledwie urządzenie, a nie narzędzie. Jeżeli nauczysz się programować, uzyskasz dostęp do jednego z najpotężniejszych narzędzi na świecie, a przy okazji przeżyjesz niezłą przygodę. Programowanie to nie jest operacja na mózgu - początkujący mogą śmiało eksperymentować i popełniać błędy.

Książka ta jest przeznaczona również dla osób, które nie mają żadnego doświadczenia w programowaniu. Jednak w takim przypadku mogą pojawić się pytania, na których odpowiedzi wykraczać będą poza zakres tematyczny książki. Pamiętaj, że efektywne zadawanie pytań oraz umiejętność znajdowania na nie odpowiedzi to nieocenione narzędzia podczas podróży programistycznej.

Zatem zaczynamy!

1 Ten sam sposób sprawdzenia możesz zastosować także w systemie macOS - przyp. tłum.

2 Zamiast trzech poleceń w krokach od 2. do 4. można wydać jedno sudo apt-get install python3 idle3 python3-pip - przyp. tłum.

Część I. Podstawy programowania w Pythonie

1. Podstawy Pythona

Język programowania Python zawiera wiele syntaktycz­nych kon­strukcji, funkcje biblioteki standardowej oraz inter­akty­wne środowisko programowania. Na szczęście można zignorować większość tych cech i zdobyć jedynie taką ilość wiedzy, jaka jest potrzebna do tworzenia pewnych nie­wielkich, choć jednocześnie niezwykle użytecznych programów.

Jednak zanim podejmiesz jakiekolwiek działania, najpierw musisz poznać podstawowe koncepcje stosowane w programowaniu. Podobnie jak czarodziej w trakcie szkolenia, także i Ty być może sądzisz, że koncepcje te są trudne do opanowania. Jednak mając pewną wiedzę i doświadczenie, będziesz w stanie kierować komputerem w taki sposób, jakbyś miał czarodziejską różdżkę przeznaczoną do wykonywania niesamowitych sztuczek.

W tym rozdziale przedstawiłem kilka przykładów, które mają zachęcić Cię do wpisywania kodu w tak zwanej powłoce interaktywnej, określanej również mianem REPL (ang. read-evaluate-print loop). Wymieniona powłoka pozwala na natychmiastowe wykonywanie poleceń Pythona i wyświetla wyniki ich działania. Użycie powłoki interaktywnej to doskonały sposób na poznanie podstaw Pythona, więc korzystaj z niej podczas lektury rozdziału. Znacznie lepiej będziesz zapamiętywać informacje, gdy samodzielnie wykonasz kolejne kroki, a nie ograniczysz się jedynie się do przeczytania tekstu.

Wprowadzanie wyrażeń w powłoce interaktywnej

Dostęp do powłoki interaktywnej Pythona masz za pomocą na przykład edytora Mu, który pobrałeś i zainstalowałeś, korzystając z informacji zamieszczonych we wprowadzeniu. W systemie Windows kliknij menu Start, a następnie wpisz Mu i uruchom aplikację Mu. W systemie macOS przejdź do katalogu Programy, a następnie dwukrotnie kliknij ikonę mu-editor. Kliknij przycisk Nowy i zapisz pusty plik pod nazwą blank.py. Po jego uruchomieniu przez kliknięcie przycisku Wykonuj lub naciśnięcie klawisza F5 na ekranie zostanie wyświetlona powłoka interaktywna w postaci nowego panelu znajdującego się w dolnej części okna edytora Mu. W tej powłoce interaktywnej powinieneś zobaczyć znak zachęty >>>.

Po znaku zachęty wpisz 2 + 2, aby Python wykonał prostą operację matematyczną.

>>> 2 + 2
4
>>>

W Pythonie wpisany powyżej fragment 2 + 2 jest wyrażeniem, które przedstawia najbardziej podstawowy rodzaj polecenia programistycznego w tym języku. Wyrażenia składają się z wartości (na przykład 2) i operatorów (na przykład +), które mogą być zawsze sprowadzane (inaczej redukowane) do pojedynczej wartości. Oznacza to, że wyrażeń można używać w dowolnym miejscu kodu Pythona, podobnie jak wartości.

W powyższym przykładzie wyrażenie 2 + 2 jest sprowadzone do pojedynczej wartości 4. Ta pojedyncza wartość bez operatorów jest również uznawana za wyrażenie, choć sprowadza się do samej siebie, jak pokazałem poniżej.

>>> 2
2

Błędy są w porządku

Program ulegnie awarii, jeśli zawiera kod, którego komputer "nie rozumie". W takim przypadku Python wyświetli komunikat błędu. Tego rodzaju komunikat błędu nie zaszkodzi komputerowi, więc nie musisz obawiać się popełniania błędów. W omawianym przypadku awaria oznacza po prostu, że program niespodziewanie przestał działać.

Jeśli chcesz dowiedzieć się więcej o danym błędzie, w ulubionej wyszukiwarce internetowej wpisz dokładny komunikat błędu. Ponadto na stronie https:// inventwithpython.com/appendixd.html znajdziesz listę najczęściej występujących błędów Pythona oraz ich opis.

Istnieje jeszcze wiele innych operatorów, których można używać w wyrażeniach Pythona. W tabeli 1.1 wymieniłem wszystkie operatory matematyczne stosowane w Pythonie.

Tabela 1.1. Operatory matematyczne wymienione w kolejności pierwszeństwa

Operator

Opis

Przykład

Wynik działania

**

Wykładnik potęgi

2 ** 3

8

%

Modulo, reszta z dzielenia

22 % 8

6

//

Dzielenie liczb całkowitych

22 // 8

2

/

Dzielenie

22 / 8

2.75

*

Mnożenie

3 * 5

15

-

Odejmowanie

5 - 2

3

+

Dodawanie

2 + 2

4

Kolejność operacji (nazywana również pierwszeństwem) jest w Pythonie podobna do stosowanej w matematyce. Operator ** jest obliczany jako pierwszy. Następnie będą obliczane operatory *, /, // i %, od lewej do prawej strony. Jako ostatnie są obliczane operatory + i - (także od lewej do prawej strony). Jeśli trzeba, użycie nawiasów pozwala na wymuszenie zastosowania innej kolejności. Białe znaki między operatorami i wartościami nie mają znaczenia dla Pythona (wyjątkiem są wcięcia na początku wiersza). Jednak zgodnie z konwencją stosuje się pojedynczą spację między operatorami i wartościami. W powłoce interaktywnej wpisz przedstawione poniżej wyrażenia.

>>> 2 + 3 * 6
20
>>> (2 + 3) * 6
30
>>> 48565878 * 578453
28093077826734
>>> 2 ** 8
256
>>> 23 / 7
3.2857142857142856
>>> 23 // 7
3
>>> 23 % 7
2
>>> 2 + 2
4
>>> (5 - 1) * ((7 + 1) / (3 - 1))
16.0

W każdym przypadku jako programista musisz wpisać podane wyrażenia, natomiast Python wykona trudniejszą pracę, czyli sprowadzi je do pojedynczej wartości. Python będzie wykonywał obliczenia, dopóki wyrażenie nie stanie się pojedynczą wartością, tak jak pokazałem na rysunku 1.1.

Rysunek 1.1. Obliczenie wyrażenia powoduje sprowadzenie go do pojedynczej wartości

Zasady łączenia operatorów i wartości w celu utworzenia wyrażenia są fundamentalną częścią Pythona jako języka programowania. Zasady te przypominają stosowane w gramatyce, z pomocą których możemy poprawnie komunikować się w naszym języku. Spójrz na poniższy przykład.

To jest zdanie poprawne gramatycznie w języku polskim.

To gramatycznie jest zdanie nie w języku polskim poprawne.

Drugie zdanie jest trudne do zrozumienia, ponieważ nie jest zgodne z zasadami gramatyki języka polskiego. Jeśli zatem wpiszesz nieprawidłowe polecenie Pythona, interpreter języka nie zrozumie go i wyświetli komunikat błędu typu SyntaxError, jak pokazałem poniżej.

>>> 5 +
File "<stdin>", line 1
5 +
^
SyntaxError: invalid syntax
>>> 42 + 5 + * 2
File "<stdin>", line 1
42 + 5 + * 2
^
SyntaxError: invalid syntax

Zawsze możesz sprawdzić, czy dane polecenie działa poprawnie. W tym celu wystarczy je wpisać w powłoce interaktywnej. Nie obawiaj się, że coś popsujesz w komputerze. W najgorszym przypadku Python wygeneruje komunikat błędu. W trakcie tworzenia kodu profesjonalni programiści nieustannie otrzymują komunikaty błędów.

Liczby całkowite, zmiennoprzecinkowe i ciągi tekstowe

Pamiętaj, że połączenie wartości oraz operatorów tworzy wyrażenia, które zawsze są sprowadzane do pojedynczej wartości. Typ danych jest kategorią dla wartości, z których każda należy do dokładnie jednego typu danych. Najczęściej używane typy danych w Pythonie wymieniłem w tabeli 1.2. Przykładowo wartości -2 i 30 są nazywane wartościami w postaci liczb całkowitych. Ten typ danych (int) wskazuje wartości będące liczbami całkowitymi. Natomiast liczby zawierające część ułamkową, takie jak 3.14, są nazywane liczbami zmiennoprzecinkowymi (typ danych float). Zwróć uwagę, że choć wartość 42 jest liczbą całkowitą, to 42.0 jest już uznawana za liczbę zmiennoprzecinkową.

Tabela 1.2. Najczęściej używane typy danych

Typy danych

Przykłady

Liczby całkowite

-2, -1, 0, 1, 2, 3, 4, 5

Liczby zmiennoprzecinkowe

-1.25, -1.0, --0.5, 0.0, 0.5, 1.0, 1.25

Ciągi tekstowe

'a', 'aa', 'aaa', 'Witaj!', '11 kotów'

Programy w języku Python mogą zawierać także wartości tekstowe nazywane ciągami tekstowymi (typ danych str). Ciąg tekstowy zawsze jest ujęty w apostrofy (na przykład 'Witaj' lub 'Żegnaj okrutny świecie'). Ujęcie w apostrofy to dla Pyt­hona informacja, gdzie zaczyna się i gdzie kończy ciąg tekstowy. Istnieje nawet możliwość utworzenia ciągu tekstowego bez żadnych znaków (''), który nazywamy pustym ciągiem tekstowym. Dokładne omówienie ciągów tekstowych znajdziesz w rozdziale 4.

Jeśli kiedykolwiek otrzymasz komunikat błędu typu SyntaxError: EOL while scanning string literal, oznacza on, że prawdopodobnie zapomniałeś umieścić apostrof na końcu ciągu tekstowego, tak jak pokazałem poniżej.

>>> 'Witaj, świecie!
SyntaxError: EOL while scanning string literal

Konkatenacja i replikacja ciągu tekstowego

Znaczenie operatora może ulec zmianie, w zależności od typu danych wartości. Przykładowo + jest operatorem dodawania, o ile operuje na dwóch liczbach całkowitych lub zmiennoprzecinkowych. Kiedy jednak użyjemy operatora + między dwoma ciągami tekstowymi, staje się operatorem konkatenacji ciągu tekstowego. W powłoce interaktywnej wprowadź poniższe polecenie.

>>> 'Alicja' + 'Bartek'
'AlicjaBartek'

Powyższe wyrażenie zostało sprowadzone do postaci pojedynczego, nowego ciągu tekstowego łączącego dwa podane. Jeżeli spróbujesz użyć operatora + wraz z wartościami ciągu tekstowego i liczby całkowitej, wtedy Python nie obsłuży tej sytuacji i wygeneruje komunikat błędu, jak pokazałem poniżej.

>>> 'Alicja' + 42
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'Alicja' + 42
TypeError: can only concatenate str (not "int") to str

Wygenerowany komunikat błędu o treści can only concatenate str (not "int") to str oznacza, że Python spróbował przeprowadzić konkatenację liczby całkowitej 42 i ciągu tekstowego 'Alicja'. W kodzie trzeba wyraźnie wskazać konieczność konwersji liczby całkowitej na ciąg tekstowy, ponieważ Python nie zrobi tego automatycznie. (Konwersją typów danych zajmiemy się dalej w tym rozdziale, podczas omawiania funkcji str(), int() i float()).

Operator * przeprowadza mnożenie, o ile operuje na dwóch wartościach w postaci liczb całkowitych lub zmiennoprzecinkowych. Kiedy natomiast operator * jest używany wraz z wartościami ciągu tekstowego i liczby całkowitej, staje się operatorem replikacji ciągu tekstowego. Aby zobaczyć ten operator w działaniu, w powłoce interaktywnej wpisz ciąg tekstowy do wyświetlenia oraz liczbę jego powtórzeń, jak pokazałem poniżej.

>>> 'Alicja' * 5
'AlicjaAlicjaAlicjaAlicjaAlicja'

Wyrażenie sprowadza się do pojedynczej wartości w postaci ciągu tekstowego, na który składa się podana liczba powtórzeń pierwotnego ciągu tekstowego. Replikacja ciągu tekstowego to użyteczna sztuczka, choć nie jest stosowana równie często jak konkatenacja.

Operator * może być używany z jedynie dwoma wartościami liczbowymi (operacja mnożenia) lub z jedną wartością ciągu tekstowego i jedną liczbą całkowitą (replikacja ciągu tekstowego). We wszystkich pozostałych przypadkach Python po prostu wygeneruje komunikat błędu, tak jak pokazałem poniżej.

>>> 'Alicja' * 'Bartek'
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
'Alicja' * 'Bartek'
TypeError: can't multiply sequence by non-int of type 'str'
>>> 'Alicja' * 5.0
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
'Alicja' * 5.0
TypeError: can't multiply sequence by non-int of type 'float'

To, że Python "nie rozumie" powyższych wyrażeń, ma sens. Nie można przecież pomnożyć dwóch słów, podobnie jak trudno replikować dowolny ciąg tekstowy niepełną ilość razy.

Przechowywanie wartości w zmiennych

Zmienna jest w pamięci komputera niczym pudełko, w którym można przechowywać pojedynczą wartość. Jeśli wyniku obliczonego wyrażenia chcesz użyć później w programie, możesz zapisać go wewnątrz zmiennej.

Polecenia przypisania

Do umieszczenia wartości w zmiennych wykorzystujemy polecenie przypisania. Wspomniane polecenie składa się z nazwy zmiennej, znaku równości (nazywanego operatorem przypisania) i wartości, która ma być przechowywana w danej zmiennej. Jeśli wprowadzisz polecenie przypisania w postaci spam = 42, wtedy w zmiennej o nazwie spam będzie przechowywana wartość w postaci liczby całkowitej 42.

Zmienną możesz potraktować jak oznakowane pudełko, w środku którego znajduje się przechowywana wartość, jak pokazałem na rysunku 1.2.

Rysunek 1.2. Polecenie spam = 42 można w programie odczytać następująco: "Zmienna o nazwie spam przechowuje teraz liczbę całkowitą 42"

W powłoce interaktywnej wpisz jak przykład poniższy fragment kodu.

>>> spam = 40 ?
>>> spam
40
>>> eggs = 2
>>> spam + eggs ?
42
>>> spam + eggs + spam
82
>>> spam = spam + 2 ?
>>> spam
42

Zmienna jest zainicjalizowana (utworzona) w chwili, gdy po raz pierwszy będzie umieszczona w niej wartość . Następnie można jej używać w wyrażeniach wraz z innymi zmiennymi i wartościami . Kiedy zmiennej jest przypisywana nowa wartość , dotychczasowa wartość będzie zapomniana. Dlatego też od tej chwili wartością zmiennej spam jest 40, a nie 42. To nosi nazwę nadpisania zmiennej. W powłoce interaktywnej wprowadź poniższe polecenia, aby zobaczyć w działaniu nadpisywanie ciągu tekstowego.

>>> spam = 'Witaj'
>>> spam
'Witaj'
>>> spam = 'Żegnaj'
>>> spam
'Żegnaj'

Przedstawiona na rysunku 1.3 zmienna spam przechowuje 'Witaj', dopóki jej nie zastąpisz wartością 'Żegnaj'.

Rysunek 1.3. Po przypisaniu nowej wartości zmiennej dotychczasowa będzie zapomniana

Nazwy zmiennych

Dobra nazwa zmiennej opisuje przechowywane w niej dane. Wyobraź sobie, że przeprowadziłeś się do nowego domu i wszystkie pudła opisałeś jako Rzeczy. W takim przypadku trudno Ci będzie znaleźć to, czego właśnie szukasz! Nazwy zmiennych, takie jak spam, eggs i bacon, zostały użyte jako ogólne nazwy w przykładach zamieszczonych w książce oraz w dużej części dokumentacji Python (inspiracja pochodzi ze skeczu Monty Pythona zatytułowanego "Spam"). W tworzonych przez Ciebie programach zastosowanie opisowych nazw zapewni większą czytelność kodu źródłowego.

Wprawdzie zmiennym możesz nadawać praktycznie dowolne nazwy, jednak Python narzuca pewne ograniczenia w tym zakresie. W tabeli 1.3 przedstawiłem przykłady prawidłowych nazw zmiennych. Zmienne możesz nazywać dowolnie, o ile tylko przestrzegasz trzech poniższych zasad.

Nazwa zmiennej może składać się tylko z jednego słowa, bez żadnych spacji. Możesz używać jedynie liter, cyfr i znaku podkreślenia (_). Nazwa nie może zaczynać się od cyfry.

Tabela 1.3. Prawidłowe i nieprawidłowe nazwy zmiennych

Prawidłowa nazwa zmiennej

Nieprawidłowa nazwa zmiennej

current_balance

current-balance (łączniki są niedozwolone)

currentBalance

current balance (spacje są niedozwolone)

account4

4account (nazwa nie może zaczynać się od cyfry)

_42

42 (nazwa nie może być liczbą)

TOTAL_SUM

TOTAL_$UM (znaki specjalne, takie jak $, są niedozwolone)

hello

'hello' (znaki specjalne, takie jak apostrof, są niedozwolone)

Wielkość liter w nazwie zmiennej ma znaczenie, więc spam, SPAM, Spam i sPaM to cztery różne zmienne. Wprawdzie Spam to poprawna nazwa zmiennej, ale zgodnie z konwencją stosowaną w Pythonie nazwa zmiennej powinna rozpoczynać się małą literą.

W tej książce w nazwach zmiennych zastosowałem styl camelCase zamiast znaków podkreślenia. Dlatego też mamy zmienną o nazwie spojrzNaTo, a nie spojrz_na_to. Doświadczeni programiści mogą sobie przypominać, że w oficjalnym stylu tworzenia kodu w języku Python (dokument PEP 8) wskazano na użycie znaków podkreślenia w nazwach zmiennych. Jednak wolę styl camelCase i wskazuję w dokumencie PEP 8 na sekcję zatytułowaną "A Foolish Consistency Is the Hobgoblin of Little Minds", w której można znaleźć następujący fragment.

"Zapewnienie spójności z regułami dotyczącymi stylu jest ważne. Jednak jeszcze ważniejsze jest prawidłowe określenie, kiedy należy postawić na niespójność - czasami reguły dotyczące stylu po prostu nie mają zastosowania. Gdy masz wątpliwości, zrób tak, jak uważasz za słuszne."

Twój pierwszy program

Wprawdzie powłoka interaktywna doskonale sprawdza się podczas wykonywania pojedynczych poleceń Pythona, ale w celu utworzenia całych programów Pythona polecenia, które składają się na nie, lepiej wprowadzać w tak zwanym edytorze pliku. Tego rodzaju edytor pliku jest podobny do edytora tekstowego, takiego jak Notatnik lub TextMate, ale ma funkcje specjalne przeznaczone do obsługi kodu źródłowego. Aby przejść do edytora pliku w programie Mu, kliknij przycisk Nowy na pasku narzędzi.

Wyświetlone na ekranie okno zawiera kursor oczekujący na wprowadzenie danych wejściowych, ale różni się od powłoki interaktywnej, w której polecenia Pythona są wykonywane natychmiast po naciśnięciu klawisza Enter. Edytor pliku pozwala na wpisanie wielu poleceń, zapisanie ich w pliku oraz uruchomienie programu. Poniżej wymieniłem różnice między powłoką interaktywną a edytorem pliku.

Okno powłoki interaktywnej zawsze ma wyświetlony znak zachęty >>>. Okno edytora pliku nie będzie miało znaku zachęty >>>.

Teraz nadeszła odpowiednia pora na utworzenie pierwszego programu. W otwartym oknie edytora pliku wprowadź przedstawiony poniżej kod.

# Ten program wyświetla powitanie i prosi o podanie imienia. ?
print('Witaj, świecie!') ?
print('Jak masz na imię?') # Prośba o podanie imienia.
myName = input()?
print('Miło Cię poznać, ' + myName + '.') ?
print('Liczba znaków w Twoim imieniu wynosi:') ?
print(len(myName))
print('Ile masz lat?') # Prośba o podanie wieku. ?
myAge = input()
print('Za rok będziesz mieć ' + str(int(myAge) + 1) + ' lat.')

Po wprowadzeniu powyższego kodu źródłowego zapisz go w pliku, aby uniknąć konieczności ponownego wpisywania programu po każdym uruchomieniu edytora Mu. Kliknij przycisk Zapisz na pasku narzędzi. W wyświetlonym oknie dialogowym wpisz hello.py w polu Nazwa pliku i kliknij przycisk Zapisz.

Programy powinieneś zapisywać natychmiast po wprowadzeniu. W ten sposób, jeśli komputer ulegnie awarii lub przypadkowo zamkniesz okno edytora Mu, nie stracisz wpisanego kodu. Skrótem klawiszowym pozwalającym na zapis pliku jest Ctrl+S w systemach Windows i Linux oraz Command+S w systemie macOS.

Po zapisaniu pliku możesz uruchomić program. W tym celu naciśnij klawisz F5. Program powinien zostać uruchomiony w oknie powłoki interaktywnej. Pamiętaj, że klawisz F5 należy nacisnąć w oknie edytora pliku, a nie oknie powłoki interaktywnej. Podaj imię, gdy program o nie zapyta. Wygenerowane przez ten program dane wyjściowe w powłoce interaktywnej powinny być podobne do przedstawionych poniżej.

Python 3.7.0b4 (v3.7.0b4:eb96c37699, May 2 2018, 19:02:22) [MSC v.1913 64 bit
(AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Witaj, świecie!
Jak masz na imię?
Robert
Miło Cię poznać, Robert.
Liczba znaków w Twoim imieniu wynosi:
6
Ile masz lat?
4
Za rok będziesz mieć 5 lat.
>>>

Kiedy nie ma więcej wierszy kodu do wykonania, program Pythona kończy działanie. (Można również powiedzieć, że nastąpiło wyjście z programu Pythona).

Teraz można już zamknąć edytor pliku, klikając przycisk X na górze okna. Aby ponownie wczytać zapisany wcześniej program, kliknij przycisk Load. Następnie w wyświetlonym oknie dialogowym wskaż plik hello.py i kliknij przycisk Open, a program powinien pojawić się w oknie edytora pliku.

Sposób wykonywania programu można monitorować za pomocą narzędzia wizualizacji Python Tutor dostępnego pod adresem http://pythontutor.com/. Przebieg wykonania tego konkretnego programu możesz prześledzić na stronie https://autbor.com/hellopy/. Klikając przycisk do przodu przejdź przez wszystkie etapy działania programu. Będziesz mógł obserwować, jak zmieniają się zmienne i dane wyjściowe.

Analiza programu

Kiedy mamy program wyświetlony w oknie edytora pliku, możemy przeanalizować użyte w nim poszczególne polecenia Pythona i wyjaśnić ich sposób działania.

Komentarze

Poniższy wiersz kodu jest nazwany komentarzem.

# Ten program wyświetla powitanie i prosi o podanie imienia. ?

Python ignoruje komentarze, więc można je wykorzystać w celu umieszczenia notatek lub informacji wyjaśniających sposób działania danego fragmentu kodu. Cały tekst umieszczony po znaku # aż do końca wiersza jest uznawany za komentarz.

Czasami programiści umieszczają znak # na początku wiersza kodu, aby tymczasowo nie wykonywać danego polecenia podczas testowania programu. Czynność nosi nazwę umieszczenia kodu w komentarzu i okazuje się użyteczną techniką pomagającą w ustaleniu przyczyn niedziałania programu. Kiedy programista jest gotowy na ponowne uwzględnienie danego polecenia podczas wykonywania programu, usuwa znak # umieszczony na początku wiersza.

Python ignoruje również pusty wiersz po komentarzu. W kodzie źródłowym możesz umieszczać dowolną liczbę pustych wierszy, bo wtedy kod źródłowy staje się łatwiejszy do odczytu; pełnią one rolę akapitów w książce.

Funkcja print()

Funkcja print() wyświetla na ekranie ciąg tekstowy umieszczony w nawiasie.

print('Witaj, świecie!') ?
print('Jak masz na imię?') # Prośba o podanie imienia.

Wiersz print('Witaj, świecie!') oznacza "wyświetl tekst znajdujący się w ciągu tekstowym 'Witaj, świecie!'". Kiedy Python wykonuje ten wiersz kodu, można powiedzieć, że wywołuje funkcję print(), a wartość w postaci ciągu tekstowego jest przekazywana funkcji. Ta przekazana wartość jest nazywana argumentem. Zwróć uwagę, że apostrofy nie są wyświetlane na ekranie. Jedynie wskazują początek i koniec ciągu tekstowego i nie są częścią wartości.

Funkcję tę można wykorzystać również do wyświetlenia pustego wiersza na ekranie. Wystarczy po prostu wywołać funkcję print() bez argumentu.

Nawias umieszczony po danej nazwie wskazuje, że mamy do czynienia z funkcją. Dlatego też w tej książce spotkasz się z zapisem print() zamiast print. Więcej szczegółowych informacji na temat funkcji znajdziesz w rozdziale 3.

Funkcja input()

Funkcja input() oczekuje na wpisanie przez użytkownika tekstu na klawiaturze i naciśnięcie klawisza Enter.

myName = input() ?

Tekst wprowadzony przez użytkownika jest przez tę funkcję przypisany zmiennej myName, która od teraz przechowuje wartość w postaci ciągu tekstowego.

Wywołanie funkcji input() możesz traktować jako wyrażenie przyjmujące dowolną wartość podaną przez użytkownika. Jeśli użytkownik wpisze 'Robert', wyrażenie przyjmie postać myName = 'Robert'.

Jeżeli wywołanie input() zakończy się komunikatem błędu, na przykład NameError: name 'Robert' is not defined, wówczas problem polega na tym, że kod został uruchomiony w Pythonie 2 zamiast w Pythonie 3.

Wyświetlanie imienia użytkownika

Poniższe wywołanie funkcji print() zawiera jedynie umieszczone w nawiasie wyrażenie 'Miło Cię poznać, ' + myName + '.'.

print('Miło Cię poznać, ' + myName + '.') ?

Pamiętaj, że wyrażenia zawsze są sprowadzane do pojedynczej wartości. Jeśli w powyższym wierszu wartością przechowywaną w zmiennej myName jest 'Robert', wtedy wyrażenie przyjmuje postać 'Miło Cię poznać, Robert.'. To jest pojedyncza wartość w postaci ciągu tekstowego przekazywana funkcji print(), która wyświetli ją na ekranie.

Funkcja len()

Funkcji len() można przekazać ciąg tekstowy (lub zmienną zawierającą wartość w postaci ciągu tekstowego), a obliczy ona liczbę znaków składających się na przekazany ciąg tekstowy. Wartością zwrotną funkcji jest więc liczba całkowita.

print('Liczba znaków w Twoim imieniu wynosi:') ?
print(len(myName))

Wpisz poniższy fragment kodu w powłoce interaktywnej, aby wypróbować działanie omawianej funkcji.

>>> len('Witaj')
5
>>> len('Mój bardzo energiczny potwór właśnie został nakarmiony.')
55
>>> len('')
0

Podobnie jak w powyższych przykładach, także w naszym programie wywołanie len(myName) powoduje sprowadzenie argumentu do pojedynczej wartości w postaci liczby całkowitej. Następnie ta liczba jest przekazywana funkcji print() w celu jej wyświetlenia na ekranie. Zauważ, że funkcja print() potrafi obsługiwać argumenty zarówno tekstowe, jak i liczbowe. Jednak wprowadzenie poniższego polecenia w powłoce interaktywnej spowoduje wygenerowanie komunikatu błędu.

>>> print('Mam ' + 29 + ' lat.')
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
print('Mam ' + 29 + ' lat.')
TypeError: can only concatenate str (not "int") to str

To nie funkcja print() spowodowała tutaj wygenerowanie błędu, ale wyrażenie, które próbowaliśmy jej przekazać. Ten sam komunikat błędu otrzymasz, gdy spróbujesz wyrażenie wpisać bezpośrednio w powłoce interaktywnej, jak pokazałem poniżej.

>>> 'Mam ' + 29 + ' lat.'
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
'Mam ' + 29 + ' lat.'
TypeError: can only concatenate str (not "int") to str

Python wygenerował błąd, ponieważ operator + może być użyty jedynie do dodania dwóch liczb lub przeprowadzenia konkatenacji dwóch ciągów tekstowych. Nie można dodać liczby całkowitej do ciągu tekstowego, ponieważ to jest niegramatyczne w Pythonie. Rozwiązaniem jest tutaj konwersja liczby na ciąg tekstowy, jak to wyjaśniam w kolejnym punkcie.

Funkcje str(), int() i float()

Jeżeli chcesz przeprowadzić konkatenację liczby całkowitej, takiej jak 29, i ciągu tekstowego w celu przygotowania argumentu dla funkcji print(), musisz użyć wartości '29' przedstawiającej liczbę 29 w postaci ciągu tekstowego. Funkcji str() można przekazać wartość liczbową, na podstawie której będzie wygenerowana jej wersja w postaci ciągu tekstowego. Spójrz na poniższy fragment kodu.

>>> str(29)
'29'
>>> print('Mam ' + str(29) + ' lat.')
Mam 29 lat.

Ponieważ wynikiem wywołania str(29) w 'Mam ' + str(29) + ' lat.' jest '29', więc otrzymujemy wyrażenie 'Mam ' + '29' + ' lat.', co z kolei przekłada się na wygenerowanie ciągu tekstowego 'Mam 29 lat.'. To będzie wartość przekazana funkcji print().

Funkcje str(), int() i float() będą sprowadzały przekazywane im wartości do postaci - odpowiednio - ciągu tekstowego, liczby całkowitej i liczby zmiennoprzecinkowej. W powłoce interaktywnej spróbuj skonwertować pewne wartości za pomocą wymienionych funkcji i zobacz, jaki będzie efekt ich wywołania.

>>> str(0)
'0'
>>> str(-3.14)
'-3.14'
>>> int('42')
42
>>> int('-99')
-99
>>> int(1.25)
1
>>> int(1.99)
1
>>> float('3.14')
3.14
>>> float(10)
10.0

W przedstawionych powyżej przykładach wywoływaliśmy funkcje str(), int() i float() i przekazywaliśmy im wartości innych typów danych w celu otrzymania wersji - odpowiednio - ciągu tekstowego, liczby całkowitej i liczby zmiennoprzecinkowej przekazanej wartości.

Funkcja str() okazuje się przydatna, gdy mamy liczbę całkowitą lub zmiennoprzecinkową, którą chcemy połączyć z ciągiem tekstowym. Z kolei funkcja int() jest pomocna, gdy mamy liczbę w postaci ciągu tekstowego, a chcemy jej użyć w pewnych operacjach matematycznych. Przykładowo funkcja input() zawsze zwraca ciąg tekstowy, nawet jeśli użytkownik wpisze liczbę. W powłoce interaktywnej wprowadź polecenie spam = input(), a następnie wpisz liczbę 101, jak pokazałem poniżej.

>>> spam = input()
101
>>> spam
'101'

Wartość przechowywana przez zmienną spam nie jest liczbą całkowitą 101, ale ciągiem tekstowym '101'. Jeżeli chcesz przeprowadzić jakiekolwiek operacje matematyczne z użyciem wartości przechowywanej przez spam, musisz wykorzystać funkcję int() w celu otrzymania liczby całkowitej na podstawie wartości zmiennej spam. Następnie trzeba tę nową wartość przypisać zmiennej spam. Spójrz na poniższy fragment kodu.

>>> spam = int(spam)
>>> spam
101

Teraz wartość zmiennej spam można już traktować jak liczbę całkowitą, a nie ciąg tekstowy.

>>> spam * 10 / 5
202.0

Zwróć uwagę, że po przekazaniu funkcji int() wartości, która nie może być skonwertowana na postać liczby całkowitej, Python wyświetli komunikat błędu, tak jak pokazałem poniżej.

>>> int('99.99')
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
int('99.99')
ValueError: invalid literal for int() with base 10: '99.99'
>>> int('dwanaście')
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
int('dwanaście')
ValueError: invalid literal for int() with base 10: 'dwanaście'

Funkcja int() okazuje się również użyteczna, gdy trzeba zaokrąglić w dół liczbę zmiennoprzecinkową.

>>> int(7.7)
7
>>> int(7.7) + 1
8

W naszym programie użyliśmy funkcji int() i str() w trzech ostatnich wierszach, aby pobrać wartości odpowiednich typów danych.

print('Ile masz lat?') # Prośba o podanie wieku. ?
myAge = input()
print('Za rok będziesz mieć ' + str(int(myAge) + 1) + ' lat.')

Odpowiedniki tekstowe i liczbowe

Wprawdzie wartość liczbowa przedstawiona w postaci ciągu tekstowego jest uznawana za zupełnie odmienną od tej samej wartości w postaci liczby całkowitej lub zmiennoprzecinkowej, to jednak liczba całkowita może być równa liczbie zmiennoprzecinkowej. Spójrz na poniższy fragment kodu.

>>> 42 == '42'
False
>>> 42 == 42.0
True
>>> 42.0 == 0042.000
True

Python stosuje tego rodzaju rozróżnienie, ponieważ ciąg tekstowy jest tekstem, natomiast liczba całkowita lub zmiennoprzecinkowa jest liczbą.

Zmienna myAge zawiera wartość zwróconą przez funkcję input(). Ponieważ wartością zwrotną funkcji input() zawsze jest ciąg tekstowy (nawet jeśli użytkownik wpisał liczbę), więc możesz użyć wywołania int(myAge), aby otrzymać wartość w postaci liczby całkowitej wygenerowanej na podstawie ciągu tekstowego przechowywanego w myAge. Następnie do tej liczby całkowitej dodajemy 1 w wyrażeniu int(myAge) + 1.

Wynikiem wymienionej operacji dodawania jest przekazanie funkcji str() wyrażenia str(int(myAge) + 1). Wartość zwrotna jest następnie łączona z ciągami tekstowymi 'Za rok będziesz mieć ' i ' lat.', co prowadzi do powstania końcowego ciągu tekstowego, który będzie przekazany funkcji print() w celu wyświetlenia na ekranie.

Przyjmujemy założenie, że użytkownik wprowadził ciąg tekstowy '4' jako wartość dla zmiennej myAge. Ten ciąg tekstowy będzie skonwertowany na liczbę całkowitą, aby można było przeprowadzić operację dodawania. Wynikiem wspomnianej operacji jest liczba 5. Funkcja str() konwertuje wynik ponownie na postać ciągu tekstowego, aby można było połączyć go z ciągiem tekstowym ' lat.' w celu otrzymania końcowego komunikatu. W sposób graficzny te kroki można przedstawić, tak jak pokazałem na rysunku 1.4.

Rysunek 1.4. Kolejne kroki operacji, gdy zmienna myAge przechowuje liczbę całkowitą 4

Podsumowanie

Wartość wyrażeń możesz obliczać za pomocą kalkulatora, a konkatenację typu ciągu tekstowego przeprowadzać w procesorze tekstu. Z kolei replikację ciągu tekstowego można łatwo otrzymać przez kopiowanie i wklejanie tekstu. Jednak wyrażenia i ich komponenty - operatory, zmienne i wywołania funkcji - są podstawowymi elementami konstrukcyjnymi, które tworzą program. Kiedy opanujesz pracę z wymienionymi elementami, będziesz w stanie wykorzystać Pythona do operowania ogromną ilością danych.

Warto pamiętać o istnieniu różnych typów operatorów (+, -, *, /, //, % i ** dla operacji matematycznych oraz + i * dla operacji na ciągach tekstowych), a także różnych typów danych (liczby całkowite, liczby zmiennoprzecinkowe i ciągi tekstowe), które zostały wprowadzone w tym rozdziale.

Ponadto poznałeś kilka różnych funkcji. Funkcje print() i input() są używane do - odpowiednio - wyświetlania tekstu na ekranie i pobierania tekstu wpisywanego za pomocą klawiatury. Z kolei funkcja len() pobiera ciąg tekstowy i podaje liczbę znaków, które się na niego składają. Natomiast funkcje str(), int() i float() generują wartość w postaci - odpowiednio - ciągu tekstowego, liczby całkowitej i liczby zmiennoprzecinkowej na podstawie przekazanych im wartości.

W następnym rozdziale dowiesz się, jak nakazać Pythonowi podejmowanie inteligentnych decyzji w zakresie kodu przeznaczonego do wykonania, kodu do pominięcia oraz kodu do powtórzenia na podstawie posiadanych wartości. Wspomniany mechanizm nosi nazwę kontroli przepływu działania programu i pozwala na tworzenie programów, które same podejmują inteligentne decyzje.

Pytania kontrolne

Które z poniższych elementów to operatory, a które to wartości?
*
'Witaj'
-88.8
-
/
+
5
Które z poniższych elementów to zmienne, a które to ciągi tekstowe?
spam
'spam'
Wymień trzy znane Ci typy danych Pythona. Z jakich elementów składa się wyrażenie? Jaka jest rola wyrażeń? W tym rozdziale przedstawiłem polecenie przypisania, takie jak spam = 10. Jaka jest różnica pomiędzy wyrażeniem i poleceniem? Co będzie zawierała zmienna bacon po wykonaniu poniższego fragmentu kodu?
bacon = 20
bacon + 1
Jakie wartości powinny przyjąć poniższe wyrażenia?
'spam' + 'spamspam'
'spam' * 3
Dlaczego eggs to prawidłowa nazwa zmiennej, podczas gdy 100 to nieprawidłowa? Jakie trzy funkcje mogą zostać użyte w celu otrzymania wartości w postaci liczby całkowitej, liczby zmiennoprzecinkowej i ciągu tekstowego na podstawie przekazanych im wartości? Dlaczego poniższe wyrażenie spowoduje wygenerowanie błędu? Jak można błąd usunąć?
'Zjadłem ' + 99 + ' sztuk burrito.'

Zadanie dodatkowe. Odszukaj dostępną w internecie dokumentację Pythona dla funkcji len(). Znajdziesz ją na stronie zatytułowanej "Built-in functions". Przejrzyj pozostałe funkcje wbudowane w Pythonie, ustal sposób działania funkcji round() i poeksperymentuj z nią w powłoce interaktywnej.

2. Kontrola przepływu działania programu

Poznałeś już podstawy poszczególnych poleceń i dowie­działeś się, że program składa się z ich serii. Jednak prawdziwa potęga programowania nie polega po prostu na wykonywaniu poleceń jedno po drugim, jak w przypadku weekendowej listy zadań do zrobienia. Na podstawie wartości wyrażenia program może podejmować decyzje o pominięciu pole­ceń, powtarzaniu ich lub wyborze jednego z wielu poleceń przeznaczonych do wykonania. Prawie nigdy nie chcesz, aby program rozpoczynał działanie w pierwszym wierszu kodu i po prostu wykonywał wszystkie po kolei aż do końca. Z pomocą konstrukcji kontroli przepływu działania programu możesz decydować, które z poleceń mają być wykonywane w określonych warunkach.

Konstrukcje kontroli przepływu działania programu odpowiadają bezpośrednio symbolom na diagramach, które będę prezentował dla kodu omawianego w rozdziale. Na rysunku 2.1 znajduje się diagram pokazujący, co zrobić, gdy pada deszcz. Podążaj za ścieżką utworzoną przez strzałki od punktu Początek do punktu Koniec .

Na diagramie zwykle można znaleźć więcej niż tylko jedną drogę od punktu początkowego do końcowego. To samo dotyczy wierszy kodu w programie komputerowym. Na diagramie punkty odgałęzienia są przedstawione za pomocą rombu, natomiast pozostałe kroki z wykorzystaniem prostokątów. Z kolei kroki początkowy i końcowy są przedstawione z użyciem prostokątów o zaokrąglonych rogach.

Rysunek 2.1. Diagram pokazujący, co zrobić, gdy pada deszcz

Zanim przejdziesz do poznawania poleceń kontroli przepływu działania programu, najpierw musisz się dowiedzieć, jak w kodzie Pythona przedstawić opcje tak i nie oraz jak tworzyć wspomniane punkty odgałęzienia. Dlatego też teraz zajmę się omówieniem wartości i operatorów boolowskich oraz operatorów porównania.

Wartości boolowskie

Typy danych w postaci liczb całkowitych, liczb zmiennoprzecinkowych i ciągu tekstowego mają nieograniczoną ilość możliwych wartości, natomiast typ danych bo­o­lowskich ma jedynie dwie możliwe wartości: True i False . (Nazwa tego typu danych pochodzi od matematyka Georga Boole'a). W kodzie Pythona wartości boolowskie True i False nie są ujmowane w apostrofy, jak ma to miejsce w przypadku ciągów tekstowych, i zawsze zaczynają się wielką literą T lub F , natomiast pozostałe litery słowa pozostają małe. W powłoce interaktywnej wprowadź poniższy fragment kodu. (Niektóre polecenia celowo są błędne i spowodują wygenerowanie komunikatów błędu po ich wykonaniu).

>>> spam = True ?
>>> spam
True
>>> true ?
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
true
NameError: name 'true' is not defined
>>> True = 2 + 2 ?
SyntaxError: can't assign to keyword

Podobnie jak inne wartości, także boolowskie są stosowane w wyrażeniach i mogą być przechowywane w zmiennych . Jeżeli zapomnisz o użyciu odpowiedniej wielkości liter lub spróbujesz nadać zmiennej nazwę True bądź False , Python wygeneruje komunikat błędu.

Operatory porównania

Zadaniem operatora porównania (można się spotkać także z określeniem operatora relacji ) jest porównanie dwóch wartości i sprowadzenie ich do pojedynczej wartości boolowskiej. W tabeli 2.1 wymieniłem używane operatory porównania.

Tabela 2.1. Operatory porównania

Operator

Opis

==

Równy

!=

Nierówny

<

Mniejszy niż

>

Większy niż

<=

Mniejszy niż lub równy

>=

Większy niż lub równy

Te operatory przyjmują wartość True lub False w zależności od przypisanej im wartości. Teraz wypróbujmy niektóre z wymienionych operatorów. Zaczynamy od operatorów == i != .

>>> 42 == 42
True
>>> 42 == 99
False
>>> 2 != 3
True
>>> 2 != 2
False

Jak można było się spodziewać, operator == (równości) przyjmuje wartość True , jeśli wartości po obu stronach wyrażenia są takie same. Natomiast operator != (nierówności) przyjmuje wartość True , jeśli wartości po obu stronach wyrażenia nie są równe. Operatorów == i != możemy używać dla wartości dowolnego typu danych.

>>> 'witaj' == 'witaj'
True
>>> 'witaj' == 'Witaj'
False
>>> 'pies' != 'kot'
True
>>> True == True
True
>>> True != False
True
>>> 42 == 42.0
True
>>> 42 == '42' ?
False

Zwróć uwagę, że wartość w postaci liczby całkowitej lub zmiennoprzecinkowej zawsze będzie nierówna wartości w postaci ciągu tekstowego. Dlatego też wyrażenie 42 == '42' przyjmuje wartość False , ponieważ dla Pythona liczba całkowita 42 różni się od ciągu tekstowego '42' .

Z kolei operatory < , > , <= i > = działają poprawnie tylko z liczbami całkowitymi i zmiennoprzecinkowymi.

>>> 42 < 100
True
>>> 42 > 100
False
>>> 42 < 42
False
>>> eggCount = 42
>>> eggCount <= 42 ?
True
>>> myAge = 29
>>> myAge >= 10 ?
True

Różnica pomiędzy operatorami == i =

Na pewno zwróciłeś uwagę, że operator == (równości) składa się z dwóch znaków równości, podczas gdy operator = (przypisania) tylko z jednego. Bardzo łatwo pomylić te dwa operatory. Aby tego uniknąć, wystarczy pamiętać o poniższych regułach.

Operator == (równości) sprawdza, czy dwie wartości są takie same. Operator = (przypisania) umieszcza w zmiennej znajdującej się po jego lewej stronie wartość znajdującą się po prawej stronie operatora.

Jeżeli chcesz jeszcze łatwiej rozróżniać te operatory, zwróć uwagę na fakt, że operator równości ( == ) składa się z dwóch znaków, podobnie jak operator nierówności ( != ).

Bardzo często będziesz używać operatorów porównania do porównywania wartości zmiennej z inną wartością, na przykład tak, jak pokazałem w poleceniach eggCount <= 42 i myAge >= 10 . Ostatecznie zamiast wpisywania 'pies' != 'kot' w kodzie mógłbyś wpisać po prostu True . Więcej przykładów tego rodzaju zobaczysz dalej w tym rozdziale, gdy będę omawiał polecenia kontroli przepływu działania programu.

Operatory boolowskie

Trzy operatory boolowskie ( and , or i not ) są używane do porównywania wartości boolowskich. Podobnie jak w przypadku operatorów porównania, także operatory boolowskie sprowadzają wyrażenie do pojedynczej wartości boolowskiej. Teraz omówię te operatory znacznie bardziej szczegółowo, a zacznę od operatora and .

Binarne operatory boolowskie

Operatory and i or zawsze pobierają dwie wartości boolowskie (lub wyrażenia) i dlatego są uważane za operatory binarne . Operator and przyjmuje wartość True tylko wtedy, gdy obie sprawdzane wartości boolowskie to True . W przeciwnym razie operator and przyjmuje, że wartością wyrażenia jest False . Aby zobaczyć działanie omawianych operatorów w praktyce, w powłoce interaktywnej wpisz poniższe wyrażenia.

>>> True and True
True
>>> True and False
False

Tak zwana tablica prawdy (ang. truth table ) wymienia każdy możliwy wynik działania operatora boolowskiego. Tę tablicę dla operatora and przedstawiłem w tabeli 2.2.

Tabela 2.2. Tablica prawdy dla operatora and

Wyrażenie

Przyjmuje wartość

True and True

True

True and False

False

False and True

False

False and False

False

Z kolei operator or sprowadza wyrażenie do pojedynczej wartości True , jeśli dowolna z dwóch sprawdzanych wartości boolowskich to True . Jeśli natomiast obie przyjmują wartość False , wówczas wartością całego wyrażenia również będzie False .

>>> False or True
True
>>> False or False
False

Wszystkie możliwe wyniki działania operatora boolowskiego or w jego tablicy prawdy wymieniłem w tabeli 2.3.

Tabela 2.3. Tablica prawdy dla operatora or

Wyrażenie

Przyjmuje wartość

True or True

True

True or False

True

False or True

True

False or False

False

Operator not

W przeciwieństwie do operatorów and i or , operator not działa tylko z jedną wartością boolowską (lub wyrażeniem). Dlatego też jest operatorem jednoargumento wym . Jego działanie polega po prostu na odwróceniu wartości boolowskiej na przeciwną.

>>> not True
False
>>> not not not not True ?
True

Podobnie jak w języku polskim można stosować podwójne przeczenia, tak samo można zagnieżdżać operatory not , choć nie ma żadnego dobrego powodu dla używania tego rodzaju rozwiązania w rzeczywistych programach. W tabeli 2.4 przedstawiłem tablicę prawdy dla operatora not .

Tabela 2.4. Tablica prawdy dla operatora not

Wyrażenie

Przyjmuje wartość

not True

False

not False

True

Łączenie operatorów boolowskich i porównania

Ponieważ operatory porównania sprowadzą wyrażenie do pojedynczej wartości boolowskiej, więc można ich używać razem z operatorami boolowskimi.

Przypomnij sobie, że operatory and , or i not są nazywane operatorami boolowskimi, ponieważ zawsze operują na wartościach boolowskich True i False . Wprawdzie wyrażenie, takie jak 4 < 5 , nie jest wartością boolowską, ale po jego obliczeniu sprowadza się do wartości boolowskiej. W powłoce interaktywnej wpisz teraz kilka wyrażeń boolowskich, w których wykorzystano operatory porównania.

>>> (4 < 5) and (5 < 6)
True
>>> (4 < 5) and (9 < 6)
False
>>> (1 == 2) or (2 == 2)
True

Komputer najpierw oblicza lewą stronę wyrażenia, a następnie prawą. Po ustaleniu wartości boolowskich dla poszczególnych stron sprowadza całe wyrażenie do pojedynczej wartości boolowskiej. Proces przetworzenia przez komputer wyrażenia (4 < 5) and (5 < 6) pokazałem na rysunku 2.2.

Rysunek 2.2. Proces określenia wartości wyrażenia (4 < 5) and (5 < 6)

W wyrażeniu można użyć wielu operatorów boolowskich w połączeniu z operatorami porównania, co pokazałem poniżej.

>>> 2 + 2 == 4 and not 2 + 2 == 5 and 2 * 2 == 2 + 2
True

W operatorach boolowskich obowiązuje kolejność wykonywania operacji, podobnie jak w przypadku operatorów matematycznych. Po wykonaniu działań wszystkich operatorów matematycznych i porównania Python najpierw przetwarza operatory not , następnie and i na końcu or .

Elementy kontroli przepływu działania programu

Polecenia kontroli przepływu działania programu bardzo często rozpoczynają konstrukcję nazywaną warunkiem , po którym znajduje się blok kodu nazywany klauzulą . Zanim przejdziemy do charakterystycznych dla Pythona poleceń kontroli przepływu działania programu, najpierw omówię warunki i bloki.

Warunek

Wyrażenia boolowskie poznane do tej pory mogą być uważane za warunki, które są tym samym, co wyrażenia. Jednak warunek to po prostu bardziej konkretna nazwa w kontekście poleceń kontroli przepływu działania programu. Warunek zawsze jest sprowadzany do wartości boolowskiej True lub False . Na podstawie otrzymanej wartości boolowskiej polecenie kontroli przepływu działania programu decyduje o tym, co zrobić dalej. W praktycznie wszystkich poleceniach kontroli przepływu działania programu używa się warunków.

Blok kodu

Wiersze kodu w Pythonie mogą być pogrupowane w tak zwane bloki . Początek i koniec danego bloku wskazują wcięcia wierszy kodu. Podczas tworzenia bloków kodu obowiązują trzy podstawowe zasady.

Blok rozpoczyna się w miejscu zwiększania wcięcia wiersza kodu. Blok może zawierać inne bloki. Blok kończy się w miejscu zmniejszenia wcięcia wiersza do zera lub wcięcia stosowanego przez jego blok nadrzędny.

Koncepcję bloku łatwiej zrozumieć, kiedy patrzy się na faktyczny kod zawierający wcięcia. Spróbuj odnaleźć bloki w poniższym fragmencie niewielkiego programu.

name = 'Maria'
password = 'miecznik'
if name == 'Maria':
print('Witaj, Maria!') ?
if password == 'miecznik':
print('Masz dostęp.') ?
else:
print('Nieprawidłowe hasło.') ?

Sposób wykonania tego programu możesz prześledzić na stronie https://autbor.com/blocks/ . Pierwszy blok kodu rozpoczyna się w wierszu print('Witaj, Maria!') i obejmuje wszystkie kolejne wiersze aż do końca. Wewnątrz tego bloku mamy kolejny obejmujący tylko jeden wiersz print('Masz dostęp') . Trzeci blok również składa się z jednego wiersza: print('Nieprawidłowe hasło') .

Wykonywanie programu

W programie hello.py przedstawionym w poprzednim rozdziale Python wykonywał kolejne polecenia od początku do końca programu. Wykonywanie programu (lub po prostu wykonywanie ) to termin oznaczający wykonywanie bieżącego polecenia. Jeżeli kod źródłowy wydrukujesz na papierze i będziesz palcem wskazywać każdy wiersz podczas jego wykonywania, wówczas Twój palec oznacza wykonywanie programu.

Jednak nie wszystkie programy są wykonywane po prostu od początku do końca. Jeżeli za pomocą palca będziesz śledzić wykonywanie programu zawierającego polecenia kontroli przepływu działania programu, prawdopodobnie będziesz przeskakiwać między fragmentami kodu źródłowego na podstawie warunków oraz być może będziesz pomijać całe klauzule.

Polecenia kontroli przepływu działania programu

Przechodzimy teraz do najważniejszego aspektu kontroli przepływu działania programu, czyli do samych poleceń. Polecenia te były przedstawione za pomocą rombów na diagramie pokazanym na rysunku 2.1. Wskazują miejsca, w których wykonywany program podejmuje rzeczywiste decyzje.

Polecenie if

Najczęściej stosowanym typem polecenia kontroli przepływu działania programu jest if . Klauzula polecenia if (czyli blok znajdujący się za poleceniem if ) zostanie wykonana, jeśli warunek polecenia przyjmuje wartość True . Natomiast klauzula będzie pominięta, jeśli warunek przyjmuje wartość False .

Ujmując rzecz najprościej, znaczenie polecenia if można zdefiniować w następujący sposób: "Jeżeli ten warunek jest prawdziwy, wykonaj kod znajdujący się w tej klauzuli". W języku Python konstrukcja if składa się z pewnych elementów. Oto one.

Słowo kluczowe if . Warunek (czyli wyrażenie przyjmujące wartość True lub False ). Dwukropek. Wcięcie w kolejnym wierszu przedstawiające wcięty blok kodu (nazywany klauzulą polecenia if ).

Przykładowo przyjmujemy założenie o istnieniu pewnego fragmentu kodu sprawdzającego, czy imieniem użytkownika jest Alicja . (Oczywiście wartość zmiennej name musiała być przypisana wcześniej).

if name == 'Alicja':
print('Cześć, Alicja!')

Wszystkie polecenia kontroli przepływu działania programu kończą się dwukropkiem, po którym znajduje się nowy blok kodu (klauzula). Klauzulą w przedstawionym powyżej fragmencie kodu jest blok składający się z wywołania print( 'Cześć, Alicja!') . Na rysunku 2.3 pokazałem diagram dla omówionego fragmentu kodu.

Rysunek 2.3. Diagram przedstawiający konstrukcję zawierającą polecenie if

Polecenie else

Po klauzuli if opcjonalnie może znajdować się polecenie else . Będzie ono wykonane tylko wtedy, gdy warunek polecenia if przyjmuje wartość False . Ujmując rzecz najprościej, znaczenie polecenia else można zdefiniować w następujący sposób: "Jeżeli ten warunek jest prawdziwy, wykonaj kod znajdujący się w tej klauzuli. Natomiast w przeciwnym razie wykonaj ten kod". Polecenie else nie zawiera warunku, w kodzie Pythona składa się z następujących elementów.

Słowo kluczowe else . Dwukropek. Wcięcie w kolejnym wierszu przedstawiające wcięty blok kodu (nazywany klauzulą polecenia else ).

Powracamy do przykładu Alicji. Spójrz na pewien fragment kodu, w którym użyto polecenia else , aby powitać osobę o imieniu innym niż Alicja.

if name == 'Alicja':
print('Cześć, Alicja!')
else:
print('Witaj, nieznajomy!')

Diagram dla przedstawionego powyżej fragmentu kodu pokazałem na rysunku 2.4.

Rysunek 2.4. Diagram przedstawiający konstrukcję zawierającą polecenie else

Polecenie elif

Wprawdzie tylko jedna klauzula if lub else będzie wykonana, ale może zdarzyć się sytuacja, w której chcemy wykonania jednej z wielu dostępnych klauzul. Tutaj pomocne będzie polecenie elif umieszczane po if lub innym poleceniu elif . Zawiera kolejny warunek do sprawdzenia, ale tylko wtedy, gdy poprzednie przyjęły wartość False . Polecenie elif w kodzie Pythona składa się z następujących elementów.

Słowo kluczowe elif . Warunek (czyli wyrażenie przyjmujące wartość True lub False ). Dwukropek. Wcięcie w kolejnym wierszu przedstawiające wcięty blok kodu (nazywany klauzulą polecenia elif ).

Aby zobaczyć polecenie elif w działaniu, dodamy je do wcześniejszego fragmentu kodu sprawdzającego imię użytkownika.

if name == 'Alicja':
print('Cześć, Alicja!')
elif age < 12:
print('Nie jesteś Alicją, dzieciaku.')

Tym razem sprawdzamy także wiek użytkownika, a program wyświetli nieco inny komunikat, jeśli osoba ma mniej niż 12 lat. Diagram dla przedstawionego powyżej fragmentu kodu pokazałem na rysunku 2.5.

Rysunek 2.5. Diagram przedstawiający konstrukcję zawierającą polecenie elif

W powyższym fragmencie kodu klauzula elif będzie wykonana, jeśli wyrażenie age < 12 przyjmuje wartość True , a name == 'Alicja' wartość False . Jednak w sytuacji, gdy oba wymienione wyrażenia będą miały wartość False , wtedy obie klauzule zostaną pominięte. Dlatego też nie ma gwarancji wykonania przynajmniej jednej klauzuli. Tak więc w zbiorze poleceń elif wykonane będzie tylko jedno z nich lub żadne. Po znalezieniu warunku przyjmującego wartość True pozostałe klauzule elif są automatycznie pomijane. Otwórz nowe okno edytora pliku i wprowadź przykładowy poniższy fragment kodu. Następnie zapisz plik pod nazwą vampire.py .

name = 'Celina'
age = 3000
if name == 'Alicja':
print('Cześć, Alicja.')
elif age < 12:
print('Nie jesteś Alicją, dzieciaku.')
elif age > 2000:
print('W przeciwieństwie do Ciebie, Alicja nie jest nieśmiertelnym wampirem.')
elif age > 100:
print('Nie jesteś Alicją, dziadku.')

Sposób wykonania tego programu możesz prześledzić na stronie https://autbor.com/vampire/ . W powyższym fragmencie kodu dodałem dwa kolejne polecenia elif do programu witającego użytkownika w odmienny sposób na podstawie wartości zmiennej age . Diagram dla przedstawionego powyżej fragmentu kodu pokazałem na rysunku 2.6.

Rysunek 2.6. Diagram przedstawiający konstrukcję zawierającą wiele poleceń elif w programie vampire.py

Kolejność występowania poleceń elif ma znaczenie. Zmienimy ją teraz w celu wprowadzenia błędu w programie. Pamiętaj, że pozostałe klauzule elif są automatycznie pomijane po znalezieniu warunku przyjmującego wartość True . Dlatego też po zmianie kolejności niektórych poleceń elif w programie vampire.py powstanie problem. Zmień kod w taki sposób, aby wyglądał tak, jak pokazałem poniżej, a następnie zapisz go w pliku o nazwie vampire2.py .

name = 'Celina'
age = 3000
if name == 'Alicja':
print('Cześć, Alicja.')
elif age < 12:
print('Nie jesteś Alicją, dzieciaku.')
elif age > 100: ?
print('Nie jesteś Alicją, dziadku.')
elif age > 2000:
print('W przeciwieństwie do Ciebie, Alicja nie jest nieśmiertelnym wampirem.')

Sposób wykonania tego programu możesz prześledzić na stronie https://autbor.com/vampire2/ . Przyjmujemy założenie, że przed wykonaniem powyższego fragmentu kodu zmienna age ma przypisaną wartość 3000 . Być może oczekujesz wyświetlenia ciągu tekstowego 'W przeciwieństwie do Ciebie, Alicja nie jest nieśmiertelnym wampirem.' . Skoro jednak warunek age > 100 przyjmuje wartość True - ponieważ liczba 3000 jest większa niż 100 - dlatego wyświetlony jest ciąg tekstowy 'Nie jesteś Alicją, dziadku.' , a pozostałe polecenia elif są automatycznie pomijane. Pamiętaj więc, że będzie wykonana co najwyżej jedna klauzula elif i dlatego kolejność ich ułożenia ma znaczenie.

Diagram dla przedstawionego powyżej fragmentu kodu pokazałem na rysunku 2.7. Zwróć uwagę na zamianę miejscami rombów wyrażeń age > 100 i age > 2000 .

Rysunek 2.7. Diagram przedstawiający sposób działania programu vampire2.py. Przekreślona ścieżka wykonywania logicznie nigdy się nie zdarzy, bo jeśli zmienna age ma wartość większą niż 2000, zostanie to już uwzględnione przez warunek age > 100

Opcjonalnie można umieścić polecenie else po ostatnim poleceniu elif . W takim przypadku mamy gwarancję wykonania co najmniej jednej (i tylko jednej) klauzuli. Jeżeli warunki w poleceniach if i elif przyjmują wartość False , wówczas zostanie wykonana klauzula else . Poniżej przedstawiłem kolejną wersję omawianego tutaj programu witającego użytkownika, tym razem użyłem w nim klauzul if , elif i else .

name = 'Celina'
age = 3000
if name == 'Alicja':
print('Cześć, Alicja.')
elif age < 12:
print('Nie jesteś Alicją, dzieciaku.')
else:
print('Nie jesteś ani Alicją ani dzieciakiem.')

Sposób wykonania tego programu możesz prześledzić na stronie https://autbor.com/littlekid/ . Na rysunku 2.8 pokazałem diagram dla przedstawionego powyżej fragmentu kodu, który należy zapisać w pliku o nazwie littleKid.py .

Rysunek 2.8. Diagram przedstawiający sposób działania programu littleKid.py

Ujmując rzecz najprościej, ten rodzaj struktury kontroli przepływu działania programu można określić w następujący sposób: "Jeżeli pierwszy warunek jest prawdziwy, zrób to. Jeśli drugi warunek jest prawdziwy, wtedy zrób to. W przeciwnym razie zrób coś innego". Kiedy będziesz używać razem wszystkich trzech wymienionych klauzul, pamiętaj o wspomnianych wcześniej regułach kolejności, aby uniknąć błędów, takich jak pokazany na rysunku 2.7. Po pierwsze, zawsze istnieje dokładnie jedno polecenie if . Po nim powinny znajdować się wszystkie polecenia elif . Po drugie, jeśli chcesz mieć pewność, że wykonana zostanie przynajmniej jedna klauzula, na końcu struktury umieść polecenie else .

Pętla while

Blok kodu można wykonywać wielokrotnie za pomocą pętli while . Kod umieszczony w klauzuli while będzie wykonywany dopóty, dopóki warunek zdefiniowany w pętli while przyjmuje wartość True . W kodzie Pythona polecenie while składa się z wymienionych poniżej elementów.

Słowo kluczowe while . Warunek (czyli wyrażenie przyjmujące wartość True lub False ). Dwukropek. Wcięcie w kolejnym wierszu przedstawiające wcięty blok kodu (nazywany klauzulą polecenia while ).

Jak widać, polecenie while jest podobne do if . Różnica polega na zachowaniu tych poleceń. Po zakończeniu wykonywania klauzuli if program kontynuuje działanie od pierwszego polecenia znajdującego się po konstrukcji if . Natomiast na końcu klauzuli while wykonywanie programu jest kontynuowane od początku polecenia while . Klauzula while jest często nazywana pętlą while lub po prostu pętlą .

Poniżej przedstawiłem polecenie if i pętlę while , w których użyto tego samego warunku i które podejmują te same akcje na podstawie danego warunku. Najpierw spójrz na fragment kodu wykorzystujący polecenie if .

spam = 0
if spam < 5:
print('Witaj, świecie!')
spam = spam + 1

Teraz spójrz na fragment kodu oparty na poleceniu while .

spam = 0
while spam < 5:
print('Witaj, świecie!')
spam = spam + 1

Wymienione polecenia są podobne. W omawianym przykładzie sprawdzają wartość zmiennej spam i jeśli jest mniejsza niż 5 , wyświetlają odpowiedni komunikat. Jednak po wykonaniu oba przedstawione powyżej fragmenty kodu działają odmiennie. W przypadku polecenia if następuje po prostu wyświetlenie komunikatu Witaj, świecie! . Natomiast w przypadku polecenia while komunikat Witaj, świecie! został wyświetlony pięciokrotnie. Na rysunkach 2.9 i 2.10 przedstawiłem diagramy wyjaśniające sposób działania obu fragmentów kodu. Przeanalizuj je, aby dowiedzieć się, dlaczego omawiane programy działają tak, a nie inaczej.

Rysunek 2.9. Diagram dla fragmentu kodu opartego na poleceniu if

Rysunek 2.10. Diagram dla fragmentu kodu opartego na poleceniu while

Kod w poleceniu if sprawdza warunek, a następnie wyświetla komunikat Witaj, świecie! tylko jednokrotnie, jeśli warunek przyjmuje wartość True . Z kolei kod oparty na poleceniu while pięciokrotnie wyświetli wymieniony komunikat. W trakcie każdego wykonania kodu pętli nastąpi inkrementacja wartości zmiennej spam . Dlatego też po piątym wyświetleniu komunikatu liczba całkowita przechowywana przez zmienną spam będzie miała wartość 6 , czyli warunek spam < 5 przyjmie wartość False .

W pętli while warunek jest zawsze sprawdzany na początku każdej iteracji (czyli każdego wykonania pętli). Jeżeli warunek przyjmuje wartość True , klauzula będzie wykonana, a następnie warunek zostanie ponownie sprawdzony. Gdy tylko warunek przyjmie wartość False , klauzula while zostanie pominięta.

Irytująca pętla while

Poniżej przedstawiłem przykład programu wymagającego wpisanie dosłownie tekstu swoje imię . W edytorze Mu kliknij przycisk Nowy na pasku narzędzi w celu otworzenia nowej karty edytora pliku. Wprowadź przedstawiony poniżej kod i zapisz go pod nazwą yourName.py .

name = '' ?
while name != 'swoje imię': ?
print('Proszę wpisz swoje imię:')
name = input() ?
print('Dziękuję!') ?

Sposób wykonania tego programu możesz prześledzić na stronie https://autbor.com/yourname/ . Działanie programu rozpoczyna się od zdefiniowania zmiennej name i przypisania jej wartości w postaci pustego ciągu tekstowego . Dlatego też w kolejnym wierszu warunek name != 'swoje imię' przyjmie wartość True i wykonywanie programu będzie kontynuowane w klauzuli pętli while .

Kod zdefiniowany w tej klauzuli prosi użytkownika o wpisanie swojego imienia. Dane wejściowe zostaną umieszczone w zmiennej name . Ponieważ to jest ostatni wiersz bloku pętli, program kontynuuje działanie od początku pętli while i ponownie sprawdza warunek. Jeżeli wartością zmiennej name nie jest ciąg tekstowy 'swoje imię' , warunek przyjmuje wartość True i program ponownie wykonuje kod w klauzuli pętli while .

Jednak gdy tylko użytkownik wpisze swoje imię , warunkiem pętli stanie się 'swoje imię' != 'swoje imię' , który przyjmuje wartość False . Dlatego też program nie wykonuje klauzuli pętli while , a pomija ją i kontynuuje działanie, wykonując pozostałą część programu . Na rysunku 2.11 pokazałem diagram przedstawiający sposób działania programu yourName.py .

Rysunek 2.11. Diagram przedstawiający sposób działania programu yourName.py

Zobaczmy teraz program yourName.py w działaniu. Naciśnij klawisz F5 w celu uruchomienia programu i kilkakrotnie wpisz cokolwiek innego niż swoje imię , jak pokazałem poniżej.

Proszę wpisz swoje imię:
Al
Proszę wpisz swoje imię:
Albert
Proszę wpisz swoje imię:
%#@#%*(^&!!!
Proszę wpisz swoje imię:
swoje imię
Dziękuję!

Jeżeli nigdy nie wpiszesz swoje imię , warunek pętli while nigdy nie przyjmie wartości False i program będzie wyświetlał w nieskończoność prośbę o wpisanie swojego imienia. Wywołanie input() pozwala użytkownikowi na podanie odpowiedniego ciągu tekstowego, aby wykonywanie programu mogło być kontynuowane.

W innych programach warunek może nigdy nie ulegać zmianie, co potencjalnie oznacza problemy. Zobaczmy więc, jak można przerwać działanie pętli while .

Polecenie break

Istnieje skrót pozwalający na wcześniejsze przerwanie wykonywania klauzuli pętli while . Kiedy wykonywanie dotrze do polecenia break , nastąpi natychmiastowe opuszczenie klauzuli pętli while . W kodzie Pythona to polecenie składa się po prostu ze słowa kluczowego break .

To całkiem proste, prawda? Poniżej przedstawiłem program wykonujący takie samo zadanie jak poprzedni, ale tym razem użyłem polecenia break w celu zakończenia działania pętli. Wprowadź poniższy fragment kodu i zapisz plik pod nazwą yourName2.py .

while True: ?
print('Proszę wpisz swoje imię:')
name = input() ?
if name == 'swoje imię': ?
break ?
print('Dziękuję!') ?

Sposób wykonania tego programu możesz prześledzić na stronie https://autbor.com/yourname2/ . W pierwszym wierszu programu następuje utworzenie pętli działającej w nieskończoność , czyli tutaj pętli while , której warunek zawsze przyjmuje wartość True . (Wyrażenie w postaci True zawsze sprowadza się do wartości True ). Program zawsze wejdzie do pętli while i będzie mógł ją opuścić tylko po wykonaniu polecenia break . (Pętla działająca w nieskończoność nigdy nie kończy działania, jest to błąd dość często popełniany podczas programowania).