Informatika2-2013/Gyakorlat09

A MathWikiből
(Változatok közti eltérés)
210. sor: 210. sor:
 
class MyClass:
 
class MyClass:
 
     valt = 5
 
     valt = 5
+
   
def fv(self):
+
    def fv(self):
    return self.valt * 2
+
        return self.valt * 2
 
</python>
 
</python>
 
Itt a '''valt''' változó az osztályhoz tartozik, így elérhetjük például """MyClass.valt"""-al. Viszont, ha a '''fv'''-t próbáljuk hasonlóképpen elérni hibába ütközünk. Ez azért van, mert az osztályt nem közvetlenül szokták használni, hanem példányosítják:
 
Itt a '''valt''' változó az osztályhoz tartozik, így elérhetjük például """MyClass.valt"""-al. Viszont, ha a '''fv'''-t próbáljuk hasonlóképpen elérni hibába ütközünk. Ez azért van, mert az osztályt nem közvetlenül szokták használni, hanem példányosítják:
  
 
<python>
 
<python>
x = MyClass() # létrehozunk egy MyClass típusú objektumot
+
x = MyClass()       # létrehozunk egy MyClass típusú objektumot
x.fv() # így már menni fog a fv metódus
+
x.fv()               # így már menni fog a fv metódus
 
</python>
 
</python>
  
234. sor: 234. sor:
 
<python>
 
<python>
 
class Test:
 
class Test:
def __init__(self):
+
    def __init__(self):
print "Mostmar elhiszed?"
+
        print "Mostmar elhiszed?"
  
 
x = Test()
 
x = Test()
243. sor: 243. sor:
 
<python>
 
<python>
 
class Pelda:
 
class Pelda:
def fv(self, szam):
+
    def fv(self, szam):
self.v = szam
+
        self.v = szam
  
 
x = Pelda()
 
x = Pelda()
262. sor: 262. sor:
 
<python>
 
<python>
 
class Test:
 
class Test:
def __init__(self, szam):
+
    def __init__(self, szam):
self.x = szam
+
        self.x = szam
  
 
x = Test(15)
 
x = Test(15)
275. sor: 275. sor:
 
<python>
 
<python>
 
class Telefonkonyv:
 
class Telefonkonyv:
def __init__(self, nevek, telefonszamok):
+
    def __init__(self, nevek, telefonszamok):
pass
+
        pass
+
   
def hozzavesz(self, nev, telefonszam):
+
    def hozzavesz(self, nev, telefonszam):
pass
+
        pass
 
</python>
 
</python>
  
 
A '''pass''' kulcsszó csak azért van ott, mert pythonban minden blokkban kell lennie legalább egy parancsnak. A '''pass''' nem csinál semmit csak kitölti a teret.
 
A '''pass''' kulcsszó csak azért van ott, mert pythonban minden blokkban kell lennie legalább egy parancsnak. A '''pass''' nem csinál semmit csak kitölti a teret.

A lap 2013. április 9., 09:55-kori változata

Tartalomjegyzék

Ismétlés

  • Függvény definiálás:
def fv_neve(x, y):		# fv definiálás
    return x + y
 
fv_neve(2, 10)			# fv meghívás
  • Listák:
l = [4, 5, 7, 8, 9, 4, 6]
print l[2:5]
  • String, tuple, dictionary:
s = "The quick brown fox jumps over the lazy dog."  # string
t = (4, 5)  # tuple
 
d = {"alma":6, "korte":8, "banan":24}  # dictionary
  • Vezérlési szerkezetek:
x = 6
y = 43
if y > 21:
    print "y nagyobb"
elif y == 21:
    print "y egyenlo"
else:
    print "y kisebb"
 
l = [5, 4, 6, 2]
for i in l:
    print i ** 2
                  # 25 16 36 4
 
for i in range(len(l)):
    print l[i] ** 2
                  # 25 16 36 4
 
i = 0
while i < 5:
    print i ** 3
                  # 0 1 8 27 64
</pyhon>
 
* Futtatás:
** Interaktív: '''python'''
** File-ból: '''python file.py''' vagy ha adtuk futtatási jogot a file-nak, és a file elsõ két sora:
<python>
#!/usr/bin/python
#coding=UTF-8

Akkor a ./file.py is mûködik.

Input / Output

Help

