2017-12-06 2 views
-1

Ich übe mit der Funktion functools.reduce() mit einer Lambda-Funktion. Das Problem, das ich habe, ist, dass ich immer einen Fehler bekomme. Hier ist mein Code:<lambda>() dauert 1 pos

>>> from functools import reduce 
>>> import math 
>>> l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> reduce((lambda x: math.sqrt(x)), l) 

Und hier ist die Ausgabe:

TypeError: <lambda>() takes 1 positional argument but 2 were given 

zog ich habe in Klammern, aber nichts scheint zu funktionieren. Aus irgendeinem Grund funktioniert dieser Code nur fein:

>>> from functools import reduce 
>>> reduce((lambda x, y: x * y), [1, 2, 3, 4]) 
24 
>>> reduce((lambda x, y: x/y), [1, 2, 3, 4]) 
0.041666666666666664 

aber ich kann keinen Unterschied anders als sehen, dass das zweite Beispiel einen zweiten Parameter y hat. Kann jemand irgendeinen Rat geben, warum ich diesen Fehler bekomme?

+1

Beide Code-Beispiele, die Sie gezeigt haben, machen zwei völlig verschiedene Dinge. Einer erhält die Quadratwurzel seiner Eingabe (verwendet aber fälschlicherweise reduce), während der andere seine Eingabe quadriert (korrekt mit reduce) – smac89

+2

Die integrierte Funktion reduce erwartet als Argument eine andere Funktion von zwei Argumenten. Ihr Lambda hat nur ein Argument. https://docs.python.org/2/library/functions.html#reduce – Apollo2020

+0

Wie @ apollo2020 sagt. Um ** ** zu reduzieren, benötigen Sie eine Funktion, die ** 2 ** Argumente annimmt und sie in einen ** einzigen ** Wert verwandelt. Was genau erwartest du von deinem Output? – schwobaseggl

Antwort

2

Die korrekte Syntax lautet:

reduce(lambda acc, x: math.sqrt(x), l) 

Die lambda zu reduce weitergegeben erfordert zwei Argumente: das akkumulierte Ergebnis und den aktuellen Wert.

+0

Vielen Dank für die Klarstellung, ich lese die Dokumentation und sehe jetzt das Problem. –