JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA Marcin Lewandowski [ mlew@ippt.gov.pl ]
PYTHON 3 2
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 3
Stringi UNICODE Typ str (string) jest UNICODE! Nie można używad u"..." dla stringów Unicode Stringi binarne (1znak = 1bajt) wymagają zapisu b"..." Typy str i bytes nie mogą byd mieszane - trzeba wykonywad konwersję: str -> bytes: str.encode() bytes -> str: bytes.decode() Alternatywnie: bytes(s, encoding=...) i str(b, encoding=...) 4
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 5
bytes Definicja stringów binarnych a = b"acme 50 91.10" # literał b = bytes([1,2,3,4,5]) # 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 6
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' 7
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 8
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' 9
Builtins Usunięte builtins: apply() callable() coerce() execfile() the file type reduce() reload() dict.has_key() Zmienione: raw_input() -> input() 10
print jest funkcją!!! 11
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() 12
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() 13
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> 14
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 15
Dictionary comprehensions Było dla list, tera jest też dla słowników: a = {key.upper():value for key,value in d.items()} 16
Wyjątki # Stara składnia raise Exception, Ooop exception! # Nowa składania exception( Ooop exception! ) try: a=int( hotdog ) except ValueError as oops: print( ValueError has occurred, oops) 17
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) 18
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 19
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) 20