kurs-pythona-czesc-i-software-developers-journal.pdf

(759 KB) Pobierz
PROGRAMOWANIE PYTHON
Python – fundamenty
Programujesz w C#, Javie lub PHP? Rozszerz swoją paletę
narzędzi! W tym miesiącu rozpoczynamy kurs Pythona:
zwięzłego, dynamicznego, łatwego do opanowania języka
programowania. Rozwiń skrzydła i otwórz się na nowe
możliwości z technologią, w której możesz tworzyć aplikacje
kilkukrotnie szybciej.
Dowiesz się:
• jak zacząć swoją przygodę z Pythonem
• jak zainstalować interpreter i z niego korzystać
• jak wyglądają podstawowe konstrukcje językowe
• gdzie szukać pomocy
Powinieneś wiedzieć:
• Tylko to, co już wiesz.
W itam w inauguracyjnym odcinku kursu języ-
znanie Pythona uczyni z Ciebie lepszego programistę
tych technologii.
ka Python, przyjaznego dla programisty na-
rzędzia do tworzenia potężnych aplikacji.
Cykl artykułów będzie składał się z dwunastu części,
na przestrzeni których zdążymy dość dokładnie omó-
wić zarówno składnię języka, jak i najbardziej przydatne
składowe biblioteki standardowej. Cały kurs stawia du-
ży nacisk na tworzenie odpowiednich nawyków, tak aby
kod, który tworzymy, był jak najwyższej jakości.
Jako czytelnik SDJ zapewne masz już doświadcze-
nie w programowaniu w innym języku. To dobrze, bo
nasz cykl nie jest kursem programowania dla zupełnie
początkujących, choć niewątpliwie Python jest dosko-
nałym językiem dla takich osób. W naszym kursie za-
kładamy, że już programujesz. Nie ma przy tym zna-
czenia, w jakiej technologii: może to być C++, .NET,
Java, PHP czy Ruby. Ważne, że rozumiesz pojęcia
w stylu funkcja , klasa , obiekt , wyjątek czy zmienna , ta-
blica , lista .
Python jest unikalnym językiem programowania, do-
skonale nadającym się do tworzenia dużych syste-
mów informatycznych, takich jak rozwiązania dla sek-
tora bankowego. Z Pythona korzysta między innymi
NASA oraz Google. Jest to jednak również doskonałe
narzędzie uzupełniające dla programisty korzystające-
go na co dzień z innej technologii. Nie bez racji stare
przysłowie mówi: "Jeżeli jedyne, co posiadasz, to mło-
tek, każdy problem wygląda jak gwóźdź." Jeśli więc je-
steś doświadczonym użytkownikiem C# lub Javy, po-
Krótka historia Pythona
Zanim jednak zabierzemy się za obowiązkowy "Hello
world", kilka zdań o historii języka. Pierwotnym auto-
rem języka i pierwszego interpretera Pythona jest Ho-
lender, Guido van Rossum. W 1989 roku w amster-
damskim Narodowym Centrum Matematyki i Informa-
tyki rozpoczęła się implementacja języka do tworze-
nia aplikacji dla rozproszonego systemu operacyjnego
Amoeba. Sam system operacyjny był wówczas w bar-
dzo eksperymentalnej fazie i pisanie dla niego progra-
mów w C było nietrwałe i pochłaniało zbyt dużo pracy
programistów. Pierwotnym zadaniem dla Pythona było
Patronat
Patronem cyklu artykułów poświęconych tematyce Py-
thon jest firma STX Next (www.stxnext.pl). Celem całe-
go cyklu jest popularyzacja języka Python, co jest wpisa-
ne w misję firmy. STX Next jest firmą typu software ho-
use, specjalizującą się w tworzeniu i wdrażaniu rozwią-
zań internetowych klasy enterprise w oparciu o techno-
logie Python, Plone, django, Pylons i pokrewne.W ko-
lejnych częściach zapoznamy czytelnika z możliwościa-
mi języka i biblioteki standardowej, natomiast w drugiej
części cyklu przedstawimy najważniejsze frameworki, ta-
kie jak: Plone, django, Pylons, Turbogears, Repoze oraz
Google App Engine.
26
7/2010
1241957638.045.png 1241957638.046.png 1241957638.047.png
 
