Informatika2-2014/teszt

A MathWikiből
(Változatok közti eltérés)
 
(egy szerkesztő 35 közbeeső változata nincs mutatva)
1. sor: 1. sor:
===Példák reguláris kifejezésekre===
+
=== Dekorátor ===
  
Írjunk olyan reguláris kifejezéset, mely illeszkedik az alábbiakban megadott mintára!
+
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]]
  
'''Feladat:''' nagy betűkkel írt római számok
+
A '''dekorátorok''' módosítják függvények vagy osztályok kódját!
  
É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?
+
==== Scope (hatókör), névtér ====
  
M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})
+
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:
  
Hogy illeszkedik az üres sztringre is!
+
<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>
  
\b(?=[MDCLXVI])M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b
+
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:''' pozitív egészek, esetleg a sokjegyű számok hármasával csoportosítva vannak és a csoportok szóközzel elválasztva
+
<python>
 +
>>> def fn():
 +
...    y = 3
 +
...    print "x, y:", x, y
 +
...    print locals()
 +
...
 +
>>> fn()
 +
x, y: 2 3
 +
{'y': 3}
 +
</python>
  
[1-9](\d{0,2}( \d{3})+|\d*)
+
Kérdés: Mi történik az alábbi kód hatására? magyarázzuk meg, mi történik:
  
Ugyanez szóhatárok közt:
+
<python>
 +
>>> def fn():
 +
...    y = 3
 +
...    print "x, y:", x, y
 +
...    x = 5
 +
...    print locals()
 +
...
 +
>>> fn()
 +
</python>
  
\b[1-9](\d{0,2}( \d{3})+|\d*)\b
+
És mi történik, ha a 3. és 4. sort fölcseréljük?
  
'''Feladat:''' HTML-kódban hexadecimális színkód (3 vagy 6 hexa szám)
+
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:
  
([0-9A-Fa-f]{3}){1,2}
+
<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 '''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:
  
'''Feladat:''' szökőév
+
<python>
 +
>>> def kulso(x):
 +
...    def belso():
 +
...        print x
 +
...    return belso
 +
...
 +
>>> f1 = kulso(3)
 +
>>> f2 = kulso(5)
 +
>>>
 +
>>> f1()
 +
3
 +
>>> f2()
 +
5
 +
</python>
  
([1-9][0-9])(0[48]|[2468][048]|[13579][26])|(([2468][048]|[13579][26])00)
+
==== Dekorálunk ====
  
'''Feladat:''' a yyyy-mm-dd formátum szerinti érvényes dátum az 1600-as évektől
+
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>
 
<python>
"""
+
>>> def kulso(fn):
(
+
...    def belso(*args):
(1[6-9]\d\d|[2-9]\d{3})         # tetszőleges év
+
...        print "belül vagyunk"
-(0[13456789]|1[0-2])            # nem február
+
...        return 2*fn(*args)
-(0[1-9]|[12]\d|30)             # 1-30
+
...    return belso
|
+
...
(1[6-9]\d\d|[2-9]\d{3})         # tetszőleges év
+
>>> dekoralt = kulso(fv)
-02-(0[1-9]|1\d|2[0-8])         # február
+
>>> dekoralt(5)
|
+
belül vagyunk
(1[6-9]\d\d|[2-9]\d{3})          # tetszőleges év
+
10
-(0[13578]|1[02])               # 31-napos hónap
+
>>> def fadd(a, b):
-31                              # 31
+
...    return a + b
|
+
...
(                               ###### szökőév
+
>>> dekoralt = kulso(fadd)
  (1[6-9]|[2-9]\d)               # első két jegy
+
>>> dekoralt(4, 5)
  (0[48]|[2468][048]|[13579][26]) # 4-gyel osztható nem évszázad
+
belül vagyunk
|                                # vagy
+
18
  (([2468][048]|[13579][26])00)  # 400-zal osztható
+
)                                ###### szökőév eddig
+
-02-29                          # február 29
+
)
+
"""
+
 
</python>
 
</python>
  
 +
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>
 +
>>> @kulso
 +
... def fmul(a, b):
 +
...    return a * b
 +
...
 +
>>> fmul(3, 5)
 +
belül vagyunk
 +
30
 +
</python>
  