Interaktív python-ban meghívva a help() függvényt egy segítség menübe jutunk. Próbáljátok ide beírni a következõket:

  • keywords
  • if
  • random

Output

Output már szerepelt a print kulcsszóval. Ez ugye bármilyen beépített típust képes volt kiírni, de ha formázni szeretnénk a kiírást akkor több dolog kell.

  • str() - string-et csinál más típusú objektumból, print valtozo és print str(valtozo) ekvivalens
  • repr() - nagyon hasonló a str()-hez, de kicsit többet mutat, próbáljátok ki: print str(2.5656454534543654) és print repr(2.5656454534543654)
  • A stringek format() metódusával a C printf függvényéhez kicsit hasonlóan kezelhetjük a stringeket, pl:
print 'Volt egyszer egy {}, elment a {}.'.format('kiskutya', 'vasarba')
  • A kapcsos zárójeleket lecseréli a format-nak adott stringekkel.
  • A kapcsos zárójelekbe írhatunk indexeket is, pl:
print 'Volt egyszer egy {1}, elment a {0}.'.format('vasarba', 'kiskutya')
  • Az indexek után :-ot téve további formázást adhatunk a string-nek, pl:
print '{0:15} ==> {1:15} = {2:15f}'.format('i = sqrt(-1)', 'i ** i valos', 0.207879)
  • Így legalább 15 karakter méretet foglalnak el a kiírásban az adott részek


Input

Input még nem szerepelt, két függvény van amit meg fogunk nézni:

  • input() - Kiírja a neki adott string-et, és vár egy bementet, a visszatérési értéke a bemenet automatikusan értelmezve, pl:
m = input("Magassag centimeterben:")
print "Magassag meterben:", m / 100.0
  • A következõ kód viszont hibát fog okozni:
n = input("Neved:")
print "Hello", n
  • Ez azért van, mert az input azonnal értelmezi a beadott adatot, és a string-eket nem tudja felismerni, õ ekkor változónévre gondol.
  • raw_input() - Kiírja a neki adott string-et, és vár egy bementet, a visszatérési értéke a bemenet stringként, pl:
n = raw_input("Neved:")
print "Hello", n

File kezelés

A file kezelés annyiban hasonlít a C-hez, hogy írásra vagy olvasásra kell megnyitnunk a file-okat, de sokkal hozzáférhetõbb. Függvények:

  • open(file_neve, megnyitasai_mod) - megnyit egy file-t, elsõ paramétere a file neve, második a megnyitási mód: 'w', 'a', 'r' a szokásosak. Pl:
f = open('test.txt', 'w')
  • write() - metódusa a file objektumoknak (az elõzõ példában f file objektum), a neki adott string-et a file-ba írja. Pl:
f.write("Which witch watches which witch's watches?\nKovetkezo sor\n")
  • read() - metódusa a file objektumoknak, beolvassa az egész file-t egy (potenciálisan) jó nagy string-be. Pl:
f = open('test.txt', 'r')
s = f.read()
print s
  • readline() - metódusa a file objektumoknak, beolvas egy sort a file-ból, az újsor jelet is beolvassa, az üres sorokat '\n'-ként olvassa be. Ha a file végére ért üres sort olvas be. Pl:
line = f.readline()
print line
  • readlines() - metódusa a file objektumoknak, beolvassa az összes sort mint listát. Pl:
lines = f.readlines()
for line in lines:
	print line
  • Megjegyzés: a file objektumok iterálhatóak, azaz az elõzõ példa ekvivalens ezzel:
for line in f:
	print line
  • close() - metódusa a file objektumoknak, bezárja a file-t. Pl:
f.close()


Feladatok

1. Hatványok kiírása

Írjatok python scriptet, ami bekér egy pozitív egész számot, majd kiírja a számok négyzetét 1-tõl kezdve eddig az egész számig, szépen formázva. Például az 10-re ezt a kimenetet adja:

  1       1
  2       4
  3       9
  4      16
  5      25
  6      36
  7      49
  8      64
  9      81
 10     100

A sor behúzások legyenek kellõen nagyok, hogy pl 100-ig szépen nézzen ki. Bónusz: hogyan lehetne megoldani, hogy bármilyen (értelmesen) nagy számra jól nézzen ki?

2. Telefonkönyv

Írjatok python scriptet, ami bekér egy nevet és egy telefonszámot, majd ezt megismétli még 4-szer. A telefonszámot reprezentálhatjuk string-el, vagy egész számmal ez rajtatok múlik. A neveket és telefonszámokat egy-egy listába tárolja el, majd kiírja szépen formázva.

