Python, mądra i dziwna gadzina...
02.10.2012 19:08
którą zrozumieć można pod warunkiem, że jesteś Duńczykiem...
Dlaczego go kocham...
Witajcie, wpis będzie lamerski i absolutnie subiektywny, więc wyzwiska proszę zatrzymajcie dla siebie. Czym jest python? Jest to język ogólnego (no prawie) zastosowanie o dość dziwacznej składni, od której każdy "Dobrze Wykształcony Programista PHP", czyli taki, który skończył jakąś szkołę i potrafi napisać kod o urodzie pani kanclerz Niemiec ma reakcję wymiotną, biegunkę i świeci w ciemnościach.
Oczywiście nie mówię, że nie ma dobrych programistów PHP, bo jacyś na pewno są. Dodatkowo ten język jest potwornie wolny (bo przecież nie można napisać w nim wielgaśnej gry komputerowej ze słitaśną grafiką. Sorry, wróć. Można, ale o tym dalej), skryptowy (w/g TRUE programistów, programista języków skryptowych ma tyle wspólnego z programowaniem co krowa z reaktorem do produkcji biogazu) i w pełni obiektowych (wszystko jest obiektem) i całkiem nowoczesnym (to akurat fakt). Dlaczego tak go lubię? W sumie to z kilku powodów.
- jest ładny. Wiem, że to babskie, ale lubię ładny kod. A Pythonowy jest bardzo ładny ( aż do przesady ).
- Jest prosty. Nie chodzi tu o to, że nie da się napisać czegoś większego. Po prostu jego składnia jest prosta, jak spaghetti.
- Napisanie w nim sporych rozmiarów czytnika rss wyświetlającego co 15 s losowy wpis w powiadomieniu jest tak prosty, jak napisanie w C++ kalkulatora liczącego podstawowe operacji.
- GUI? Jest PySide, PyQt i PyGTK
- A biblioteki. Jest ich raz, dwa, trzy... dużo. Nie mam tylu palców niestety. a tak te od nóg. Nie. To też nieco za mało. Dokładniej o jakieś kilka tysięcy.
- Modularność. Zrobienie modułu z dowolnego kodu ogranicza się do wpisania w innym pliku, gdzie chcemy nasz moduł wykorzystać import cośtamcośtam
I dużo innych. O kilku najciekawszych funkcjach powiem za moment.
A teraz wady
Bądźmy uczciwi. Python ma wady. Problemy z portowaniem z Pythona 2.x do Py3k idą z tempem ślimaka biegnącego pod prąd bieżni. Kolejna rzecz to błąd IndentationError i o ile wcięcia są super, to problem, gdy python trafi na spację zamiast taba, czy dwie spacje zamiast jednej i wysypie liczący ileśtam linii kodu program i zmuszający do przejrzenia całego kodu. Mimo, że interpreter mówi tu i tu jest błąd. To błędu tam nie ma. Tam napotkał problem. Błąd może być wszędzie. Nawet na Karaibach.
Kod jednak czasem staje się lekko rozlazły, a wytyczne co do ilości spacji są irytujące. Jeden z twórców Pythona (chyba nawet sam Guido) powiedział, że jeśli używasz więcej niż 4 poziomów zagnieżdżenia w kodzie, to twój kod jest zły. Pewne rzeczy powinny być też out‑of-the-box. Jak argv bez importu sys, czy uznanie za słowa kluczowe tak samo false i False.
Kilka ciekawostek i przydatnych hintów
Doskonałe źródła wiedzy
Ta ciekawostka nie jest czysto Pythonowa. Gdzie znaleźć najlepsze ebooki do nauki? Ja polecam serię Python from Scratch z Net.tutsplus.com, dobry ebook z Wikibooks Python programming - eng. Może "Dive into Python" jest lepszy i po polsku, ale Python Programming jest prostszy, lepsiejszy i w/g mnie bardziej pythonowoy. No i genialny "Learn Python in the Hard Way". Po za tym polecam odwiedzanie (częste) Stackoverflow. No i jest jeszcze polecenie help(), taki linuksowy man.
Gdy interaktywny shell to za mało
Lub szukasz wygody, urody i dokładnej lokalizacji błedów, autouzupełniania składni i masy bajerów musisz to mieć - iPython. Prawdziwie interaktywny Python.
Co zrobić gdy kod jest rozwlekły
A ty nie masz monitora na 150 stopni pogłebień? Użyj lambd. Jest to zapożyczony z Lispa element zapewniający elementy funkcyjne Pythonowi. Czym są lambdy? Lambda to funkcja w jednej linii. Przydatne i skraca kod. No i kod jest też ładniejszy.
# budowa zmienna = lambda argument: # to co wstawisz dalej zależy od ciebie # przykład 1. suma = lambda x,y: x+y # Ale co zrobić, by nasza lambda mogła przeprowadzać operacje w stylu if... else... # bo ten okropny Python potrzebuje wcięc # Bez lambd def Test(x): if x == 0: print "%s jest równe 0" % x else: print "Pomysl chwile :)" # Z lambdami Test = lambda x: "%s jest rowne 0" if x == 0 else "Pomysl :)" print Test(0)
Prościej i krócej
Praca z listami
Lista to taka jednowymiarowa c++ tablica, chociaż bardziej przypomina vector. Możemy dodawać i usuwać elementy do tablicy. Spójrzmy na kod
lista = [] for x in xrange(10): x = x**x lista.append(x) # 3 linijki to sporo. I rozwlekle. Może być krócej lista = [x**x for x in xrange(10)]
I więcej przykładów
W starym stylu można było (w sumie to dalej to działa) zrobić coś takiego
file = open(file, 'r') file_ = file.read() for line in file: print line file.close() # Teraz wystarczy with open(file, 'r') as f: f_ = f.read() for line in f_: print line # Znika linijka kodu. Pewnie da się to skrócić. Chętnie zobaczę wasze pomysły
Python - język nieobfuskowalny
Co to jest obfuskacja. To sprawianie by kod był nieczytelny. Czy w Pythonie da się. Jest to trudne, nawet bardzo, ale się da.
#!/usr/bin/python # -*- encoding:rot13 -*- vzcbeg enaqbz cevag 'Ybfbjnavr mnxbapmbar:: %v' % enaqbz.enaqvag(0,49)
Albo nawet tak:
#!/usr/bin/env python class ____: def __init__(__,_):__._=_ def __ror__(__,___):return ____(lambda _,__=__,___=___:__._(___,_)) def __or__(__,___):return __._(___) def __call__(__,_,___):return __._(_,___) _=['||,|||,||','.|,|.|','..|.',':)','.,,_,,,.|','____,____','|,|,|,|,|,', ',|,,|,','|,,,_','......',',__,|',',____,___,',';)'] ___=[0];_0_0=[];__=____(lambda _,__:_+__);_0=____(lambda _,__:chr(_-__)) __0=____(lambda _,__:_.append(__)) def __0__(_): _0_=0 for _0 in range(len(_)): if _[_0]=='|':_0_=_0_|__|10 elif _[_0]==',':_0_=_0_|__|1 elif _[_0]=='_':_0_=_0_|__|-10 elif _[_0]=='.':_0_=_0_|__|-1 return _0_ for _0_ in range(len(_)): ___|__0|(__0__(_[_0_])|__|___[_0_]);_0_0|__0|(___[_0_]|_0|0) print ''.join(_0_0)
Co lepsze, ten kod uruchamia się bez problemu.
A co gdy mam dużo napisów?
Można wtedy użyć takie składni
print "Pierwsza linia \ druga linia \ trzecia linia" # lub print """Pierwsza linia \n druga linia \n trzecia linia"""
A co jeśli tworzę ogromną superhiper gierkę?
Jeśli ta gierka to Pasjans. Sięgnij po pygame. Prosta, niezbyt szybka biblioteka do pythonowych gierek. Jeśli tak gra jest na serio dużo. Chociażby, jak Battlefield, porzuć myśl pisania jej całej w Pythonie. Warto jednak pomyśleć nad stworzeniem możliwości pisania w Pythonie skryptów AI lub innych rzeczy np. modów. Tak zrobili goście tworzący Civilization IV.
No i kończąc ten wpis pragnę podzielić się jeszcze jedną rzeczą. Wpisz w interaktywnej konsoli import this. To są główne zasady Python. Żegnajcie.
PS. Może wy znacie jakieś zajegenialne triki w Pythonie? Jeśli tak podzielcie się.