1 / 61

Python – typy danych, operacje we/wy, wyjątki, moduły i klasy

Python – typy danych, operacje we/wy, wyjątki, moduły i klasy. Dr inż. Maciej Miłostan, Instytut Informatyki, Politechnika Poznańska. Struktury danych. Struktury danych. Listy Krotki ( tuples ) i sekwencje Zbiory Słowniki. Listy. Lista=[ ‘To’, ‘jest’, ‘lista’] Operacje na listach:

vinaya
Download Presentation

Python – typy danych, operacje we/wy, wyjątki, moduły i klasy

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Python – typy danych, operacje we/wy, wyjątki, moduły i klasy Dr inż. Maciej Miłostan, Instytut Informatyki, Politechnika Poznańska

  2. Struktury danych

  3. Struktury danych • Listy • Krotki (tuples) i sekwencje • Zbiory • Słowniki

  4. Listy • Lista=[ ‘To’, ‘jest’, ‘lista’] • Operacje na listach: • Lista.append(x) • Lista.extend(L) • Lista.insert(i,x) • Lista.remove(x) • Lista.pop(), albo Lista.pop(i) • Lista.index(x) #błąd jeśli nie ma x • Lista.count(x) • Lista.sort() • Lista.reverse() • del Lista[i]

  5. Lista jako stos >>> stack = [3, 4, 5] >>> stack.append(6) >>> stack.append(7) >>> stack [3, 4, 5, 6, 7] >>> stack.pop() 7 >>> stack [3, 4, 5, 6] >>> stack.pop() 6 >>> stack.pop() 5 >>> stack [3, 4]

  6. Lista jako kolejka (FIFO) • Użyj collections.deque (ta kolekcja ma zaimplementowane szybkie operacje dodawania i usuwania elementów z dwóch końców >>> fromcollections import deque >>> queue = deque(["Eric", "John", "Michael"]) >>> queue.append("Terry") # Terryarrives >>> queue.append("Graham") # Grahamarrives >>> queue.popleft() # The first to arrivenowleaves 'Eric' >>> queue.popleft() # Thesecond to arrivenowleaves 'John' >>> queue # Remainingqueuein order of arrivaldeque(['Michael', 'Terry', 'Graham'])

  7. Listy z sekwencji (listscomprehensions) • Prosty przykład >>> vec = [2, 4, 6] >>> [3*x for x in vec] [6, 12, 18] • Bardziej złożony przykład >>> [[x, x**2] for x invec] [[2, 4], [4, 16], [6, 36]] • Z wywołaniem metody >>> owoc = [' banan', ' cyrtyna ', ‘jabłko '] >>> [bron.strip() for bron in owoc] [' banan', ' cyrtyna ', ‘jabłko '] • Z if-em: >>> [3*x for x in vec if x > 3] [12, 18] >>> [3*x for x in vec if x < 2] []

  8. >>> [x, x**2 for x invec] # error - parensrequired for tuples File "<stdin>", line 1, in ? [x, x**2 for x invec] ^ SyntaxError: invalidsyntax >>> [(x, x**2) for x invec] [(2, 4), (4, 16), (6, 36)]

  9. >>> vec1 = [2, 4, 6] >>> vec2 = [4, 3, -9] >>> [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 inrange(len(vec1))] [8, 12, -54]

  10. >>> [str(round(355/113, i)) for i in range(1, 6)] ['3.1', '3.14', '3.142', '3.1416', '3.14159']

  11. Listy zagnieżdżone - przykłady >>> mat = [ ... [1, 2, 3], ... [4, 5, 6], ... [7, 8, 9], ... ] >>> print([[row[i] for row in mat] for i in [0, 1, 2]]) [[1, 4, 7], [2, 5, 8], [3, 6, 9]] for i in [0, 1, 2]: for row in mat: print(row[i], end="") print() >>> list(zip(*mat)) [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

  12. Lista – przykład: del >>> a = [-1, 1, 66.25, 333, 333, 1234.5] >>> del a[0] >>> a [1, 66.25, 333, 333, 1234.5] >>> del a[2:4] >>> a [1, 66.25, 1234.5] >>> del a[:] >>> a []

  13. Krotki (ang. tuples) i sekwencje (ang. sequences) Sequence Types — str, bytes, bytearray, list, tuple, range >>> t = 12345, 54321, 'hello!' >>> t[0] 12345 >>> t (12345, 54321, 'hello!') >>> # Tuples may be nested: ... u = t, (1, 2, 3, 4, 5) >>> u ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5)) >>> empty = () >>> singleton = 'hello', # <-- przecinek ma znaczenie >>> len(empty) 0 >>> len(singleton) 1 >>> singleton ('hello',) Rozpakowywanie: >>> x, y, z = t

  14. Zbiory • Zbiory inicjujemy za pomocą set() albo {} (ten drugi sposób tylko dla niepustych zbiorów) >>> basket = {'apple’, 'orange', 'apple', 'pear', 'orange', 'banana'} >>> print(basket) {'orange', 'banana', 'pear', 'apple'} >>> 'orange' in basket True >>> 'crabgrass' in basket False

  15. Zbiory - przykłady >>> # Demonstrate set operations on uniquelettersfromtwowords ... >>> a = set('abracadabra') >>> b = set('alacazam') >>> a # uniquelettersin a {'a', 'r', 'b', 'c', 'd'} >>> a - b # lettersin a but not in b {'r', 'd', 'b'} >>> a | b # lettersineither a or b {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'} >>> a & b # lettersinboth a and b {'a', 'c'} >>> a ^ b # lettersin a or b but not both {'r', 'd', 'b', 'm', 'z', 'l'}

  16. Zbiory - przykłady >>> a = {x for x in 'abracadabra' if x not in 'abc'} >>> a {'r', 'd'}

  17. Słowniki • Inaczej tablice asocjacyjne • Kluczem może być każda niemutowalnastrutura danych (w tym krotka, złożona z liczby i/lub str-ów) • Klucze muszą być unikalne • Pusty słownik inicjalizujemy za pomocą {} (dlatego w przypadku zbiorów trzeba używać set()) • list(d.keys()) – zwraca wartości wszystkich kluczy (sorted(d.keys()) – postortowane klucze) • in – sprawdzenie czy klucz istnieje w słowniku

  18. Słowniki - przykłady >>> tel = {'jack': 4098, 'sape': 4139} >>> tel['guido'] = 4127 >>> tel {'sape': 4139, 'guido': 4127, 'jack': 4098} >>> tel['jack'] 4098 >>> del tel['sape'] >>> tel['irv'] = 4127 >>> tel {'guido': 4127, 'irv': 4127, 'jack': 4098} >>> list(tel.keys()) ['irv', 'guido', 'jack'] >>> sorted(tel.keys()) ['guido', 'irv', 'jack'] >>> 'guido' intel True >>> 'jack' not intel False

  19. Słowniki - przykłady >>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) {'sape': 4139, 'jack': 4098, 'guido': 4127} >>> {x: x**2 for x in (2, 4, 6)} {2: 4, 4: 16, 6: 36} >>> dict(sape=4139, guido=4127, jack=4098) {'sape': 4139, 'jack': 4098, 'guido': 4127}

  20. Moduły

  21. Moduły • Moduły tworzymy tak samo jak każdy skrypt tj. umieszczamy definicje funkcji w pliku z rozszerzeniem .py • Nazwa zaimportowanego modułu jest dostępna w zmiennej __name__

  22. Moduł - przykład • Plik fibo.py: # Fibonaccinumbers module deffib(n): # writeFibonacciseriesup to n a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() def fib2(n): # return Fibonacciseriesup to n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result

  23. Korzystanie z modułu • Załadowanie modułu >>> import fibo • Korzystanie z funkcji >>> fibo.fib(50) 1 1 2 3 5 8 13 21 34 >>> fibo.fib2(50) [1, 1, 2, 3, 5, 8, 13, 21, 34] >>> fibo.__name__ 'fibo' • Przypisanie funkcji do lokalnej zmiennej >>> fib = fibo.fib >>> fib(50) 1 1 2 3 5 8 13 21 34 • Jeszcze jeden sposób załadowania: >>> from fibo import * (lub fib, fib2 ) >>> fib(50) #bez nazwy mod… 1 1 2 3 5 8 13 21 34

  24. Moduł jako skrypt pythonfibo.py <arguments> if __name__ == "__main__": import sys fib(int(sys.argv[1])) $ pythonfibo.py 50 1 1 2 3 5 8 13 21 34 >>> import fibo >>>

  25. Moduły standardowe i wbudowane • Moduły standardowe – PythonLibraryReference • Moduły wbudowane - są wbudowane, ale żeby je wyświetlić za pomocą dir(), to trzeba: >>> import builtins >>> dir(builtins)

  26. Ścieżki do modułów • PYTHONPATH

  27. Wejście i wyjście

  28. Wejście i wyjście • Formatowanie wyjścia • str.format() print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)) 9 81 729 10 100 1000 • str() • repr() • str.rjust() (np. ‘123’.rjust(4)) • >>> '12'.zfill(5) '00012'

  29. Obiekt plikowy • f=open(filename, mode) Mode: r[b] (tylko odczyt) w[b] (istniejący plik zostanie nadpisany), r+[b] (odczyt i zapis) opcjonalne b oznacza tryb binarny • Metody obiektu: f.read() – cały plik f.read(size) – tylko część pliku >>> f.read() 'This is the entire file.\n‘ >>> f.read() '‘ • f.readline() – odczytuje pojedyncze linie na końcu lini zostawia \n za wyjątkiem ostatniej (koniec pliku to ‘’)

  30. Obiekt plikowy • Metody cd. >>>f.readlines() ['This is the first lineof the file.\n','Second line of the file\n'] Iterowanie po pliku >>> for line in f: ... print(line, end='') ... Zapis do pliku f.write(string) – zapisuje i zwraca liczbę zapisanych znaków Zapisując inne wartości niż string trzeba dokonać konwersji >>> value = ('the answer', 42) >>> s = str(value) >>> f.write(s)

  31. Obiekt plikowy • f.tell() • f.seek(przesunięcie, odkąd) odkąd = 0 – początek pliku (domyślnie) 1 – od bieżącego miejsca w pliku 2 – od końca pliku • f.close() >>> f = open('/tmp/workfile', 'rb+') >>> f.write(b'0123456789abcdef') 16 >>> f.seek(5) # Go to the 6th byte in the file 5 >>> f.read(1) b'5' >>> f.seek(-3, 2) # Go to the 3rd byte before the end 13 >>> f.read(1) b'd'

  32. Obiekt plikowy • withopen… as f – dba o zamknięcie pliku przechwytuje błędy >>> with open(‘/tmp/in’, 'r') as f: ... read_data = f.read() >>> f.closed True • Zapisywanie obiektów: pickle.dump(x, f) x = pickle.load(f) • Odczyt z zamkniętego pliku: >>> f.close() >>> f.read() Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: I/O operation on closed file

  33. Obsługa błędów i wyjątków

  34. Obsługa błędów i wyjątków Błędy składniowe Wyjątki >>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in ? ZeroDivisionError: int division or modulo by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: Can't convert 'int' object to str implicitly • Np. brak : po whileTrue >>> while True print('Hello world') File "<stdin>", line 1, in ? while True print('Hello world') ^ SyntaxError: invalid syntax

  35. Wyjątki wbudowane • Znaczenie wyjątków wbudowanych: http://docs.python.org/py3k/library/exceptions.html#bltin-exceptions

  36. Obsługa wyjątków • try: … except …: except: … while True: try: x = int(input("Please enter a number: ")) break except ValueError: print("Oops! That was no valid number. Try again...") except (RuntimeError, TypeError, NameError): pass

  37. Obsługa wyjątkowa import sys try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) exceptIOError as err: print("I/O error: {0}".format(err)) exceptValueError: print("Could not convert data to an integer.") except: print("Unexpectederror:", sys.exc_info()[0]) raise

  38. Obsługa wyjątków • try: … except …: else: for arginsys.argv[1:]: try: f = open(arg, 'r') exceptIOError: print('cannotopen', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()

  39. instance.args – argumenty wyjątku • Instancja wyjątku implementuje również metodę __str()__, dzięki czemu argumenty mogą być wypisywane w sposób bezpośredni >>> try: ... raiseException('spam', 'eggs') ... exceptException as inst: ... print(type(inst)) # theexceptioninstance ... print(inst.args) # argumentsstoredin .args ... print(inst) # __str__ allowsargs to be printeddirectly, ... # but may be overriddeninexceptionsubclasses ... x, y = inst.args # unpackargs ... print('x =', x) ... print('y =', y) ... <class 'Exception'> ('spam', 'eggs') ('spam', 'eggs') x = spam y = eggs

  40. Przechwytywanie wyjątków z funkcji >>> def this_fails(): ... x = 1/0 ... >>> try: ... this_fails() ... except ZeroDivisionError as err: ... print('Handling run-time error:', err) ... Handling run-time error: int division or modulo by zero

  41. Zgłaszanie wyjątków • Polecenie raise >>> raise NameError('HiThere') Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: HiThere >>> try: ... raise NameError('HiThere') ... except NameError: ... print('An exception flew by!') ... raise ... An exception flew by! Traceback (most recent call last): File "<stdin>", line 2, in ? NameError: HiThere

  42. Własna klasa wyjątku >>> class MyError(Exception): ... def __init__(self, value): ... self.value = value ... def __str__(self): ... return repr(self.value) >>> try: ... raise MyError(2*2) ... except MyError as e: ... print('My exception occurred, value:', e.value) ... My exception occurred, value: 4 >>> raise MyError('oops!') Traceback (most recent call last): File "<stdin>", line 1, in ? __main__.MyError: 'oops!'

  43. try: … except …: finally: … >>> def divide(x, y): ... try: ... result = x / y ... except ZeroDivisionError: ... print("division by zero!") ... else: ... print("result is", result) ... finally: ... print("executing finally clause") ... >>> divide(2, 1) result is 2.0 executing finally clause >>> divide(2, 0) division by zero! executing finally clause >>> divide("2", "1") executing finally clause Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 3, in divide TypeError: unsupported operand type(s) for /: 'str' and 'str'

  44. Predefiniowane akcje sprzątające • Niektóre obiekty mają zdefiniowane operacje, które umożliwiają prawidłowe zakończenie przetwarzania • Zobaczmy to na przykładzie obiektu plikowego • Kod bez „sprzątania” for line in open("myfile.txt"): print(line) • Kod ze sprzątaniem with open("myfile.txt") as f: for line in f: print(line) Plik zostanie automatycznie zamknięty, niezależnie od wyniku przetwarzania

  45. Klasy

  46. Klasy • Definicja klasy - składnia classClassName: <statement-1> . . . <statement-N>

  47. Definicja klasy - przykład class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world‘ MyClass.i, MyClass.f są referencjami wskazującymi odpowiednio na int i funkcję (obiekt) MyClass.__doc__ • Inicjalizacja instancji obiektu x=MyClass() • Dodatkowe operacje w trakcie tworzenia instancji – metoda __init__ def __init__(self): self.data = [] >>> classComplex: ... def __init__(self, rzecz, uroj): ... self.r= rzecz ... self.u= uroj ... >>> x = Complex(3.0, -4.5)

  48. Instancje x.counter = 1 whilex.counter < 10: x.counter = x.counter * 2 print(x.counter) del x.counter • Atrybuty do instancji mogą być dodawane i usuwane „dynamicznie”

  49. Dziedziczenie classDerivedClassName(BaseClassName): <statement-1> . . . <statement-N> • isinstance() • issubclass() • Dziedziczenie wielokrotne • class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N> • Funkcja super()

  50. Zmienne prywatne • W pythonie nie ma czegoś takiego jak prywatne atrybuty/zmienne klasy • Zamiast tego stosuje się konwencję, że zmienne, które mają być dostępne tylko za pomocą metod są poprzedzane _ np. _prywata • Natomiast zmienne __zmienna (co najmniej dwa znaki odkreślenia na początku) jest konwertowany automatycznie do postaci _nazwaklasy_zmienna

More Related