Sunday, January 2, 2011

Python 3.1

Ostatnio pisałem o problemie dzielenia w Pythonie, podczas gdy wynik ma być mniejszy od 1 wynikiem jest 0. Pisałem też, że problem ten nie występuje w nowszej wersji Pythona 3.1. Wtedy mnie to dosyć zniechęciło do Pythona ale gdzieś podświadomie wiedziałem, że jest to język na tyle dobry, iż ma jakieś rozwiązanie tego problemu. Ostatnio wpadała mi w ręce książka "Python 3. Kompletne wprowadzenie do programowania. Wydanie II" i to nie przypadkiem ;).

Mimo, iż Pythona używałem już wcześniej to nigdy nie czytałem żadnej książki o nim (w wersji papierowej). Spodziewałem się, że taka książka może dużo wyjaśnić i pokazać Pythona w nowym świetle. Chodzi głownie o wyjaśnienie filozofii tego języka. Takie mam własnie odczucie ją czytając.

Jeszcze jest za wcześniej, aby oceniać tą książkę ale już mogę przedstawić kilka ciekawostek, które wyczytałem.

Po pierwsze to środowisko IDLE. W Windows jest domyślnie dodawane do instalacji Pythona. W Linuksie można również je zainstalować jako dodatkową paczkę. Tak samo sytuacja wygląda z samym interpreterem Pythona w wersji 3.x. W Windows dostaniemy najnowszą wersję, na moim systemie jakim jest wersja stabilna Debiana domyślnie jest Python w wersji starszej 2.x z pewnych powodów - systemowych. Nie oznacza to jednak, że nie można jednocześnie posiadać wersji nowszej, owszem, można, tylko również trzeba dodatkowo to zainstalować i jest.


Tak samo sprawa wygląda z środowiskiem IDLE, które jest napisane w GUI Tkinter. To standardowa biblioteka Pythona do pisania programów z GUI, bazuje ona na Tk. Jej zaletą jest "lekkość". Za IDLE przemawia również wbudowany debugger, więc czemu nie.



Kolejną rzeczą jest rozmiar liczb. Nie wiem jak we wcześniejszych wersjach Pythona ale w 3.x zmienne są ograniczone tylko przez dostępną pamięć w komputerze. Ciekawe.

Co do samych wersji to faworyzowana jest wersja 3.1 lub późniejsze bo zawiera pewne poprawki wersji 3.0.

Pisałem o instalacji dodatkowo Pythona 3, w wyniku czego mamy kilka interpreterów - jak widać na pierwszym zdjęciu. Chodzi o to, że zapis w skrypcie:

#!/usr/bin/env python

oznacz, że interpreter może być zainstalowany w innej ścieżce niż wymieniona albo używa pierwszy napotkany w tym katalogu - pierwszym będzie zapewne ten o najniższym numerze. Możemy to przetestować.


grzesiek@home:~/Desktop$ cat test.py 
#!/usr/bin/env python
import sys


print(sys.version)

grzesiek@home:~/Desktop$ ./test.py 
2.6.6 (r266:84292, Oct  9 2010, 12:24:52) 
[GCC 4.4.5]

Dlatego preferuje samemu wywoływać interpreter ale nie w kodzie np.:

grzesiek@home:~/Desktop$ cat test.py 
#!/usr/bin/python3.1
import sys

print(sys.version)
 
grzesiek@home:~/Desktop$ ./test.py 
3.1.3 (r313:86834, Nov 28 2010, 10:01:07) 
[GCC 4.4.5]

tylko tak:

grzesiek@home:~/Desktop$ python3.1 test.py 
3.1.3 (r313:86834, Nov 28 2010, 10:01:07) 
[GCC 4.4.5]


Kwestia upodobań.

Teraz kilka ciekawych przykładów.

>>> "test"[2]
's'
>>> _
's'
>>> "test"[0]
't'

"_" to ostatnie wykonanie wyrażenie.

>>> int(" xxx3")
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    int(" xxx3")
ValueError: invalid literal for int() with base 10: ' xxx3'
>>> int(" 3 ")
3

Obiekt przestaje istnieć, jeżeli zostało usunięte ostatnie odniesienie do niego. Tym właśnie są wszystkie zmienne. Zmienne są niezmienne - prawda, że śmieszne. Krotki i napisy również.

Wyliczanie elementów krotki i napisu:

>>> "aa","bb","cc"
('aa', 'bb', 'cc')
>>> len(("aa",))
1
>>> len("aa")
2

Listy można zmieniać:

>>> x = ["a","b","c"]
>>> x
['a', 'b', 'c']
>>> x.append("x")
>>> x
['a', 'b', 'c', 'x']
>>> list.append(x,999)
>>> x
['a', 'b', 'c', 'x', 999]
>>> x[0]
'a'
>>> x[0] = 0
>>> x
[0, 'b', 'c', 'x', 999]
>>>


Tożsamość:

>>> a = 5
>>> b = 5
>>> a is b
True
>>> a2 = "test"
>>> b2 = "test"
>>> a2 is b2
True
>>> a3 = [1,2,3]
>>> b3 = [1,2,3]
>>> a3 is b3
False
>>> a3 = b3
>>> a3 is b3
True
>>> a4 = (1,2,3)
>>> b4 = (1,2,3)
>>> a4 is b4
False
>>> a = 4
>>> a is b
False

Porównanie:

>>> a2 == b2
True
>>> a4 == b4
True

Ładnie wygląda:

>>> a =3
>>> 0 < a < 10
True

Operator przynależności:

>>> a3
[1, 2, 3]
>>> 2 in a3
True
>>> 10 not in a3
True
>>> a2
'test'
>>> "t" in a2
True

Operatory arytmetyczne nie tylko dla liczb:

>>> nazwa = "cos"
>>> nazwa += " tam"
>>> nazwa
'cos tam'

>>> x
[0, 'b', 'c', 'x', 999]
>>> x += nazwa
>>> x
[0, 'b', 'c', 'x', 999, 'c', 'o', 's', ' ', 't', 'a', 'm']
>>> x += "999"
>>> x
[0, 'b', 'c', 'x', 999, 'c', 'o', 's', ' ', 't', 'a', 'm', '9', '9', '9']

Elementy wbudowane:

>>> dir()
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'a', 'a2', 'a3', 'a4', 'b', 'b2', 'b3', 'b4', 'main', 'nazwa', 'os', 'x']
>>> dir("__builtins__")
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__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', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir('b')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__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', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']


Liczby:

>>> 0b1010101
85
>>> 0xEEEEE
978670
>>> bin(1234)
'0b10011010010'
>>> hex(1234)
'0x4d2'
>>> oct(1234)
'0o2322'
>>> import math
>>> math.pi
3.141592653589793
>>> 1,3.14
(1, 3.14)


Nie będę tu opisywał dokładnie tych przykładów ale i tak są przydatne - przynajmniej dla mnie.

No comments:

Post a Comment