Python rekurzivní funkce - velice podivné

python

Python rekurzivní funkce - velice podivné
« kdy: 19. 01. 2016, 10:13:18 »
mam tuto rekurzivni funkci

Kód: [Vybrat]
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?




mko

Re:Python rekurzivní funkce - velice podivné
« Odpověď #1 kdy: 19. 01. 2016, 10:31:18 »
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

Milan Straka

Re:Python rekurzivní funkce - velice podivné
« Odpověď #2 kdy: 19. 01. 2016, 10:33:33 »
mam tuto rekurzivni funkci

Kód: [Vybrat]
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/

Re:Python rekurzivní funkce - velice podivné
« Odpověď #3 kdy: 19. 01. 2016, 10:42:54 »
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í.

Kód: [Vybrat]
a = []
for key, value in n.iteritems():
a.append(value)
return ''.join(a)

Se dá přepsat na
Kód: [Vybrat]
return "".join(n.values())
Podmínka

Kód: [Vybrat]
if 0 < len(i):
je Yoda condition a dá se přepsat na
Kód: [Vybrat]
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.

python

Re:Python rekurzivní funkce - velice podivné
« Odpověď #4 kdy: 19. 01. 2016, 10:54:53 »
diky za pomoc, mam velke mezery.
jinak ten kod je primy prepis nejakeho obsfukovaneho javascriptu