Informatika2-2014/teszt
A MathWikiből
(Változatok közti eltérés)
46. sor: | 46. sor: | ||
</python> | </python> | ||
− | + | És mi történik, ha a 3. és 4. sort fölcseréljük? | |
− | + | A névtér törlődik a függvény lefutása után, magasabb szinten az alacsonyabb szintű névterek nem érhetők el: | |
<python> | <python> | ||
+ | >>> def fn(): | ||
+ | ... z = 1 | ||
+ | ... | ||
+ | >>> print z | ||
+ | Traceback (most recent call last): | ||
+ | File "<stdin>", line 1, in <module> | ||
+ | NameError: name 'z' is not defined | ||
+ | </python> | ||
+ | A külső függvény az argumentumában átadott függvény eredményét duplázza, és ezt a duplázó függvényt adja vissza. Ezzel '''dekorálunk''' két különböző függvényt! | ||
+ | |||
+ | <python> | ||
+ | >>> def kulso(fn): | ||
+ | ... def belso(*args): | ||
+ | ... print "belül vagyunk" | ||
+ | ... return 2*fn(*args) | ||
+ | ... return belso | ||
+ | ... | ||
+ | >>> dekoralt = kulso(fv) | ||
+ | >>> dekoralt(5) | ||
+ | belül vagyunk | ||
+ | 10 | ||
+ | >>> def fadd(a, b): | ||
+ | ... return a + b | ||
+ | ... | ||
+ | >>> dekoralt = kulso(fadd) | ||
+ | >>> dekoralt(4, 5) | ||
+ | belül vagyunk | ||
+ | 18 | ||
</python> | </python> | ||
A lap 2014. március 26., 08:52-kori változata
Dekorátor
A dekorátorok módosítják függvények vagy osztályok kódját!
Scope (hatókör), névtér
Minden új függvény fölépíti saját névterét, egy szótár formájában. Íme a globális és egy lokális névtér:
>>> x = 2 >>> print globals() {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'x': 2, '__doc__': None, '__package__': None} >>> def fn(): ... y = 3 ... print locals() ... >>> fn() {'y': 3}
Ha egy név lokálisan nem lett létrehozva, a tartalmazó névterekben keresi egyre kijjebb haladva (itt az x nem lett lokálisan létrehozva, de elérhető):
>>> def fn(): ... y = 3 ... print "x, y:", x, y ... print locals() ... >>> fn() x, y: 2 3 {'y': 3}
Kérdés: Mi történik az alábbi kód hatására? magyarázzuk meg, mi történik:
>>> def fn(): ... y = 3 ... print "x, y:", x, y ... x = 5 ... print locals() ... >>> fn()
És mi történik, ha a 3. és 4. sort fölcseréljük?
A névtér törlődik a függvény lefutása után, magasabb szinten az alacsonyabb szintű névterek nem érhetők el:
>>> def fn(): ... z = 1 ... >>> print z Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'z' is not defined
A külső függvény az argumentumában átadott függvény eredményét duplázza, és ezt a duplázó függvényt adja vissza. Ezzel dekorálunk két különböző függvényt!
>>> def kulso(fn): ... def belso(*args): ... print "belül vagyunk" ... return 2*fn(*args) ... return belso ... >>> dekoralt = kulso(fv) >>> dekoralt(5) belül vagyunk 10 >>> def fadd(a, b): ... return a + b ... >>> dekoralt = kulso(fadd) >>> dekoralt(4, 5) belül vagyunk 18