lamda in Python?

2 Antworten

warum dsum und dann die klammern?

Es handelt sich um einen rekursiven Aufruf. Die Funktion ruft sich selbst auf. In Klammern befinden sich die Parameter, die der Funktion übergeben werden.

Was ich auch noch nicht verstehe ist dieses
if n else s

Da kommen gleich mehrere Dinge zusammen. Zum einen ein hässliches Pythonkonstrukt und zum anderen die Anwendung dieses Konstrukts in einer schlecht verständlichen Form.

1.) Mittels

<Value for True> if <Condition> else <Value for False>

kannst du in einem Lambda-Ausdruck eine If-Abfrage machen. Hässlich ist dieses Konstrukt, da die Bedingung, nicht wie bei "normalen" If-Abfragen am Anfang, sondern in der Mitte steht.

2.) In der Bedingung wird hier ein impliziter Typcast vorgenommen. "n" ist eigentlich eine Zahl. Diese wird allerdings implizit in ein bool gecastet. Das ergibt "True", wenn (n == 0) und ansonsten "False".

Derartige implizite Umwandlungen sind allerdings nicht wirklich übersichtlich, da sollte man sich lieber bequemen und die entsprechenden Tests ausschreiben. Das ergäbe dann:

dsum = lambda n, s=0: dsum(n // 10, s + n % 10) if (n == 0) else s
Ich möchte die Quersumme einer Zahl berechnen. Die Quersumme soll nicht größer als 9 sein.

Das nennt man iterative Quersumme und ist viel einfacher zu berechnen. Etwa so:

itdsum = lambda n: 1 + ((n-1) % 9) if n != 0 else 0
n und s sind die Parameter von lamda. Wie geht es dann weiter, warum dsum und dann die klammern?

Es handelt sich um einen rekursiven Aufruf. Die Funktion ruft sich also selbst wieder auf. Das folgt einem typischen Schema: man knabbert einen Teil des Problems weg und ruft sich selber bis zu einer Abbruchbedingung mit dem Rest davon wieder auf. Lässt sich auch iterativ machen, aber rekursiv und noch dazu in ein Lambda gepackt natürlich viel cooler :-)

Was soll diese Anweisung bedeuten?

Das ist eine kompakte if-else-Form, die in einen einzigen Ausdruck gepackt wird. Ein Lambda darf nur einen Ausdruck enthalten.


alfredo153  21.10.2020, 12:02

Ach ja, vielleicht verwirrt dich das "if n". In Python haben auch nicht boolsche Werte einen Wahrheitswert, ohne dass man sie explizit in ein bool umwandeln muss (was man als Aufweichung der strengen Typisierung sehen kann...).

So sind die Werte None, [] (leere Liste) und 0 "falsy", werden also als false betrachtet. Es ist daher nicht nötig, explizit mit == 0 zu vergleichen. (Ich mach's trotzdem, weil es für Leser ein bisschen klarer ist.)

0