JĘZYK PYTHON NARZĘDZIE DLA KAŻDEGO NAUKOWCA Dr Marcin Lewandowski [ mlew@ippt.pan.pl ] Strona kursu: http://us4us.eu/wydarzenia/kursy/ 1
2 OPERACJE NA STRINGACH
3 Bit/Byte/Word Bit 0/1 Byte 8 bitów Word 2 bajty 16 bitów Long Word 4 bajty 32 bitów Long Long Word 8 bajty 64 bitów
4 ASCII American Standard Code for Information Interchange ustandaryzowany w 1963 Pierwsze zastosowanie: BELL teleprinter (TTY - TeleTYpe) Kodowanie znaków alfanumerycznych amerykańskich, kontrolnych i ew. znaków międzynarodowych (tzw. strona kodowa)
5 ASCII-I
6 ASCII-II
7 UNICODE Unicode jest nowoczesnym sposobem kodowania obejmującym znaki używane na całym świecie (np. polskie ogonki, alfabet chiński, hieroglify, cyrylicę i wiele innych), symbole muzyczne, techniczne, fonetyczne i inne często spotykane. Unicode przypisuje każdemu znakowi unikalny numer (kod numeryczny, ang. code point), niezależny od używanego systemu operacyjnego, programu czy języka. Ważną cechą Unicode jest fakt, że pierwsze 128 znaków odpowiada kodom ASCII (zakres 00..7F). więcej o Unicode na www.unicode.org
8 UNICODE encoding UTF-8 kodowanie 8-bitowe zmiennej długości (zgodność z ASCII). UTF-16 kodowanie 16-bitowe zmiennej długości. UTF-32 kodowanie 32-bitowe stałej długości.
9 UNICODE escape >>> 'm' 'm' >>> '\155' 'm' >>> '\x6d' 'm >>> u'\n{latin SMALL LETTER A} 'a' >>> u'\n{latin SMALL LETTER A WITH ACUTE} 'á' >>> u"\u0041" A >>> u"\u00000041" A
10 String escape sequence Raw string wyłączona interpretacja sekwencji escape!
11 Funkcje len(s) zwraca długość sekwencji (liczbę elementów), działa dla obiektów typu: string, tuple, list, dictionary char(n) zwraca znak odpowiadający kodowi n ASCII ord(ch) zwraca kod ASCII danego znaku ch str(s) reprezentacja obiektu dla człowieka repr(s) reprezentacja obiektu dla interpretera W Python 3.0+ znaki są stringi/kodowane w UNICODE!
12 str() vs repr() >>> s = 'Hello, world.' >>> str(s) 'Hello, world.' >>> repr(s) "'Hello, world. >>> str(0.1) '0.1' >>> repr(0.1) '0.10000000000000001'
13 \ problem # Path on Windows >>> path = C:\\sample.txt >>> path = r C:\sample.txt >>> str(path) 'C:\\sample.txt' >>> repr(path) "'C:\\\\sample.txt >>> print path C:\sample.txt # Path on Unix/Linux >>> path = /tmp/sample.txt
14 Formatowanie stringów.format() format_spec ::= [fill][align][sign][#][0][width][.precision][type] fill ::= <a character other than '}'> align ::= "<" ">" "=" "^ sign ::= "+" "-" " " width ::= integer precision ::= integer type ::= "c" "d" "i" "o" "u" "e" "E" "f" "F" "g" "G" "x" "X" "r" "s" "%"
15 Formatowanie
16 Formatowanie: opcje dosuwania
17 Formatowanie: opcje znaku '#' dla całkowitoliczbowych jeśli występuję poprzedza liczbę '0b', '0o', or '0x w zależności od podstawy: binarnej, ósemkowej, hexadecymalnej
18 format() przykłady >>> '{0}, {1}, {2}'.format('a', 'b', 'c') 'a, b, c' >>> '{}, {}, {}'.format('a', 'b', 'c') # 2.7+ only 'a, b, c' >>> '{2}, {1}, {0}'.format('a', 'b', 'c') 'c, b, a' >>> '{2}, {1}, {0}'.format(*'abc') # unpacking argument sequence 'c, b, a'
19 format() przykłady >>> '{:<30}'.format('left aligned') 'left aligned ' >>> '{:>30}'.format('right aligned') ' right aligned' >>> '{:^30}'.format('centered') ' centered ' # use '*' as a fill char >>> '{:*^30}'.format('centered') '***********centered***********'
20 Formatowanie % ze słownika >>> print WITAMY %(imie)s %(nazwisko)s.' % \ { imie : Marcin", nazwisko": Lewandowski } WITAMY Marcin Lewandowski
21 Funkcje stringowe >>> dir( Hello Python! ) [' add ', ' class ', ' contains ', ' delattr ', ' doc ', ' eq ', ' format ', ' ge ', ' getattribute ', ' getitem ', ' getnewargs ', ' getslice ', ' gt ', ' hash ', ' init ', ' le ', ' len ', ' lt ', ' mod ', ' mul ', ' ne ', ' new ', ' reduce ', ' reduce_ex ', ' repr, ' rmod ', ' rmul ', ' setattr ', ' sizeof ', ' str ', ' subclasshook ', '_formatter_field_name_split', '_formatter_parser', 'capitalize, 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper, 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', strip', 'swapcase', 'title', 'translate', 'upper', 'zfill ] *** Przegląd funkcji stringowych w dokumentacji ***
22 Użycie help() >>> help( Hello.replace) Help on built-in function replace: replace(...) S.replace (old, new[, count]) -> str Return a copy of S with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.
23 Operacja na stringach I Operacja S = '' S = str() S = "spam's" S = 'spam\'s' S = '\thello\nworld \x21' S = """...ble, ble, ble""" S = r'\temp\spam' Interpretacja Pusty string Apostrof w stringu Sekwencje escape String wieloliniowy String raw S = u'spam' String Unicode tylko Python 2.6 S = b'spam' String bajtowy tylko Python 3.0+ S1 + S2 S * 3 S[i] S[i:j] Konkatenacja (łączenie) stringów Powielanie stringów Indeksowanie, przecinanie (slicing)
24 Operacja na stringach II Operacja len(s) "Type: %s has value %d" % (type, val) Interpretacja Długość stringu Formatowanie stringu "a {0} parrot".format(kind) Funkcja formatowania S.find( spam') S.rstrip() S.replace('spam', 'ham') S.split(',') '+'.join(strlist) S.lower(), S.upper() S.startswith('spam'), S.endswith('spam') S.isdigit() S.encode('latin-1') Funkcja szukania w stringu Funkcja usuwania spacji Funkcja zamiany Funkcja dzielenia stringu na separatorze Funkcja łączenia listy w string z separatorem Zamiana znaków na małe/wielkie litery Test na zawartość początku/końca stringu Test czy string zawiera tylko cyfry Kodowanie w danej stronie kodowej
25 Konwersja/kodowanie ASCII Wyświetlanie całej tablicy znaków ASCII w formacie: kod hex, kod decymalny, znak ASCII Kodowanie/Dekodowanie stringu ASCII reprezentacji heksadecymalnej i binarnej
26 Encoding "Marcin".encode('hex') "3233343536". decode('hex') encodings/cp1252.py *** Codecs w dokumentacji ***
27 Encoding I >>> import sys >>> sys.version '2.6 (r26:66721, Oct 2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)]' >>> S = 'A\xC4B\xE8C' # String of 8-bit bytes >>> print S # Some are non-ascii AÄBčC >>> S.decode('latin-1') # Decode byte to latin-1 Unicode u'a\xc4b\xe8c' >>> S.decode('utf-8') # Not formatted as utf-8 UnicodeDecodeError: 'utf8' codec can't decode bytes in position 1-2: invalid data >>> S.decode('ascii') # Outside ASCII range UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 1: ordinal not in range(128)
28 WYRAŻENIA REGULARNE (REGEX)
29 Hmmm "Some people, when confronted with a problem, think: 'I know, I'll use regular expressions.' Now they have two problems. Jamie Zawinski
30 Regex >>> import re >>> s = His name is Marcin Lewandowski and her is Merlin Monroe.' >>> print re.findall( ([A-Z]\w+)\s+([A-Z]\w+)', s) [('Marcin', 'Lewandowski'), ('Merlin', 'Monroe')]
31 Regex funkcje I re.compile(pattern[, flags]) kompilacja wyrażenie regularnego do obiektu, który będzie następnie używany do wywołania metod: match() i search(); flags opcjonalne, specyfikowane razem przy pomocy operatora OR ( ). prog = re.compile(pattern) result = prog.match(string)
32 Regex funkcje II RegexObj.match(string[, pos[, endpos]]) dopasowywanie obiektu regex do stringu. Jeśli zero lub więcej znaków na początku stringu pasuje do wzorca zwraca obiekt MatchObj, lub None w przeciwnym wypadku RegexObj.search(string[, pos[, endpos]]) przeszukuje string w celu dopasowania wzorca. Zwraca obiekt MatchObj w przypadku znalezienia dopasowania lub None w przeciwnym wypadku *** moduł re w dokumentacji ***
33 Regex flagi/opcje re.i, re.ignorecase włącza opcję case-insensitive re.l, re.locale włącza interpretację znaków \w, \W, \b, \B, \s, \S z wykorzystaniem aktualnego locale. re.m, re.multiline kiedy włączone znak '^' dopasowuje na początku stringu oraz każdej nowej linii tekstu; podobnie znak '$' na końcu stringu oraz na końcu każdej linii tekstu re.s, re.dotall włącza dopasowanie znaku '.' jako każdego znaku włącznie ze znakiem nowej linii re.u, re.unicode włącza interpretację znaków \w, \W, \b, \B, \d, \D, \s, \S zgodnie z UNICODE re.x, re.verbose umożliwia pisanie wyrażeń regularnych w bardziej czytelnej postaci wieloliniowej oraz ze spacjami, które są ignorowane, znaki po # są traktowane jak komentarz
34 match vs search import re regex = re.compile( he..o') if regex.match( hello!!!'): print match!' if regex.search( Python hello!'): print found!'
35 Regex I Znak Znaczenie ^ Dopasowuje początek napisu $ Dopasowuje koniec napisu \b Dopasowuje początek lub koniec słowa \d Dopasowuje dowolna cyfrę \D Dopasowuje dowolny znak, który nie jest cyfra \s Dopasowuje pustą przestrzeń odpowiednik: [ \t\n\r\f\v] \S Negacja do \s odpowiednik: [^ \t\n\r\f\v] \w Dopasowuje znak alfanumeryczny odpowiednik: [a-za-z0-9_] \W Negacja do \w odpowiednik: [^a-za-z0-9_]
36 Regex II Znak Znaczenie x? Dopasowuje wystąpienie x zero lub jedno raz x* Dopasowuje x zero lub więcej razy x+ Dopasowuje x jeden lub więcej razy x{n,m} (a b c) (x) Dopasowuje znak x co najmniej n razy, lecz nie więcej niż m razy Dopasowuje a albo b albo c Definicja grupy dopasowana wartość dostępna za pomocą groups(), na obiekcie zwróconym przez re.search. Dopasowuje dowolny pojedynczy znak (z wyjątkiem nowej linii, o ile nie ustawiona flaga re.dotall) [ ] Dopasowuje zestaw lub zakres znaków (np. [abc], [a-za-z] [^ ] Negacja do [ ]
37 Obiekt match m = re.search("a(b*)c", "_abbbbc_") Wyrażeni e m.group(1 ) Wartoś ć bbbb Opis Dopasowany string pierwszej dopasowanej grupy m.start(1) 2 Indeks startu w stringu elementu pierwszej dopasowanej grupy m.end(1) 6 Indeks końca w stringu elementu pierwszej dopasowanej grupy
Dekodowanie numerów telefonów 38 EX7 Formaty numerów telefonów: 800-555-1212 800 555 1212 800.555.1212 (800) 555-1212 1-800-555-1212 800-555-1212-1234 800-555-1212x1234 800-555-1212 ext. 1234 work 1-(800) 555.1212 #1234
39 Regex narzędzia i linki http://www.regular-expressions.info dla Pythona i różnych innych języków http://www.pythonregex.com webowy tester Regex http://kodos.sourceforge.net narzędzie GUI do testowania Regex
40 Moduł struct Pakowanie i rozpakowywanie struktur binarnych na podstawie definicji formatu danych Potrzebne przy konwersji, zapisie/odczycie binarnych plików i struktur danych
41 Moduł struct funkcje exception struct.error wyjątek generowany dla niepoprawnych specyfikacji typów struct.pack(fmt, v1, v2,...) zwraca string zawierający spakowaną (binarną) strukturę w formacie fmt złożoną z wartości v1, v2,... (argumenty muszą pasować do formatu wzorca!) struct.pack_into(fmt, buffer, offset, v1, v2,...) j.w. ale pakuje wynik do zapisywalnego bufora buffer zaczynając w miejscu offset struct.unpack(fmt, string) rozpakowuje strukturę binarną (string) zgodnie z formatem fmt; zwraca listę niemodyfikowalną wartości; Uwaga: len(string) == struct.calcsize(fmt) struct.unpack_from(fmt, buffer[, offset=0]) j.w. ale rozpakowuje z bufora buffer zaczynając od miejsca offset struct.calcsize(fmt) zwraca długość struktury dla określonej specyfikacji formatu wzorca
42 Moduł struct typy I Format C Type Python x pad byte no value c char string of length 1 b signed char integer B unsigned char integer h short integer H unsigned short integer i int integer I unsigned int integer or long l long integer L unsigned long long q long long long
43 Moduł struct typy II Format C Type Python f float float d double float s char[] string p char[] string P void * long Wzorzec formatu Znaczenie 10s String o długości 10 4h <HLQ Liczba powtórzeń z wyjątkiem typu s (to samo co hhhh ) Pierwszy znak określa kolejność bajtów i wyrównanie w tym wypadku little-endian/standard
44 Moduł struct kolejność bajtów Znak Kolejność bajtów Rozmiar @ (domyślny) Natywny Natywny = Natywny Standard < little-endian Standard > big-endian Standard! network (= big-endian) Standard Natywny rozmiar i wyrównanie określa funkcje kompilatora C sizeof(). Standardowy rozmiar i wyrównanie = bez wyrównania, short = 2 bajty; int, long = 4 bajty; long long = 8 bajty; float = 4 bajty, double = 8 bajtów
Moduł struct przykład 45 EX6 BIN2TXT konwerter binarnych plików z danymi typu int do pliku tekstowego
46 OPERACJA NA PLIKACH
47 Co o plikach? Typy plików: Tekstowe (automatyczna obsługa znaków końca linii) Binarne Pliki wirtualne urządzeń (znakowe/blokowe) Tryby dostępu Buforowany/niebuforowany Blokujący/nieblokujący Funkcje/Operacje na plikach i katalogach Moduły obsługi plików: os, os.path, fileinput, tempfile, shutil CSV, XML, ZIP, rekordy, DB
48 Moduł io open(filename[, mode[, bufsize]]) otwiera plik filename w trybie mode (domyślnie r ); bufsize określa tryb i wielkość bufora close(file) zamyka plik file file.readline([limit]) czyta linię tekstu z pliku (max limit znaków) file.readlines([limit]) czyta linie z pliku i zwraca w formie listy (max limit znaków) file.seek(offset[, whence]) zmienia pozycję w pliku o offset względem (whence): 0 początku pliku (domyślnie); 1 pozycji aktualnej; 2 końca pliku; zwraca bezwzględną pozycję aktualną file.tell() Return the current stream position file.read([n]) czyta i zwraca zadaną liczbę n bajtów z pliku file.readall() czyta zawartość całego pliku file.write(buf) pisze bajty z bufora buf do pliku
49 open/read/close # open( C:\\path\\file, w+ ) # tekstowy, read/write # open( C:/path/file, rb ) # binarny, read >>> f = open(r C:\path\file ) >>> f.read(10) >>> print f.tell() >>> f.seek(10) >>> print f.tell() >>> f.close()
50 open() tryb otwarcia Wartość Początkowa pozycja w pliku Odczyt? r Początek (domyślnie) Tak Nie w Początek Nie Tak a Koniec Nie Tak r+ Początek Tak Nie w+ Początek Tak Tak a+ Koniec Tak Tak U Uniwersalna obsługa końców linii: \n, \r, \r\n Zapis?
51 Pliki zapis/odczyt # ZAPIS: fid = open( test.txt, w ) fid.write( Hello\nWorld ) fid.close() # ODCZYT: cały plik na raz! fid = open( test.txt, r ) s = fid.read() fid.close() # ODCZYT: linia po linii fid = open( test.txt, r ) for line in fid: print("line: " + line.strip()) fid.close()
52 CRLF/LF Linia tekstu zakończona znakiem nowej linii: LF (0x0A) Unix CR LF (0x0D 0x0A) Windows print ord( \r ) # 13 print ord( \n ) # 10 print \n, # \x0d\x0a '\n' w plikach tekstowych zamieniane automatycznie na koniec linii dla danej platformy
53 Przetwarzanie pliku tekstowego def process(line): print line # Process file line-by-line file = open( plik1.txt ) for line in file: process(line)
54 Wyjątki obsługi plików try: # file operations except IOError, message: print( An IO error, message) except : else: print( Succes )
Czytanie plików INI 55 EX8 [View] WindowSize=1024,768 BackgroundColor=green7 WindowSize=1280,1024 [Print] BackgroundColor=green5
56 Moduł os os.chdir(path) zmienia katalog bieżący na path os.getcwd() zwraca string z katalogiem bieżącym os.listdir(path) zwraca listę nazw w katalogu path os.mkdir(path[, mode]) tworzy katalog path z prawami dostępu mode (domyślnie 0777) os.makedirs(path[, mode]) rekursywne tworzenie katalogów os.rmdir(path) usuwa katalog path os.remove(path) usuwa plik path os.stat(path) zwraca strukturę (tuple) stat z informacjami o pliku (rozmiar, czasy, etc.) moduł os patrz dokumentacja Pythona
57 Moduł os.path Na danej platformie import os.path Implementacja dla różnych systemów: posixpath dla UNIXowych ntpath dla Windows macpath dla starych MacOS os2emxpath dla OS/2 EMX
58 Moduł os.path funkcje os.path.dirname(path) zwraca katalog dla podanej ścieżki os.path.getsize(path) zwraca rozmiar pliku w bajtach (os.error gdy plik jest niedostępny lub nieistnieje) os.path.isfile(path) True gdy path jest istniejącym i regularnym plikiem os.path.isdir(path) True gdy path jest katalogiem os.path.join(path1[, path2[,...]]) inteligentnie łączy elementy ścieżki w jedną ścieżkę wynikową moduł os.path patrz dokumentacja Pythona
59 Moduł glob Znajduje nazwy plików wg. zadanego wzorca zgodnie z regułami stosowanymi w systemach powłok systemu UNIX Wildcar d Dopasowuje * zero lub więcej znaków Przykład *.xls wszystkie pliki z rozszerzeniem xls? pojedynczy znak??? wszystkie pliki o nazwie składającej się dokładnie z 3 znaków [...] Pojedynczy znak z listy [!...] Pojedynczy znak nie z listy [ABC]* nazwy zaczynające się od liter A, B lub C *[!x] nazwy które nie kończą się na literę x >>> import glob >>> for path in glob.glob( C:\\source\\*.bak ):... os.remove(path)
60 Pliki CSV moduł CSV csv.reader(csvfile [, dialect='excel'] [, fmtparam]) zwraca obiekt typu reader dla pliku CSV. import csv cr = csv.reader(open('plik.csv'), delimiter=',', quotechar= ') for row in cr: print ':'.join(row)
61 CSV z obsługą błędów import csv, sys fn = "some.csv" reader = csv.reader(open(fn, "rb")) try: for row in reader: print row except csv.error, e: sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
62 Inne moduły fileinput otwiera i czyta pliki podane w linii poleceń, czyli sys.argv[1:]; domyślnie sys.stdin import fileinput for line in fileinput.input(): process(line) tempfile do tworzenia tymczasowych plików i katalogów shutil wysokopoziomowe operacja na plikach (np. copytree, rmtree) urllib pobieranie stron WWW
63 PROGRAMOWANIE FUNKCYJNE
64 Źródła Programowanie funkcyjne (wykład MIMUW) http://wazniak.mimuw.edu.pl/index.php?title=programowa nie_funkcyjne M.L. Scott, Programming Language Pragmatics, Morgan Kaufmann, 3 ed., 2009 Charming Python installments http://gnosis.cx/publish/tech_index_cp.html
65 Paradygmaty programowania Proceduralne/Imperatywne operacje wykonywane na danych (operacje zmieniają stan programu) Obiektowe opis interakcji pomiędzy obiektami Funkcyjne program jako funkcja
66 Imperatywne vs. Funkcyjne Cecha Imperatywne Funkcyjne Konstrukcja algorytmu Zmiana/Stan programu Kolejność wykonywania Jakie instrukcje wykonać (algorytm) i jak zmieniać stan programu Ważny Ważna Jakie transformacje danych są potrzebne Nie istnieje Mało ważna Przepływ sterowania Pętle, warunki i funkcje Funkcje, rekurencja Podstawowe elementy języka Struktury danych, instancje klas Funkcje jako obiekty firstclass, kolekcje danych (listy)
Konstrukcje programowania funkcyjnego w Pythonie Funkcje jako obiekty podstawowe (tzw. first-class) lambda, przekazywanie funkcji jako argument Domknięcia (ang. Closures) funkcje związane z damymi Funkcje operujące na funkcjach (ang. high-order functions) Dekoratory forma opakowań (wrapperów) dla funkcji Iteratory i Generatory Listy jako podstawowa struktura danych (List Comprehensions) 67
68 Lambda Lambda proste, jednolinijkowe, anonimowe funkcje Mogą być przekazywane tak jak zwykłąe funkcje nazwane Używane często jako funkcje w callback, list comprehesnsions, high-order functions return jest w nich domniemany (implicite) square = lambda x: x*x >>> square(9) 81 squares = map(lambda x: x*x, range(3)) >>> squares [0, 1, 4]
69 Domknięcie (Closure) Domknięcie to funkcja ze związanymi zmiennymi: składa się z funkcji, jej lokalnych zmiennych oraz referencji do zmiennych spoza zakresu (outer scope) Obiekty to metody związane z danymi na których działają; Domknięcia to dane dowiązane do funkcji # Zwraca funkcję opodatkowania daną stawką VAT def vat_taxer(rate): def taxer(amount): return amount * (float(rate) / 100) return taxer vat22 = vat_taxer(22) vat7 = vat_taxer(7)
70 Domknięcie przykład # zwraca funkcję mnożącą przez n def multiply_by(n): return lambda x: return x*n double = multiply_by(2) triple = multiply_by(3) >>> double(2) 4 >>> triple(4) 12
71 High-order functions 1 map zastosuj funkcję na każdym elemencie sekwencji: >> map(lambda x: x**2, range(1,5)) [1, 4, 9, 16] filter wybiera elementy spełniające warunek >> filter(lambda x: x%2==0, range(10)) [0, 2, 4, 6, 8] reduce redukuje elementy sekwencji do jednej wartości za pomocą funkcji: >> reduce(lambda x,y: x+y, [1, 2, 3, 4]) 10
72 High-order functions 2 zip zszywa kolejne elementy z sekwencji: >> zip(( a, b, c ), (1,2,3)) [( a,1), ( b,2), ( c,3)] all zwraca True, gdy wszystkie elementy są True: >> all((1, 2, alala )) True any zwraca True, gdy choś jeden element jest True: >> any((0, None, 1)) True
73 Dekoratory def my_decorator(fn): def wrapper(*args): print before invocation fn(*args) print after invocation return wrapper @my_decorator def hello_world(): print hello, world >>> hello_world() before invocation hello, world after invocation
74 Iteratory Iterator jest analogiem sekwencji ale z kilkoma różnicami: Często używamy funkcji, która tworzy kolejne elementy sekwencji (np. za pomocą Generatora) Elementy sekwencji są produkowane dopiero w momencie kiedy są potrzebne Iteratory mogą tworzyć sekwencje dowolnie długie (w odróżnieniu od sekwencji struktur danych ograniczonych pamięcią) Iterator to protokół (nie typ danych) na który składa się: Funkcji next() (w implementacji next ()) Raise StopIteration after last item
75 Generatory Generator funkcja działająca jako Iterator Każdy element jest zwracany za pomocą polecenia yield Zakończenie przez: zakończenie funkcji zwykłe return raise StopIteration
76 Generatory przykład def four(): x = 0 while x < 3: print("in generator, x =", x) yield x x += 1 >>> for i in four(): print(i) in generator, x = 0 0 in generator, x = 1 1 in generator, x = 2 2
77 Generatory wyrażenia Składniowo podobne do List Comprehensions Ewaluacja leniwa jeden element za jednym razem Mogą być używane wszędzie, gdzie jest spodziewany Iterator # Przykład 1 it = (line.strip() for line in open('input.txt')) # Przykład 2 można ominąć nawiasy w wywołaniu funkcji func(line.strip() for line in open('input.txt'))
3 implementacje is_prime() 78 EX9 # Implementacja imperatywna wersja 1 def is_prime(n): k = 2 while k < n: if n % k == 0: return False k += 1 return True # Implementacja funkcyjna wersja 2 def is_prime(n): return len(filter(lambda k: n%k==0, range(2,n))) == 0 # Implementacja funkcyjna wersja 3 def is_prime(n): return not any(n%k==0 for k in xrange(2,n))
79 PROGRAMOWANIE OBIEKTOWE
Programowanie obiektowe Object-oriented programming (OOP) Klasy i obiekty: Obiekty są tworzone na podstawie definicji klas Pojedynczy obiekt jest nazywany instancją klasy Dane i operacje na nich (funkcje) tworzą obiekt Operacje/funkcje zawarte w klasie są nazywane metodami Dane/zmienne w klasie są nazywane atrybutami klasy Atrybuty tworzą stan instancji klasy (obiektu) 80
81 Definicja klasy class circle: def init (self, radius): self.radius = radius init jest inicjalizatorem obiektu self jest referencją do obiektu # utworzenie obiektu klasy circle >> c = circle(10) c < main.circle instance at 0x004A48A0> >> dir(c) [' doc ', ' init ', ' module ', 'radius']
Przeszukiwanie: obiekt.atrybut Szuka pierwszego wystąpienia atrybutu w obiekcie lub we wszystkich klasach powyżej (z których dziedziczył) od dołu do góry i od lewej do prawej strony 82 class C2: x = z = 2 class C3: w = z = 3 class C1(C2, C3): x = y = 1 I1 = C1() I2 = C1()
83 Metody specjalne klas METODA IMPLEMENTUJE WOŁANA DLA init Konstruktor obiektu X = Class(args) del Destruktor obiektu Usuwanie obiektu X add Operator + X + Y, X += Y jeśli nie iadd or Operator (bitowy OR) X Y, X = Y jeśli nie _ior repr, str Drukowanie, konwersja print(x), repr(x), str(x) call Wywołanie funkcji X(*args, **kargs) setattr Przypisanie atrybutu X.any = value delattr Skasowanie atrybutu del X.any getattribute Pobranie atrybutu X.any getattr Pobranie atrybutu X.undefined
84 Metody specjalne klas c.d. METODA IMPLEMENTUJE WOŁANA DLA getitem setitem delitem Indeksowanie, przecinanie, iteracja Przypisanie indeksowane, przecinane Usuwanie indeksowane, przecinane X[key], X[i:j], także dla pętli jeśli nie iter X[key] = value, X[i:j] = sequence del X[key], del X[i:j] len Długość len(x), testowanie gdy nie bool bool Testy logiczne bool(x), ( nonzero w Py 2.6) lt, gt, le, ge, eq, ne Porównania X < Y, X > Y, X <= Y, X >= Y, X == Y, X!= Y ( cmp w Py 2.6)
85 Metody specjalne klas c.d. METODA IMPLEMENTUJE WOŁANA DLA iadd Operator dodawania w miejscu X += Y iter, next Iterator I=iter(X), next(i); dla pętli contains Tester przynależności item in X (dla iterowalnych) index enter, exit get, set, delete Wartość całkowitoliczbowa Menadżer kontekstu with Deskryptory atrybutów hex(x), bin(x), oct(x), O[X], O[X:] (zastpuje Py 2.x oct, hex ) with obj as var: X.attr, X.attr = value, del X.attr new Tworzenie obiektu przed init
86 Atrybuty specjalne klas Wszystkie klasy posiadają następujące atrybuty: doc string dokumentacji class referencji do obiektu klasy (z każdej instancji) bases lista klas bazowych name nazwa klasy obiektu module nazwa modułu, w którym klasę zdefiniowano dict słownik będący przestrzenią nazw klasy (ale nie superklas)
87 Przykład 1 zmienne klasowe class Circle: pi = 3.14159 # class variable def init (self, radius = 1): self.radius = radius def area(self): return self.radius**2 * pt print Circle.pi circle1 = Circle() print circle1.area() circle5 = Circle(5) print circle5.area()
88 Przykład 2 metody statyczne class Circle: all_circles = [] # class variable pi = 3.14159 # class variable def init (self, r=1): self.radius = r self. class.all_circles.append(self) def area(self): return self. class.pi * self.radius * self.radius @staticmethod def total_area(): total = 0 for c in Circle.all_circles: total = total + c.area() return total
89 Przykład 3 dziedziczenie class Shape: def init (self, x, y): self.x = x self.y = y class Square(Shape): def init (self, side=1, x=0, y=0): super(). init (x, y) self.side = side class Circle(Shape): def init (self, r=1, x=0, y=0): super(). init (x, y) self.radius = r
90 Przykład 4 getters/setters class Temperature: def init (self): self. t_fahr = 0 # private in F @property def temp(self): # in ºC return (self. t_fahr-32)*5/9 @temp.setter def temp(self, new_temp): # in ºC self. t_fahr = new_temp*9/5 + 32
Klasa operacji na ułamkach zwykłych 91 EX10 Implementacja klasy ułamek oraz operacji: dodawania, odejmowania, mnożenia i dzielenia ułamków wyświetlania ułamków
92 PYTHON 3
93 Int int jest obecnie odpowiednikiem dawnego long int nie ma wartości maksymalnej (sys.maxint) 2/4 == 0.5 dzielenie jest już zmiennopozycyjne! 2//4 == 0 zwraca rezultat stałopozycyjny Zapis ósemkowy: 0o720 zamiast 0720
94 Stringi UNICODE Typ str (string) jest UNICODE! Nie można używać u"..." dla stringów Unicode Stringi binarne (1znak = 1bajt) wymagają zapisu b"..." Typy str i bytes nie mogą być mieszane - trzeba wykonywać konwersję: str -> bytes: str.encode() bytes -> str: bytes.decode() Alternatywnie: bytes(s, encoding=...) i str(b, encoding=...)
95 bytes i bytearray str i bytes są niemodyfikowalne (immutable) Typ bytearray jest modyfikowalnym do buforowanie danych binarnych Pliki otwierane w trybie tekstowym używają funkcji encoding do konwersji pomiędzy strings w pamięci i bajtami na dysku Pliki w trybie binarnym używają bytes/ bytearray
96 bytes Definicja stringów binarnych a = b"acme 50 91.10" b = bytes([1,2,3,4,5]) # literał # z listy c = bytes(10) # tablica 10 zero-bajtów d = bytes( ąćęłń","utf-8") # encoding ze stringu Uwaga to są tablice bajtów! >>> s = b"acme 50 91.10" >>> s[0] 65 >>> s[1] 67
97 Encoding dla plików Funkcja open() ma opcjonalny parametr: encoding: f=open("a.txt","rt,encoding="latin-1") Jeśli niepodany (domyślny): >>> f = open("somefile.txt","rt") >>> f.encoding 'UTF-8'
98 Latin-1 Latin-1 (znany także jako "iso-8859-1") Ograniczony dla znaków 8-bit (0-255) Wartości bajtów 1-1 Emuluje zachowanie Python 2.x Najszybszy encoding dla czystych 8-bitowych plików tekstowych
99 Encoding everywhere >>> import sys >>> sys.stdin.encoding 'UTF-8' >>> sys.stdout.encoding 'UTF-8 Uwaga na encoding zależny od ustawionego locale w OS: >>> import sys >>> sys.stdout.encoding 'US-ASCII'
100 Builtins Usunięte builtins: apply() callable() coerce() execfile() the file type reduce() reload() dict.has_key() Zmienione: raw_input() -> input()
101 print jest funkcją!!!
102 Nowe formatowanie stringów Po staremu: s = "%10s %10d %10.2f" % (name, shares, price) Po nowemu (Python 3): s = "{0:10s} {1:10d} {2:10.2f}".format(name,shares,price) Patrz dokumentacja Python 3 format()
103 ITERATORY Te funkcje zwracają Iteratory zamiast list: dict.keys(), dict.items(), dict.values (nie wspierane: dict.iterkeys(), dict.iteritems(), dict.itervalues()) map() filter() zip() range() robi za dawne xrange()
104 Uwaga na ITERATORY # To już nie działa w PYTHON 3! k = d.keys(); k.sort() # Użyj k = sorted(d) # to jest obiekt typu iterator! >>> {1: 0}.keys() <dict_keys object at 0x7ffdf8d53d00>
105 Listy vs. Iteratory PYTHON 2.x PYTHON 3 a = map(lambda x: x[1], items) a = [x[1] for x in items] for name in map(str.lower, names):... a = filter(lambda n: n%2==0, nums) for key in filter(str.isdigit, keys):... dict(zip(sins, persons)) bez zmian a = [n for n in nums if n%2==0] bez zmian bez zmian
106 Dictionary comprehensions Było dla list, tera jest też dla słowników: a = {key.upper():value for key,value in d.items()}
107 Wyjątki # Stara składnia raise Exception, Ooop exception! # Nowa składania raise Exception( Ooop exception! ) try: a=int( hotdog ) except ValueError as oops: print( ValueError has occurred, oops)
108 Moduły usunięte cfmfile cl md5 and sha (replaced with hashlib) mimetools, MimeWriter, mimify, multifile, and rfc822 (replaced with the e- mail package) posixfile sv timing (use time.clock instead) Canvas commands and popen2 (replaced with subprocess) compiler dircache dl fpformat htmllib (replaced with HTMLParser) mhlib (replaced with mailbox) stat (changed to os.stat) urllib (replaced with urllib2)
109 Moduły zmienione _winreg -> winreg ConfigParser -> configparser copy_reg -> copyreg Queue -> queue SocketServer -> socketserver markupbase -> _markupbase repr -> reprlib test.test_support -> test.support Zintegrowane: dbm: anydbm, dbhash, dbm, dumbdbm, gdbm, whichdb html: HTMLParser, htmlentitydefs http: httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib tkinter zawiera całego Tkinter (poza turtle) urllib: urllib, urllib2, urlparse, robotparse xmlrpc: xmlrpclib, DocXMLRPCServer, SimpleXMLRPCServer
110 Narzędzie 2to3 Automatyczne narzędzie do konwersji kody Pythona 2.x do Pythona 3. Narzędzie 2to3 znajduje się w podkatalogu: Tools/scripts Wewnętrznie korzysta z modułu: lib2to3 Użycie z zapisem do oryginalnego pliku: $ 2to3 -w ex.py (tworzy także backup pliku oryginalnego ex.py.bak)
111 Py launcher w Python 3.3+ Dwa uruchamiacze do Pythona (instalowane w katalogu systemu Windows!) py.exe dla aplikacji konsolowych pyw.exe dla aplikacji okienkowych (bez konsoli) Są automatycznie skojarzone z plikami ".py" i ".pyw"
112 Py launcher przykłady Z LINII POLECEŃ: C:\temp>py -3 script.py # runs under latest 3.X C:\temp>py -2 script.py # runs under latest 2.X C:\temp>py -2.6 script.py # runs under 2.6 (only) ZE SKRYPTU: #!python3... # runs under latest 3.X installed #!python2... # runs under latest 2.X installed #!python2.6... # runs under 2.6 (only)
113 Py launcher Domyślnie skrypty są uruchamiane w najnowszej zainstalowanej wersji Python 2.x Zmiana zachowania za pomocą zmiennych środowiskowych: PY_PYTHON=3 zmiana domyślnej wersji na 3.x Alternatywnie za pomocą pliku konfiguracyjnego py.ini w katalogu skryptu
114 c.d. http://docs.pythonsprints.com/python3_porting/pyporting.html.