{| class="wikitable"
 
|-
 
! scope="col" | Karakter
 
! scope="col" | Használat ("minta" >> pl. "erre illeszkedik", !! "erre nem illeszkedik")
 
|-
 
| | Bármely karakter
 
| | Az adott karaktert jelöli, ha más jelentése nincs. "ba" >> "ba"
 
|-
 
| | .
 
| | Bármely karaktert jelöli a sortörésjel kivételével. „.l.m” >> „elem” „alom” !! „idom”
 
|-
 
| | ^
 
| | Sor (vagy a sztring) elejére illeszkedik. "^Azt"
 
|-
 
| | $
 
| | Sor vagy a sztring végére illeszkedik. "azt.$".
 
  
A $ önmagában a bekezdés végére illeszkedik. Így a bekezdéstörések megkereshetők és kicserélhetők.
+
Dekorátor lehet olyan osztály is, mely '''meghívható''', azaz amelyben létezik <code>__call__</code> függvény:
|-
+
| | *
+
| | A "*" jel előtti atom 0 vagy több előfordulását keresi. "pil*a" >> "pia", "pila", "pilla",...
+
|-
+
| | +
+
| | A „+” jel előtti atom 1 vagy több előfordulását keresi. "na+" >> "na", "naa", naaa",...
+
|-
+
| | ?
+
| | A „?” jel előtti atom 0 vagy 1 előfordulását keresi. "ezt?" >> "ez, "ezt"
+
|-
+
| | \
+
| | (eszkép) a "\" jel után írt speciális karakterek normál karakterként és nem reguláris kifejezésként lesznek felismerve. "fa\." >> "fa." !! "fal"
+
|-
+
| | \n
+
| | A Shift+Enter használatával beszúrt sortörést jelöli. Egy sortörés „bekezdés vége” jelre való lecseréléséhez a '''Keresett szöveg''' és a '''Csere erre''' mezőkbe írja be a '''\n''' értéket, majd hajtson végre egy „Keresés és csere” funkciót.
+
  
A \n a '''Keresés''' mezőben a sortörést jelenti, amelyet a Shift+Enter billentyűkombinációval vittek be.
+
<python>
 
+
>>> class Dekorator(object):
A \n a '''Csere erre''' mezőben a bekezdésjelet jelenti, amelyet az Enter vagy a Return billentyűvel vihet be.
+
...     def __init__(self, f):
|-
+
...         print "Dekorátor konstruktor"
| | \t
+
...         print "meghívjuk a fv-t:", f()
| | Egy tabulátort jelöl. Ez a kifejezés a '''Csere erre''' mezőben is használható.
+
...     def __call__(self):
|-
+
...         print "Dekorátor meghívása"
| | \b
+
...  
| | Illeszkedés szóhatárra. Például a „\bkönyv” megtalálja a „könyvjelző” szót, de a „tankönyv” szót nem, míg a „könyv\b” megtalálja a „tankönyv” szót de a „könyvjelző” szót nem. A „könyv” szót önmagában mindkét keresőkifejezés megtalálja.
+
>>> @Dekorator
|-
+
... def fn():
| | ^$
+
...    print "az fn meghívása"
| | Egy üres bekezdést keres meg.
+
...  
|-
+
Dekorátor konstruktor
| | ^.
+
meghívjuk a fv-t: az fn meghívása
| | Egy bekezdés első karakterét keresi meg.
+
None
|-
+
>>> fn()
| | & vagy $0
+
Dekorátor meghívása
| | Cserekor a '''Keresett szöveg''' mezőben megadott keresési feltétel által talált karakterláncot hozzáadja a '''Csere erre''' mezőhöz.
+
</python>
 
+
Ha például az "ablak" szót írja a '''Keresett szöveg''' mezőbe és a "&kerete" szót pedig a '''Csere erre''' mezőbe, akkor az ablak szó az "ablak kerete" kifejezésre cserélődik.
+
 
+
Egy "&" karakter '''Csere erre''' mezőbe való beírásával módosíthatók a keresési feltétel által talált karakterlánc '''Attribútum''' vagy '''Formátum''' értékei.
+
|-
+
| | [abc123]
+
| | A zárójelek között lévő karakterek egyikét jelöli.
+
|-
+
| | [a-e]
+
| | Az a és e között elhelyezkedő betűk bármelyikét jelöli a kezdő és a záró karaktert is beleértve.
+
 
+
A karakterek a kódszámuk szerint vannak rendezve.
+
|-
+
| | [a-eh-x]
+
| | Az a és e, valamint a h és x között elhelyezkedő betűk bármelyikét jelöli.
+
|-
+
| | [^a-s]
+
| | Az a és s között nem elhelyezkedő betűk bármelyikét jelöli.
+
|-
+
| | \uXXXX
+
 
+
\UXXXXXXXX
+
| | A négyjegyű hexadecimális Unicode kódjának (XXXX) megfelelő karaktert jelöli.
+
 
+
Ritka karakterekhez létezik egy külön változó nagy U-val és nyolc hexadecimális számjeggyel (XXXXXXXX).
+
 
+
Bizonyos szimbólum-betűkészletek esetén a speciális karakterek kódja a használt betűkészlettől függ A kódok megtekintéséhez válassza a '''Beszúrás - Különleges karakter''' lehetőséget.
+
|-
+
| | |
+
| | Megkeresi a „|” jel előtti és utáni kifejezést. Például az „ez|az” megtalálja az „ez” és az ”az” szót egyaránt.
+
|-
+
| | {2}
+
| | Megadja, hogy a nyitó zárójel előtti karakter hányszor szerepel. Például a „hal{2}” megtalálja és kijelöli a „hall” szót.
+
|-
+
| | {1,2}
+
| | Megadja, hogy a nyitó zárójel előtti karakter minimum és maximum hányszor szerepelhet. Például a „hal{1,2}” megtalálja és kijelöli a „hal” és a „hall” szót is.
+
|-
+
| | {1,}
+
| | Megadja, hogy a nyitó zárójel előtti karakter legalább hányszor szerepelhet. Például a "hal{2,}" megtalálja a "hall", a "halll" és a "hallllllllllll" szót is.
+
|-
+
| | ( )
+
| | A '''Keresett szöveg''' mezőbe írja be a következőt:
+
 
+
A zárójelben lévő karaktereket hivatkozásként adja meg. Ezután az aktuális kifejezésben az első hivatkozásra a "\1", a másodikra a "\2" karakterlánc megadásával hivatkozhat.
+
 
+
Ha például a szöveg tartalmazza a 13487889-es számot, és a (8)7\1\1 reguláris kifejezés használatával keres, a program a „8788”-at találja meg.
+
 
+
A kifejezések csoportosításához használhat zárójeleket is, például az "a(bc)?d" megtalálja az "ad" és az "abcd".
+
 
+
A '''Csere erre''' mezőben:
+
 
+
Használja a $ (dollár) jelet a \ (fordított perjel) helyett a hivatkozások lecserélésére. Használja a $0 karakterláncot a teljes megtalált karakterlánc lecserélésére.
+
|-
+
| | [:alpha:]
+
| | Egy betű karaktert jelöl. Használja az [:alpha:]+ kifejezést egy darab megtalálásához.
+
|-
+
| | [:digit:]
+
| | Egy szám karaktert jelöl. Használja a [:digit:]+ kifejezést egy darab megtalálásához.
+
|-
+
| | [:alnum:]
+
| | Egy alfanumerikus karaktert jelöl ([:alpha:] és [:digit:]).
+
|-
+
| | [:space:]
+
| | Szóköz karaktert jelöl (de nem a többi üres karaktert).
+
|-
+
| | [:print:]
+
| | Egy nyomtatható karaktert jelöl.
+
|-
+
| | [:cntrl:]
+
| | Nem nyomtatható karaktert jelöl.
+
|-
+
| | [:lower:]
+
| | Kisbetűs karaktereket jelöl, ha a '''Beállítások''' részben ki van választva a '''Kis- és nagybetűk megkülönböztetése''' lehetőség.
+
|-
+
| | [:upper:]
+
| | Nagybetűs karaktereket jelöl, ha a '''Beállítások''' részben ki van választva a '''Kis- és nagybetűk megkülönböztetése''' lehetőség.
+
|}
+
 
+
== Példák ==
+
 
+
e([:digit:])?    – megtalálja az „e”-t és az azt követő nulla vagy egy számjegyet. Jelenleg az összes névvel rendelkező karakterosztályt (például a [:digit:]-et) zárójelbe kell tenni.
+
 
+
^([:digit:])$    – megtalálja azokat a sorokat vagy cellákat, amelyekben pontosan egy számjegy van.
+
 
+
A keresési kifejezések kombinálásával összetett keresések alakíthatók ki.
+
 
+
=== Olyan bekezdés megtalálása, amelyben egyedül csak három számjegy van. ===
+
 
+
<code>^[:digit:]{3}$</code>
+
 
+
• a ^ azt jelenti, hogy a találatnak a bekezdés elején kell lennie,
+
 
+
• a [:digit:] bármilyen számjegyre illeszkedik,
+
 
+
• a {3} azt jelenti, hogy a „[:digit:]” pontosan háromszor fordulhat elő,
+
 
+
• a $ azt jelenti, hogy a találatnak a bekezdés végén kell lennie.
+

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