Python w dydaktyce informatyki – podstawy jezyka
Transkrypt
Python w dydaktyce informatyki – podstawy jezyka
Python w dydaktyce informatyki – podstawy jezyka ˛ Tomasz Łukaszuk Katedra Oprogramowania Wydział Informatyki Politechnika Białostocka [email protected] 04-10-2014 Tomasz Łukaszuk (WI PB) Python 04-10-2014 1 / 31 Wprowadzenie Historia Opracowany w późnych latach 1980 przez Guido Van Rossum pracujacego ˛ w Centrum Wiskunde & Informatica w Holandii. Nazwa wywodzi sie˛ od ’Monty Python’s Flying Circus’. 16-10-2000: Python wersja 2.0 3-12-2008: Python wersja 3.0. Niekompatybilna wstecz z wersja˛ 2.0, ale wiele cech wersji 3.0 wprowadzono w wersji 2.6 wersje 2.x i 3.x sa˛ aktualnie rozwijane jednocześnie 04-10-2014: Python wersja 2.7.8 i 3.4.1 Tomasz Łukaszuk (WI PB) Python 04-10-2014 2 / 31 Wprowadzenie Filozofia programowania - The Zen of Python I 1 Ładne jest lepsze niż brzydkie. 2 Jawne jest lepsze niż niejawne. 3 Proste jest lepsze niż złożone. 4 Złożone jest lepsze niż skomplikowane. 5 Płaskie jest lepsze niż zagnieżdżone. 6 Rzadkie jest lepsze niż geste. ˛ 7 Liczy sie˛ czytelność. 8 Szczególne przypadki nie sa˛ na tyle specjalne żeby łamać zasady. 9 Chociaż praktyczność jest ważniejsza od czystości. Tomasz Łukaszuk (WI PB) Python 04-10-2014 3 / 31 Wprowadzenie Filozofia programowania - The Zen of Python II 10 Błedy ˛ nie powinny być przekazywane w milczeniu. 11 O ile jawnie nie zostana˛ wyciszone. 12 W obliczu dwuznaczności, odrzucić pokuse˛ zgadywania. 13 Powinien być jeden - i najlepiej tylko jeden - oczywisty sposób aby coś zrobić. 14 Chociaż ten sposób może nie być od razu oczywisty, chyba że jesteś Holendrem. 15 Teraz jest lepsze niż nigdy. 16 Chociaż nigdy jest cz˛esto lepsze niż "right" teraz. 17 Jeśli implementacja jest trudna do wytłumaczenia, jest to zły pomysł. 18 Jeśli implementacja jest łatwa do wyjaśnienia, to może być dobry pomysł. Tomasz Łukaszuk (WI PB) Python 04-10-2014 4 / 31 Wprowadzenie Dlaczego używać Pythona? I Zmniejsza czas tworzenia programów Bardzo jasna, czytelna składnia Bardzo łatwy do nauczenia sie˛ Dość szybki! Bardzo dużo standardowych bibliotek i rozszerzajacych ˛ modułów do wykonywania praktycznie każdego zadania Pracuje wsz˛edzie (Windows, Linux/Unix, Mac, Amiga) Otwarty i darmowy! Tomasz Łukaszuk (WI PB) Python 04-10-2014 5 / 31 Python Cechy jezyka ˛ Python I Interpretowalny Używa kodu bajtowego (pliki *.pyc i *.pyo) WSZYSTKO JEST OBIEKTEM Bardzo jasna, czytelna składnia Moduły, klasy, funkcje Pełna modułowość, wspieranie hierarchii pakietów Multi-paradigm: programowanie obiektowe i strukturalne + wiele innych właściwości: programowanie funkcyjne, programowanie aspect-oriented Dynamiczne i silne typowanie, polimorfizm, garbage collector, późne wiazania ˛ Tomasz Łukaszuk (WI PB) Python 04-10-2014 6 / 31 Python Cechy jezyka ˛ Python II Duck typing: ’when I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.’ - James Whitcomb Riley Przeciażanie ˛ operatorów Wciecia ˛ do określenia struktury bloków kodu Silne zdolności introspekcji Rozszerzenia i moduły pisane w C, C++ (lub Java z Jython, lub .NET dla IronPython) Tomasz Łukaszuk (WI PB) Python 04-10-2014 7 / 31 Python Typy danych Liczbowe: int, long, float, complex String: niezmienialny Podstawowe kontenery: listy, słowniki, zbiory (zmienialny), krotki (niezmienialny) Inne typy, np. binarne dane, wyrażenia regularne, introspekcja Moduły rozszerzajace ˛ moga˛ definiować własne typy danych Tomasz Łukaszuk (WI PB) Python 04-10-2014 8 / 31 Kodowanie w pythonie Wejście-wyjście Operacje wejścia/wyjścia Pobieranie danych od użytkownika: 1 2 3 4 5 6 7 8 9 x = raw_input("Podaj liczbe: ") -> Podaj liczbe: 6 x -> ’6’ x = int(x) x -> 6 Wypisywanie wartości na ekranie: 1 2 3 4 5 6 7 8 print "Hello world" -> Hello world print "Hello world " + str(7) -> Hello world 7 print "Hello world %d %s" % (7, "xyz") -> Hello world 7 xyz Tomasz Łukaszuk (WI PB) Python 04-10-2014 9 / 31 Kodowanie w pythonie Wejście-wyjście Deklarowanie zmiennych 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 >>> x Traceback (innermost last): File "<interactive input>", line 1, in ? NameError: There is no variable named ’x’ >>> x = 1 >>> x 1 >>> [0, >>> >>> 0 >>> 1 >>> 6 range(7) 1, 2, 3, 4, 5, 6] (MO, TUE, WED, THU, FRI, SAT, SUN) = range(7) MO TUE SUN Nie można deklarować zmiennej bez przypisania jej wartości Moża przypisać wiele wartości na raz Tomasz Łukaszuk (WI PB) Python 04-10-2014 10 / 31 Kodowanie w pythonie Wejście-wyjście Formatowanie napisów (strings) I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 >>> k = "id" >>> v = "XYZ" >>> "%s=%s" % (k, v) ’id=XYZ’ >>> id = "XYZ" >>> pwd = "secret" >>> print pwd + " is not a good password for " + id secret is not a good password for XYZ >>> print "%s is not a good password for %s" % (pwd, uid) secret is not a good password for XYZ >>> userCount = 6 >>> print "Users connected: %d" % (userCount, ) Users connected: 6 >>> print "Users connected: " + userCount Traceback (innermost last): File "<interactive input>", line 1, in ? TypeError: cannot concatenate ’str’ and ’int’ objects Silne typowanie: nie można dodawać integer’a do a string’a! Tomasz Łukaszuk (WI PB) Python 04-10-2014 11 / 31 Kodowanie w pythonie Wejście-wyjście Formatowanie napisów (strings) II 1 2 3 >>> d = { ’pwd’ : ’secret’, ’id’ : ’XYZ’ } >>> "%(id)s=%(pwd)s # user id: %(id)s, password: %(pwd)s" % d ’XYZ=secret # user id: XYZ, password: secret’ Można formatować strings używajac ˛ słowników (nazwanych argumentów) Moża użyć każdego argumentu wielokrotnie (albo wcale) 1 2 3 4 5 6 >>> params = {"server":"zeus", "database":"master", "id":"XYZ", "pwd":"secret"} >>> ["%s=%s" % (k, v) for k, v in params.items()] [’server=zeus’, ’id=XYZ’, ’database=master’, ’pwd=secret’] >>> ";".join(["%s=%s" % (k, v) for k, v in params.items()]) ’server=zeus;id=XYZ;database=master;pwd=secret’ Strings sa˛ obiektami - tak jak wszystko inne! Tomasz Łukaszuk (WI PB) Python 04-10-2014 12 / 31 Kodowanie w pythonie Wejście-wyjście ——- Zadania praktyczne 1 ——— http://repl.it/languages/Python 1) Pobierz od użytkownika jego imie˛ i nazwisko używajac ˛ do tego dwóch wywołań raw_input i nastepnie ˛ wypisz je w odwrotnej kolejności i przecinkiem pomiedzy ˛ nimi. Podaj imie: Stefan Podaj nazwisko: Burczymucha -> Burczymucha, Stefan Tomasz Łukaszuk (WI PB) Python 04-10-2014 13 / 31 Kodowanie w pythonie Wejście-wyjście ——- Zadania praktyczne 1 ——— 2) Pobierz od użytkownika jego imie˛ i nazwisko używajac ˛ jednego wywołania raw_input i nastepnie ˛ wypisz [nazwisko], [imi˛ e] Podaj imie i nazwisko: Stefan Burczymucha -> Burczymucha, Stefan Tomasz Łukaszuk (WI PB) Python 04-10-2014 14 / 31 Kodowanie w pythonie Wejście-wyjście ——- Zadania praktyczne 1 ——— 3) Joanna zamówiła na przyjecie ˛ urodzinowe 32 kawałki pizzy. Pozwól użytkownikowi (prawdopodobnie Joannie) na wpisanie liczby gości, którzy bed ˛ a˛ jeść pizz˛e i wypisz liczbe˛ kawałków, ile dostanie każdy gość. Jak wiesz pizza może nie dać sie˛ podzielić w całości. Można to zrobić na dwa sposoby. Pierwszy to nie dzielić kawałków i każdemy dać tylko całe kawałki, a reszte˛ odłożyć. Drugi sposób to podzielić odłożone kawałki na równe cz˛eści pomiedzy ˛ gości. Twój program powinien wyświetlić obie opcje: Liczba gosci: 10 -> Opcja 1: 3 kawalki dla kazdego, 2 kawalki pozostaja -> Opcja 2: 3.2 kawalki dla kazdego Tomasz Łukaszuk (WI PB) Python 04-10-2014 15 / 31 Kodowanie w pythonie Instrukcje sterujace ˛ Wartość logiczna prawda - True Każdy obiekt może być testowany na wartość prawdy, do wykorzystania w wyrażeniach if lub while lub jako operand w operacjach logicznych. Nastepuj ˛ ace ˛ wartości sa˛ uważane za fałszywe (wartościowane jako false): None False zero każdego typu numerycznego, np. 0, 0L, 0.0, 0j każda pusta sekwencja, np. ”, (), [] kazde puste mapowanie, np. {} instancje klas zdefiniowanych przez użytkownika, jeśli klasa definiuje metode˛ __nonzero__() lub __len__(), gdy ta metoda zwraca wartość całkowita zero lub boolowska˛ False. Wszystkie inne wartości sa˛ uważane za prawdziwe Tomasz Łukaszuk (WI PB) Python 04-10-2014 16 / 31 Kodowanie w pythonie Instrukcje sterujace ˛ Operacje boolowskie Operation x or y x and y not x Result if x is false, then y , else x if x is false, then x, else y if x is false, then True, else False or wartościuje drugi argument tylko w przypadku kiedy pierwszy argument jest False and wartościuje drugi argument tylko w przypadku kiedy pierwszy argument jest True Należy pamietać, ˛ że operatory or/and moga˛ zwracać nie tylko True lub False Tomasz Łukaszuk (WI PB) Python 04-10-2014 17 / 31 Kodowanie w pythonie Instrukcje sterujace ˛ Konstrukcja if 1 2 3 4 5 6 7 8 9 10 11 12 13 >>> x = int(raw_input("Please enter an integer: ")) Please enter an integer: 42 >>> if x < 0: ... x = 0 ... print ’Negative changed to zero’ ... elif x == 0: ... print ’Zero’ ... elif x == 1: ... print ’Single’ ... else: ... print ’More’ ... More Może być zero lub wiecej ˛ cz˛eści elif Cz˛eść else jest opcjonalna Tomasz Łukaszuk (WI PB) Python 04-10-2014 18 / 31 Kodowanie w pythonie Instrukcje sterujace ˛ Konstrukcja while 1 2 3 4 5 6 >>> a, b = 0, 1 >>> while b < 1000: ... print b, ... a, b = b, a+b ... 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 Nic nowego . . . Końcowy przecinek zapobiega przejściu do nowej linii. Tomasz Łukaszuk (WI PB) Python 04-10-2014 19 / 31 Kodowanie w pythonie Instrukcje sterujace ˛ Konstrukcja for 1 2 3 4 5 6 7 8 >>> # Measure some strings: ... a = [’cat’, ’window’, ’defenestrate’] >>> for x in a: ... print x, len(x) ... cat 3 window 6 defenestrate 12 Zamiast zawsze iterować po rosnacych ˛ liczbach arytmetycznych (jak w Pascalu), lub dajac ˛ użytkownikowi możliwość definiowania zarówno kroku iteracji jak i momentu jej zatrzymania (jak w C), w Pythonie iteracja odbywa sie˛ po ciagu ˛ elementów dowolnej kolejności (lista lub string), w kolejności, w jakiej wystepuj ˛ a˛ w sekwencji. Nie jest bezpieczne modyfikowanie sekwencji po której nastepuje ˛ iteracja. Tomasz Łukaszuk (WI PB) Python 04-10-2014 20 / 31 Kodowanie w pythonie Instrukcje sterujace ˛ ——- Zadania praktyczne 2 ——— 1) Pobierz od użytkownika zdanie i wyświetl je w odwróconej kolejności, każde słowo w oddzielnej linii. Podaj zdanie: Poszla Ola do przedszkola. -> przedsszkola. -> do -> Ola -> Poszla Tomasz Łukaszuk (WI PB) Python 04-10-2014 21 / 31 Kodowanie w pythonie Instrukcje sterujace ˛ ——- Zadania praktyczne 2 ——— 2) Klatka dla pytona powinna mieć odpowiednia˛ powierzchnie˛ zależna˛ od długości weża. ˛ Minimalna powierzchnia to 0.5 m2 na każdy metr długości weża, ˛ jeżeli waż ˛ ma nie wiecej ˛ niż 6 metrów i 0.75 m2 na każdy metr długości powyżej 6 metrów. np. 9 metrowy pyton potrzebuje 5.25 m2 (6 * 0.5 + 3 * 0.75) Napisz program, który zapyta użytkownika o długość weża ˛ i odpowie jakiej powierzchni klatki on potrzebuje. Podaj dlugosc Pythona: 6 -> Ten Python potrzebuje klatki o powierzchni 5.25 m2 Tomasz Łukaszuk (WI PB) Python 04-10-2014 22 / 31 Kodowanie w pythonie Instrukcje sterujace ˛ ——- Zadania praktyczne 2 ——— 3) Palindrom to wyraz, który tak samo brzmi czytany od poczatku ˛ i od końca. Napisz program, który pobierze od użytkownika słowo i powie, czy jest ono palindromem. Program nie powienien brać pod uwage˛ wielkości liter. Podaj slowo: Kajak -> Kajak jest palindromem Tomasz Łukaszuk (WI PB) Python 04-10-2014 23 / 31 Kodowanie w pythonie Kontenery Słowniki (Dictionaries) 1 2 3 4 5 6 7 8 9 10 11 12 d = {"server":"mpilgrim", "database":"master"} d -> {’server’: ’mpilgrim’, ’database’: ’master’} d["server"] -> ’mpilgrim’ d[24] = 6666 d -> {’server’: ’mpilgrim’, ’database’: ’master’, 24 : 666} del d[’server’] d -> {’database’: ’master’, 24 : 666} Klucze i wartości słowników moga˛ być dowolnego typu (zagnieżdżenia)! Słowniki NIE SA˛ UPORZADKOWANE ˛ Tomasz Łukaszuk (WI PB) Python 04-10-2014 24 / 31 Kodowanie w pythonie Kontenery Listy (Lists) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 li = ["a", "b", "mpilgrim", "z", "example"] li -> [’a’, ’b’, ’mpilgrim’, ’z’, ’example’] li[4] -> ’example’ li[-1] -> ’example’ li[1:3] -> [’b’, ’mpilgrim’] li.append("new") li -> [’a’, ’b’, ’mpilgrim’, ’z’, ’example’, ’new’] li = [’a’, ’b’, ’mpilgrim’] li = li + [’example’, ’new’] li -> [’a’, ’b’, ’mpilgrim’, ’example’, ’new’] Elementy listy moga˛ być dowolnego typu Listy SA˛ UPORZADKOWANE ˛ Wiecej ˛ metod: remove, push, pop, index . . . Tomasz Łukaszuk (WI PB) Python 04-10-2014 25 / 31 Kodowanie w pythonie Kontenery Wyrażenia listowe Wygodny sposób na tworzenie list Wyrażenie listowe składa sie˛ z wyrażenia, nastepuj ˛ acej ˛ po nim klauzuli for, a potem zero lub wiecej ˛ klauzul for lub if. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 vec1 = [2, 4, 6] vec2 = [4, 3, -9] [(x, x**2) for x in vec1] -> [(2, 4), (4, 16), (6, 36)] [x*y for x in vec1 for y in vec2] -> [8, 6, -18, 16, 12, -36, 24, 18, -54] [x+y for x in vec1 for y in vec2] -> [6, 5, -7, 8, 7, -5, 10, 9, -3] [vec1[i]*vec2[i] for i in range(len(vec1))] -> [8, 12, -54] Tomasz Łukaszuk (WI PB) Python 04-10-2014 26 / 31 Kodowanie w pythonie Kontenery Krotki (Tuples) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 t = ("a", "b", "mpilgrim", "z", "example") t -> (’a’, ’b’, ’mpilgrim’, ’z’, ’example’) t[0] -> ’a’ t[-1] -> ’example’ t[1:3] -> (’b’, ’mpilgrim’) "z" in t -> True Elementy krotki moga˛ być dowolnego typu Krotki SA˛ UPORZADKOWANE ˛ Krotki nie posiadaja˛ metod i sa˛ niezmienialne . . . . . . ale elementy krotki moga˛ być! Tomasz Łukaszuk (WI PB) Python 04-10-2014 27 / 31 Kodowanie w pythonie Kontenery Zbiory (Sets) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 s1 = set([’one’, ’two’, ’three’]) s2 = set([’two’, ’three’, 4]) s1 | s2 -> set([4, ’two’, ’three’, ’one’]) s1 ^ s2 -> set([4, ’one’]) s1 & s2 -> set([’two’, ’three’]) s1 - s2 -> set([’one’]) Obiekt zbiór jest nieuporzadkowan ˛ a˛ kolekcja˛ niezmienialnych wartości Przydatne do testowania przynależności, usuwania duplikatów z sekwencji i obliczania działań matematycznych, takich jak przeciecie, ˛ różnica zbiorów i różnica symetryczna. Tomasz Łukaszuk (WI PB) Python 04-10-2014 28 / 31 Kodowanie w pythonie Kontenery ——- Zadania praktyczne 3 ——— 1) Napisz procedure˛ histogram(), która pobiera liste˛ liczb całkowitych i rysuje na ekranie histogram. Na przykład, histogram([4, 9, 7]) powinien dać nastepuj ˛ acy ˛ wynik: **** ********* ******* def histogram(list): ... end Tomasz Łukaszuk (WI PB) Python 04-10-2014 29 / 31 Kodowanie w pythonie Kontenery ——- Zadania praktyczne 3 ——— 2) Napisz funkcje˛ find_longest_word(), która pobiera liste˛ słów i zwraca najdłuższe z nich. def find_longest_word(slowa): ... end print find_longest_word(["ala","kaloryfer","szkola"]) -> kaloryfer Tomasz Łukaszuk (WI PB) Python 04-10-2014 30 / 31 Kodowanie w pythonie Kontenery ——- Zadania praktyczne 3 ——— 3) W kryptografii, szyfr Cezara jest bardzo prosta˛ technika˛ szyfrowania, w którym każda litera w tekście jest zastepowana ˛ przez litere˛ znajdujac ˛ a˛ sie˛ w alfabecie ustalona˛ liczbe˛ pozycji za nia. ˛ Na przykład, przy przesunieciu ˛ 3, A zostanie zastapiona ˛ przez D, B stanie sie˛ E, i tak dalej. Metoda nazywa sie˛ tak po Juliuszu Cezarze, który używał jej do komunikowania sie˛ ze swoimi generałami. ROT-13 ("obróć o 13 miejsc") jest powszechnie stosowanym przykładem szyfru Cezara, w którym przesuniecie ˛ ma wartość 13. W Pythonie klucz ROT-13 może być reprezentowany za pomoca˛ nastepuj ˛ acego ˛ słownika: key = {’a’:’n’, ’i’:’v’, ’q’:’d’, ’y’:’l’, ’G’:’T’, ’O’:’B’, ’W’:’J’, ’b’:’o’, ’j’:’w’, ’r’:’e’, ’z’:’m’, ’H’:’U’, ’P’:’C’, ’X’:’K’, ’c’:’p’, ’k’:’x’, ’s’:’f’, ’A’:’N’, ’I’:’V’, ’Q’:’D’, ’Y’:’L’, ’d’:’q’, ’l’:’y’, ’t’:’g’, ’B’:’O’, ’J’:’W’, ’R’:’E’, ’Z’:’M’} ’e’:’r’, ’m’:’z’, ’u’:’h’, ’C’:’P’, ’K’:’X’, ’S’:’F’, ’f’:’s’, ’n’:’a’, ’v’:’i’, ’D’:’Q’, ’L’:’Y’, ’T’:’G’, ’g’:’ ’o’:’ ’w’:’ ’E’:’ ’M’:’ ’U’:’ Twoim zadaniem jest napisanie kodera/dekodera ROT-13. Kiedy skończysz, bedziesz ˛ mógł przeczytać nastepuj ˛ ac ˛ a˛ tajna˛ wiadomość: Pnrfne pvcure? Tomasz Łukaszuk (WI PB) V zhpu cersre Pnrfne fnynq! Python 04-10-2014 31 / 31