Lambda Funktion in Python

  • Ein interresantes Thema ist die Lambda Funktion in Python. Dazu möchte ich nur ein wenig dazu schreiben.


    Lambda Funktion


    Die Lambda Funktion wird bei diveintopython.net so beschrieben:

    Code
    1. >>> def f(x):
    2. ... return x*2
    3. ...
    4. >>> f(3)
    5. 6
    6. >>> g = lambda x: x*2
    7. >>> g(3)
    8. 6
    9. >>> (lambda x: x*2)(3)
    10. 6


    Also eine Formel definieren und ausrechnen lassen.


    Ich habe neulich einen interresanten Beitrag gelesen, da wurde eine Schulaufgabe mit dieser Funktion gelöset. Die Aufgabe war, finde die Zahlen die durch 2 geteilt mit dem Rest 1, durch 3 mit Rest 2, durch 4 mit Rest 3, 5 Rest 4, 6 Rest 5 und geteilt durch 7 mit Rest 0 im Bereich von 1 bis 1000.


    Also die Zahlen x/2 Rest 1 sind 1, 3, 5,... x/3 Rest 2 sind 5, 8, 11, 14...


    Programmtechnisch lässt die Aufgabe so ausdrücken:

    Code
    1. x % 2 = 1
    2. x % 3 = 2
    3. x % 4 = 3
    4. x % 5 = 4
    5. x % 6 = 6
    6. x % 7 = 0
    7. mit 1 <= x < 1000


    Lösungsweg


    Es gibt die Möglichkeit die Zahlen mit einer Formel auf den selben Nenner zu bringen und dann nach x auflösen.


    Da ich aber hier die lambda Funktion zeigen möchte, wähle ich den brutalen Weg, alle Zahlen von 1 bis 1000 nach diesen Bedienungen zu prüfen und auszuwerten.


    Dazu brauche ich eine Schleife welche die Zahlen von 1 bis 1000 durchläuft. Und mit IF Abfragen jeden Wert prüfen ob es passen würde.
    In etwa so:

    Code
    1. for i in range(1, 1001):
    2. if i % 2 == 1:
    3. if i % 3 == 2:
    4. ... usw


    Aber das ist ein sich wiederholender Code und ist verpöhnt. Denn bei einen Fehler oder Änderung muss an allen Stellen ausgebessert werden. Besser ist es eine Funktion zu schreiben die alle Werte überprüft.
    Das sieht für x % 2 = 1 so aus:

    Code
    1. funcs = lambda x: x % 2 == 1

    Und das Testergebniss in der Python Idle:

    Code
    1. >>> funcs = lambda x: x % 2 == 1
    2. >>> funcs(3)
    3. True
    4. >>> funcs(5)
    5. True
    6. >>> funcs(4)
    7. False


    Das könnte für jede Bedienung wiederholt werden, aber das wäre ebenso wieder Spagetticode.


    Es ist besser Iteratoren zu verwenden.
    Die Abfrage für geteilt durch 7 mit Rest mit append zu der erstellte Liste hinzufügen und dann die Liste mit einer zweiten Schleife abfragen und auswerten.


    fertiges Programm


    Dann sieht das fertige Programm so aus:

    Code
    1. funcs = [lambda x, n=n: x % n == n - 1 for n in range(2, 7)]
    2. funcs.append(lambda x: x % 7 == 0)
    3. for i in range(1, 1001):
    4. if all(f(i) for f in funcs):
    5. print(i)


    Die Idee zu diesem Beitrag habe ich von www.python-forum.de