Új hozzászólás Aktív témák

  • cousin333

    addikt

    válasz oszi666 #2659 üzenetére

    A lambda alapvetően egyszerű függvények helyett van, ami így nem foglal nevet, és kompaktabbul használható, mert nem kell előtte definiálni és elég egy sort írni. Nyilván nem kell mindig ezt használni, de néha jól jöhet.

    Egy példa a pandas modul használatával:

    import pandas as pd
    data = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

    Az eredmény egy indexelt "táblázat", oszlop fejlécekkel:
    A B
    0 1 4
    1 2 5
    2 3 6

    Tegyük fel, hogy egy számításhoz minden sorban össze akarom adni az A oszlop köbét és a B oszlop felét. Hogyan lehet ezt megcsinálni? Létezik az apply() metódus, ami soronként, vagy oszloponként végigmegy a táblázaton, és az első argumentumban megadott függvényt futtatja. Az első megoldás, hogy készítünk egy függvényt, majd ezt használjuk:

    def process(sor):
        return sor.A**3 + sor.B / 2

    data.apply(process, axis=1)

    Az eredmény:
    0 3.0
    1 10.5
    2 30.0
    dtype: float64

    A megoldás tehát működik, viszont a process mostantól egy foglalt név (vagy felülír egy korábbit) olyasvalamire, amit talán soha többé nem használunk. Ráadásul írtunk 2 extra sort. Ugyanez lambda függvénnyel jóval egyszerűbb:

    data.apply(lambda x: x.A**3 + x.B/2, axis=1)

    A helyzet hasonló a list comprehension-hoz. Azt is meg tudod oldani for ciklussal, de miért írnád azt, hogy

    a = [1, 2, 3, 4, 5, 6, 7, 8]
    b = []
    for elem in a:
        if elem % 2 == 0:
            b.append(elem**2)

    ha írhatod jóval egyszerűbben (és gyorsabban) is:

    a = [1, 2, 3, 4, 5, 6, 7, 8]
    b = [elem**2 for elem in a if a % 2 == 0]

    Sőt, utóbbi esetben, ha mondjuk alapvetően csak ezen négyzetszámoknak az összegére vagyunk kíváncsiak, akkor azt is írhatjuk, hogy:

    szumma = sum(elem**2 for elem in a if a % 2 == 0)

    és akkor nem számoltunk ki és tároltunk el feleslegesen egy egész listát.

    [ Szerkesztve ]

    "We spared no expense"

Új hozzászólás Aktív témák