Mit Funktionen in Python dividieren funktioniert falsch?
Hallo, leider funktioniert der Code, aber "vertauscht" die Zahlen. Wie kann ich das fixen?
from functools import partial
from operator import add, floordiv, mul, sub
def three(op=None):
return 3 if not op else op(3)
def seven(op=None):
return 7 if not op else op(7)
def plus(val):
return partial(add, val)
def minus(val):
return partial(sub, val)
def times(val):
return partial(mul, val)
def divided(val):
return partial(floordiv, val)
print(seven(divided(three()))) # --> 0
print(three(divided(seven()))) # --> 2
3 Antworten
Dein Programm würde so, wie du es dir vorstellst, nur funktionieren, indem du die Reihenfolge der Argumente für floordiv umtauschst (aktuell werden die Argumente nur nach Ausführungsreihenfolge angehängt: Erst die 3, dann die 7).
Da es sich hierbei allerdings um eine C-Funktion handelt, sind keyword-Argumente nicht möglich.
Du könntest dir stattdessen eine eigene Funktion für die Division schreiben:
def floor_division(a, b):
return floordiv(a, b)
Die kannst du dann in divided benutzen:
def divided(val):
return partial(floor_division, b=val)
return partial(floordiv, val)
gibt eine Funktion f(x) zurück, die val/x berechnet.
Wenn Du stattdessen x/val möchtest, versuche es mit
return lambda x: x//val
So wie ich das verstehe, passiert im ersten Fall folgendes:
(Von innen nach außen)
three() liefert eine 3.
divided(3) liefert eine Funktion, die floordiv mit dem Argument 3 aufrufen will.
In seven(divided(...)) wird diese Funtion dann gerufen (sie heißt dort op(7)). Die 7 ist ein extra Argument, das an die als Argument schon vorhandene 3 angehängt wird. Es wird also effektiv floordiv(3,7) aufgerufen.
Im zweite Fall wird das floordiv(7,3).
Der Trick von regex9 sollte helfen. Man kann dort auch ganz frech die Argumente von floordiv vertauschen.
Wie kann ich das dann ändern?