Informatika2-2014/Eloadas Python/1ZH

A MathWikiből
(Változatok közti eltérés)
(Új oldal, tartalma: „==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…”)
 
51. sor: 51. sor:
 
'''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.
 
'''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.
  
<python>
+
'''Megoldás'''
</python>
+
  
 
<python>
 
<python>
</python>
+
f = open("eredmenyek.txt", "r")
  
<python>
+
d = {}
</python>
+
for line in f:
 +
    l = line.split()
 +
    d[l[0]] = int(l[1])
  
<python>
+
print d
 
</python>
 
</python>
  
<python>
+
'''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.
</python>
+
 
 +
'''Megoldás'''
  
 
<python>
 
<python>
 +
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)
 
</python>
 
</python>
 +
 +
'''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.
  
 
<python>
 
<python>
 +
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()
 
</python>
 
</python>
 +
 +
 +
'''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'''
  
 
<python>
 
<python>
 +
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)
 
</python>
 
</python>
 +
 +
Használata:
  
 
<python>
 
<python>
 +
>>> t = Cuboid(3, 4, 5)
 +
>>> print t.surface
 +
94
 
</python>
 
</python>
 +
 +
 +
 +
'''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'''
  
 
<python>
 
<python>
 +
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.""")
 
</python>
 
</python>
 +
 +
'''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:
  
 
<python>
 
<python>
 +
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.""")
 
</python>
 
</python>
 +
 +
E megoldások használata:
  
 
<python>
 
<python>
 +
>>> k = Cube(4)
 +
>>>> print k.surface
 +
96
 +
>>> print k.volume
 +
64
 +
>>> k.volume = 8
 +
>>> print k.a
 +
2.0
 
</python>
 
</python>
 +
 +
 +
'''8.'''
 +
 +
'''Megoldás'''
  
 
<python>
 
<python>
 
</python>
 
</python>
 +
 +
'''9.'''
 +
 +
'''Megoldás'''
  
 
<python>
 
<python>
 
</python>
 
</python>
 +
 +
'''10.'''
 +
 +
'''Megoldás'''
  
 
<python>
 
<python>
 
</python>
 
</python>

A lap 2014. április 22., 21:42-kori változata

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

 
Személyes eszközök