Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: python 19. 01. 2016, 10:13:18
-
mam tuto rekurzivni funkci
def dekoder(t=[],n = {}):
i = list(t)
r = i.pop(0)
s = ord(i.pop(0)) - ord(r)
o = ''.join(i)
n[s] = r
if 0 < len(i):
return dekoder(o,n)
else:
a = []
for key, value in n.iteritems():
a.append(value)
return ''.join(a)
string_one = ' + $ 0anehekfrgohqi{iplll\x7fl\x80opp\x81sus\x81s\x88t\x83t~w|'
string_two = ' , $ckehesgwhyipixktlllvopqvsut\x86u{w\x84y\x84'
print dekoder(string_one)
print dekoder(string_two)
pokud funkci dekoder zavolam vicekrat nez jednou, tak to muze vracet jina data nez ma. Ta puvodni data tam nepochopitelne stale jsou a pouze se prepisou!
Muze mi nekdo vysvetlit cim to je? Neni to bug?
-
Bug to není, jde o vyhodnocení defaultních argumentů funkce, které se provádí pouze jednou, při deklaraci funkce (vykonání def příkazu). Obsah >n< tak ve funkci zůstává. Pythonovský idiom pro očekávané chování je
def dekoder(t=[],n = None):
if n is None:
n = {}
# puvodni ... pokracovani
-
mam tuto rekurzivni funkci
def dekoder(t=[],n = {}):
...
string_one = ' + $ 0anehekfrgohqi{iplll\x7fl\x80opp\x81sus\x81s\x88t\x83t~w|'
string_two = ' , $ckehesgwhyipixktlllvopqvsut\x86u{w\x84y\x84'
print dekoder(string_one)
print dekoder(string_two)
pokud funkci dekoder zavolam vicekrat nez jednou, tak to muze vracet jina data nez ma. Ta puvodni data tam nepochopitelne stale jsou a pouze se prepisou!
Muze mi nekdo vysvetlit cim to je? Neni to bug?
http://docs.python-guide.org/en/latest/writing/gotchas/
-
Boha, ten kód je teda zrůdnost. Když modifikuješ mutable parametry, tak se asi stěží můžeš divit, že budou modifikované. Jejich inicializace probíhá při vytváření funkce, ne při volání.
a = []
for key, value in n.iteritems():
a.append(value)
return ''.join(a)
Se dá přepsat na return "".join(n.values())
Podmínka
if 0 < len(i):
je Yoda condition (https://en.wikipedia.org/wiki/Yoda_conditions) a dá se přepsat na if i:
A tak dále. To ani nemluvím o tom jednopísmenném pojmenování proměnných. Co to šašíš s tím t, které inicializuješ na prázdné pole, pak mu vždycky předáváš string, který pak konvertuješ tam a zpět na pole jsem nepochopil už vůbec, ale rozhodně to není dobrá praktika.
-
diky za pomoc, mam velke mezery.
jinak ten kod je primy prepis nejakeho obsfukovaneho javascriptu