1241957638.001.png 1241957638.002.png 1241957638.003.png 1241957638.004.png 1241957638.005.png 1241957638.006.png 1241957638.007.png 1241957638.008.png 1241957638.009.png 1241957638.010.png 1241957638.011.png
Python – fundamenty
więc umożliwienie szybkiego tworzenia krótkich, czy-
telnych programów, które będzie można łatwo modyfi-
kować i dowolnie łączyć ze sobą w celu implementacji
dużych aplikacji odpornych na zmiany w niższych war-
stwach systemu operacyjnego.
Współczesny Python to język programowania wy-
sokiego poziomu, który nadaje się do rozwiązywania
szerokiego wachlarza problemów. Jest to język z dy-
namicznym typowaniem, zorientowany obiektowo,
z elementami programowania funkcyjnego. Szczegól-
nie dobrze nadaje się do przetwarzania tekstu (wyra-
żenia regularne, Unikod), usług internetowych (HTTP,
XML-RPC, FTP, SMTP, POP, IMAP, itd.) czy aplikacji
z dużą liczbą wywołań systemowych, operacji na pli-
kach czy gniazdach sieciowych. Każde z tych zastoso-
wań wspiera bogata biblioteka standardowa oraz wiele
bibliotek zewnętrznych.
Najbardziej rzucającymi się na pierwszy rzut oka ce-
chami języka są jednak:
bować uruchomić na alternatywnych implementa-
cjach.
Aktualnie utrzymywane są dwie gałęzie interpretera
CPython: 2.x i 3.x. Ta druga to stosunkowo nowa, nie-
kompatybilna wstecz rewizja całego języka i bibliote-
ki standardowej. Ma ona na celu uporządkowanie do-
stępnej funkcjonalności i umożliwienie dalszego roz-
woju platformy. Wśród zmian w stosunku do wersji 2.x
część idzie bardzo daleko, w związku z czym prak-
tycznie żaden program pisany pod wersje 2.x nie bę-
dzie działać bez odpowiednich przekształceń w inter-
preterze 3.x.
Z tego powodu podczas kursu skupimy się na ostat-
niej dostępnej wersji CPythona 2.x, tzn. 2.6. Z tej wer-
sji korzysta przeważająca większość bibliotek ze-
wnętrznych dostępnych w Internecie, ponadto umoż-
liwia ona pisanie aplikacji w taki sposób, żeby ilość
ręcznych zmian koniecznych do uruchomienia progra-
mu na wersji 3.x była minimalna.
W przypadku systemu operacyjnego Windows naj-
lepiej zainstalować dystrybucję Pythona dostępną na
stronie http://www.python.org/download/ . Na więk-
szości aktualnych dystrybucji Linux Python w wersji
2.6 jest dostępny wraz z domyślną instalacją. W prze-
ciwnym wypadku łatwo można doinstalować go odpo-
wiednim menedżerem pakietów lub przez pobranie
pakietu źródłowego i standardowe ./configure , make
i make install . Dla systemów Mac OS X najlepiej po-
służyć się narzędziem MacPorts.
• zwięzłość, czyli to, jak mało linii kodu jest potrzeb-
nych na uzyskanie rozbudowanej funkcjonalności;
• wykorzystanie wcięć w kodzie do grupowania wy-
rażeń.
Cechy te w połączeniu z dynamicznym typowaniem
powodują, że o programach pythonowych często mó-
wi się, że jest to wykonywalny pseudokod. Język jest
na tyle skondensowany i wysokopoziomowy, że do-
skonale nadaje się do prototypowania algorytmów
wszelkiego rodzaju.
Jeżeli wcięcia w kodzie, które wpływają na sposób
wykonania programu, brzmią dla Ciebie jak herezja -
nie martw się! Po pierwszych kilku tysiącach linii prze-
staniesz to zauważać, a z czasem docenisz, jaki to
sprytny pomysł.
Pierwszy kontakt z interpreterem
Programy pisane w Pythonie są uruchamiane przez in-
terpreter.Z interpretera można jednak korzystać rów-
nież w sposób interaktywny.Taki sposób wykorzysta-
nia jest o wiele powszechniejszy niż w innych językach
i dużo kodu prototypuje się bezpośrednio w interpre-
terze. Spróbujmy więc sami. Pod Linuksem i Mac OS
X interpreter uruchamiamy z konsoli tekstowej polece-
niem python2.6 lub po prostu python , jeżeli jest to wer-
sja domyślna (lub jedyna) na danym systemie. W przy-
padku systemów Windows odpowiedni skrót znajdzie-
my w Menu Start .
Po uruchomieniu interpretera naszym oczom ukaże
się znak zachęty:
Instalacja Pythona 2.6
W poprzedniej sekcji mówiliśmy ogólnie o języku Py-
thon. Programy w nim pisane można uruchamiać na
różnych interpreterach, a nawet kompilować wyspe-
cjalizowanymi kompilatorami. Podstawową wersją Py-
thona jest interpreter zwany w środowisku programi-
stów jako CPython, interpretujący kod w czasie uru-
chomienia. Istnieją jednak również dojrzałe implemen-
tacje działające w oparciu o platformę .NET (IronPy-
thon) czy Java (Jython).W tym przypadku podobnie
jak CPython może współpracować z bibliotekami pisa-
nymi w C i C++, IronPython może wykorzystywać bi-
blioteki dla platformy .NET (pisane np. w C# lub w Vi-
sual Basic), a Jython uruchamiać biblioteki dla Javy
(pisane w języku Java, Clojure, itp.).
W naszym kursie skupimy się na wersji CPython,
ponieważ jest ona najszerzej wykorzystywana. Nie
ma jednak przeszkód, aby przykładowy kod pró-
ambv@Machiavelli.local:~ $ python2.6
Python 2.6.5 (r265:79063, Mar 26 2010, 16:07:38)
[GCC 4.2.1 (Apple Inc. build 5646) (dot 1)] on darwin
Type "help", "copyright", "credits" or "license" for
more information.
>>>
Od tej pory możemy wprowadzać polecenia i obser-
wować na bieżąco wynik ich wykonania. Z interpre-
tera wychodzimy przez wpisanie quit() lub szybciej
www.sdjournal.org
27
1241957638.012.png 1241957638.013.png 1241957638.014.png 1241957638.015.png 1241957638.016.png 1241957638.017.png 1241957638.018.png 1241957638.019.png 1241957638.020.png 1241957638.021.png
 
