Ugrás a fő tartalomra

Python nyelv alapjai Control Flow, függvények, osztályok, modulok

Python Control Flow


####################################################



# Legyen egy változónk

some_var = 5



# Ez egy if elágazás. A behúzás mértéke (az indentáció) jelentéssel bír a nyelvben!

# Ez a kód ezt fogja kiírni: "some_var kisebb 10-nél"

if some_var > 10:

    print "some_var nagyobb, mint 10."

elif some_var < 10:  # Az elif kifejezés nem kötelező az if szerkezetben.

    print "some_var kisebb 10-nél"

else:  # Ez sem kötelező.

    print "some_var kereken 10."



"""

For ciklusokkal végigiterálhatunk listákon

a kimenet:

    A(z) kutya emlős

    A(z) macska emlős

    A(z) egér emlős

"""

for animal in ["kutya", "macska", "egér"]:

    # A {0} kifejezéssel formázzuk a stringet, ld. korábban.

    print "A(z) {0} emlős".format(animal)



"""

"range(number)" visszatér számok listájával 0-től number-ig

a kimenet:

    0

    1

    2

    3

"""

for i in range(4):

    print i



"""

"range(lower, upper)" visszatér a lower és upper közti számok listájával

a kimenet:

    4

    5

    6

    7

"""

for i in range(4, 8):

    print i



"""

A while ciklus a feltétel hamissá válásáig fut.

a kimenet:

    0

    1

    2

    3

"""

x = 0

while x < 4:

    print x

    x += 1  # Rövidítés az x = x + 1 kifejezésre



# A kivételek try/except blokkokkal kezelhetőek



# Python 2.6-tól felfele:

try:

    # A "raise" szóval lehet hibát dobni

    raise IndexError("Ez egy index error")

except IndexError as e:

    pass  # A pass egy üres helytartó művelet. Itt hívnánk a hibakezelő kódunkat.

except (TypeError, NameError):

    pass  # Ha szükséges, egyszerre több hiba típus is kezelhető

else:  # Az except blokk után opcionálisan megadható

    print "Minden rendben!"  # Csak akkor fut le, ha fentebb nem voltak hibák

finally:  # Mindenképpen lefut

    print "Itt felszabadíthatjuk az erőforrásokat például"



# Az erőforrások felszabadításához try/finally helyett a with használható

with open("myfile.txt") as f:

    for line in f:

        print line







 Függvények


# A "def" szóval hozhatunk létre új függvényt

def add(x, y):

    print "x is {0} and y is {1}".format(x, y)

    return x + y  # A return szóval tudunk értékeket visszaadni





# Így hívunk függvényt paraméterekkel

add(5, 6)  # => a konzol kimenet "x is 5 and y is 6", a visszatérési érték 11



# Nevesített paraméterekkel (ún. "keyword arguments") is hívhatunk egy függvényt

add(y=6, x=5)  # Ez esetben a sorrendjük nem számít





# Változó számú paramétert fogadó függvény így definiálható.

# A * használatával a paramétereket egy N-esként kapjuk meg.

def varargs(*args):

    return args





varargs(1, 2, 3)  # => (1, 2, 3)





# Változó számú nevesített paramétert fogadó függvény is megadható,

# a ** használatával a paramétereket egy dictionary-ként kapjuk meg

def keyword_args(**kwargs):

    return kwargs





# Nézzük meg, mi történik

keyword_args(big="foot", loch="ness")  # => {"big": "foot", "loch": "ness"}





# A két módszer egyszerre is használható

def all_the_args(*args, **kwargs):

    print args

    print kwargs





"""

all_the_args(1, 2, a=3, b=4) kimenete:

    (1, 2)

    {"a": 3, "b": 4}

"""



# Függvények hívásakor a fenti args és kwargs módszerek inverze használható

# A * karakter kifejt egy listát külön paraméterekbe, a ** egy dictionary-t nevesített paraméterekbe.

args = (1, 2, 3, 4)

kwargs = {"a": 3, "b": 4}

all_the_args(*args)  # egyenértékű: foo(1, 2, 3, 4)

all_the_args(**kwargs)  # egyenértékű: foo(a=3, b=4)

all_the_args(*args, **kwargs)  # egyenértékű: foo(1, 2, 3, 4, a=3, b=4)





# A fenti arg és kwarg paraméterek továbbadhatóak egyéb függvényeknek,

# a * illetve ** operátorokkal kifejtve

def pass_all_the_args(*args, **kwargs):

    all_the_args(*args, **kwargs)

    print varargs(*args)

    print keyword_args(**kwargs)





# Függvény scope

x = 5





def set_x(num):

    # A lokális x változó nem ugyanaz, mint a globális x

    x = num  # => 43

    print x  # => 43





def set_global_x(num):

    global x

    print x  # => 5

    x = num  # a globális x-et 6-ra állítjuk

    print x  # => 6





