Informatika2-2014/teszt

A MathWikiből
(Változatok közti eltérés)
 
(egy szerkesztő 28 közbeeső változata nincs mutatva)
1. sor: 1. sor:
===Példák reguláris kifejezésekre===
+
=== Dekorátor ===
  
[[http://docs.python.org/2/howto/regex.html python.org: Regular expression HOWTO]]
+
Jó leírások: [[http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/]], [[http://www.artima.com/weblogs/viewpost.jsp?thread=240808]]
  
[[http://docs.python.org/2/library/re.html python.org: Regular expressions]]
+
A '''dekorátorok''' módosítják függvények vagy osztályok kódját!
  
[[http://www.tutorialspoint.com/python/python_reg_expressions.htm tutorialspoint.com: Python regexp összefoglaló]]
+
==== Scope (hatókör), névtér ====
  
Írjunk olyan reguláris kifejezéset, mely illeszkedik az alábbiakban megadott mintára!
+
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:
  
'''Feladat:''' néggyel osztható 2-jegyű szám
+
<python>
 +
>>> 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}
 +
</python>
  
[02468][048]|[13579][26]
+
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ő):
  
'''Feladat:''' szökőév
+
<python>
 +
>>> def fn():
 +
...    y = 3
 +
...    print "x, y:", x, y
 +
...    print locals()
 +
...
 +
>>> fn()
 +
x, y: 2 3
 +
{'y': 3}
 +
</python>
  
([1-9][0-9])(0[48]|[2468][048]|[13579][26])|(([2468][048]|[13579][26])00)
+
Kérdés: Mi történik az alábbi kód hatására? magyarázzuk meg, mi történik:
  
 +
<python>
 +
>>> def fn():
 +
...    y = 3
 +
...    print "x, y:", x, y
 +
...    x = 5
 +
...    print locals()
 +
...
 +
>>> fn()
 +
</python>
  
'''Feladat:''' nagy betűkkel írt római számok
+
És mi történik, ha a 3. és 4. sort fölcseréljük?
  
Évezred: <code>M{0,4}</code>, évszázad: <code>CM|CD|D?C{0,3}</code>, évtized: <code>XC|XL|L?X{0,3}</code>, év: <code>IX|IV|V?I{0,3}</code>. Akkor mégis mi a hiba az alábbi megoldással?
+
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:
  
M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})
+
<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>
  
Hogy illeszkedik az üres sztringre is! Megoldás
+
A '''függvény lezárása''' a Pythonnak azt a képességét jelenti, hogy a nem globális névtérben definiált függvény '''emlékszik''' a definiálás pillanatában érvényes bennfoglaló névterekre:
 
+
\b(?=[MDCLXVI])M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b
+
 
+
'''Feladat:''' pozitív egészek, esetleg a sokjegyű számok hármasával csoportosítva vannak és a csoportok szóközzel elválasztva
+
 
+
[1-9](\d{0,2}( \d{3})+|\d*)
+
 
+
Ugyanez szóhatárok közt:
+
 
+
\b[1-9](\d{0,2}( \d{3})+|\d*)\b
+
 
+
'''Feladat:''' HTML-kódban hexadecimális színkód (3 vagy 6 hexa szám)
+
 
+
([0-9A-Fa-f]{3}){1,2}
+
 
+
 
+
'''Feladat:''' a yyyy-mm-dd formátum szerinti érvényes dátum az 1600-as évektől
+
  
 
<python>
 
<python>
"""
+
>>> def kulso(x):
(
+
...    def belso():
(1[6-9]\d\d|[2-9]\d{3})         # tetszőleges év
+
...        print x
-(0[13456789]|1[0-2])           # nem február
+
...    return belso
-(0[1-9]|[12]\d|30)              # 1-30
+
...
|
+
>>> f1 = kulso(3)
(1[6-9]\d\d|[2-9]\d{3})          # tetszőleges év
+
>>> f2 = kulso(5)
-02-(0[1-9]|1\d|2[0-8])          # február
+
>>>
|
+
>>> f1()
(1[6-9]\d\d|[2-9]\d{3})         # tetszőleges év
+
3
-(0[13578]|1[02])               # 31-napos hónap
+
>>> f2()
-31                              # 31
+
5
|
+
(                               ###### szökőév
+
  (1[6-9]|[2-9]\d)               # első két jegy
+
  (0[48]|[2468][048]|[13579][26]) # 4-gyel osztható nem évszázad
+
|                                # vagy
+
  (([2468][048]|[13579][26])00)  # 400-zal osztható
+
)                                ###### szökőév eddig
+
-02-29                          # február 29
+
)
+
"""
+
 
</python>
 
</python>
  
'''Feladat:''' '-jelek vagy "-jelek közé zárt szöveg
+
==== Dekorálunk ====
  
(['"])[^\1]*\1
+
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!
 
+
 
+
=== Modul szintű függvények ===
+
 
+
A modul betöltése:
+
 
+
import re
+
 
+
====A match objektumok ====
+
 
+
re.match(pattern, string, flags=0)
+
re.seartch(pattern, string, flags=0)
+
 
+
A match objektum metódusai: group(num=0), groups()
+
  
 
<python>
 
<python>
>>> line = "gyöngyön elemelem vilmoskörte"
+
>>> def kulso(fn):
>>>
+
...     def belso(*args):
>>> matchObj = re.match(r'\b(.+)\1\b', line, re.M|re.I)
+
...         print "belül vagyunk"
>>>
+
...         return 2*fn(*args)
>>> if matchObj:
+
...     return belso
...   print "matchObj.group() : ", matchObj.group()
+
...   print "matchObj.group(1) : ", matchObj.group(1)
+
...   print "matchObj.groups() : ", matchObj.groups()
+
... else:
+
...    print "No match!!"
+
 
...  
 
...  
matchObj.group() :  gyöngyön
+
>>> dekoralt = kulso(fv)
matchObj.group(1) :  gyön
+
>>> dekoralt(5)
matchObj.groups() :  ('gy\xc3\xb6n',)
+
belül vagyunk
>>> matchObj = re.search(r'\b(.+)\1\b', line, re.M|re.I)
+
10
>>>  
+
>>> def fadd(a, b):
>>> if matchObj:
+
...     return a + b
...    print "matchObj.group() : ", matchObj.group()
+
...    print "matchObj.group(1) : ", matchObj.group(1)
+
...   print "matchObj.groups() : ", matchObj.groups()
+
... else:
+
...    print "No match!!"
+
 
...  
 
...  
matchObj.group() :  gyöngyön
+
>>> dekoralt = kulso(fadd)
matchObj.group(1) :  gyön
+
>>> dekoralt(4, 5)
matchObj.groups() :  ('gy\xc3\xb6n',)
+
belül vagyunk
 +
18
 
</python>
 
</python>
  
Iterátor match objektumra:
+
A <code>fv = kulso(fv)</code> rövidítése a <code>@kulso</code> a fv függvénydefiníció elé írásával:
  
 
<python>
 
<python>
>>> iterObj = re.finditer(r'\b(.+)\1\b', line, re.M|re.I)
+
>>> @kulso
>>>
+
... def fmul(a, b):
>>> for j in iterObj:
+
...    return a * b
...    print j.group()
+
 
...  
 
...  
gyöngyön
+
>>> fmul(3, 5)
elemelem
+
belül vagyunk
 +
30
 
</python>
 
</python>
  
Helyettesítés:
+
 
 +
Dekorátor lehet olyan osztály is, mely '''meghívható''', azaz amelyben létezik <code>__call__</code> függvény:
  
 
<python>
 
<python>
>>> print re.sub(r'\b(.+)\1\b', r'\1|\1', line, re.M|re.I)
+
>>> class Dekorator(object):
gyön|gyön elem|elem vilmoskörte
+
...    def __init__(self, f):
>>>
+
...        print "Dekorátor konstruktor"
>>> print re.sub(r'\b(.+)\1\b', r'\1|\1', line, 1, re.M|re.I)
+
...        print "meghívjuk a fv-t:", f()
gyön|gyön elemelem vilmoskörte
+
...     def __call__(self):
>>> print re.subn(r'\b(.+)\1\b', r'\1|\1', line, re.M|re.I)
+
...        print "Dekorátor meghívása"
('gy\xc3\xb6n|gy\xc3\xb6n elem|elem vilmosk\xc3\xb6rte', 2)
+
...
>>> print re.split(r'[,.\s]+', 'szavak, ige,    ez. Meg      az')
+
>>> @Dekorator
['szavak', 'ige', 'ez', 'Meg', 'az']
+
... def fn():
 +
...     print "az fn meghívása"
 +
...
 +
Dekorátor konstruktor
 +
meghívjuk a fv-t: az fn meghívása
 +
None
 +
>>> fn()
 +
Dekorátor meghívása
 
</python>
 
</python>
 
====A regex objektumok ====
 

A lap jelenlegi, 2014. március 26., 10:29-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 függvény lezárása a Pythonnak azt a képességét jelenti, hogy a nem globális névtérben definiált függvény emlékszik a definiálás pillanatában érvényes bennfoglaló névterekre:

>>> def kulso(x):
...     def belso():
...         print x
...     return belso
... 
>>> f1 = kulso(3)
>>> f2 = kulso(5)
>>> 
>>> f1()
3
>>> f2()
5

Dekorálunk

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

A fv = kulso(fv) rövidítése a @kulso a fv függvénydefiníció elé írásával:

>>> @kulso
... def fmul(a, b):
...     return a * b
... 
>>> fmul(3, 5)
belül vagyunk
30


Dekorátor lehet olyan osztály is, mely meghívható, azaz amelyben létezik __call__ függvény:

>>> class Dekorator(object):
...     def __init__(self, f):
...         print "Dekorátor konstruktor"
...         print "meghívjuk a fv-t:", f()
...     def __call__(self):
...         print "Dekorátor meghívása"
... 
>>> @Dekorator
... def fn():
...     print "az fn meghívása"
... 
Dekorátor konstruktor
meghívjuk a fv-t: az fn meghívása
None
>>> fn()
Dekorátor meghívása
Személyes eszközök