PROGRAMOWANIE PYTHON
przez kombinację klawiszy CTRL+D (pod Windows
CTRL+Z). Spróbujmy na początek wykorzystać inter-
preter jako programowalny kalkulator:
Typy danych! Tak, Python jest językiem dynamicznie,
ale twardo typowanym. Oznacza to, że:
• z jednej strony: do dowolnej zmiennej można przy-
pisać wartość dowolnego typu;
• z drugiej strony: każda wartość ma ściśle określo-
ny, niezmienny typ.
>>> 2+2*2
6
>>>x = 2
>>>y = 5
>>>z = x * y
>>>z
10
Sprawdźmy w praktyce:
>>>a = 1
>>>b = 2
>>>type(a)
<type 'int'>
>>>type(b)
<type 'int'>
>>>a + b
3
>>>a = '1'
>>>type(a)
<type 'str'>
>>>a + b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Jak widać, możemy wpisywać wyrażenia i te, które
zwracają wartość, od razu wypisują wynik na ekran.
Możemy wykorzystywać zmienne i dowolnie na nich
operować. Wielu programistów korzysta z Pythona
jako szybkiego kalkulatora. Ostatnia wartość wyświe-
tlona w interpreterze jest przechowywana pod zmien-
ną _ (znak podkreślnika) i możemy ją wykorzystać
w obliczeniach:
>>> _
10
>>> _ * 3
30
>>> _ / 2
15
>>> _ / 2 # dzielenie całkowite, zaokrąglenie w dół
7
>>> _ / -2
-4
>>> 7 / -2.0 # liczba rzeczywista jako argument,
dzielenie rzeczywiste
Do zmiennej a, która początkowo przechowywa-
ła liczbę całkowitą 1 przypisaliśmy łańcuch znaków
'1'. Przypisanie takie powiodło się: Python jest dy-
namicznie typowany. Twarde typowanie dało się jed-
nak we znaki przy próbie dodania do siebie łańcu-
cha znaków i liczby całkowitej. Python nie dokonu-
je automatycznych konwersji i operacja się nie po-
wiodła.
Takie podejście daje dużą dowolność w organizacji
tworzonego programu i przyspiesza pracę programi-
sty poprzez brak konieczności określania typów przy
każdej okazji. Jednocześnie, poprzez twardy system
typów programista unika niepożądanego zachowania,
które jest wynikiem trywialnych błędów w kodzie. Do-
datkowym zabezpieczeniem jest fakt, że zmienne mu-
szą mieć przypisaną wartość przed pierwszym uży-
ciem:
-3.5
Jak widać, w kodzie można dodawać komentarze
przez poprzedzanie ich znakiem # ( hash) . Wynik
dzielenia jest ciekawy, bo jego typ zależy od typu ar-
gumentów. Gdybyśmy chcieli wykorzystać dzielenie
rzeczywiste na zmiennych, które mogą być albo rze-
czywiste, albo całkowite, wystarczy opakować je kon-
wersją do zmiennej rzeczywistej:
>>>y / x
2
>>>loat(y) / loat(x)
2.5
>>>loat(y) / x
2.5
>>>loat(y / x)
2.0
>>>type(_)
<type 'loat'>
>>>type(x)
<type 'int'>
>>>i = 1
>>>i> j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'j' is not deined
>>>j = 2
>>>i> j
False
Skoro już wspomnieliśmy o łańcuchach znaków,
przyjrzyjmy się chwilę sposobom ich notacji:
28
7/2010
1241957638.022.png 1241957638.023.png 1241957638.024.png
>>> 'Monty Python'
'Monty Python'
>>> 'Monty ' 'Python'
'Monty Python'
>>> 'Monty ' + 'Python'
'Monty Python'
>>> 'Monty Python\'s Flying Circus'
"Monty Python's Flying Circus"
>>> "Monty Python's Flying Circus"
"Monty Python's Flying Circus"
>>> "Monty Python's \
... Flying Circus"
"Monty Python's Flying Circus"
>>> """Monty Python's
... Flying Circus"""
"Monty Python's \nFlying Circus"
Archiwa SDJ i PHP Solutions otwarte!
Interesują Cie archiwalne wydania
Software Developer’s Journal i PHP Solutions?
Nie zwlekaj! Odwiedź nasza stronę
www.sdjournal.org.
Co tydzień możesz pobrać zupełnie
za darmo archiwalne wydania naszych
magazynów!
Jak widać, łańcuchy znaków można zapisywać, ko-
rzystając zarówno z apostrofów pojedynczych, jak
też z cudzysłowów. W przypadku długich łańcuchów
można je dzielić na wiele linii, wstawiając na koniec
sztucznej linii znak \. Nie jest to tożsame z wykorzy-
staniem potrójnego cudzysłowu, który oznacza wie-
loliniowy łańcuch znaków. Ostatecznie, sąsiadujące
łańcuchy są przez interpreter łączone, można je też
konkatenować znakiem +. Łączenie sąsiednich łańcu-
chów dotyczy jednak tylko dosłownie podanych tek-
stów, a nie zmiennych, to znaczy:
Zapraszamy!
>>> 'Jeden ' 'string'
'Jeden string'
>>>a = 'Jeden '
>>>b = 'string'
>>>a b
File "<stdin>", line 1
a b
^
SyntaxError: invalid syntax
>>>a + b
'Jeden string'
Łańcuchy znaków są w Pythonie niezmienne (ang.
immutable ), to znaczy, że nie można do istniejące-
go łańcucha znaków dodać nowych liter, usunąć
istniejących ani zamienić litery na inną. Każda tego
typu operacja zwraca zupełnie nowy łańcuch zna-
ków:
>>>a = 'ala'
>>>id(a)
4299399456
>>>a.capitalize()
'Ala'
>>>id(_)
4299399840
www.sdjournal.org
www.sdjournal.org
1241957638.025.png 1241957638.026.png 1241957638.027.png 1241957638.028.png 1241957638.029.png
 
