Oto bardziej interesujące wdrożenie wielu linii lambd. Nie jest to możliwe ze względu na to, jak Python używa wcięć jako sposobu strukturyzacji kodu.
Ale na szczęście dla nas formatowanie wcięć można wyłączyć za pomocą tablic i nawiasów.
Jak niektórzy już zauważyli, możesz napisać kod jako taki:
lambda args: (expr1, expr2,... exprN)
Teoretycznie, jeśli masz gwarancję oceny od lewej do prawej, to zadziałałoby, ale nadal tracisz wartości przekazywane z jednego wyrażenia na drugie.
Jednym ze sposobów osiągnięcia tego, co jest nieco bardziej szczegółowe, jest posiadanie
lambda args: [lambda1, lambda2, ..., lambdaN]
Gdzie każda lambda otrzymuje argumenty od poprzedniego.
def let(*funcs):
def wrap(args):
result = args
for func in funcs:
if not isinstance(result, tuple):
result = (result,)
result = func(*result)
return result
return wrap
Ta metoda pozwala napisać coś, co jest nieco seplenienie / schematem.
Możesz więc pisać takie rzeczy:
let(lambda x, y: x+y)((1, 2))
Do obliczenia przeciwprostokątnej można zastosować bardziej złożoną metodę
lst = [(1,2), (2,3)]
result = map(let(
lambda x, y: (x**2, y**2),
lambda x, y: (x + y) ** (1/2)
), lst)
Spowoduje to zwrócenie listy liczb skalarnych, dzięki czemu można jej użyć do zmniejszenia wielu wartości do jednej.
Posiadanie tak wielu lambda z pewnością nie będzie bardzo wydajne, ale jeśli jesteś ograniczony, może to być dobry sposób na szybkie zrobienie czegoś, a następnie przepisanie go jako rzeczywistej funkcji później.