3. Telefonkönyv file

Az elõzõ scriptet írjátok át úgy, hogy a telefonszámokat egy telefonkonyv.txt-be mentse el, a formázást itt jobb ha hanyagoljátok, soronként egy név és a hozzá tartozó telefonszám legyen pl vesszõvel elválasztva.

4. Telefonkönyvbõl olvasás

Most írjunk egy python scriptet, ami az elõzõ scriptünk által írt file-ból beolvassa az adatokat ugyanolyan listába mint azok a 2. feladatban voltak tárolva. Használjátok a stringek split() metódusát, erre egy példa:

s = "Volt egyszer egy kiskutya"
s2 = s.split()
print s2		# ['Volt', 'egyszer', 'egy', 'kiskutya']
 
s = "Volt egyszer egy kiskutya, elment a vasarba."
s2 = s.split(',')
print s2		# ['Volt egyszer egy kiskutya', ' elment a vasarba']

Osztályok

Az osztályok egységbe zárnak és a felesleges információt elrejtik. Például a file objektumaink file típusúak, meg van bennük írva a write(), stb metódus, de el van rejtve elõlünk a mûködése, mert nem kell tudnunk hogy van megvalósítva ahhoz hogy használni tudjuk. Osztályok változókból és metódusokból állnak.

Saját osztályt így definiálhatunk:

class MyClass:
    valt = 5
 
    def fv(self):
        return self.valt * 2

Itt a valt változó az osztályhoz tartozik, így elérhetjük például """MyClass.valt"""-al. Viszont, ha a fv-t próbáljuk hasonlóképpen elérni hibába ütközünk. Ez azért van, mert az osztályt nem közvetlenül szokták használni, hanem példányosítják:

x = MyClass()        # létrehozunk egy MyClass típusú objektumot
x.fv()                # így már menni fog a fv metódus

Így definiált objektumokhoz késõbb is hozzávehetünk még adattagokat:

x = MyClass()
x.ujValt = "Valami"
print x.ujValt
#print MyClass.ujValt ez nem menne, mert az ujValt az x objektumhoz tartozik és nem az osztályához

Osztályoknak léteznek speciális metódusai, ezekrõl részletesebben következõ gyakorlaton lesz szó, most nézzük csak az __init__-et. Ez az a függvény, ami meghívódik amikor létrehozunk egy ilyen típusú objektumot, azaz pl az x = MyClass() parancsnál ez hívódik. Aki nem hiszi próbálja lefuttatni ezt:

class Test:
    def __init__(self):
        print "Mostmar elhiszed?"
 
x = Test()

Mi ez a self amit mindig megadunk a metódusoknak? Ezzel a változóval hivatkozhatunk magára az objektumra amin meghívtuk az adott metódust, példából jobban érthetõ:

class Pelda:
    def fv(self, szam):
        self.v = szam
 
x = Pelda()
y = Pelda()
x.fv(5)
y.fv(15)
 
print x.v
print y.v
 
# Ez a fv metódus olyan volt, mintha már az x létrehozása után azt írtam volna, hogy x.v = 5

Amint látjátok a self változót nem kell nekünk átadnunk amikor meghívjuk a metódusokat, ez automatikusan megtörténik. (Pelda.fv(x, 5) <=> x.fv(5))

Ha az __init__ függvény nem csak a self-et, hanem más változókat is kap, akkor ezeket is meg kell adnunk, pl:

class Test:
    def __init__(self, szam):
        self.x = szam
 
x = Test(15)
print x.x

5. Osztály feladat - Telefonkönyv

Egészítsétek ki a következõ osztályt, hogy egy ilyen objektum létrehozásakor megadhassunk neki két listát amikben nevek és telefonszámok szerepelnek, ezeket tárolja el adattagként. Valamint a hozzavesz metódusa vegyen hozzá egy nevet és a hozzá tartozó telefonszámot a listákhoz.

class Telefonkonyv:
    def __init__(self, nevek, telefonszamok):
        pass
 
    def hozzavesz(self, nev, telefonszam):
        pass

A pass kulcsszó csak azért van ott, mert pythonban minden blokkban kell lennie legalább egy parancsnak. A pass nem csinál semmit csak kitölti a teret.

Személyes eszközök