Informatika2-2014/teszt

A MathWikiből
(Változatok közti eltérés)
46. sor: 46. sor:
 
</python>
 
</python>
  
<python>
+
És mi történik, ha a 3. és 4. sort fölcseréljük?
  
</python>
+
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

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