Python - różnice pomiędzy 2.x i 3.x



Zaczynając swoją przygodę z Python'em możemy natrafić na pewien dylemat. Czy programować w wersji 2.x, czy może w wersji 3.x? Pytanie to nie jest tak naprawdę łatwe, gdyż obydwie wersje Python'a są obecnie dostępne i rozwijane. Wersje niestety nie są do końca kompatybilne ze sobą. Jest co prawda mała szansa, że kod napisany w jednej wersji zadziała na drugiej. Niestety jednak większa szansa jest na to, że będziemy musieli dokonac pewnych zmian w naszym programie. Obydwie wersje są utrzymywane. Jako, że różnice pomiędzy wersjami 2.x, a 3.x nie są tak przytłaczające, to osobom zaczynającym programować radziłbym uczyć się wersji 3.x. Wersja ta jest bardziej przejrzysta. Usuwa sporo brzytkich cech, które pojawiły się podczas wieloletniego rozwoju gałęzi 2.x. Chciałbym tu przedstawić kilka z różnic jakie występują pomiędzy wersjami. Jako, że python ciągle się rozwija to nie jest łatwo zebrać w jednym miejscu wszystkiego, aczkolwiek mam nadzieję, że choć część z tych różnic uda mi się tu umiescić.


Zmiany w działaniu funkcji ;)

Funkcjonalność Python 2.x Python 3.x
print Jest instrukcją.
Brak możliwości definiowania separatorów i zakończenia.
Umieszczając przecinek po argumentach możemy zapobiec wyświetleniu znaku końca wiersza:
print x, y,
Składnia >> w kontekście tej instrukcji służy do przekierowania wyniku zapytania w inne miejsce niż sys.stdout:
print >> afile, x, y
Jest funkcją.
Domyślnie zwraca None.
Składnia: print([object, ...][, sep=' '][, end='\n'][, file=sys.stdout])
Argumenty w nawiasach [] są opcjonalne.
sep - separator.
end - ciąg znaków używany na za końcu wyświetlanego tekstu.
file - określa strumień wyjściowy.
nonlocal Brak W porównaniu do wersji python 2.x instrukcja nonlocal w pythonie 3.x pozwala nam na modyfikacje zmiennej w zakresie funkcji zawierającej ją.
range(), map(), zip(), filter() Zwracają listy.
Dodatkowo jest xrange(), który działa tak jak range() w pythonie 3.x i zwraca obiekt generujący kolejne wartości.
Zwracają obiekty iterowane.
xrange() został zastąpiony funkcją range().
Typy znakowe Instrukcja unicode służy do przetwarzania tekstów Unicode.
Instrukcja str jest stosowana natomiast do tekstu w kodowaniu 8-bitowym i binarnym.
Instrukcja str jest stosowana do tekstów Unicode (kodowanie ASCII lub inne)
Instrukcja bytes służy do zapisu danych binarnych (w tym tekstu zakodowanego)
Instrukcja bytearray jest mutowalną wersją instrukcji bytes. Jest także dostępna od wersji 2.6 ale w bardziej ogranicznonej formie.
Metody statyczne w klasach Metody sa traktowane jako metody niezwiązane.
Nie można ich wywoływać, nie przekazując im instancji w sposób jawny.
Metoda zawsze musi być deklarowana jako statyczna, gdy chcemy ją wykorzystać bez instancji.
Metody są traktowane jak zwykłe funkcje, które mozna wywoływac bez podawania instancji.
Metody nie musimy deklarować jako statyczną jeżeli wywołujemy ją wyłacznie z klasy.
Słowniki Metody D.keys, D.values i D.items zwracają listy.
Można porównywać wielkośc słowników.
Metoda D.has_key.
Są obługiwane podobnie do list i zbiorów.
Metody D.keys, D.values i D.items zwracają widoki będące obiektami iterowanymi.
Wielkość słowników musimy porównywać ręcznie.
Brak metody D.has_key, zamiast tego stosuje się test przynależności.
Liczby 0177 - literał ósemkowy
X / Y - odcina resztę z dzielenia.
0o177 - literał ósemkowy
Typy liczb całkowitych (zwykłe i długie ) zostały połaczone.
X / Y - zachowuję resztę z dzielenia.
Zbiory Tworzymy wywołując instrukcję set.
set([5,6,7,8])
Tworzymy urzywając klamer.
{5,6,7,8}
Adnotacje funkcji Brak Są opcjonalne, zapisywane w atrybucie __anotations__
Rozszerzona składnia sekwencji Działania na wycinkach. Możliwość zastosowania * w celu przypisania większej ilości elementów sekwencji.
Zmiany w składni raise Wyjątek, Argumenty
Dozwolona forma:
X != Y, albo X <> Y
apply(f, ps, ks)
`X`
raw_input
file
cmp(x, y)
raise Wyjątek(Argumenty)
Tylko forma
X != Y jest poprawna.
f(*ps, **ks)
repr(X)
input
open()
(x > y) - (x < y)