Podstawy programowania w Pythonie Wykład 9 dr Andrzej Zbrzezny Instytut Matematyki i Informatyki Akademia Jana Długosza w Częstochowie 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 więc 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 >>> stos = [] # pusty stos >>> stos = [3, 4, 5] >>> stos.append(6) >>> stos [3, 4, 5, 6] >>> stos.pop() 6 >>> stos [3, 4, 5] >>> stos.pop() 5 >>> stos [3, 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 więc 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, przecięcie, różnica oraz różnica symetryczna. Aby utworzyć zbiór należy użyć nawiasów {} lub funkcji set() z argumentem będacym 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) # różnica zbiorów # suma zbiorów # iloczyn zbiorów # różnica symetryczna dr Andrzej Zbrzezny (IMI AJD) 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łędy i wyjatki Błędy składniowe Błędy składniowe, znane również jako błędy parsingu, sa być może najbardziej powszechnym rodzajem błędów, z którymi na poczatku maja do czynienia uczacy się języka 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łędny wiersz i wyświetla mała strzałkę, 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łędy i wyjatki Błędy składniowe Bład został wykryty w składniku poprzedzajacym strzałkę: 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łędu, w przypadku gdy na wejściu znajdował się skrypt. W przypadku wpisania błędnej 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łędy i wyjatki Błędy wykonania Nawet gdy wyrażenie jest składniowo poprawne, może spowodować bład podczas próby wykonania go. Błędy wykryte podczas wykonania nazywane sa wyjatkami i niekoniecznie musza zakończyć program. Wkrótce dowiemy się jak radzić sobie z nimi w programach Pythona. Większość wyjatków nie jest obsługiwana przez programy a objawiaja się one w komunikatach o błędzie, jak w poniższych przykładach. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 11 / 25
Błędy i wyjatki Przykład (Błędy 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łędy 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ę całkowitą: ")) except ValueError: print("to co podałeś nie jest liczbą całkowitą") print("spróbuj ponownie") else: print("brawo! Podałeś liczbę o wartości", a) break dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 13 / 25
Błędy i wyjatki Działanie instrukcji try Na poczatku wykonywana jest klauzula try (czyli instrukcje pomiędzy try a except). Jeżeli nie pojawi się żaden wyjatek klauzula except jest pomijana i wykonanie instrukcji try uważa się za zakończone. Jeżeli podczas wykonywania klauzuli try pojawi się wyjatek, reszta niewykonanych instrukcji jest pomijana. Następnie, w zależności od tego, czy jego typ pasuje do typów wyjatków wymienionych w części except, wykonywany jest kod następujacy 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łędy i wyjatki Działanie instrukcji try W przypadku pojawienia się wyjatku, który nie zostanie dopasowany do żadnego z wyjatków wymienionych w klauzuli except, zostaje on przekazany do do następnych, zewnętrznych 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 się komunikatu podobnego do pokazanego uprzednio. Aby umożliwić obsługę wielu wyjatków, instrukcja try może posiadać więcej niż jedna klauzulę 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łędy 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ęści try, a nie w innych, sasiednich częś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ć nazwę lub nazwy wyjatków w celu obsłużenia dowolnego wyjatku. Można jej również użyć do wypisania komunikatu o błędzie 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łędy i wyjatki Przykład import sys try: f = open("myfile.txt") s = f.readline() i = int(s.strip()) except IOError as err: print("błąd I/O error: {0}".format(err)) except ValueError: print("nie mogę przekształcić danej", end=" ") print("w liczbę całkowitą.") except: print("nieoczekiwany błąd:", sys.exc_info()[0]) raise dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 17 / 25
Błędy i wyjatki Działanie instrukcji try Instrukcja try...except wyposażona jest w opcjonalna klauzulę else, która musi pojawić się 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 się przypadkowego złapania wyjatku, który nie został zgłoszony przez kod chroniony przez klauzulę try. dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania w Pythonie 12.12.2012 18 / 25
Błędy 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łędy 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 językach programowania jako pamięć 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 się 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 listę wszystkich kluczy używanych w słowniku, w porzadku losowym (jeżeli chce się uzyskać posortowana listę kluczy, należy zastosować metodę 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