Anonymní profil K21 – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil K21 – Programujte.comAnonymní profil K21 – Programujte.com

 

Příspěvky odeslané z IP adresy 212.24.152.–

Anonymní uživatel
Python › Předání hodnot do konstruktoru
19. 10. 2010   #134774

Druhá možnost je nahradit poslední řádek tímto:

obj = TestClass(*a)

Hvězdička před parametrem znamená, že objekty v listu se předají jako samostatné parametry.

K21
Python › Existence souboru
1. 11. 2009   #118285

Omlouvam se, normalne bych mu odpovedel velice slusne, ale zrovna jsem mel spatnou naladu, kterou navic podporila prvni odpoved v tomto vlaknu (vsimnete si, prosim, ze ja nejsem ten prvni clovek, ktery odpovedel). Moje odpoved (ta, kterou jste citoval) predpokladala, ze predchozi otazka jiz byla zodpovezena a navic jsem si nevsiml, ze tazatel se vlastne stale pta na to same, protoze to vypadalo, jde o uplne novou otazku. Ja osobne jsem tedy odpovidal pouze na druhou otazku, ktera, jak jiste uznate, neni prilis informativni a specificka. Uznavam, ze se dalo odpovedet lepe, ale musel bych se zapojit do diskuze drive, abych mohl odpovedet jiz na prvni otazku. Takhle jsem se vlastne pridal na stranu toho, kdo odpovidal (coz je nejspise strana spatna). Znovu se tedy omlouvam a posilam strucnou ukazkovou odpoved, kterou bych podal, kdybych mel prilezitost byt ten, kdo odpovedel jako prvni.

Tomik napsal:
Chtel jsem se zeptat. Jak udelam podminku na to jestli existuje nejaky soubor?



Spravny zpusob je pouzit modulu os, konkretne funkci os.path.isfile()
Udela se to treba takhle:


import os
if os.path.isfile(r"c:\soubor.txt"):
#delej neco se souborem
else:
#soubor neexistuje


P.S.: vetsinouu se snazim pomoci i absolutnim zacatecnikum, proto se prosim nezlobte, ze kdyz vidim jednoduchou otazku (jejiz odpoved se opravdu da najit na Googlu), obcas mi ujedou nervy, zvlast, kdyz me v tom nekdo "podpori", a nepredpokladam existenci jazykove bariery a dalsich moznych komplikaci.

K21
Python › Existence souboru
24. 10. 2009   #117778

Aha, to jsem z tve otazky asi nepochopil. Chtelo by to ji presneji formulovat.

Ackoliv to neni zrovna spravny pristup (ve smyslu tom, ze kazda vyjimka by mela byt osetrena), da se to obejit takhle:

try: a=1/0 #neco co vyvola vyjimku
except: pass #neco co nic nedela

K21
Python › Existence souboru
24. 10. 2009   #117772

Nevim, jestli se da odpovedet slusne. Zkusim to.

Tady neni potreba ani ten Google, staci ti interpreter Pythonu, schopnost psat na pocitaci a spustit program, pripadne si precist chybovou hlasku.

Jo a jinak: ano, musi.

K21
Python › askopenfilename
24. 10. 2009   #117739

V Pythonu delam a vim, ze kdyz chces mit tuple pouze s jednim prvkem, musis za nej umistit carku.
Tedy takhle:

name=askopenfilename(title="Soubor", filetypes=(('WAV Files', '*.wav'),))

Koumes21
Python › načítání řetězců ze souboru
21. 5. 2009   #101547

Kódování jsem použil iso-8859-2.


Dost jde o to, jestli jsi použil tohle kódování v souboru se skriptem nebo v souboru, ze kterého načítáš slova. Budu předpokládat, že jde o druhý případ, protože to dává větší smysl. Po té co načteš řetězec ze souboru je dobré si ho převést na Unicode, v tvém případě takhle:
text_v_unicode = nacteny_text.decode("iso-8859-2")

Pak taky musíš převést na Unicode to, co načteš z klávesnice, to by mělo jít nějak takhle:
text_v_unicode = nacteny_text.decode(sys.stdin.encoding) # nezapomeň na 'import sys'

Mám pocit, že na tohle ses ptal, kdyby ne, tak upřesni svůj dotaz
P.S.: Tohle se týká Pythonu 2.5, u dalších verzí mám pocit, že se něco s Unicode měnilo, ale stejně můžeš zkusit.

Koumes21
Python › Pygame - stisk vice klaves
26. 4. 2009   #99964

Ještě abych řekl "proč" a ne jenom "jak": Jde o to, že jedna událost (event) je například jeden stisk klávesy, jedno puštění klávesy atd. Pokud stiskneš víc kláves úplně ve stejný okamžik (což by se ti pravděpodobně nepovedlo, ale teoreticky), tak se stejně vygenerují dvě události, které ty budeš vyhodnocovat postupně. Tudíž hodnota event.key se nemůže rovnat dvěma klávesám, ale vždy jen jedné. Proto si také musíš ukládat, v jakém stavu je která klávesa.

