Függvényekről

Végignéztem a bejegyzéseket, és meglepődtem, hogy még nem írtam semmit a függvényekről. Nos, ezt sürgősen pótolni akartam!

Elöljáróban annyit, hogy ugye nem felejtjük el, hogy pythonunkban minden objektum, ezért a függvényeink is azok, viszont a "főprogramunk" is objektum, ezért minden toplevel szinten kreált függvényünk egyben metódus is. Aki nem tudja mi az a metódus, ne foglalkozzon vele, hamarosan ejtünk róla szót.


Nos, mi is a függvény? Nagyon tömören: paraméterekkel hívható parancs, amelynek van valamilyen visszatérési értéke. Saját függvények alkotásával kibővíthetjük a python parancskészletét, és gyakran használatos feladatokat a programunkban egy parancs beírásával adhatunk meg. Mondok is egy példát! Tételezzük fel, hogy azt szeretnénk, hogy programunk minden üzenet kiírásakor a szöveg elé és mögé tegyen három csillagot. Megtehetjük ezt úgy is, hogy minden stringünkbe így írjuk be a szöveget. Persze, miért is ne? Igaz, hogy forráskódunk tekintélyes részét a csillag karakter fogja kitenni... De mi van akkor, ha meggondoljuk magunkat, és nem 3 hanem 4 csillagot akarunk majd kiiratni? Átírjuk az összes stringet? Három darabnál ez nem gond, de 300-nál vagy 3000-nél már bosszantóan sok unalmas gépelést jelent, ráadásul téveszthetünk is :( Mi lenne, ha erre lenne egy programrészletünk, ami ezt mindig elvégezné nekünk? Nos ez lenne a függvény! A python eleve rengeteg beépített függvényt tartalmaz, természetesen ilyen csillagozót nemigazán, ezt nekünk kell megadnunk.

A függvények létrehozása a def kulcsszóval történik, a következő módon:

def fuggveny(param1):
    """Ez egy függvény"""
    # ... jelenleg nem sokat csinál
    print "semmi"
    return None 

A def kulcsszót a függvény neve követi, majd utána zárójelben a függvénynek átadandó paramétereket soroljuk fel, jelen esetben ez csak egy, param1 nevű paramétert jelent. Ezután adhatunk a függvénynek egy docstringet, amiben leírhatjuk pár szóval, hogy mit csinál, majd megírjuk a függvény törzsét. A függvény visszatérésekor a None értéket adja vissza.

Nos, ezek alapján belecsaphatunk a csillagozó függvényünkbe! Mit is szeretnénk? Át szeretnénk adni egy szöveget a függvénynek, a függvény a kapott szöveg elé és mögé berak három-három csillagot, majd visszaadja nekünk:

def csillagozo(szoveg):
    """Ez a függvény a paraméterként kapott szöveg elé és
    mögé három-három csillagot rak
    
    @param szoveg: az átadott szöveg
    @return: a csillagozott szöveg"""
    
    szoveg = '*** ' + szoveg + ' ***'
    return szoveg


>>> print csillagozo('Helló Világ!')
*** Helló Világ! ***


Láthatjuk, hogy csillagozó függvényünk remekül működik.

De mi van akkor, ha nem csillagot akarunk, vagy nem hármat? Nos a legegyszerűbb dolog, hogy átírjuk a függvényünket univerzálisra, ahol megadhatjuk milyen karaktert szeretnénk a szöveg elé és mögé tenni, valamint abból hány darabot.
Lássuk:

def diszito(szoveg,karakter,darab):
    """Ez a függvény a paraméterként kapott szöveg elé és
    mögé 'darab' számú 'karakter'-t rak
    
    @param szoveg: az átadott szöveg
    @param karakter: a díszítő karakter
    @param darab: a díszítő karakterek száma
    
    @return: a díszített szöveg"""

    disz = karakter * darab
    szoveg = disz + ' ' + szoveg + ' ' + disz
    return szoveg



>>> print diszito('Helló Világ!','#',4)
#### Helló Világ! ####


Egyszerű, nem? Most már csak egy kényelmi funkció lenne jó a függvényünkbe. Ha nem adjuk meg a díszítő karaktert, illetve a darabszámot, akkor tegyen automatikusan *-ot, és abból is hármat:

def diszito(szoveg,karakter='*',darab=3):
    """Ez a függvény a paraméterként kapott szöveg elé és
    mögé 'darab' számú 'karakter'-t rak
    
    @param szoveg: az átadott szöveg
    @param karakter: a díszítő karakter
    @param darab: a díszítő karakterek száma
    
    @return: a díszített szöveg"""
    
    disz = karakter * darab
    szoveg = disz + ' ' + szoveg + ' ' + disz
    return szoveg



>>> print diszito('Na ez most milyen lesz?')
*** Na ez most milyen lesz? ***


A függvény definíciójakor a függvény paramétereinek adhatunk alapértelmezett értékeket, így ha ezek a függvény hívásakor nem kerülnek megadásra, a függvény az alapértelmezett értékeket használja. Egy megkötésünk van csak, a függvény hívásakor a paraméterek sorrendjét be kell tartani. Ettől eltérhetünk, ha nevesítve adjuk meg ezeket a paramétereket, és így hívjuk meg a függvényünket:


>>> print diszito('Na ez most milyen lesz?',karakter='$')
$$$ Na ez most milyen lesz? $$$
>>> print diszito('Na ez most milyen lesz?',darab=5)
***** Na ez most milyen lesz? *****


Szóba kerültek a metódusok. Nos ezek tulajdonképpen függvények, de egy objektumhoz tartozó, annak belső függvényei, definíciójuk egy osztály definíción belül történik. Hívásuk:


objektumnev.fuggveny(parameterek)


Nos ennyit szerettem volna a függvényekről kezdésnek írni kezdőknek :)

6 megjegyzés:

  1. A pythont magát is függvények építik fel?

    VálaszTörlés
  2. Nem, objektumok, de azok metódusai ugye maguk is függvények...

    VálaszTörlés
  3. De akkor az objektumok is tekinthetők összetett függvényeknek és az osztályok is?

    VálaszTörlés
  4. Nem. A függvénynek vannak bemenő paraméterei (argumentumai), van egy műveletsor amit elvégez velük, rajtuk, majd visszatér egy értékkel. Az objektumnak vannak tulajdonságai (amik csak arra az objektumra jellemzőek, minden mástól függetlenek), és vannak metódusai, amik az objektum osztályára jellemző függvények. Az objektum egy osztály "megvalósulása", míg az osztály "csak" egy leíró entitás, ami megfogalmazza, hogy az őbelőle megalkotott objektumnak milyen tulajdonságai és metódusai vannak. Alaphelyzetben az osztály nem való másra.

    VálaszTörlés
  5. De ha a python maga is rendelkezik bemenő paraméterekkel, hiszen programozható, úgymond "feltöltjük", és van egy műveletsor ami lefut, valamint visszaad egy értéket, magát a kész programot, amit programoztunk vele, akkor tekinthető egy bonyolultabb függvénynek?

    VálaszTörlés
  6. Az operációs rendszer szempontjából tekinthető meghívott függvénynek, de a visszaadott érték nem a kész program.

    VálaszTörlés