1241957638.030.png 1241957638.031.png 1241957638.032.png 1241957638.033.png 1241957638.034.png
PROGRAMOWANIE PYTHON
Funkcja id zwraca adres obiektu w pamięci, jak widać
oba obiekty mają różne adresy. Można więc łatwo
sprawdzić, czy dane zmienne wskazują na ten sam
obiekt w pamięci:
set(['o'])
>>>book_set - vowel_set
set(['k', 'b', 's'])
Zbiory nie przechowują duplikatów obiektów, pozwa-
lają za to na szereg przydatnych operacji, jak pokaza-
>>>a = 'abrakadabra'
>>>b = a
>>>id(a) == id(b)
True
Listing 1. Program listujący duplikaty plików
# -*- coding: utf-8 -*-
import os
import hashlib
Jest to dość przydatna operacja, stąd Python udo-
stępnia operator przydatny w takich porównaniach:
>>>a = 'abrakadabra'
>>>b = a
>>>a is b
True
>>>b = a.upper()
>>>a is b
False
# ścieżka, w której szukać duplikatów
SEARCH_DIR = '.'
# rozmiar pojedynczego odczytu
BUFFER_SIZE = 4096
# słownik z sumami kontrolnymi wszystkich plików
# suma -> [lista, ścieżek, do, plików, z, taką,
sumą]
DIGEST_DICT = {}
O operatorach i łańcuchach znaków dokładnie opo-
wiemy sobie za miesiąc, tymczasem spójrzmy jesz-
cze pokrótce na trzy proste, ale potężne struktury da-
nych dostępne w Pythonie. Zacznijmy od list, czyli
uporządkowanych struktur przechowujących zmienną
liczbę elementów:
def gather_digests ( search_dir , dig_dict , buf_size ):
for ile_name in os . listdir ( search_dir ):
full_path = os . path . realpath (
os . path . join ( search_dir , ile_name )
)
try :
if os . path . isdir ( full_path ):
# szukamy też w podkatalogach
gather_digests ( full_path , dig_dict , buf_
size )
elif not os . path . isile ( full_path ):
continue
current_hash = hashlib . sha1 ()
with open ( full_path ) as current_ile :
data = current_ile . read ( buf_size )
while data :
current_hash . update ( data )
data = current_ile . read ( buf_size )
except ( IOError , OSError ):
continue
digest = current_hash . hexdigest ()
dig_dict . setdefault ( digest , []) . append ( full_
path )
>>>book = ['b', 'o', 'o', 'k']
>>>len(book)
4
>>>book[0]
'b'
>>>book[-1]
'k'
>>>book.count('o')
2
>>>book.append('s')
>>>book
['b', 'o', 'o', 'k', 's']
Jak widać, możemy dodawać nowe elementy do list,
zawierają też one szereg przydatnych funkcji i metod.
Trochę inną strukturą danych jest zbiór:
>>>book_set = set(book)
>>>book_set
set(['k', 'b', 's', 'o'])
>>>vowel_set = set(['a', 'e', 'i', 'o', 'u', 'y'])
>>>len(vowel_set)
6
>>>vowel_set.add('a')
>>>len(vowel_set)
6
>>>book_set & vowel_set
gather_digests ( SEARCH_DIR , DIGEST_DICT , BUFFER_SIZE )
# ze słownika z sumami kontrolnymi wybieramy
# te pozycje, które mają wiele wpisów
for digest , paths in DIGEST_DICT . iteritems ():
count = len ( paths )
if count > 1 :
print count , 'identical iles:' , paths
30
7/2010
1241957638.035.png 1241957638.036.png 1241957638.037.png
 
1241957638.038.png 1241957638.039.png 1241957638.040.png 1241957638.041.png 1241957638.042.png 1241957638.043.png 1241957638.044.png
 
Zgłoś jeśli naruszono regulamin