Koumes21
Python › Pygame - stisk vice klaves
26. 4. 2009   #99963

Na to si udělej proměnnou k_space a přiřazuj do ní stejně jako do k_left a k_right a až na konci (tam, kde máš teď "if k_jumpr") vyhodnoť "if k_left and k_space". Naopak k_jumpr a k_jumpl vůbec potřebovat nebudeš.

Koumes21
Python › Pygame - stisk vice klaves
25. 4. 2009   #99881

Já to obyčejně dělám tak, že nepoužívám set_repeat a když uživatel klávesu stiskne, zapamatuji si, že je stisknutá, pokud ji pustí, zapamatuji si, že už není stisknutá a nakonec vyhodnotím tyto hodnoty, které jsem si zapamatoval. Posílám přibližně ten úsek kódu, který si poslal ty, ale upravený způsobem, jakým bych to udělal já. Doufám, že bude užitečný.



# použijeme několik pomocných proměnných pro zapamatování stavu kláves
k_left = False
k_right = False
[...]

for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_ESCAPE:
sys.exit()

# tady si uložíme stavy kláves, když byla klávesa stisknuta
elif event.key==K_LEFT:
k_left = True
elif event.key==K_RIGHT:
k_right = True
[...]
elif event.type==KEYUP:
# a tady když byla puštěna
if event.key==K_LEFT:
k_left = False
elif event.key==K_RIGHT:
k_right = False
[...]

# tady si vyhodnoť klávesy, které jsou stisknuté, jak chceš
if k_left:
[...]
if k_right:
[...]

koumes21
Python › Zabiti vypočtu v pythonu.
23. 2. 2009   #95823

Ještě se omlouvám, teď jsem si přečetl, že ten kód v tom odkazu nebude v tvém případě fungovat, protože dokáže přerušit pouze operaci, která je zaseklá v kódu Pythonu, ale ne tu, která je zaseklá v nějakém kódu na nižší úrovni, což je právě tvůj případ. Ještě jednou se tedy omlouvám za falešnou naději.

koumes21
Python › Zabiti vypočtu v pythonu.
23. 2. 2009   #95822

ještě ke komentářům k programu: třída locked_var je náhrada za tvou původní globální proměnnou a, ale je bezpečné volat funkce get() a set() ze dvou různých vláken současně, protože třída používá zámek, který před čtením nebo zápisem zamkne a potom zase odemkne. Nepamatuji si, jestli je v dokumentaci Pythonu něco o tom, že GIL tohle zajistí pro každou proměnnou, je to možné, ale i tak je lepší používat tento postup, i kdyby to mělo být jen kvůli tomu, že to tak je v jiných jazycích. Třída loop_thread je náhrada za tvoje loop(), dejme tomu, že je ekvivalentní, ale podle mě je rozumnější použít klasickou cestu, neboť Timer slouží ke spuštění funkce po nějakém čase, což není přesně to co chceme. loop_thread.__init__() si pouze uloží parametry, které jí předáme a zavolá __init__() funkci třídy threading.Thread, ze které je odvozená. Funkce run() je potom ta funkce, která bude zavolána v novém vlákně až zavolám start(), která je zděděna z threading.Thread.
Ještě si dovolím konstruktivní kritiku ke tvému programu: nepoužívej pouze "except:", vždy uveď kterého typu výjimky se to týká. Například v tvém případě by to bylo "except TypeError:". Je to proto, že i stisknutí Ctrl+C vyvolá výjimku a ty bys ji takhle odchytil, což není to co ty chceš a program by pak nešel tímto způsobem přerušit. I kdybys nevěděl, který typ chyby použít, uveď alespoň "except Exception:". Exception je třída odvozená od BaseException, ale KeyboardInterrupt je odvozen přímo od BaseException a ne od Exception, tudíž odchytávání Exception nezachytí KeyboardInterrupt. Asi jsem to napsal dost nepřehledně, takže doufám, že jsem tě tím ještě více nezmátl.

koumes21
Python › Zabiti vypočtu v pythonu.
23. 2. 2009   #95819

Operační systém většinou povoluje zabití vlákna, jenže problém je, že vlákno nedostane příležitost po sobě uklidit. Některé programovací jazyky dají programátorovi příležitost vlákno zabít, Python ovšem nikoliv, protože je jaksi zaměřen na začátečníky a nechce jim dávat do rukou zbraň hromadného ničení, kterou neumí ovládat. Nejlepší by bylo, kdybys měl možnost nějak výrazy zjednodušit, například vkládáním funkcí do pole a voláním jedné funkce po druhé.

funkce = [

lambda x: 2*x+1,
lambda x: x+5,
lambda x: x/2
]

n=1
for f in funkce:
n=f(n)
print n

Pokud ovšem jsou výrazy generovány náhodně, může být složité je takto zjednodušit.
P.S.: Dobře, možná existuje možnost jak zabít vlákno. Našel jsem ukázku kódu v Pythonu, který by toto měl dělat, viz. http://www.velocityreviews.com/forums/t330554-kill-a-thread-in-python.html, ale protože ho sám nehodlám použít, budeš muset zjistit detaily jeho použití sám. Znovu opakuji, že je možné, že nebude fungovat absolutně tak jak má a že bude dělat problémy - zaseknutí programu, nadměrné zaplňování paměti atd.

