Informatika2-2012/Eloadas10

A MathWikiből
(Változatok közti eltérés)
(Kivételek)
(yield hogyan)
157. sor: 157. sor:
 
=== yield hogyan ===
 
=== yield hogyan ===
 
Memória barát funkcionális program elem, generátor
 
Memória barát funkcionális program elem, generátor
 +
 +
<python>
 +
def reverse(data):
 +
    for index in range(len(data)-1, -1, -1):
 +
        yield data[index]
 +
 +
>>> for char in reverse('golf'):
 +
...    print char
 +
...
 +
f
 +
l
 +
o
 +
g
 +
</python>
  
 
==== generátor ====
 
==== generátor ====
  
 
[http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained egy magyarázat]
 
[http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained egy magyarázat]

A lap 2012. április 17., 23:28-kori változata

Tartalomjegyzék

Osztályok és kivételek

Osztályok

Az osztályokat alapvetően egységbezárásra használják. Ami által a program tagolhatósága és újrahasznosítása nő.

Osztályok változókból és metódusokból állnak.

class MyClass:
  pass

Az előbbi kód egy alap gyűjtő osztályt reprezentál.

class MyClass:
  gvar = 667
 
  def fv(self):
    pass

A gvar változó a MyClass osztály szintű azaz az osztály nevével elérhető nem kell példányosítani. A fv metódus csak példányon hívható meg.

függvény metódus kapcsolata

>>> x = MyClass() # a myclass osztály példánya x
 
>>> MyClass.f(x)
'hello world'
>>> x.f()
'hello world'

Az osztály elemeit nem szükséges a definíció során megadni. Utólag is hozzáadhatjuk.

x.count = 1
x.count += 1
# es szinten torolheto is
del(x.count)

A python osztályok alapvetően nem valók absztrakt definiálásra, ebben van az egyszerűsége.

öröklés

>>> class A(object):
...   pass
... 
>>> a = A()
>>> a.t = 5
>>> a.t
5

Alapvetően minden osztály az object alosztálya. Az alosztály örökli az ős minden elemét.

Megegyezés szerint.

  • _elem - fél privát
  • __elem - privát

isinstance - lehet vizsgálni a példányt

>>> isinstance(object, int)
False
>>> isinstance(int, object)
True
>>> isinstance(x, object)
True

issubclass - a leszármazást lehet vele vizsgálni hasonló képen

Több osztályt is megadhatunk leszármazás során

class A(B,C):
  pass

konstruktor, operátorok

Az __init__ metódus az osztály konstruktorát reprezentálja. Amikor létrehozunk egy példányt az osztályból ez a függvény hívódik meg.

A __repr__ - a repr() által visszaadott elemet definiálhatjuk, hasonló képen a __str__ a str() fv-vel.

class Position3D:
  def __init__(self,x,y,z):
    self.pos = (x,y,z)
 
  def get_y():
    return self.pos[1]
 
  def __repr__(self):
    return 'This position is in:\n\tx: {0:d}, y: {1:d}, z:{2:d}'.format(self.pos[0],self.pos[1],self.pos[2])

További operátorok:

Kivételek

try:
  ...
except <exp> as <v>:
  ...
else:
  ...
finally:
  ...

A kivételek is osztályok, és azok is leszármaztathatók.

>>> class B():
...   pass
... 
>>> class C(B):
...   pass
... 
>>> class D(C):
...   pass
... 
>>> for c in [B,C,D]:
...   try:
...     raise c()
...   except D:
...     print "d"
...   except C:
...     print 'c'
...   except B:
...     print 'b'
... 
b
c
d

egy magyarázat

with értelmezése

Egyenértékű kód:

__enter__()
try:
  doSth()
finally:
  __exit__()

egy magyarázat

iterátorok

yield hogyan

Memória barát funkcionális program elem, generátor

def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]
 
>>> for char in reverse('golf'):
...     print char
...
f
l
o
g

generátor

egy magyarázat

Személyes eszközök