set_x(43)

set_global_x(6)





# A pythonban a függvény elsőrendű (ún. "first class") típus

def create_adder(x):

    def adder(y):

        return x + y



    return adder





add_10 = create_adder(10)

add_10(3)  # => 13



# Névtelen függvények is definiálhatóak

(lambda x: x > 2)(3)  # => True

(lambda x, y: x ** 2 + y ** 2)(2, 1)  # => 5



# Léteznek beépített magasabb rendű függvények

map(add_10, [1, 2, 3])  # => [11, 12, 13]

map(max, [1, 2, 3], [4, 2, 1])  # => [4, 2, 3]



filter(lambda x: x > 5, [3, 4, 5, 6, 7])  # => [6, 7]



# A listaképző kifejezések ("list comprehensions") jól használhatóak a map és filter függvényekkel

[add_10(i) for i in [1, 2, 3]]  # => [11, 12, 13]

[x for x in [3, 4, 5, 6, 7] if x > 5]  # => [6, 7]



# halmaz és dictionary képzők is léteznek

{x for x in 'abcddeef' if x in 'abc'}  # => {'a', 'b', 'c'}

{x: x ** 2 for x in range(5)}  # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}







Osztályok




# Az object osztály egy alosztályát képezzük

class Human(object):

    # Osztály szintű mező: az osztály összes példányában azonos

    species = "H. sapiens"



    # Ez a függvény meghívódik az osztály példányosításakor.

    # Megjegyzés: a dupla aláhúzás a név előtt és után egy konvenció a python

    # előre definiált, a nyelv által belsőleg használt, de a felhasználó által

    # is látható objektumok és mezők neveire.

    # Ne vezessünk be új, ilyen elnevezési sémát használó neveket!

    def __init__(self, name):

        # A paramétert értékül adjuk a példány name attribútumának

        self.name = name



        # Inicializálunk egy mezőt

        self.age = 0



    # Példány metódus. Minden metódus első paramétere a "self", a példány maga

    def say(self, msg):

        return "{0}: {1}".format(self.name, msg)



    # Egy osztálymetódus az osztály összes példány közt meg van osztva.

    # Hívásukkor az első paraméter mindig a hívó osztály.

    @classmethod

    def get_species(cls):

        return cls.species



    # Egy statikus metódus osztály és példányreferencia nélkül hívódik

    @staticmethod

    def grunt():

        return "*grunt*"



    # Egy property jelölésű függvény olyan, mint egy getter.

    # Használatával az age mező egy csak-olvasható attribútummá válik.

    @property

    def age(self):

        return self._age



    # Így lehet settert megadni egy mezőhöz

    @age.setter

    def age(self, age):

        self._age = age



    # Így lehet egy mező törlését engedélyezni

    @age.deleter

    def age(self):

        del self._age





# Példányosítsuk az osztályt

i = Human(name="Ian")

print i.say("hi")  # kimenet: "Ian: hi"



j = Human("Joel")

print j.say("hello")  # kimenet: "Joel: hello"



# Hívjuk az osztály metódusunkat

i.get_species()  # => "H. sapiens"



# Változtassuk meg az osztály szintű attribútumot

Human.species = "H. neanderthalensis"

i.get_species()  # => "H. neanderthalensis"

j.get_species()  # => "H. neanderthalensis"



# Hívjuk meg a statikus metódust

Human.grunt()  # => "*grunt*"



# Adjunk új értéket a mezőnek

i.age = 42



# Kérjük le a mező értékét

i.age  # => 42



# Töröljük a mezőt

del i.age

i.age  # => AttributeError hibát dob





Modulok




# Modulokat így lehet importálni

import math



print math.sqrt(16)  # => 4.0



# Lehetséges csak bizonyos függvényeket importálni egy modulból

from math import ceil, floor



print ceil(3.7)  # => 4.0

print floor(3.7)  # => 3.0



# Egy modul összes függvénye is importálható

# Vigyázat: ez nem ajánlott.

from math import *



# A modulok nevei lerövidíthetőek

import math as m



math.sqrt(16) == m.sqrt(16)  # => True

# Meggyőződhetünk róla, hogy a függvények valóban azonosak

from math import sqrt



math.sqrt == m.sqrt == sqrt  # => True



# A Python modulok egyszerű fájlok.

# Írhatsz sajátot és importálhatod is.

# A modul neve azonos a tartalmazó fájl nevével.



# Így lehet megtekinteni, milyen mezőket és függvényeket definiál egy modul.

import math



dir(math)





# Ha van egy math.py nevű Python scripted a jelenleg futó scripttel azonos

# mappában, a math.py fájl lesz betöltve a beépített Python modul helyett.

# A lokális mappa prioritást élvez a beépített könyvtárak felett.

Megjegyzések