Koumes21
Python › Zabiti vypočtu v pythonu.
23. 2. 2009   #95784

Quiark napsal:
Tuším, že to bude výsledek global interpreter locku - když se počítá a*a, tak žádný jiný kód kvůli tomu neběží, takže ho ani nemůže zastavit. Pokud to tak je, tak s tím nic moc nenaděláš.


Nechci působit nějak hrubě, ale to je hloupost. GIL sice způsobuje, že v jednom okamžiku běží jen jedna část kódu, ale mezi těmito částmi přepíná. Jde o to, že zavoláním "a**a" se zavolá jakási funkce umocni() s parametry (a,a), které se v tomto případě předávají hodnotou, tudíž pozdější změna "a" nijak neovlivní to, co se dostalo do umocňovací funkce. Nejjednodušší je pravděpodobně rozebrat "a**a" na menší kroky, které nebudou zabírat tak velký časový úsek. Také by to chtělo trochu změnit způsob zabití vlákna. Sice je pravda, že Python je tolerantní jazyk a právě díky GIL se nemůže stát, že by se v tomto programu něco zkazilo, ale v jakémkoliv jiném jazyce by čtení z proměnné a zároveň probíhající zápis do ní vedlo k nedefinovanému chování. Pokud by tě zajímalo, jak bych tuto úlohu řešil já, posílám ti svůj kód.


import time
import threading

class locked_var:
def __init__(self,var):
self.lock=threading.Lock()
self.var=var
def set(self,var):
self.lock.acquire()
self.var=var
self.lock.release()
def get(self):
self.lock.acquire()
ret=self.var
self.lock.release()
return ret

class loop_thread(threading.Thread):
def __init__(self,condition,a):
threading.Thread.__init__(self)
self.condition=condition
self.a=a
self.res=0
def run(self):
n=1
res=self.a
while self.condition.get() and n<self.a:
# dokud to neni zpocitano nebo neni vlakno ukonceno
res*=self.a
n+=1
print "bylo zpocitano a**"+str(n)
self.res=res
self.condition.set(True) # oznam, ze byl vysledek ulozen

a=55654
cond=locked_var(True)
t=loop_thread(cond,a)
print "startuji vlakno s parametrem "+str(a)
t.start()
time.sleep(5.5)
print "posilam signal na zastaveni..."
cond.set(False)
while not cond.get(): time.sleep(0.1) # cekame, az se vlakno doopravdy zastavi
# a ulozi vysledek
# vysledek je nyni v t.res
print "\nted jdu vysledek vytisknout, ale protoze"
print "ho nejdrive musim prevest z cisla na retezec,"
print "muze to trvat i nekolik minut"
print t.res
print "\nhotovo"
raw_input()

Koumes21
Python › Zmena tapety WIndows...
26. 9. 2008   #85990

Jo, určitě dokáže, přes WinAPI jde na windowsech vlastně všechno, že ano. Kdysi jsem něco takového dělal, ale už si to přesně nepamatuju, ale určitě to bylo přes WinAPI. Možná se dá sehnat i nějaký pokročilejší modul, který to udělá za tebe...

Koumes21
Python › keylogger
13. 9. 2008   #85052

Volání WinAPI funkcí lze uskutečnit přes modul win32api, ukládání hodnot do registrů jde potom udělat přes volání určitých API funkcí (msdn.com), s odesíláním mailu bohužel neporadím (řešil bych nalezením modulu nebo přímo přes socket) a nastavování atributů souborů -> API (jenom nevím, jak dobře to ten program skryje). Jo, a mimochodem, Python je jeden z nejhorších programovacích jazyků na psaní malware.

Anonymní uživatel
Python › socket problem
19. 5. 2008   #74394

Tvoje část kódu by nejspíš vypadala nějak takhle:



class add1(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.i=0
def run(self):
while True:
self.i+=1


def f(s):
add1().start()
while True:
s.recv()

kuomes21
Python › socket problem
19. 5. 2008   #74367

Úplně nejzákladnější možnost jak toto řešit v pythonu jsou vlákna, tedy např. modul threading. Doporučuju si najít navody na Googlu, anglicky jich je určitě spousta.

Koumes21
Python › Prerusenie alebo alternativa…
9. 4. 2008   #70851

Doporučuji prostudovat modul threads, případně threading. Promiň, že ti to nepopíšu podrobněji, ale nemám čas. Buď tady ve fóru nebo jinde na netu určitě najdeš potřebné návody.

Koumes21
Python › Testovací řetězec
3. 4. 2008   #70465

Jestli jsem to správně pochopil, tak chceš použít v řetězci zpětné lomítko.
To pak musíš napsat: "\\", neboli-zpětné lomítko značí speciální znak, pokud chceš napsat jen zpětné lomítko, musíš vždy napsat dvě.

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý