Informatika2-2014/teszt

A MathWikiből
A lap korábbi változatát látod, amilyen Wettl (vitalap | szerkesztései) 2014. március 26., 08:52-kor történt szerkesztése után volt.

Dekorátor

Jó leírások: [[1]], [[2]]

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
 
 
Személyes eszközök