Informatika2-2014/Eloadas Python/1ZH
1. ZH
1. Írjunk fel egy reguláris kifejezést, mely pontosan azokra a két számból álló karakterláncokra illeszkedik, melyek oszthatók 3-mal. A reguláris kifejezés tehát illeszkedjen a "00", "03", "12", "24", "99" karaterláncokra, de ne illeszkedjen a "01", "98", "0a", "ab" karakterláncokra (az egyszerűség kedvéért az előtte lévő és az utána következő karakterekkel nem kell foglalkozni).
Megoldás
[0369][0369]|[147][258]|[258][147]
2. Írjunk kódot, mely egy karakterláncból mozaikszót képez. A mozaikszó a karakterlánc minden nagy betűvel kezdődő szavából csak a nagy betűk megtartásával képződik. A karakterlánc csak az angol ábécé betűit és szóközöket tartalmaz. Használjuk a 're' modul 'sub' függvényét, vagy egy regexp objektum 'sub' metódusát a megoldáshoz. A kód példa bemenetekre adott válaszai: \pont2
"American Mathematical Society" --> "AMS"
"Masters of Business Administration" --> "MBA"
Két megoldás
>>> import re >>> line = 'Masters of Business Administration' >>> prog = re.compile("[^A-Z]") >>> prog.sub("", line) 'MBA'
>>> import re >>> line = 'Masters of Business Administration' >>> re.sub("[^A-Z]", "", line) 'MBA'
Két másik megoldás
>>> import re >>> line = 'Masters of Business Administration' >>> prog = re.compile("([A-Z])[a-z ]+") >>> prog.sub(r"\1", line) 'MBA'
>>> import re >>> line = 'Masters of Business Administration' >>> re.sub("([A-Z])[a-z ]+", r"\1", line) 'MBA'
3. Egy file-ban soronként vannak a neptunkód--pontszám párok, szóközzel elválasztva. Írjunk python kódot, mely beolvassa ezt a file-t és egy szótárban tárolja a hallgatók eredményeit. A szótár kulcsai neptunkódok, az értékek ZH pontok.
Megoldás
f = open("eredmenyek.txt", "r") d = {} for line in f: l = line.split() d[l[0]] = int(l[1]) print d
4. Írjunk egy legjobbak nevű függvényt, mely egy -- az előző feladat szerinti -- szótárat és egy pozitív egész számot kap paraméterként. A függvény egy listában visszaadja az n legmagasabb pontszámú hallgató neptunkódját tetszőleges sorrendben, ahol n a második paraméter. Nincs két hallgató azonos pontszámmal.
Megoldás
pontszamok = {'C3WRGQ':15, 'PTKFGS':54, 'TB7RU9':65, 'YTMND1':43, 'BATMAN':78} def legjobbak(pontDict, n): retval = [] p = pontDict.values() p.sort() p = p[-n:] for k in pontDict: if pontDict[k] in p: retval.append(k) return retval print legjobbak(pontszamok, 3)
5. Adjuk meg, hogy mely változók lesznek elérhetők az a és b objektumokból az alábbi kód futtatása után.
class A(object): x = 1 z = 2 def __init__(self): self.u = 6 self.w = 4 class B(A): y = 5 def __init__(self): self.v = 3 a = A() b = B()
Megoldás
Az a objektumban elérhető a.x, a.z, a.u, a.w
A b objektumban elérhető b.x, b.z, b.y, b.v
6. Egészítsd ki az alábbi kódot. Az osztály egy téglatestet reprezentál, melynek surface tulajdonsággal lehet lekérni a felszínét.
Megoldás
import math class Cuboid(object): def __init__(self, sideA, sideB, sideC): self.a = sideA self.b = sideB self.c = sideC @property def surface(self): return 2 * (self.a*self.b + self.a*self.c + self.b*self.c)
Használata:
>>> t = Cuboid(3, 4, 5) >>> print t.surface 94
7. A Cube osztály a fenti Cuboid leszármazottja, mely a kockákat írja le.
- Egészítsük ki az '__init__' metódusát, hogy annak a 'self'-en kívül csak egy argumentuma legyen.
- Legyen volume (térfogat) írható és olvasható tulajdonsága. (Köbgyökhöz használjuk a python ** operátorát tört kitevővel.)
Egyszerű megoldás
import math class Cube(Cuboid): def __init__(self, side): Cuboid.__init__(self, side, side, side) def __get_volume(self): """Calculates the 'volume' property.""" return self.a ** 3 def __set_volume(self, volume): """Sets the 'volume' property.""" self.a = self.b = self.c = volume ** (1.0 / 3.0) volume = property(__get_volume, __set_volume, doc="""Gets or sets the volume of the cube.""")
Megoldás, melyben a cube osztály leszármazott osztályaiban is átírható lesz a __get_volume és a __set_volume függvény, mivel a property függvény csak implicit függvényekre hat:
class Cube(Cuboid): def __init__(self, side): Cuboid.__init__(self, side, side, side) def __get_volume(self): """Calculates the 'volume' property.""" return self.a ** 3 def ___get_volume(self): """Indirect accessor for 'volume' property.""" return self.__get_volume() def __set_volume(self, volume): """Sets the 'volume' property.""" self.a = volume ** (1.0 / 3.0) self.b = self.a self.c = self.a def ___set_volume(self, volume): """Indirect setter for 'volume' property.""" self.__set_volume(volume) volume = property(___get_volume, ___set_volume, doc="""Gets or sets the volume of the cube.""")
E megoldások használata:
>>> k = Cube(4) >>>> print k.surface 96 >>> print k.volume 64 >>> k.volume = 8 >>> print k.a 2.0
8.
Megoldás
9.
Megoldás
10.
Megoldás