Python 101 Documentation Wydanie 0.5 Centrum Edukacji Obywatelskiej October 03 2014
Spis treści 1 Pobieranie tej dokumentacji 3 2 Przygotowanie do szkolenia 5 2.1 Środowisko systemowe i wymagane oprogramowanie......................... 5 2.2 Przygotowanie katalogu projektu.................................... 8 3 Zaczynamy! 11 3.1 Python - Podstawy programowania................................... 11 3.2 Mów mi Python wprowadzenie do języka Python........................... 17 3.3 Gra w Ponga............................................... 31 3.4 Gra w życie Conwaya.......................................... 40 3.5 Gra w Kółko i Krzyżyk......................................... 49 3.6 Quiz Aplikacja internetowa...................................... 55 3.7 Lista ToDo Aplikacja internetowa................................... 63 3.8 Chatter Aplikacja internetowa..................................... 63 3.9 Indices and tables............................................ 63 i
ii
Niniejsze materiały to dokumentacja do szkolenia z języka Python realizowanego w ramach projektu Koduj z Klasą prowadzonego przez Fundację Centrum Edukacji Obywatelskiej. Krótki link do tej strony: bit.ly/kzk-py Spis treści 1
2 Spis treści
ROZDZIAŁ 1 Pobieranie tej dokumentacji Materiały można pobrać do czytania w wersji offline. Poniższa komendy pobiorą dokumentację i rozpakują pliki na pulpicie w folderze ~/Pulpit/python-101-html: wget -O python-101-html.zip http://koduj-z-klasa.github.io/python101/python-101-html.zip unzip python-101-html.zip -d ~/Pulpit/ Te materiały można także pobrać i zmodyfikować i przygotować według instrukcji w repozytorium 3
4 Rozdział 1. Pobieranie tej dokumentacji
ROZDZIAŁ 2 Przygotowanie do szkolenia Przed szkoleniem warto przygotować sprawdzić i przygotować swój komputer. 2.1 Środowisko systemowe i wymagane oprogramowanie Postaraliśmy się by każdy z uczestników szkolenia Koduj z Klasą otrzymał gotowe środowisko, dzięki unifikacji minimalizujemy liczbę problemów konfiguracyjnych. Jednak przygotowanie swojego środowiska nie wymaga dużych nakładów pracy, wystarczy wykonać kilka krótkich instrukcji by dostosować swój komputer na potrzeby tego szkolenia. 2.1.1 Szkolny Remix Ucznia (SRU) Nasze materiały zakładają wykorzystanie Szkolnego Remixu Ucznia (SRU) ze względu na jego gotowość do realizacji celów szkoleniowych niemal z pudełka. http://sru.e-swoi.pl Przykłady zakładają jednakową ścieżkę do katalogu domowego użytkownika, w przypadku innych instalacji należy uwzględniać własną ścieżkę: /home/sru LiveCD lub uruchomienie z Pendrive Środowisko SRU jest przygotowane do uruchomienia bez instalacji na komputerach z wykorzystaniem tzw. Live CD. W ramach programu Koduj z Klasą przekazujemy pamięci USB zawierające SRU i umożliwiające uruchomienie systemu bez instalacji. Informacja: Pamięci USB zwykle są tak przygotowane że pomiędzy uruchomieniami zapamiętywane są tylko zmiany w katalogu domowym. Dzięki temu użytkownicy nie mogą popsuć konfiguracji systemu, ale też nie są wstanie instalować nowego oprogramowania. Dla komputerów z systemem Windows 8 i BIOS UEFI Aby używać Szkolny Remiks Ucznia jako maszynę wirtualną bez konieczności startu z USB, zainstalujcie Virtualbox, a następnie pobierzcie plik OVA i po prostu kliknijcie na niego dwa razy. Następnie postępujcie wg wskazówek wyświetlanych przez VirtualBox. Po wykonanym imporcie, będziecie mogli po prostu uruchomić maszynę w Virtualbox. 5
Po imporcie plik OVA można skasować, aby nie zabierał już miejsca. Nie będzie więcej potrzebny. pamięci USB zawierające SRU i umożliwiające uruchomienie systemu bez instalacji. Niezbędne pakiety: Virtualbox - wersja dla Windows Maszyna wirtualna SRU Brakujace komponenty Na starszych wersjach SRU może brakować oprogramowania przydatnego podczas szkolenia warto je do instalować Pobranie przykładów na komputerze uruchomionego z pomocą LiveCD lub Pendrive SRU wymaga wcześniejszego instalacji narzędzia GIT, w terminalu (Win+T) uruchamiamy: $ sudo apt-get install git Inne systemy Linux Wykorzystanie innych systemów Linux do celów szkoleniowych nie powinno sprawiać większych problemów pod warunkiem, że uzupełnimy brakujące oprogramowanie. Do instalacji wykorzystujemy systemowy package manager, przykładowo dla Ubuntu i Debiana: $ sudo apt-get build-dep python-pygame $ sudo apt-get install python-dev python-pip python-virtualenv 2.1.2 Środowisko Windows Nie zalecamy wykorzystania Windows ze względu na kompatybilność poleceń i ścieżek do plików używanych w scenariuszach. Jednak użycie Windows jako środowiska szkoleniowego nie jest wykluczone. Informacja: Pamiętaj by zmieniać znaki / (slash) na \ (backslash) w ścieżkach, natomiast w miejscu komend systemu Linux użyj bliskich zamienników z Windows. Instalacja Python 2.7 pod windows Możemy szybko zainstalować Python z pomocą konsoli PowerShell (taka niebieska) (new-object System.Net.WebClient).DownloadFile("https://www.python.org/ftp/python/2.7.8/python-2.7.8. msiexec /i python-2.7.8.msi TARGETDIR=C:\Python27 [Environment]::SetEnvironmentVariable("Path", "$env:path;c:\python27\;c:\python27\scripts\", "User") (new-object System.Net.WebClient).DownloadFile("https://raw.github.com/pypa/pip/master/contrib/get-pi C:\Python27\python.exe get-pip.py virtualenv Pozostałe biblioteki dystrybuowane w wersjach binarnych musimy zainstalować z katalogu /arch/ w repo, pozostałe instalujemy za pomocą pip: pip install -r requirements.txt 6 Rozdział 2. Przygotowanie do szkolenia
Jak nie ma PowerShell Jeśli nie mamy PowerShella to pozostaje ręcznie sciągnąć plik instalacyjny https://www.python.org/downloads/ A następnie zainstalować pip przy użyciu świeżo zainstalowanego Pythona :) python -c "exec( try: from urllib2 import urlopen \nexcept: from urllib.request import urlopen );f=ur Ponadto możemy ustawić zmienną systemową by za każdym razerm nie używać pełnej ścieżki. set PATH=%PATH%;c:\Python27\;c:\Python27\Scripts\ 2.1.3 Środowisko programistyczne Geany Geany to profesjonalne środowisko środowisko OpenSource, a więc dostępne na licencji GNU General Public Licence. To oznacza, że każdy użytkownik posiada: wolność uruchamiania programu, w dowolnym celu (wolność 0) wolność analizowania programu oraz dostosowywania go do swoich potrzeb (wolność 1) wolność rozpowszechniania kopii programu (wolność 2) wolność udoskonalania programu i publicznego rozpowszechniania własnych ulepszeń, dzięki czemu może z nich skorzystać cała społeczność (wolność 3). Geany oferuje kolorowanie składni dla najpopularniejszych języków, m.in. C, C++, C#, Java, PHP, HTML, Python, Perl i Pascal, wsparcie dla kodowania w ponad 50 standardach, mechanizm automatycznego zamykanie tagów dla HTMLXML, auto-wcięć, pracy na kartach i wiele, wiele więcej. Podczas pisania kodu przydatny okazuje się brudnopis, pozwalający tworzyć dowolne notatki, a także możliwość kompilacji plików źródłowych bezpośrednio z poziomu programu. 2.1.4 Środowisko programistyczne PyCharm PyCharm to profesjonalne, komercyjne środowisko programistyczne dostępne za darmo do celów szkoleniowych. To IDE doskonale wspiera proces uczenia się. Dzięki nawigacji po kodzie, podpowiedziom oraz wykrywaniu błędów niemal na bieżąco uczniowie mniej czasu będą spędzać na szukaniu problemów a więcej na poznawaniu tajników programowania. Szybka instalacja na systemach linux Instalacja wersji testowej na systemach Linux wymaga pobrania i rozpakowania archiwum: wget http://download.jetbrains.com/python/pycharm-professional-3.4.1.tar.gz -O - tar -xz./pycharm-3.4.1/bin/pycharm.sh Ręczna instalacja Na systemach Windows możemy zainstalować PyCharm po pobraniu pliku instalacyjnego ze strony producenta z pomocą przeglądarki. 2.1. Środowisko systemowe i wymagane oprogramowanie 7
Jak zdobyć bezpłatna licencję Każdy nauczyciel może wystąpić o klucz licencyjny przy pomocy formularza dostępnego na stronie producenta Polski słownik ortograficzny W programie możemy włączyć sprawdzanie polskiej pisowni, jednak potrzebne jest wskazanie pliku słownika. W ustawieniach Ctrl+Alt+S szukamy spell i dodajemy custom dictionaries folder wskazując na /usr/share/hunspell/ (lokalizacja w SRU). 2.2 Przygotowanie katalogu projektu Poszczególne zadania zakładają wykorzystanie wspólnego katalogu projektu python101 znajdującego się w katalogu domowym użytkownika. 2.2.1 Pobieranie materiałów Materiały szkoleniowe zostały umieszczone w repozytorium GIT w serwisie GitHub dzięki temu każdy może w łatwy sposób pobrać, zmieniać a także zsynchronizować swoją lokalną kopię. W katalogu domowym użytkownika uruchamiamy komendę: ~$ git clone https://github.com/koduj-z-klasa/python101.git W efekcie otrzymamy katalog python101 z kodami źródłowymi materiałów. Informacja: Przykłady zawierające znak zachęty $ oznaczają komendy do wykonania w terminalu systemu operacyjnego (uruchom przez Win+T). Oprócz znaku zachęty $ przykłady mogą zawierać informację o lokalizacji w jakiej należy wykonać komendę. Np. ~/python101$ oznacza że komendę wykonujemy w folderze python101 w katalogu domowym użytkownika, czyli /home/sru/python101 w środowisku SRU. Komendy należy kopiować i wklejać bez znaku zachęty $ i poprzedzającego tekstu. Komendy można wklejać do terminala środkowym klawiszem myszki. 2.2.2 Korzystanie z kodu źródłowego w opisie przykładów W materiałach będą pojawiać się przykłady kodu źródłowego jak ten poniżej. Te przykłady pokazują jak nasz kod może się rozwijać. By wspierać uczenie się na błędach i zwracanie uwagi na niuanse składni języka programowania, warto by część przykładów uczestnicy próbowali odtworzyć samodzielnie. Jednak dla w przypadku większego tempa i w przypadku jasnych przykładów warto je zwyczajnie kopiować, omawiać ich działanie i ewentualnie modyfikować w ramach eksperymentów. Niektóre przykłady starają się zachować numerację linii zgodną z oczekiwanym rezultatem. Przykładowo kod poniżej powinien zostać wklejony w linii 51 omawianego pliku. Podczas przepisywania kodu, można pominąć kawałki dokumentujące kod, to znaczy tzw. komentarze. Komentarzem są teksty zaczynające się od znaku # oraz teksty zamknięte pomiędzy potrójnymi cudzysłowami """. 8 Rozdział 2. Przygotowanie do szkolenia
2.2.3 Synchronizacja kodu pomiędzy etapami przykładów Informacja: Poniższe instrukcje nie są wymagane w ramach przygotowania, ale warto się z nimi zapoznać w przypadku gdybyśmy chcieli skorzystać z możliwości pozbycia się lokalnych zmian wprowadzonych podczas ćwiczeń i przewrócenia stany do punktu wyjścia. Materiały zostały podzielone w repozytorium na części które w kolejnych krokach są rozbudowywane. Dzięki temu na początku szkolenia mamy niewielki zbiór plików, natomiast w kolejnych krokach szkolenia możemy aktualizować wersję roboczą o nowe treści. Uczestnicy mogą spokojnie edytować i zmieniać materiały bez obaw o późniejsze różnice względem reszty grupy. Zmiany możemy szybko wyczyścić i powrócić do stanu z początku ćwiczenia: $ git reset --hard Możemy także skakać pomiędzy punktami kontrolnymi np. skoczyć do następnego Lub skoczyć do następnego punktu kontrolnego i zsynchronizować kody źródłowe grupy bez zachowania zmian poszczególnych uczestników: $ git checkout -f pong/z1 Jeśli uczestnicy chą wcześniej zachować swoje modyfikacje mogą je zapisać w swoim lokalnym repozytorium (wykonują tzw. commit). 2.2. Przygotowanie katalogu projektu 9
10 Rozdział 2. Przygotowanie do szkolenia
ROZDZIAŁ 3 Zaczynamy! 3.1 Python - Podstawy programowania Python jest dynamicznym językiem interpretowanym. Interpretowany tzn. że kod, który napiszemy możemy natychmiast wykonać bez potrzeby tłumaczenia (kompilowania) kodu programistycznego na język maszynowy (czyli na formę zrozumiałą przez komputer). Interpreter tłumaczy (kompiluje w locie) nasz kod oraz natychmiast go uruchamia. Interpreter może również być używany w trybie interaktywnym do testowania kawałków kodu (np. IPython omawiany w kolejnych scenariuszach). Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem $ python Po uruchomieniu interpretera komputer powinien wypisać trzy linie tekstu a w czwartej tak zwany znak zachęty, po którym wpisujemy komendy. Standardowym znakiem zachęty w interpreterze Pythona jest >>>. Informacja: Przykłady zawierające znak zachęty $ oznaczają komendy do wykonania w terminalu systemu operacyjnego (uruchom przez Win+T). Komendy należy kopiować i wklejać bez znaku zachęty $ i poprzedzającego tekstu. Komendy można wklejać do terminala środkowym klawiszem myszki. 3.1.1 Zmienne W interpreterze wpisz poniższy przykład: >>> a = 3 >>> b = 5 >>> a + b 8 >>> c = -6.5 >>> a + c -3.5 >>> 7/2 3.5 >>> 2*6 12 >>> 2**6 64 >>> kwiatek = stokrotka 11
>>> kwiatek2 = "róża" >>> kwiatek + i + kwiatek2 stokrotka i róża Informacja: Przykłady zawierające znaki zachęty >>> elementy do wykonania w interpreterze języka Python. Komendy należy kopiować i wklejać bez znaku zachęty >>>. W powyższym przykładzie wykonujemy operacje na zmiennych. Zmienne są pudełkami trzymającymi różne informacje. Zmienna posiada swoją nazwę i wartość. Nazwa zmiennej w Pythonie nie może zawierać: polskich znaków cyfry na pierwszym miejscu spacji znaków specjalnych za wyjątkiem podkreślnikiem ( _ ) Wielkość liter jest rozróżniana (zmienna x i zmienna X to dwie różne zmienne). Przykłady poprawnych: i _chodnik nazwa_23 a2c4 Przykłady niepoprawnych: 1nazwa 4_strony_świata z-myslnikiem, nazwa ze spacja Główne typy zmiennych, którymi będziemy się zajmować to: liczby całkowite (integer) liczby zmiennoprzecinkowe (float) napisy, czyli tzw. Łańcuchy znaków (string) Istnieje wiele innych typów zmiennych. [odniesienie do zewn. Źródeł] Zróbmy proste zadanie - będąc w interpreterze wykonaj: zmienna1 = raw_input( Podaj imię: ) print( Witaj, zmienna1) Stworzyliśmy właśnie pierwszy program w języku Python. Gratulacje! Przy użyciu funkcji raw_input pobiera on do zmiennej to, co użytkownik wpisze z klawiatury a następnie używając funkcji print wyświetla na ekranie kawałek tekstu oraz zawartość wcześniej utworzonej zmiennej. Aby zamienić podaną z klawiatury liczbę na zmienną liczbową (int lub float) musimy skorzystać z funkcji int. zmienna1 = raw_input("podaj 1 liczbę: ") zmienna2 = raw_input("podaj 2 liczbę: ") wynik = int(zmienna1) + int(zmienna2) print("suma:", wynik) 12 Rozdział 3. Zaczynamy!
Wskazówka: Grupy mniej zaawansowane mogą poświęcić czas na eksperymenty z operacjami na zmiennych podawanych z klawiatury. Funkcje Funkcje są to wcześniej zdefiniowane kawałki kodu, których możemy później użyć do wykonania określonej czynności, zamiast wpisywać ten sam kod po raz kolejny. W okrągłych nawiasach po nazwach funkcji umieszczamy parametry lub argumenty funkcji (może być ich więcej niż jeden). Parametry i argumenty oddzielamy od siebie przecinkami. Jak widać na przykładzie funkcji raw_input niektóre funkcje pozostawiają coś po sobie. W tym przypadku funkcja raw_input pozostawia po sobie to, co użytkownik wpisał z klawiatury a my wrzucamy to do naszej zmiennej zmienna1. Kiedy funkcja pozostawia po sobie jakieś dane, mówimy, że funkcja zwraca dane. Kolejny program zapiszemy już w pliku aby prościej było go zmieniać oraz wykonywać wiele razy. W tym celu należy otworzyć edytor tekstu, wpisać do niego instrukcje języka Python, a następnie zapisać z rozszerzeniem.py. Aby uruchomić tak zapisany program należy będąc w linii poleceń (konsola / terminal) w tym samym katalogu gdzie zapisaliśmy nasz plik wpisać: $python nazwa-pliku.py 3.1.2 Wyrażenia warunkowe Do podejmowania decyzji w programowaniu służy instrukcja warunkowa if. Blok kodu podany po instrukcji if zostanie wykonany wtedy, gdy wyrażenie warunkowe będzie prawdziwe. W przeciwnym przypadku blok kodu zostanie zignorowany. Część else jest przydatna, jeśli chcemy, żeby nasz program sprawdził wyrażenie warunkowe i wykonał blok kodu jeśli wyrażenie warunkowe jest prawdziwe lub wykonał inny blok kodu jeśli wyrażenie warunkowe było fałszywe. Python pozwala także na sprawdzenie większej liczby warunków w ramach jednej instrukcji if. instrukcja elif (skrót od else if). if wyrażenie_warunkowe: blok kodu 1 elif: blok kodu 2 else: blok kodu 3 Służy do tego Wszystkie instrukcje w bloku kodu muszą być wcięte względem instrukcji if. W ten sposób Python rozpoznaje, które instrukcje ma wykonać po sprawdzeniu prawdziwości wyrażenia. Tak samo po instrukcjach elif i else musimy wstawić dwukropek a instrukcje muszą być wcięte. Głębokość wcięcia nie ma znaczenia (dobry zwyczaj programowania w Pythonie mówi, żeby używać czterech spacji) ale musi być ono w całym programie zawsze tej samej głębokości. Pobawmy się instrukcjami if, elif i else na prostym przykładzie. zmienna = raw_input( Podaj liczbę: ) zmienna = int(zmienna) if zmienna > 0: print( Wpisałeś liczbę dodatnią ) elif zmienna == 0: print( Wpisałeś zero ) else: 3.1. Python - Podstawy programowania 13
print( Wpisałeś liczbę ujemną ) print( Koniec programu ) W programie na początku wczytywana jest wartość z klawiatury do zmiennej, a następnie dokonujemy zmiany jej typu na liczbę całkowitą. W dalszej części stosujemy instrukcję if sprawdzając czy wartość podanej liczby jest większa od 0. Jeśli wartość będzie większa od 0 na ekranie wyświetlony będzie napis Wpisałeś liczbę dodatnią, jeśli nie, program wykona kolejną instrukcję: elif sprawdzając czy liczba jest równa 0. Jeśli żaden z powyższych warunków nie będzie spełniony wykonane zostanie polecenie zawarte po instrukcji else. Program zakończy się wyświetlając: Koniec programu. Jak również widać porównanie w Pythonie, wykonujemy poprzez podwójne użycie znaku równości: ==. Matematyczne wyrażenie nie równe () w Pythonie zapisujemy jako!=. 3.1.3 Gra w zgadnij liczbę Napisz program, w którym: do zmiennej dana przypiszesz pewną liczbę użytkownik będzie mógł podać z klawiatury dowolną liczbę całkowitą jeżeli użytkownik trafi program wyświetli komunikat: Gratulacje!, a jeśli nie, to wyświetli napis określający czy podana liczba jest większa od danej czy mniejsza. dana = 18 strzal = int(raw_input("wpisz liczbę całkowitą")) if strzal == dana: print("gratulacje! Zgadłeś") elif strzal < dana: print("nie! Szukana liczba jest większa!") else: print("nie! Szukana liczba jest mniejsza!") print("koniec programu.") 3.1.4 Zadania dodatkowe 1. Za pomocą poznanych narzędzi stwórz program będący kalkulatorem. 2. Napisz program rozwiązujący równania kwadratowe (Przykład równania kwadratowego). 3. Napisz program, który spyta użytkownika ile ma lat, a następnie wyświetli czy osoba ta jest młodzieżą, dzieckiem czy dorosłym (załóżmy, że dziecko ma mniej niż 12 lat, a dorosły więcej niż 18). 4. Napisz program, który będzie sortował trzy podane przez użytkownika liczby. 5. Napisz program, który w odpowiedzi na podaną przez użytkownika liczbę będzie wyświetlał komunikat czy jest to liczba parzysta, czy nieparzysta. 6. Napisz program, który będzie sprawdzał czy z podanych przez użytkownika trzech długości można zbudować trójkąt. Przykład równania kwadratowego 1 print Dla równania kwadratowego ax2+bx+c=0 2 a=int(raw_input( podaj wartość parametru a: )) 3 b=int(raw_input( podaj wartość parametru b: )) 4 c=int(raw_input( podaj wartość parametru c: )) 14 Rozdział 3. Zaczynamy!
5 delta = b**2-4*a*c 6 if delta > 0: 7 x1 = (-b-delta**(1/2))/(2*a) 8 x2 = (-b+delta**(1/2))/(2*a) 9 print x1 =, x1,, x2=, x2 10 elif delta == 0: 11 x0 = -b/(2*a) 12 print x0 =, x0 13 else: 14 print brak rozwiązań 3.1.5 Pętla WHILE Pętla while służy do konstrukcji bloku instrukcji, które będą wykonywane warunkowo. W programie najpierw będzie sprawdzane czy warunek jest spełniony jeśli tak, to wykonane będą wszystkie instrukcje zawarte w bloku. Następnie ponownie sprawdzany jest warunek, jeśli nadal jest spełniony to ponownie wykonuje wszystkie polecenia. Pętla jest wykonywana tak długo, jak długo warunek jest prawdziwy. while wyrażenie_warunkowe: blok kodu Zobaczmy działanie pętli while na poniższym przykładzie. 1 import random 2 dana = random.choice(range(10)) 3 kontynuuj = True 4 while koniec: 5 strzal = int(raw_input("wpisz liczbę całkowitą")) 6 if strzal == dana: 7 print("gratulacje! Zgadłeś") 8 kontynuuj = False 9 elif strzal < dana: 10 print("nie! Szukana liczba jest większa!") 11 else: 12 print("nie! Szukana liczba jest mniejsza!") 13 print("koniec programu.") Program będzie wykonywany do momentu, w którym użytkownik poda właściwą liczbę. Zatem nie trzeba do każdego strzału ponownie uruchamiać programu. Zmienna kontynuuj ma ustawioną wartość logiczną True (z angielskiego prawda). W momencie, w którym użytkownik poda właściwą liczbę zmienna przyjmie wartość logiczną False (z angielskiego fałsz), co spowoduje zakończenie wykonywania pętli while. 3.1.6 Wyrażenia break i continue Wyrażenie break powoduje natychmiastowe zakończenie wykonywania pętli. 1 import random 2 dana = random.choice(range(10)) 3 while True: 4 strzal = int(raw_input("wpisz liczbę całkowitą")) 5 if strzal == dana: 6 print("gratulacje! Zgadłeś") 7 break 8 elif strzal < dana: 9 print("nie! Szukana liczba jest większa!") 10 else: 3.1. Python - Podstawy programowania 15
11 print("nie! Szukana liczba jest mniejsza!") 12 print("koniec programu.") Wyrażenie continue powoduje ominięcie następujących po nim wyrażeń w bloku, a następnie rozpoczyna ponowne wykonanie pętli. 1 import random 2 dana = random.choice(range(10)) 3 while True: 4 strzal = int(raw_input("wpisz liczbę całkowitą")) 5 if strzal > dana: 6 print("nie! Szukana liczba jest mniejsza!") 7 continue 8 elif strzal < dana: 9 print("nie! Szukana liczba jest większa!") 10 continue 11 print("gratulacje! Zgadłeś") 12 break 13 print("koniec programu.") Zadania dodatkowe 1. Napisz program, który sumuje liczby dodatnie podawane przez użytkownika pętla pozwala użytkownikowi podawać liczby dopóki nie poda liczby niedodatniej. Następnie obok podawanego wyniku będzie wyświetlana liczba określająca ilość podanych liczb. 2. Na podstawie wcześniejszego zadania napisz program obliczający średnią liczb dodatnich, a następnie zmodyfikuj go tak, aby obliczana była średnia również dla liczb ujemnych. 3.1.7 Pętla FOR Pętla for służy do wykonywania tego samego bloku operacji dla każdego elementu z pewnej listy. Ilość wykonań tego bloku jest równa liczbie elementów tej listy. Wywoływana w pętli zmienna przyjmuje po kolei wartości każdego z elementów. Przykłady list: lista liczb wpisanych ręcznie elementy podane w nawiasach kwadratowych [2,3,4,5] funkcja range wywoła kolejno liczby naturalne zaczynając od podanej w nawiasie na pierwszym miejscu, kończąc na liczbie mniejszej o 1 od liczby na miejscu drugim range(2,6) Zobrazujmy działanie pętli for na prostym przykładzie, wymieniającym kolejno elementy z pewnej listy. print("mamy listę elementów: ", [5,6,7,8]) for liczba in [5,6,7,8]: print("element listy: ", liczba) Zadania dodatkowe 1. Napisz dwa programy, które wypisują liczby naturalne od 1 do 15. W pierwszym programie wykonaj pętlę for, a w drugim while. 16 Rozdział 3. Zaczynamy!
2. Zmodyfikuj powyższe zadanie, tak aby programy obliczały sumę liczb od 1 do 15. 3. Za pomocą pętli for, napisz program, który oblicza silnię liczby podanej przez użytkownika. 4. Oblicz sumę kwadratów liczb naturalnych z zakresu od 1 do 100. 3.1.8 Słowniczek Język interpretowany język, który jest tłumaczony i wykonywany w locie. Tłumaczeniem i wykonywaniem programu zajmuje się specjalny program nazwany interpreterem języka. Interpreter program, który zajmuje się tłumaczeniem kodu języka programowania na język maszynowy i jego wykonywaniem. Zmienne symbole zdefiniowane i nazwane przez programistę, które służą do przechowywania wartości, obliczeń na nich i odwoływanie się do wartości przez zdefiniowaną nazwę. Funkcje fragmenty kodu zamknięte w określonym przez programistę symbolu, mogące przyjmować parametry oraz mogące zwracać wartości. Umożliwiają wielokrotne wywoływanie tego samego kodu, bez konieczności jego przepisywania za każdym razem, gdy zajdzie potrzeba jego wykonania. Typ zmiennych rodzaj danych, który przypisany jest do zmiennej w momencie jej tworzenia. 3.2 Mów mi Python wprowadzenie do języka Python 3.2.1 I. Jestem Python Python jest dynamicznie typowanym językiem interpretowanym wysokiego poziomu. Cechuje się czytelnością i zwięzłością kodu. Stworzony został w latach 90. przez Guido van Rossuma, nazwa zaś pochodzi od tytułu serialu komediowego emitowanego w BBC pt. Latający cyrk Monty Pythona. W systemach opartych na Linuksie interpreter Pythona jest standardowo zainstalowany, ponieważ duża część oprogramowania na nim bazuje. W systemach Microsoft Windows Pythona należy doinstalować. Funkcjonalność Pythona może być dowolnie rozszerzana dzięki licznym bibliotekom pozwalającym tworzyć aplikacje okienkowe (PyQt, PyGTK, wxpython), internetowe (Flask, Django) czy multimedialne i gry (Pygame). Istnieją również kompleksowe projekty oparte na Pythonie wspomagające naukową analizę, obliczenia i przetwarzanie danych (Anaconda, Canopy). Kodować można w dowolnym edytorze tekstowym, jednak ze względów praktycznych warto korzystać z programów ułatwiających pisanie kodu. Polecić można np. lekkie, szybkie i obsługujące wiele języków środowisko Geany, a także profesjonalne rozwiązanie, jakim jest aplikacja PyCharm. Obydwa programy działają na platformie Linux i Windows. Zanim przystąpimy do pracy w katalogu domowym utworzymy podkatalog python, w którym będziemy zapisywali nasze skrypty: Terminal I.1 ~ $ mkdir python Poznawanie Pythona zrealizujemy poprzez rozwiązywanie prostych zadań, które pozwolą zaprezentować elastyczność i łatwość tego języka. Nazwy kolejnych skryptów umieszczone są jako komentarz zawsze w czwartej linii kodu. Pliki zawierające skrypty Pythona mają zazwyczaj rozszerzenie.py. Bardzo przydatnym narzędziem podczas kodowania w Pythonie jest konsola interpretera, którą uruchomimy wydając w terminalu polecenie python lub ipython[#f1]_. Można w niej testować i debugować wszystkie wyrażenia, warunki, polecenia itd., z których korzystamy w skryptach. 3.2. Mów mi Python wprowadzenie do języka Python 17
3.2.2 II. Witaj Python! ZADANIE II.1 Pobierz od użytkownika imię, wiek i powitaj go komunikatem:: Mów mi Python, mam x lat. świecie imie. Jesteś starszy(młodszy) ode mnie. Kod II.1 Witaj w moim #! /usr/bin/env python # -*- coding: UTF-8 -*- # ~/python/01_hello.py # inicjalizujemy zmienne (wartości) curyear = 2014 pythonyear = 1989 wiekpythona = curyear - pythonyear # ile lat ma Python # pobieramy dane imie = raw_input( Jak się nazywasz? ) wiek = int(raw_input( Ile masz lat? )) # wyprowadzamy dane print "Witaj w moim świecie ",imie print "Mów mi Python, mam", wiekpythona, "lat." # instrukcja warunkowa if wiek > wiekpythona: print Jesteś starszy ode mnie. else: print Jesteś młodszy ode mnie. JAK TO DZIAŁA Pojęcia: zmienna, wartość, wyrażenie, wejście i wyjście danych, instrukcja warunkowa, komentarz. Deklaracja zmiennej w Pythonie nie jest wymagana, wystarczy podanej nazwie przypisać jakąś wartość za pomocą operatora przypisania = 1. Zmiennym często przypisujemy wartości za pomocą wyrażeń, czyli działań arytmetycznych lub logicznych. Funkcja raw_input() zwraca pobrane z klawiatury znaki jako napis, czyli typ string. Funkcja int() umożliwia konwersję napisu na liczbę całkowitą, czyli typ integer. Funkcja print drukuje podane argumenty oddzielone przecinkami. Komunikaty tekstowe ujmujemy w cudzysłowy podwójne lub pojedyncze. Przecinek oddziela kolejne argumenty spacjami. Instrukcja if (jeżeli) pozwala na warunkowe wykonanie kodu. Jeżeli podane wyrażenie jest prawdziwe (przyjmuje wartość True) wykonywana jest pierwsza instrukcja, w przeciwnym wypadku (else), kiedy wyrażenie jest fałszywe (wartość False), wykonywana jest instrukcja druga. Warto zauważyć, że polecenia instrukcji warunkowej kończymy dwukropkiem. Charakterystyczną cechą Pythona jest używanie wcięć do zaznaczania bloków kodu. Komentarze wprowadzamy po znaku #. 1 Dlatego niekiedy mówi się, że w Pythonie zmiennych nie ma, są natomiast wartości określonego typu. 18 Rozdział 3. Zaczynamy!
POĆWICZ SAM Zmień program tak, aby zmienna curyear (aktualny rok) była podawana przez użytkownika na początku programu. 3.2.3 III. Warunki i pętle ZADANIE III.1 Kod III.1 Pobierz od użytkownika trzy liczby, sprawdź, która jest najmniejsza i wydrukuj ją na ekranie. #! /usr/bin/env python # -*- coding: UTF-8 -*- # ~/python/02_if.py op = "t" while op == "t": a, b, c = raw_input("podaj trzy liczby oddzielone spacjami: ").split(" ") print "Wprowadzono liczby:", a, b, c, print "\nnajmniejsza: ", if a < b: if a < c: print a elif b < c: print b else: print c op = raw_input("jeszcze raz (t/n)? ") print "Nie, to nie :-(" JAK TO DZIAŁA Pojęcia: pętla, obiekt, metoda, instrukcja warunkowa zagnieżdżona, formatowanie kodu. Pętla while umożliwia powtarzanie określonych operacji, czyli pozwala użytkownikowi wprowadzać kolejne serie liczb. Definiując pętle określamy warunek powtarzania kodu. Dopóki jest prawdziwy, czyli dopóki zmienna op ma wartość t pętla działa. Do wydzielania kodu przynależnego do pętli i innych instrukcji (np. if) stosujemy wcięcia. Formatując kod, możemy używać zarówno tabulatorów, jak i spacji, ważne aby w obrębie pliku było to konsekwentne 2. W Pythonie wszystko jest obiektem, czyli typy wbudowane, np. napisy, posiadają metody (funkcje) wykonujące określone operacje na wartościach. W podanym kodzie funkcja raw_input() zwraca ciąg znaków wprowadzony przez użytkownika, z którego wydobywamy poszczególne słowa za pomocą metody split() typu string. Instrukcje warunkowe (if), jak i pętle, można zagnieżdżać stosując wcięcia. W jednej złożonej instrukcji warunkowej można sprawdzać wiele warunków (elif:). 2 Dobry styl programowania sugeruje używanie do wcięć 4 spacji. 3.2. Mów mi Python wprowadzenie do języka Python 19
POĆWICZ SAM Sprawdź, co się stanie, jeśli podasz liczby oddzielone przecinkiem lub podasz za mało liczb. Zmień program tak, aby poprawnie interpretował dane oddzielane przecinkami. ZADANIE III.2 Kod III.2 Wydrukuj alfabet w porzadku naturalnym, a następnie odwróconym w formacie: mała => duża litera. W jednym wierszu trzeba wydrukować po pięć takich grup. #! /usr/bin/env python # -*- coding: UTF-8 -*- # ~/python/03_petle.py print "Alfabet w porządku naturalnym:" x = 0 for i in range(65,91): litera = chr(i) tmp = litera + " => " + litera.lower() x += 1 if i > 65 and x % 5 == 0: # warunek złożony x = 0 tmp += "\n" print tmp, x = -1 print "\nalfabet w porządku odwróconym:" for i in range(122,96,-1): litera = chr(i) x += 1 if x == 5: x = 0 print "\n", print litera.upper(), "=>", litera, JAK TO DZIAŁA Pojęcia: iteracja, pętla, kod ASCII, lista, inkrementacja, operatory arytmetyczne, logiczne, przypisania i zawierania. Pętla for wykorzystuje zmienną i, która przybiera wartości z listy liczb całkowitych zwróconej przez funkcję range(). Parametry tej funkcji określają wartość początkową i końcową listy, przy czym wartość końcowa nie wchodzi do listy. Kod range(122,96,-1) generuje listę wartości malejących od 122 do 97(!) z krokiem -1. Funkcja chr() zwraca znak, którego kod ASCII, czyli liczbę całkowitą, przyjmuje jako argument. Metoda lower() typu string (napisu) zwraca małą literę, upper() dużą. Wyrażenie przypisywane zmiennej tmp pokazuje, jak można łączyć napisy (konkatenacja). Zmienna pomocnicza x jest zwiększana (inkrementacja) w pętlach o 1. Wyrażenie x += 1 odpowiada wyrażeniu x = x + 1. Pierwszy warunek wykorzystuje operator logiczny and (koniunkcję) i operator modulo % (zwraca resztę z dzielenia), aby do ciągu znaków w zmiennej tmp dodać znak końca linii (\n) za pomocą operatora +=. W drugim warunku używamy operatora porównania ==. Poniżej podano wybrane operatory dostępne w Pythonie. Arytmetyczne: 20 Rozdział 3. Zaczynamy!
+, -,, /, //, %, * (potęgowanie) znak + znak (konkatenacja napisów) znak * 10 (powielenie znaków) Przypisania: - =, +=, -=, *=, /=, %=, **=, //= Logiczne: - and, or, not Fałszem logicznym są: liczby zero (0, 0.0), False, None (null), puste kolekcje ([], (), {}, set()), puste napisy. Wszystko inne jest prawdą logiczną. Zawierania: - in, not in Porównania: - ==, >, <, <>, <=, >=!= (jest różne) POĆWICZ SAM Uprość warunek w pierwszej pętli for drukującej alfabet w porządku naturalnym tak, aby nie używać operatora modulo. Wydrukuj co n-tą grupę liter alfabetu, przy czym wartość n podaje użytkownik. Wskazówka: użyj opcjonalnego, trzeciego argumentu funkcji range(). Sprawdź działanie różnych operatorów Pythona w konsoli. 3.2.4 IV. Listy, tuple i funkcje ZADANIE IV.1 Pobierz od użytkownika n liczb i zapisz je w liście. Wydrukuj: elementy listy i ich indeksy, elementy w odwrotnej kolejności, posortowane elementy. Usuń z listy pierwsze wystąpienie elementu podanego przez użytkownika. Usuń z listy element o podanym indeksie. Podaj ilość wystąpień oraz indeks pierwszego wystąpienia podanego elementu. Wybierz z listy elementy od indeksu i do j. Wszystkie poniższe przykłady proponujemy wykonać w konsoli Pythona. Nie umieszczaj w konsoli komentarzy, możesz też pominąć lub skrócić komunikaty funkcji print. Można również wpisać poniższy kod do pliku i go uruchomić. Kod IV.1 #! /usr/bin/env python # -*- coding: UTF-8 -*- # ~/python/04_1_listy.py tupla = input("podaj liczby oddzielone przecinkami: ") lista = [] # deklaracja pustej listy for i in range(len(tupla)): lista.append(int(tupla[i])) print "Elementy i ich indeksy:" for i, v in enumerate(lista): print v, "[",i,"]" 3.2. Mów mi Python wprowadzenie do języka Python 21
print "Elementy w odwróconym porządku:" for e in reversed(lista): print e, print "" print "Elementy posortowane rosnąco:" for e in sorted(lista): print e, print "" e = int(raw_input("którą liczbę usunąć? ")) lista.remove(e) print lista a, i = input("podaj element do dodania i indeks, przed którym ma się on znaleźć: ") lista.insert(i, a) print lista e = int(raw_input("podaj liczbę, której wystąpienia w liście chcesz zliczyć? ")) print lista.count(e) print "Pierwszy indeks, pod którym zapisana jest podana liczba to: " print lista.index(e) print "Pobieramy ostatni element z listy: " print lista.pop() print lista i, j = input("podaj indeks początkowy i końcowy, aby uzyskać frgament listy: ") print lista[i:j] JAK TO DZIAŁA Pojęcia: tupla, lista, metoda. Funkcja input() pobiera dane wprowadzone przez użytkownika (tak jak raw_input()), ale próbuje zinterpretować je jako kod Pythona. Podane na wejściu liczby oddzielone przecinkami zostają więc spakowane jako tupla (krotka). Jest to uporządkowana sekwencja poindeksowanych danych, przypominająca tablicę, której wartości nie można zmieniać. Gdybyśmy chcieli wpisać do tupli wartości od razu w kodzie, napisalibyśmy: tupla = (4, 3, 5) 3. Listy to również uporządkowane sekwencje indeksowanych danych, zazwyczaj tego samego typu, które jednak możemy zmieniać. Dostęp do elementów tupli lub listy uzyskujemy podając nazwę i indeks, np. lista[0]. Elementy indeksowane są od 0 (zera!). Funkcja len() zwraca ilość elementów w tupli/liście. Funkcja enumerate() zwraca obiekt zawierający indeksy i elementy sekwencji (np. tupli lub listy) podanej jako atrybut. Funkcja reversed() zwraca odwróconą sekwencję. Lista ma wiele użytecznych metod:.append(x) dodaje x do listy;.remove(x) usuwa pierwszy x z listy;.insert(i, x) wstawia x przed indeksem i;.count(x) zwraca ilość wystąpień x;.index(x) zwraca indeks pierwszego wystąpienia x;.pop() usuwa i zwraca ostatni element listy. Funkcja reversed(lista) zwraca kopię listy w odwróconym porządku, natomiast sorted(lista) zwraca kopię listy posortowanej rosnąco. Jeżeli chcemy trwale odwrócić lub posortować elementy listy stosujemy metody:.reverse() i.sort(). Z każdej sekwencji (napisu, tupli czy listy) możemy wydobywać fragmenty dzięki notacji slice (wycinek). W najprostszym przypadku polega ona na podaniu początkowego i końcowego (wyłącznie) indeksu elementów, które chcemy wydobyć, np. lista[1:4]. 3 W definicji tupli nawiasy są opcjonalne, można więc pisać tak: tupla = 3, 2, 5, 8. 22 Rozdział 3. Zaczynamy!
POĆWICZ SAM Utwórz w konsoli Pythona dowolną listę i przećwicz notację slice. Sprawdź działanie indeksów pustych i ujemnych, np. lista[2:], lista[:4], lista[-2], lista[-2:]. Posortuj dowolną listę malejąco. Wskazówka: wykorzystaj metodę.sort(reverse=true). ZADANIE IV.2 Kod IV.2 Wypisz ciąg Fibonacciego aż do n-ego wyrazu podanego przez użytkownika. Ciąg Fibonacciego to ciąg liczb naturalnych, którego każdy wyraz poza dwoma pierwszymi jest sumą dwóch wyrazów poprzednich. Początkowe wyrazy tego ciągu to: 0 1 1 2 3 5 8 13 21 1 #! /usr/bin/env python 2 # -*- coding: UTF-8 -*- 3 4 # ~/python/04_2_fibonacci.py 5 6 def fibonacci(n): #definicja funkcji 7 pwyrazy = (0, 1) #dwa pierwsze wyrazy ciągu zapisane w tupli 8 a, b = pwyrazy #przypisanie wielokrotne, rozpakowanie tupli 9 while a < n: 10 print b 11 a, b = b, a+b #przypisanie wielokrotne 12 13 n = int(raw_input("podaj numer wyrazu: ")) 14 fibonacci(n) #wywołanie funkcji 15 print "" #pusta linia 16 print "=" * 25 #na koniec szlaczek JAK TO DZIAŁA Pojęcia: funkcja, zwracanie wartości, tupla, rozpakowanie tupli, przypisanie wielokrotne. Definicja funkcji w Pythonie polega na użyciu słowa kluczowego def, podaniu nazwy funkcji i w nawiasach okrągłych ewentualnej listy argumentów. Definicję kończymy znakiem dwukropka, po którym wpisujemy w następnych liniach, pamiętając o wcięciach, ciało funkcji. Funkcja może, ale nie musi zwracać wartości. Jeżeli chcemy zwrócić jakąś wartość używamy polecenia return wartość. Zapis a, b = pwyrazy jest przykładem rozpakowania tupli, tzn. zmienne a i b przyjmują wartości kolejnych elementów tupli pwyrazy. Zapis równoważny, w którym nie definiujemy tupli tylko wprost podajemy wartości, to a, b = 0, 1; ten sposób przypisania wielokrotnego stosujemy w kodzie a, b = b, b+a. Jak widać, ilość zmiennych z lewej strony musi odpowiadać liczbie wartości rozpakowywanych z tupli lub liczbie wartości podawanych wprost z prawej strony. POĆWICZ SAM Zmień funkcję fibonnacci() tak, aby zwracała wartość n-tego wyrazu. Wydrukuj tylko tę wartość w programie. 3.2. Mów mi Python wprowadzenie do języka Python 23
3.2.5 V. Listy, zbiory, moduły i funkcje w praktyce ZADANIE Napisz program, który umożliwi wprowadzanie ocen z podanego przedmiotu ścisłego (np. fizyki), następnie policzy i wyświetla średnią, medianę i odchylenie standardowe wprowadzonych ocen. Funkcje pomocnicze i statystyczne umieść w osobnym module. :nrkodu Kod V.1 1 #! /usr/bin/env python 2 # -*- coding: UTF-8 -*- 3 4 # ~/python/05_oceny_03.py 5 6 # importujemy funkcje z modułu ocenyfun zapisanego w pliku ocenyfun.py 7 from ocenyfun import drukuj 8 from ocenyfun import srednia 9 from ocenyfun import mediana 10 from ocenyfun import odchylenie 11 12 przedmioty = set([ polski, angielski ]) #definicja zbioru 13 drukuj(przedmioty, "Lista przedmiotów zawiera: ") #wywołanie funkcji z modułu ocenyfun 14 15 print "\naby przerwać wprowadzanie przedmiotów, naciśnij Enter." 16 while True: 17 przedmiot = raw_input("podaj nazwę przedmiotu: ") 18 if len(przedmiot): 19 if przedmiot in przedmioty: #czy przedmiot jest w zbiorze? 20 print "Ten przedmiot już mamy :-)" 21 przedmioty.add(przedmiot) #dodaj przedmiot do zbioru 22 else: 23 drukuj(przedmioty,"\ntwoje przedmioty: ") 24 przedmiot = raw_input("\nz którego przedmiotu wprowadzisz oceny? ") 25 if przedmiot not in przedmioty: #jeżeli przedmiotu nie ma w zbiorze 26 print "Brak takiego przedmiotu, możesz go dodać." 27 else: 28 break # wyjście z pętli 29 30 oceny = [] # pusta lista ocen 31 ocena = None # zmienna sterująca pętlą i do pobierania ocen 32 print "\naby przerwać wprowadzanie ocen, podaj 0 (zero)." 33 34 while not ocena: 35 try: #mechanizm obsługi błędów 36 ocena = int(raw_input("podaj ocenę (1-6): ")) 37 if (ocena > 0 and ocena < 7): 38 oceny.append(float(ocena)) 39 elif ocena == 0: 40 break 41 else: 42 print "Błędna ocena." 43 ocena = None 44 except ValueError: 45 print "Błędne dane!" 46 47 drukuj(oceny,przedmiot.capitalize()+" - wprowadzone oceny: ") 48 s = srednia(oceny) # wywołanie funkcji z modułu ocenyfun 24 Rozdział 3. Zaczynamy!
49 m = mediana(oceny) # wywołanie funkcji z modułu ocenyfun 50 o = odchylenie(oceny,s) # wywołanie funkcji z modułu ocenyfun 51 print "\nśrednia: {0:5.2f}\nMediana: {1:5.2f}\nOdchylenie: {2:5.2f}".format(s,m,o) JAK TO DZIAŁA Pojęcia: import, moduł, zbiór, przechwytywanie wyjatków, formatowanie napisów i danych na wyjściu. Klauza from moduł import funkcja umożliwia wykorzystanie w programie funkcji zdefiniowanych w innych modułach i zapisanych w osobnych plikach. Dzięki temu utrzymujemy przejrzystość programu głównego, a jednocześnie możemy funkcje z modułów wykorzystywać, importując je w innych programach. Nazwa modułu to nazwa pliku z kodem pozbawiona jednak rozszerzenia.py. Moduł musi być dostępny w ścieżce przeszukiwania 4, aby można go było poprawnie dołączyć. Instrukcja set() tworzy zbiór, czyli nieuporządkowany zestaw niepowtarzalnych (!) elementów. Instrukcje if przedmiot in przedmioty i if przedmiot not in przedmioty za pomocą operatorów zawierania (not) in sprawdzają, czy podany przedmiot już jest lub nie w zbiorze. Polecenie przedmioty.add() pozwala dodawać elementy do zbioru, przy czym jeżeli element jest już w zbiorze, nie zostanie dodany. Polecenie przedmioty.remove() usunnie podany jako argument element ze zbioru. Oceny z wybranego przedmiotu pobieramy w pętli dopóty, dopóki użytkownik nie wprowadzi 0 (zera). Blok try...except pozwala przechwycić wyjątki, czyli w naszym przypadku niemożność przekształcenia wprowadzonej wartości na liczbę całkowitą. Jeżeli funkcja int() zwróci wyjątek, wykonywane są instrukcje w bloku except ValueError:, w przeciwnym razie po sprawdzeniu poprawności oceny dodajemy ją jako liczbę zmiennoprzecinkową (typ float) do listy: oceny.append(float(ocena)). Metoda.capitalize() pozwala wydrukować podany napis dużą literą. W funkcji print(...).format(s,m,o) zastosowano formatowanie drukowanych wartości, do których odwołujemy się w specyfikacji {0:5.2f}. Pierwsza cyfra wskazuje, którą wartość z numerowanej od 0 (zera) listy, umieszczonej w funkcji format(), wydrukować; np. aby wydrukować drugą wartość, trzeba by użyć kodu {1:}.Po dwukropku podajemy szerokość pola przeznaczonego na wydruk, po kropce ilość miejsc po przecinku, symbol f oznacza natomiast liczbę zmiennoprzecinkową stałej precyzji. POĆWICZ SAM W konsoli Pythona utwórz listę wyrazy zawierającą elementy: abrakadabra i kordoba. Utwórz zbiór w1 poleceniem set(wyrazy[0]). Oraz zbiór w2 poleceniem set(wyrazy[1]). Wykonaj kolejno polecenia: print w1 - w2; print w1 w2; print w1 & w2; print w1 ^ w2. Przykłady te ilustrują użycie klasycznych operatorów na zbiorach, czyli: różnica (-), suma ( ), przecięcie (część wspólna, &) i elementy unikalne (^). Funkcje wykorzystywane w programie umieszczamy w osobnym pliku. :nrkodu Kod V.2 1 #! /usr/bin/env python 2 # -*- coding: UTF-8 -*- 3 4 # ~/python/ocenyfun.py 5 6 """ 7 Moduł ocenyfun zawiera funkcje wykorzystywane w programie m01_oceny. 8 """ 9 4 W przypadku prostych programów zapisuj moduły w tym samym katalogu co program główny. 3.2. Mów mi Python wprowadzenie do języka Python 25
10 import math # zaimportuj moduł matematyczny 11 12 def drukuj(co,kom="sekwencja zawiera: "): 13 print kom 14 for i in co: 15 print i, 16 17 def srednia(oceny): 18 suma = sum(oceny) 19 return suma/float(len(oceny)) 20 21 def mediana(oceny): 22 oceny.sort(); 23 if len(oceny) % 2 == 0: #parzysta ilość ocen 24 half = len(oceny)/2 25 #można tak: 26 #return float(oceny[half-1]+oceny[half]) / 2.0 27 #albo tak: 28 return sum(oceny[half-1:half+1]) / 2.0 29 else: #nieparzysta ilość ocen 30 return oceny[len(oceny)/2] 31 32 def wariancja(oceny,srednia): 33 """ 34 Wariancja to suma kwadratów różnicy każdej oceny i średniej podzielona przez ilość ocen: 35 sigma = (o1-s)+(o2-s)+...+(on-s) / n, gdzie: 36 o1, o2,..., on - kolejne oceny, 37 s - średnia ocen, 38 n - liczba ocen. 39 """ 40 sigma = 0.0 41 for ocena in oceny: 42 sigma += (ocena-srednia)**2 43 return sigma/len(oceny) 44 45 def odchylenie(oceny,srednia): #pierwiastek kwadratowy z wariancji 46 w = wariancja(oceny,srednia) 47 return math.sqrt(w) JAK TO DZIAŁA Pojęcia: funkcja, argumenty funkcji, zwracanie wartości, moduł. Klauzula import math udostępnia w pliku wszystkie metody z modułu matematycznego, dlatego musimy odwoływać się do nich za pomocą notacji moduł.funkcja, np.: math.sqrt() zwraca pierwiastek kwadratowy. Funkcja drukuj(co, kom="...") przyjmuje dwa argumenty, co listę lub zbiór, który drukujemy w pętli for, oraz kom komunikat, który wyświetlamy przed wydrukiem. Argument kom jest opcjonalny, przypisano mu bowiem wartość domyślną, która zostanie użyta, jeżeli użytkownik nie poda innej w wywołaniu funkcji. Funkcja srednia() do zsumowania wartości ocen wykorzystuje funkcję sum(). Funkcja mediana() sortuje otrzymaną listę w miejscu (oceny.sort()), tzn. trwale zmienia porządek elementów 5. W zależności od długości listy zwraca wartość środkową (długość nieparzysta) lub średnią arytmetyczną dwóch środkowych wartości (długość). Zapis oceny[half-1:half+1] wycina i zwraca dwa środkowe elementy z listy, przy czym wyrażenie half = len(oceny)/2 wylicza nam indeks drugiego ze środkowych elementów. 5 Przypomnijmy: alternatywna funkcja sorted(lista) zwraca uporządkowaną rosnąco kopię listy. 26 Rozdział 3. Zaczynamy!
W funkcja wariancja() pętla for odczytuje kolejne oceny i w kodzie sigma += (ocena-srednia)**2 korzysta z operatorów skróconego dodawania (+=) i potęgowania (**), aby wyliczyć sumę kwadratów różnic kolejnych ocen i średniej. POĆWICZ SAM Dopisz funkcję, która wyświetli wszystkie oceny oraz ich odchylenia od wartości średniej. 3.2.6 VI. Słowniki ZADANIE Przygotuj słownik zawierający obce wyrazy oraz ich możliwe znaczenia. Pobierz od użytkownika dane w formacie: wyraz obcy: znaczenie1, znaczenie2,... itd. Pobieranie danych kończy wpisanie słowa koniec. Podane dane zapisz w pliku. Użytkownik powinien mieć możliwość dodawania nowych i zmieniania zapisanych danych. :nrkodu Kod VI.1 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 # ~/python/06_slownik_02.py 5 6 import os.path # moduł udostępniający funkcję isfile() 7 8 print """Podaj dane w formacie: 9 wyraz obcy: znaczenie1, znaczenie2 10 Aby zakończyć wprowadzanie danych, podaj 0. 11 """ 12 13 sfile="slownik.txt" #nazwa pliku zawierającego wyrazy i ich tłumaczenia 14 slownik = {} # pusty słownik 15 16 def otworz(plik): 17 if os.path.isfile(sfile): #czy istnieje plik słownika? 18 with open(sfile, "r") as stxt: #otwórz plik do odczytu 19 for line in stxt: #przeglądamy kolejne linie 20 t = line.split(":") #rozbijamy linię na wyraz obcy i tłumaczenia 21 wobcy = t[0] 22 znaczenia = t[1].replace("\n","") #usuwamy znaki nowych linii 23 znaczenia = znaczenia.split(",") #tworzymy listę znaczeń 24 slownik[wobcy] = znaczenia #dodajemy do słownika wyrazy obce i ich znaczenia 25 return len(slownik) #zwracamy ilość elementów w słowniku 26 27 def zapisz(slownik): 28 file1 = open(sfile,"w") #otwieramy plik do zapisu, istniejący plik zostanie nadpisany(!) 29 for wobcy in slownik: 30 znaczenia=",".join(slownik[wobcy]) # "sklejamy" znaczenia przecinkami w jeden napis 31 linia = ":".join([wobcy,znaczenia])# wyraz_obcy:znaczenie1,znaczenie2,... 32 print >>file1, linia # zapisujemy w pliku kolejne linie 33 file1.close() #zamykamy plik 34 35 def oczysc(str): 36 str = str.strip() # usuń początkowe lub końcowe białe znaki 37 str = str.lower() # zmień na małe litery 3.2. Mów mi Python wprowadzenie do języka Python 27
38 return str 39 40 nowy = False #zmienna oznaczająca, że użytkownik uzupełnił lub zmienił słownik 41 ilewyrazow = otworz(sfile) 42 print "Wpisów w bazie:", ilewyrazow 43 44 #główna pętla programu 45 while True: 46 dane = raw_input("podaj dane: ") 47 t = dane.split(":") 48 wobcy = t[0].strip().lower() # robimy to samo, co funkcja oczysc() 49 if wobcy == koniec : 50 break 51 elif dane.count(":") == 1: #sprawdzamy poprawność wprowadzonych danych 52 if wobcy in slownik: 53 print "Wyraz", wobcy, " i jego znaczenia są już w słowniku." 54 op = raw_input("zastąpić wpis (t/n)? ") 55 #czy wyrazu nie ma w słowniku? a może chcemy go zastąpić? 56 if wobcy not in slownik or op == "t": 57 znaczenia = t[1].split(",") #podane znaczenia zapisujemy w liście 58 znaczenia = map(oczysc, znaczenia) #oczyszczamy elementy listy 59 slownik[wobcy] = znaczenia 60 nowy = True 61 else: 62 print "Błędny format!" 63 64 if nowy: zapisz(slownik) 65 66 print "="*50 67 print "{0: <15}{1: <40}".format("Wyraz obcy","znaczenia") 68 print "="*50 69 for wobcy in slownik: 70 print "{0: <15}{1: <40}".format(wobcy,",".join(slownik[wobcy])) JAK TO DZIAŁA Pojęcia: słownik, odczyt i zapis plików, formatowanie napisów. Słownik to struktura nieposortowanych danych w formacie klucz:wartość. Kluczami są najczęściej napisy, które wskazują na wartości dowolnego typu, np. inne napisy, liczby, listy, tuple itd. Notacja oceny = { polski : 1,4,2, fizyka : 4,3,1 } utworzy nam słownik ocen z poszczególnych przedmiotów. Aby zapisać coś w słowniku stosujemy notację oceny[ biologia ] = 4,2,5. Aby odczytać wartość używamy po prostu: oceny[ polski ]. W programie wykorzystujemy słownik, którego kluczami są obce wyrazy, natomiast wartościami są listy możliwych znaczeń. Przykładowy element naszego słownika wygląda więc tak: { go : iść,pojechać }. Natomiast ten sam element zapisany w pliku będzie miał format: wyraz_obcy:znaczenie1,znaczeni2,... Dlatego funkcja otworz() przekształca format pliku na słownik, a funkcja zapisz() słownik na format pliku. Funkcja otworz(plik) sprawdza za pomocą funkcji isfile(plik) z modułu os.path, czy podany plik istnieje na dysku. Polecenie open("plik", "r") otwiera podany plik w trybie do odczytu. Wyrażenie with... as stxt zapewnia obsługę błędów podczas dostępu do pliku (m. in. zadba o jego zamknięcie) i udostępnia zawartość pliku w zmiennej stxt. Pętla for line in stxt: odczytuje kolejne linie (czyli napisy). Metoda.split() zwraca listę zawierającą wydzielone według podanego znaku części ciągu, np.: t = line.split(":"). Operacją odwrotną jest sklejanie w jeden ciąg elementów listy za pomocą podanego znaku, np.,.join(slownik[wobcy]). Metoda.replace( co, czym ) pozwala zastąpić w ciągu wszystkie wystąpienia co czym., np.: znaczenia = t[1].replace("\n",""). 28 Rozdział 3. Zaczynamy!