Komentáře k článku
Python profesionálně: co jazyk nabízí

V předchozích dílech tohoto seriálu jsme si ukázali spoustu syntaktických tipů. Dnes už necháme syntaktické tipy být a posuneme se trochu dál: vestavěné funkce, užitečné metody slovníku, na co si dát pozor u defaultních parametrů funkce, zajímavé moduly a další.
Pocitani slov
Na pocitani slov je skoda startovat editor ;-)
perl -nae ‚END{print“$_:t$k{$_}n“ for sort keys%k}$k{$_}++for@F‘
Re: Pocitani slov
Perl na pocitanie slov? :-)
wc -w subor.txt
Re: Pocitani slov
wc -w dela neco jineho, shellovsky prikaz, ktery pocita cetnost slov, je uniq. Na to nelze rict nez RTFM.
Re: Pocitani slov
A jeho pouziti bude pomalejsi, protoze ta slova je treba nejdrive seradit. Muzete si to zmerit:
sed ‚s/ /n/g‘ | sort | uniq -c
Re: Pocitani slov
Presne takhle to vypadalo, kdyz se mi po klavesnici prosla kocka.
Re: Pocitani slov
Tak ten byl dobrej :-D +1
Re: Pocitani slov
Zrejme bude chytrejsi nez vy, kdyz umi programovat v perlu ;-)
našeptávač - ipython
Pokud chci shell s našeptávačem, pouštím IPython. Je bohatší o opravdu úctyhodnou hromadu dalších funkcí, které jsou pro ruční psaní skvělé (copy, paste, editace příkazu v editoru, help přes ? a ??, barevné tracebacky atd atd).
Re: našeptávač - ipython
Naprosty souhlas, iPython je skvela zalezitost ktera toho umi neskutecne mnoho, od doplnovani na tabulator az po vzdalenou exekuci. Vice napriklad v http://pyvideo.org/video/640/ipython-python-at-your-fingertips
Re: našeptávač - ipython
Mě zas baví bpython – http://bpython-interpreter.org/
Díky za tipy
je super si připomenout, že v pythonu máme tolik krásným funkcí a je dobré o nich vědět. Zatím nejlepší článek ze série Python profesionálně…
Je to super
Tento zatím třídílný seriálek vypadá napsaný velmi fundovaně, je vidět, že autor opravdu ví, o čem píše. Pro mne (a asi nejsem sám) je to ale jako by psal švédsky.
Na linuxsoftu vycházel v letech 2005 – 2011 seriál o perlu – 149 dílů, krok za krokem.
Kéž by něco takového vzniklo i pro Py…
Předem, ale asi marně, děkuji.
Re: Je to super
Jak pisete, dobre napsano pro nekoho kdo to umi a chce si bud pripomenout co tam je nebo ukazat co lze. Proste pro lidi co v tom uz umi delat a chcou si zdelit na prikladech jde toto a jeste toto.
P.S. neklritizuju profesionalitu(autor dle clanku umi), ale pro nekoho kdo chce teprve zacit je to nepouzitelne.
Re: Je to super
Ale to je u seriálu zaměřeného na lidi, kteří Python již nějakou dobu používají, zcela v pořádku ne? Začátečník si stáhne kupříkladu český překlad „Ponořme se do Pythonu“, který je zdarma na http://knihy.nic.cz/ a může začít. Nebo využije některý se starších začátečnických tutoriálů, kterých je v češtině hned několik.
Re: Je to super
Díky za typ.
Re: Je to super
Ta kniha Ponořme se do Pythonu je výborná, vřele doporučuji. Líbila se i bývalému šefredaktorovi zdrojáku http://www.zdrojak.cz/clanky/python-3-uspesny-ponor/
V knihkupectví najdete Python 3 Výukový kurz od Marka Summerfielda. Jde od začátku a postupuje pěkně do hloubky. Také doporučuji.
Seriály pro začátečníky vycházely třeba i na rootu, ale jsou staršího data, je třeba s tím počítat.
Re: Je to super
Stačí nahlédnou na http://www.py.cz/TutorialyLiteratura – tam je zdrojů jak začít dost a dost. A výborný kurz základů programování a Pythonu je teď na http://www.udacity.com/overview/Course/cs101 – zatím asi nejlepší e-learning co jsem v životě viděl.
Pěkné
Že je prázdný list nevhodná výchozí hodnota, to ví každý kdo to zkusil a použil PyLint, ale aspoň jsem se dozvěděl proč. Díky.
Chybka
Předpokládám, že v části „Defaultní hodnoty slovníku“ bylo na řádku 9 spíše zamýšleno:
d[key].append(element)
Díky za článek!
Hacky
diky za clanek. Inspekce __dict__, at uz primo nebo pres vars() je pomerne nebezpecna zalezitost kdyz nevime uplne presne jak je dany objekt naimplementovany (a i potom ma sve problemy). Vtesina veci se da resit mnohem lepe a mnohem cisteji, v tomto pripade prostou inspekci parseru:
dict((o.dest, getattr(options, o.dest)) for o in parser.option_list if o.dest)
Ziskame si vsechny promenne ktere parse mel nadefinovat a z options ziskame jejich hodnoty. Pouzivame verejne API a mame jistotu ze nas kodu bude fungovat spravne, zadny zbytecny hack ktery se spoleha na vnitrni implementaci.
Dve reseni pro predavani listu jako parametru budou mit vyrazne jinou funkcnost, v nicem to nejsou ekvivalentni implementace! Nehlede na to ze vytvaret kopii parametru jen kvuli naseptavaci je pri nejmensim podivne. Od toho jsou v Pythonu docstrings abychom mohli popsat co metoda ci funkce dela. Kopirovani listu neni zadarmo.
Ad „Switch“: ano, jde to. Stejne jako jde zamenit objektu atribut __class__ za behu a zmeni mu to tridu. Je to ale dalsi z veci v tomto serialu ktere rozhodne nepatri do profesionalniho kodu, ani kdyz primhourim obe oci. A nedokazu si pro to predstavit zadny rozumny use-case ktery by nesel implementovat lepe.
A opet: jak to chcete testovat? Testovani je (spolu s citelnosti) jeden ze zakladnich piliru Pythonu a profesionalniho kodu presto spousta tipu popisovana v tomto serialu neniotestova a hlavne dramaticky zhorsuje testovatelnost (nehlede o citelnosti) kodu.
dynamicke parametry
Dynamicke parametry resi tento muj snippet: http://code.activestate.com/recipes/578049-dynamic-function-parameters-using-annotations/
Neslo by to aspon ciste?
Pokud ma serial za cil opravdu popisovat, jak psat Python *profesionalne*, mel by se drzet nekolika principu:
– Pouzivat public API, misto spolehani na vnitrni implementace
– Testovatelnost
– Citelnost
Podle toho by taky mely vypadat jednotlive rady a tipy. Pritom aspon polovina z clanku porusuje minimalne jedno z techto principu.
1] Seznam options je na parseru. Prochazet je pres vars() je spolehani se na nezname API a necitelne.
2] To, ze v Pythonu neni konstrukce „switch“ se typicky nahrazuje dictionary callables. Co s tim ma spolecneho monkeypatchovani vlastni tridy za behu??
3] Co je to za hack s readline, kdyz mame IPython? Proc???
Repr je dobry tip. Jen bych doplnil, ze byva uzitecne si metodu __repr__() definovat na vlastnich tridach – pomaha to pak pri praci s temito instancemi pri debugu v python konzoli.
Mnoziny se daji primo pres slozene zavorky konstruovat i v Python 2.7.
Python sraz
Kdyz jsme u toho Pythonu, prijdte se podivat na skutecne Python profesionaly z masa a kosti na dalsim, 13. Python/Django srazu, ktery probehne uz zitra, 18. 4. 2012 v Praze 5 na Smichove na adrese Ostrovkeho 38a!
Na tento vecer bude mobilni s (nejenom) Pythonem – Scala & Objective C. Vice informaci na http://lanyrd.com/2012/djangocs-april/
Re: Python sraz
Dík, tady by to zapadlo, udělal jsem z toho zprávičku http://www.zdrojak.cz/zpravicky/ve-stredu-probehne-prazsky-python-sraz/
ipython
Dobré doporučení je si do .bashrc přidat řádek export PYTHONSTARTUP=/home/me/startup.py a do tohoto souboru následující kód
…
http://img837.imageshack.us/img837/6794/orwecoulduse.png
dotaz
asi pomerne trivialni dotaz,ale nejsem pythonista,jen v prostredi aplikace ve ktere pracuji lze pouzit python jako scriptovaci jazyk…
alokace a pristup k pameti, potrebuji dynamicky vytvorit nejaky 3 rozmerny grid,radove tisice prvku na osach x,y,z pricems prvek bude nejaky class. v C-ku si alokuju pamet na x*y*z mych classu,klasicke 3rozmerne pole. chci to same udelat v pythonu,samozrejme to sice jde,ale vsechny postupy mi prisly zatgim jako drbani se levou rukou za pravym uchem.
jak se tahle vec dela klasicky po pythonovsku?
dik:-)
Re: dotaz
Po pythonovsku nemusim nic alokovat, bud pouziju list (analogie array z jinych jazyku) nebo dict (=~ hashmap) pro sparse grid.
Zalezi na tom jak ten grid chces pak vyuzivat, jestli by nebyl nejjednodussi pouzit ten dict s tim ze jako index pouzijes tuple (x, y, z), takze:
grid = {}
grid[0,0,0] = object
grid[1,2,3] = dict
grid[x,y,y] = OtherClass
muzes pouzit i defaultdict z dnesniho clanku a alokovat tak jednotlive bunky lazy.
Pokud potrebujes ten grid nejak rezat tak bud muzes pouzit list obsahujici listy:
grid = [[[Class() for z in xrange(MAX_Z)] for y in xrange(MAX_Y)] for x in xrange(MAX_X)]
pripadne si muzu nagenerovat prazdny plochy list a klasicky prepocitavat souradnice:
# rychla inicializace velkeho listu
l = [None] * (MAX_X * MAX_Y * MAX_Z)
def get_y_column(l, zcord, ycoord):
wall_size = MAX_X * MAX_Y
temp_l = l[z*wall_size:(z+1) * wall_size] # z-ta stena kvadru
return temp_l[ycoord::MAX_Y] # kazdy MAX_Y-ty prvek, pocinajici ycoord == ycoord-ty sloupec
pro lepsi vykon lze oba slicy zkombinovat do jednoho a pro usporu pameti pouzit spise itertools:
from itertools import islice
def get_y_column(l, zcord, ycoord):
return islice(l, ycoord + zcoord + MAX_X * MAX_Z, (zcoord + 1) * MAX_X * MAX_Z, MAX_Y)
pozn: nekontroloval jsem jestli jsem nekde neprevratil poradi x, y, z – uvedeny kod slouzi pouze pro ilustraci moznych ristupu
Re: dotaz
diky moc,
jde mi o co nejprimnejsi pristup k bunkam,s tim ze rezy budou podstatne mene caste,ale budou.kompilovany kod mel radove miliony r/w operaci za sekundu,samozrejne se ocekava od pythonu mensi performance,ale aby to bylo maximalne python-optimalni:-) pri velikostech gridu jak jsem psal pujde o stovky MB/grid takze i nejkompaktnejsi pametova struktura by bodla:-) obejdu se bez vymozenosti jako variabilni velikost prvku atd.
Re: dotaz
Tak nejprijemnejsi pristup k bunkam splnuje asi ten dict, je to nejjednodussi na primy pristup (O(1)) a clovek si nemusi pamatovat jak se ty listy vnoruji.
Co se pametove narocnosti tyka tak je to vcelku jedno – vsechno bude pracovat s referencemi ktere maji fixni velikost, u dict je index hash tuplu coz je jen cislo:
hash((1,2,3)) == -378539185
list v pythonu ma tu vlastnost ze musi obsazovat souvisly kus pameti coz muze zdrzovat pri alokaci a zvetsovani kdy se musi naalokovat vetsi misto + presunout stavajici data. U takhle velkych struktur uz to muze byt problem.
Nevim uplne presne jak je to s pameti u dictu, ale muj odhad je ze to bude pri nejhorsim stejne. Vice info: http://stackoverflow.com/questions/671403/memory-efficiency-one-large-dictionary-or-a-dictionary-of-smaller-dictionaries
python 3 a změna hodnoty atributu objektu z metody
Ahoj, poradí mi někdo jak mám v metodě přiřadit novou hodnotu atributu obj? Toto mi nefakčí:
class abc():
def __init__():
self.is_alive= False
def zmena():
self.is_alive= True
return
def tiskni():
print(self.is_alive)
return
ins = abc()
ins.tiskni()
False
ins.zmena()
ins.tiskni()
False
Přes global to nejde… Díky dik
Re: python 3 a změna hodnoty atributu objektu z metody
Chybí ti tam self v definici metod.
Re: python 3 a změna hodnoty atributu objektu z metody
sorry ,psal jsem to z hlavy ,ale v kodu self mam a presto to nefakci.
dik
Re: python 3 a změna hodnoty atributu objektu z metody
Tenhle kód vypíše False, True. V Pythonu 2 i 3.
https://gist.github.com/2415523
Re: python 3 a změna hodnoty atributu objektu z metody
Ano,máte pravdu , vše funguje dle očekávání – měl jsem v kódu zamotanej modul „multiprocessing.Process“ ,který mě mátl.
Díky za Váš čas :-),Dík