Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Python, mądra i dziwna gadzina...

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ę. 

programowanie hobby inne

Komentarze

0 nowych
Frankfurterium   9 #1 02.10.2012 19:04

"GUI? Jest PySide, PyQt i PyGTK"
Ostatnio zainteresowało mnie całkiem ciekawe i megaplatformowe (Windows, Linuks, Mac, Android IOS) Kivy.

Odnośnie szybkiego wprowadzenia do języka polecam A Byte of Python - książkę autor udostępnia na własnej stronie. W internetach leżą też ze dwa tłumaczenia (Ukąś Pythona).



I tak na boku pytanie o dobrą praktykę.

W Pythonie nie muszę definiować pól klasy. "Nie muszę" nie "znaczy nie mogę", więc czy dla zgodności ze sztuką powinienem:
a) Powoływać do życia np. cena = None i potem normalnie ładować wartość konstruktorem?
b) Dać znać o polach klasy w komentarzu albo docstringu?
c) Olać sprawę i przyjąć, że twardzi Pythonowcy (ja tu tak tylko z doskoku) połapią się i bez tego, bo to norma?

  #2 03.10.2012 08:47

"3 linijki to dużo"
Tylko wiesz, te trzy linijki dają plus dwadzieścia do czytelności i plus trzydzieści do łatwości rozwijania kodu.
Coś czuje drogi Demagogu, że lepiej nie mówić ci, że można zrobić coś takiego:

lancuch="jeden";print lancuch; lancuch2="dwa"; print lancuch, lancuch2

Bo zaczniesz pisać programy w jednej linijce, a czytający twój kod dostaną ataku serca, porównywalnego z zobaczeniem GOTO.

  #3 03.10.2012 12:51

kilka uwag:

with open(file, 'r') as f:
f_ = f.read()
for line in f_:
print line


ten f_ = f.read() jest niepotrzebny. mozesz iterowac juz po f.

Pozatym zaleta bloku with nie jest 'skracanie linii kodu' a obsluga bledow przede wszystkim.


kolejna:
" gdy python trafi na spację zamiast taba, czy dwie spacje zamiast jednej"

PEP8 definiuje ze *POWINNY* to byc zawsze 4 spacje a nie TAB.

etc.

  #4 03.10.2012 14:08

Czyli nie jestem prawdziwym programistą, skoro piszę w Pythonie ? WTF ?

  #5 03.10.2012 15:27

język skryptowy to nie prawdziwe programowanie ?

kwpolska   5 #6 03.10.2012 15:27

> którą zrozumieć można pod warunkiem, że jesteś Duńczykiem...

Guido? Holender.

  #7 03.10.2012 17:47

"Po prostu jego składnia jest prosta, jak spaghetti."
Przed czy po ugotowaniu :)

kwpolska   5 #8 03.10.2012 17:53

> 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

…bo w pythonie nie używa się ^I, tylko spacje, standardowo 4…

Demagog   4 #9 03.10.2012 18:20

@X.A.N.

Spokojna twoja, jak to mówią.
Czytelność użycia lambd i koherencji (nie wiem, czy takie słowo istnieje w sumie) list jest spora.
2. Nie po to przerzuciłem się na Pythona, by cofać się w rozwoju. Przepraszam, do C++ znaczy się.
3. Takie skróty są genialne jeśli chodzi o szybkie skrypt, czy coś w ten deseń. Służą raczej do rzeczy banalnych, na które aż szkoda x linii kodu skoro wiesz, że skrypt ma działać i nie robić wiele ponad to.
Co do średników. Znam, choć nie korzystam.
@kwpolska

Edytuj wpis działa i ma się dobrze. Jeśli nie wierzysz wpisz import this w interpreterze lub w Google Zen of Python.

Standardowo tak, gorzej, jak się siedzi w nieprzystosowanym edytorze. Szkoda odpalać pod Windowsem Eclipse, czy gVim, by się Taby na spacje zmieniały.

  #10 03.10.2012 20:02

@Demagog
Nie pozostaje mi nic innego jak powiedzieć "touche" i się ulotnić.

mikolaj_s   13 #11 04.10.2012 00:41

@Demagog:
Gdyby w Pythona wpompowano choć ułamek pieniędzy i pracy co JavaScript to mógłby być kilka razy wydajniejszy

Demagog   4 #12 04.10.2012 15:57

Oby, oby.
Ale teraz na Pythona zrobił się hype i język stał się "sexy" (określenie z angielskich for, więc wybaczcie).
Może wszystko przyśpieszy, ale szczerze wolę to co jest teraz. Wolę mieć wolniejszy język o ciągle rosnących możliwościach niż język, który zatrzymał się z lekka w rozwoju, a każda zmiana trwa lata całe.

Mam cichą nadzieję, że w Pythonie zrobią opcjonalne typy statyczne.

  #13 04.10.2012 16:54

ostantio programuję w jython (python dla java) + javafx 2.x(taki flash zawarty w java 7.x)

Pigmej   5 #14 05.10.2012 12:54

@Demagog

poczytaj o pypy

I na prawde Python *nie jest* wolny, to glownie wyobrazenie tych ktorzy go nie znaja. Pewnie.. sa szybsze ale python nie jest wolny.

Demagog   4 #15 05.10.2012 15:31

Chyba drogi Pigmeju nie czytałeś nawiasów (tak mam na myśli ironiczną zawartość ;) )

W/g mnie Python jest całkiem szybki.
A jeśli chodzi o Pypy, to jest conajmniej kilka innych podobnych.
Choć na razie po nie nie sięgam.

  #16 27.01.2013 02:01

Lista w pythonie to znacznie więcej niż tablica w c++. Nawet vector z bliblioteki STL jest kontenerem sekwencyjnym określonego typu np int: vector wektor;
W pythonie do listy można swobodnie dodawać dowolne elementy różnego typu.
lista=[]
lista.append('jeden')
lista.append(2)
lista.append([5,6,7])

Plik można wczytać również w inny sposób:
for linia in open('plik.txt'):
print(linia,end='')

olszam   3 #17 16.11.2013 04:34

Pythona można opisać jako językiem skryptowym do wszystkiego, ale do wymagających gier typu Battlefield jak autor wspomniał to się nie nada bo byłby za wolny. Ja z pythona widzę jeden plus, to że jak coś w nim zrobimy to się nie namęczymy, i spora ilość bibliotek jest plusem ale to też jest ten minus z tą ilością bibliotek bo nie zawsze znajdziemy to czego nam potrzeba a drugiego minusa dam za wcięcia bo powinniśmy mieć wybór czy chcemy sobie pisać na wcięciach czy w klamerkach. Nie ma co porównywać php do innych języków bo jak każdy inny język został napisany w określonym celu a to że są jeszcze i inne możliwości języka to już dodatki do niego. Mnie osobiście podoba się php i możliwości html5,css3 + js z różnymi frameworkami(np jquery,bonsaijs,webgl).