Informatika2-2013/Gyakorlat14

A MathWikiből
(Változatok közti eltérés)
34. sor: 34. sor:
 
<python>
 
<python>
 
[kifejezés for elem in bejárható_objektum]
 
[kifejezés for elem in bejárható_objektum]
 +
</python>
 +
<python>
 
[kifejezés for elem in bejárható_objektum if feltétel]
 
[kifejezés for elem in bejárható_objektum if feltétel]
 +
</python>
 +
<python>
 
[kifejezés for elem1 in bejárható_objektum1 if feltétel1
 
[kifejezés for elem1 in bejárható_objektum1 if feltétel1
 
           for elem2 in bejárható_objektum2 if feltétel2
 
           for elem2 in bejárható_objektum2 if feltétel2

A lap 2013. május 14., 08:09-kori változata

Tartalomjegyzék

Gyakorlat anyaga

A függvényközpontú programozás klasszikus elemei a Pythonban

A lambda kifejezések névtelen függvények, alakjuk:

lambda paraméterek: kifejezés

ahol a paraméterek egy esetleg üres lista, a kifejezés pedig egy elágazást, ciklust, return vagy yield utasítást nem tartalmazó (de esetleg feltételes) kifejezés lehet. Előnyük, hogy csak kifejezések, ezért más kifejezésekben is szerepelhetnek, és ha nem szükséges, nem kell nevet adni nekik. Csak nagyon egyszerű (félsoros) függvényekre használjuk!

lambda x: x ** 2
lambda x: "pozitív" if x > 0 else "nem pozitív"
lambda x, y: x + y

A ciklusok elkerülésére három egyszerű ,,klasszikus függvény szolgál:

  • megfeleltetés -- egy függvény egy bejárható (iterable) objektum minden elemére hat: map()
map(lambda x: x ** 2, [1, 2, 3, 4])  # [1, 4, 9, 16]
map(lambda x, y: x + y, [1, 2, 3, 4], [0, 10, 100, 1000]) 
                                # [1, 12, 103, 1004]
  • szűrés -- egy bejárható objektumnak csak azokat az elemeit tartjuk meg, amelyre egy függvény True értéket ad: filter()
filter(lambda x: x > 0, [-1, 2, -3, 4])  # [2, 4]


Listaértelmezések (list comprehensions) és generátorkifejezések

Megfeleltetés és szűrés másként

A fenti három függvény helyettesítésére szolgál a lista elemeinek a matematikában szokásos halmazmegadási módjára emlékeztető leírása, amelyben ciklus-szerű és feltétel-szerű nyelvi elem is szerepelhet. Alakjuk azonnal érthető:

[kifejezés for elem in bejárható_objektum]
[kifejezés for elem in bejárható_objektum if feltétel]
[kifejezés for elem1 in bejárható_objektum1 if feltétel1
           for elem2 in bejárható_objektum2 if feltétel2
           for elemN in bejárható_objektumN if feltételN]

Az utóbbi listaértelmezés a következő kóddal ekvivalens:

for elem1 in bejárható_objektum1:
    if not (feltétel1):
        continue
    for elem2 in bejárható_objektum2:
        if not (feltétel2):
            continue
        for elemN in bejárható_objektumN:
            if not (feltételN):
                continue
            kifejezés

Megadjuk a megfeleltetés és szűrés fenti első két példája e szintaktika szerinti változatát:

[x ** 2 for x in [1, 2, 3, 4]]  # [1, 4, 9, 16]
[x for x in [-1, 2, -3, 4] if x > 0]
Személyes eszközök