Podstawy programowania w Pythonie
Transkrypt
Podstawy programowania w Pythonie
Podstawy programowania w Pythonie Wykład 9 dr Andrzej Zbrzezny Instytut Matematyki i Informatyki Akademia Jana Długosza w Cz˛estochowie 12 grudnia 2012 dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 1 / 25 Listy Używanie listy jako stosu Stos to liniowa struktura danych, w której dane dodawane sa˛ tylko na szczyt stosu i tylko ze szczytu stosu sa˛ pobierane. Jest to wiec ˛ bufor typu LIFO (ang. Last-In-First-Out) – ostatni na wejściu, pierwszy na wyjściu. Stosy sa˛ stosowane w systemach komputerowych na wszystkich poziomach funkcjonowania systemów informatycznych. Użycie listy w roli stosu jest bardzo łatwe: Aby dodać element na szczyt stosu, należy użyć metody append(). Aby pobrać elementu ze szczytu stosu, należy użyć metody pop() bez podawania indeksu. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 2 / 25 Operacje na stosie Przykład >>> >>> >>> >>> [3, >>> 6 >>> [3, >>> 5 >>> [3, stos = [] # pusty stos stos = [3, 4, 5] stos.append(6) stos 4, 5, 6] stos.pop() stos 4, 5] stos.pop() stos 4] dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 3 / 25 Listy Używanie listy jako kolejki Kolejka to liniowa struktura danych, w której dane dodawane sa˛ na tylko końcu listy a pobierane sa˛ tylko z poczatku ˛ listy. Jest to wiec ˛ bufor typu FIFO (ang. First-In-First-Out) – pierwszy na wejściu, pierwszy na wyjściu. Podobnie jak stosy, listy sa˛ stosowane w systemach komputerowych na wszystkich poziomach funkcjonowania systemów informatycznych. Użycie listy w roli stosu jest bardzo łatwe: Aby dodać element do kolejki, należy użyć metody append(). Aby pobrać elementu z kolejki, należy użyć metody pop(0) dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 4 / 25 Operacje na kolejce Przykład >>> kolejka = [] # kolejka pusta >>> kolejka = ["Adam", "Tadeusz", "Michał"] >>> kolejka.append("Eryk") # przybywa Eryk >>> kolejka.append("Jan") # przybywa Jan >>> kolejka.pop(0) ’ Adam’ >>> kolejka.pop(0) ’ Tadeusz’ >>> kolejka [’Michał’, ’Eryk’, ’Jan’] dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 5 / 25 Zbiory Podstawowe informacje Python posiada również typ danych dla zbiorów. Zbiór jest nieuporzadkowan ˛ a˛ kolekcja˛ nie zawierajac ˛ a˛ duplikatów. Przy pomocy operatora in można testować przynależność elementu do zbioru. Zbiory umożliwiaja˛ wykonywanie takich podstawowych operacji jak suma, przeciecie, ˛ różnica oraz różnica symetryczna. Aby utworzyć zbiór należy użyć nawiasów {} lub funkcji set() z argumentem bed ˛ acym ˛ obiektem iterowalnym. Aby utworzyć zbiór pusty należy użyć funkcji set() bez argumentów a nie nawiasów {}, ponieważ konstrukcja {} tworzy pusty słownik. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 6 / 25 Zbiory Przykład (Podstawowe operacje na zbiorach) koszyk = {"gruszka", "kiwi", "gruszka", \ "cytryna", "kiwi", "banan", "mango"} print(koszyk) print("kiwi" in koszyk) print("mandarynka" in koszyk) a = set("abracadabra") b = set("alacazam") print("a =", a) print("b =", b) print("a - b =", a - b) print("a | b =", a | b) print("a & b =", a & b) print("a ^ b =", a ^ b) dr Andrzej Zbrzezny (IMI AJD) # # # # różnica zbiorów suma zbiorów iloczyn zbiorów różnica symetryczna Podstawy programowania w Pythonie 12.12.2012 7 / 25 Zbiory Przykład (Podstawowe operacje na zbiorach) koszyk = {"gruszka", "kiwi", "gruszka", \ "cytryna", "kiwi", "banan", "mango"} print("\n", koszyk) lista = list(koszyk) print("\n", lista) lista.sort() # sortowanie listy print("\n", lista) koszyk.clear() for owoc in lista: koszyk.add(owoc) print("\n", koszyk, "\n") dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 8 / 25 Błedy ˛ i wyjatki ˛ Błedy ˛ składniowe Błedy ˛ składniowe, znane również jako błedy ˛ parsingu, sa˛ być może najbardziej powszechnym rodzajem błedów, ˛ z którymi na poczatku ˛ maja˛ do czynienia uczacy ˛ sie˛ jezyka ˛ Python. Rozważmy przykład: >>> while True print("Hello") File "<stdin>", line 1 while True print("Hello") ^ SyntaxError: invalid syntax >>> Parser powtarza na wyjściu błedny ˛ wiersz i wyświetla mała˛ „strzałk˛e”, wskazujac ˛ a˛ na najwcześniejszy punkt w wierszu gdzie znaleziono bład. ˛ dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 9 / 25 Błedy ˛ i wyjatki ˛ Błedy ˛ składniowe Bład ˛ został wykryty w składniku poprzedzajacym ˛ strzałk˛e: w powyższym przykładzie, bład ˛ wykryty został na instrukcji wywołaniu funkcji print, z powodu braku znaku dwukropka (":") przed ta˛ instrukcja. ˛ Sa˛ również wyświetlane nazwa pliku i numer linii, aby wiedzieć, gdzie szukać błedu, ˛ w przypadku gdy na wejściu znajdował sie˛ skrypt. W przypadku wpisania błednej ˛ instrukcji w interpreterze, wyświetlana jest zamiast nazwy pliku nazwa <stdin> oznaczajaca ˛ standardowe wejście. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 10 / 25 Błedy ˛ i wyjatki ˛ Błedy ˛ wykonania Nawet gdy wyrażenie jest składniowo poprawne, może spowodować bład ˛ podczas próby wykonania go. Błedy ˛ wykryte podczas wykonania nazywane sa˛ wyjatkami ˛ i niekoniecznie musza˛ zakończyć program. Wkrótce dowiemy sie˛ jak radzić sobie z nimi w programach Pythona. Wiekszość ˛ wyjatków ˛ nie jest obsługiwana przez programy a objawiaja˛ sie˛ one w komunikatach o błedzie, ˛ jak w poniższych przykładach. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 11 / 25 Błedy ˛ i wyjatki ˛ Przykład (Błedy ˛ wykonania) >>> 10 * 1/0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> 4 * 3 + spam Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name ’spam’ is not defined >>> "2" + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can't convert ’int’ object to str implicitly >>> dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 12 / 25 Błedy ˛ i wyjatki ˛ Obsługa wyjatków ˛ W poniższym przykładzie użytkownik podaje dane na wejściu aż do momentu, kiedy zostanie wprowadzona poprawna liczba całkowita. Przykład (Instrukcja try) while True: try: a = int(input("Podaj liczb˛ e całkowita: ˛ ")) except ValueError: print("To co podałeś nie jest liczba˛ całkowita") ˛ print("Spróbuj ponownie") else: print("Brawo! Podałeś liczb˛ e o wartości", a) break dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 13 / 25 Błedy ˛ i wyjatki ˛ Działanie instrukcji try Na poczatku ˛ wykonywana jest klauzula try (czyli instrukcje pomiedzy ˛ try a except). Jeżeli nie pojawi sie˛ żaden wyjatek ˛ klauzula except jest pomijana i wykonanie instrukcji try uważa sie˛ za zakończone. Jeżeli podczas wykonywania klauzuli try pojawi sie˛ wyjatek, ˛ reszta niewykonanych instrukcji jest pomijana. Nastepnie, ˛ w zależności od tego, czy jego typ pasuje do typów wyjatków ˛ wymienionych w cz˛eści except, wykonywany jest kod nastepuj ˛ acy ˛ w tym bloku, a potem interpreter przechodzi do wykonywania instrukcji umieszczonych po całej instrukcji try. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 14 / 25 Błedy ˛ i wyjatki ˛ Działanie instrukcji try W przypadku pojawienia sie˛ wyjatku, ˛ który nie zostanie dopasowany do żadnego z wyjatków ˛ wymienionych w klauzuli except, zostaje on przekazany do do nastepnych, ˛ zewnetrznych ˛ instrukcji try. Jeżeli również tam nie zostanie znaleziony odpowiadajacy ˛ mu blok except, wyjatek ˛ ten nie zostanie wyłapany, stanie nieobsłużonym wyjatkiem, ˛ a wykonywanie programu zostanie wstrzymane wraz z pojawieniem sie˛ komunikatu podobnego do pokazanego uprzednio. Aby umożliwić obsługe˛ wielu wyjatków, ˛ instrukcja try może posiadać wiecej ˛ niż jedna˛ klauzule˛ except. W takim przypadku, kod dla co najwyżej jednego wyjatku ˛ zostanie wykonany. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 15 / 25 Błedy ˛ i wyjatki ˛ Działanie instrukcji try Kody obsługi wyjatków ˛ wykonywane sa˛ tylko dla wyjatków, ˛ które zostały zgłoszone w odpowiadajacej ˛ im cz˛eści try, a nie w innych, sasiednich ˛ cz˛eściach except. Klauzula except może zawierać nazwy wielu wyjatków, ˛ podanych w formie listy otoczonej nawiasami okragłymi, ˛ np. ... except (TypeError, NameError): ... pass W ostatniej podanej klauzuli except można pominać ˛ nazwe˛ lub nazwy wyjatków ˛ w celu obsłużenia dowolnego wyjatku. ˛ Można jej również użyć do wypisania komunikatu o błedzie ˛ i ponownie zgłosić wyłapany wyjatek ˛ (umożliwiajac ˛ w ten sposób funkcji wywołujacej ˛ wyłapanie zgłoszonego wyjatku). ˛ dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 16 / 25 Błedy ˛ i wyjatki ˛ Przykład import sys try: f = open("myfile.txt") s = f.readline() i = int(s.strip()) except IOError as err: print("Bład ˛ I/O error: {0}".format(err)) except ValueError: print("Nie mog˛ e przekształcić danej", end=" ") print("w liczb˛ e całkowita.") ˛ except: print("Nieoczekiwany bład:", ˛ sys.exc_info()[0]) raise dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 17 / 25 Błedy ˛ i wyjatki ˛ Działanie instrukcji try Instrukcja try...except wyposażona jest w opcjonalna˛ klauzule˛ else, która musi pojawić sie˛ za wszystkimi podanymi blokami except. Można po niej umieścić kod, który zostanie wykonany, jeżeli nie zostanie zgłoszony wyjatek. ˛ Zastosowanie klauzuli else jest lepsze niż dodatkowy kod do klauzuli try, ponieważ unika sie˛ przypadkowego złapania wyjatku, ˛ który nie został zgłoszony przez kod chroniony przez klauzule˛ try. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 18 / 25 Błedy ˛ i wyjatki ˛ Przykład (Klauzula else w instrukcji try) def inputInt(prompt): while True: try: a = int(input(prompt)) except: print("To nie jest liczba całkowita") print("Spróbuj ponownie") else: return a dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 19 / 25 Błedy ˛ i wyjatki ˛ Przykład (Klauzula else w instrukcji try) def inputFloat(prompt): while True: try: a = float(input(prompt)) except: print("To nie jest liczba typu float") print("Spróbuj ponownie") else: return a dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 20 / 25 Słowniki Podstawowe informacje Innym użytecznym typem danych w Pythonie jest słownik. Słowniki spotykane sa˛ czasami w innych jezykach ˛ programowania jako „pamieć ˛ asocjacyjna” lub „tablice asocjacyjne”. W odróżnieniu od sekwencji, które sa˛ indeksowane liczbami, słowniki indeksowane sa˛ kluczami, które moga˛ być obiektami dowolnego, niemutowalnego typu, np. napisy i liczby zawsze moga˛ być kluczami. Listy niemutowalne również moga˛ zostać użyte jako klucze, jeżeli zawieraja˛ napisy, liczby lub listy niemutowalne. Nie można użyć zwykłych list jako kluczy, ponieważ można je modyfikować za pomoca˛ metody append(). dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 21 / 25 Słowniki Podstawowe informacje Najlepiej wyobrazić sobie słownik jako nieuporzadkowany ˛ zbiór par klucz:wartość, z założeniem, że klucze sa˛ unikalne (w jednym słowniku). Para nawiasów klamrowych tworzy pusty słownik: {}. Umieszczenie listy par klucz:wartość, oddzielonych przecinkami w tych nawiasach dodaje poczatkowe ˛ pary klucz:wartość do słownika. W ten sposób słowniki sa˛ wyświetlane na standardowym wyjściu. Głównymi operacjami na słownikach sa˛ dodawanie wartości z jakimś kluczem i pobieranie wartości opatrzonej podanym kluczem. Możliwe jest usuwanie pary klucz:wartość za pomoca˛ instrukcji del. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 22 / 25 Słowniki Podstawowe informacje Jeżeli próbuje sie˛ przechować klucz, który istnieje już w słowniku, poprzednia wartość zwiazana ˛ z tym kluczem jest zapominana. Bład ˛ powstaje w wyniku próby pozyskania wartości spod klucza, który nie istnieje w słowniku. Metoda obiektu słownika keys() zwraca liste˛ wszystkich kluczy używanych w słowniku, w porzadku ˛ losowym (jeżeli chce sie˛ uzyskać posortowana˛ liste˛ kluczy, należy zastosować metode˛ sort() na tej liście). Aby sprawdzić obecność klucza k w słowniku d należy sprawdzić czy klucz k należy do zbioru kluczy słownika d: k in d.keys(). dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 23 / 25 Słowniki Przykład (Podstawowe operacje na słownikach) tel = {"jack": 4098, "sape": 4139} tel["guido"] = 4127 print(tel) print(tel["jack"]) del tel["sape"] tel["irv"] = 4127; print(tel) print("guido" in tel, "jack" not in tel) print(list(tel.keys())) print(sorted(tel.keys())) print(list(tel.values())) print(sorted(tel.values())) print(list(tel.items())) print(sorted(tel.items())) dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 24 / 25 Słowniki Przykład (Podstawowe operacje na słownikach) tel = {"jack": 4098, "sape": 4139} tel["guido"] = 4127 print(tel) try: print(tel["jack"]) except: print("Brak klucza \"jack\"") try: del tel["jacek"] except: print("Brak klucza \"jacek\"") print(tel) dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 25 / 25