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ć.
Funkcjonalność | Python 2.x | Python 3.x |
---|---|---|
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) |