def sub3(n):
return n - 3
def square(n):
return n * n
Es ist tot einfach Funktionen in Python zu komponieren:Wie multipliziert man Funktionen in Python?
>>> my_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [square(sub3(n)) for n in my_list]
[9, 4, 1, 0, 1, 4, 9, 16, 25, 36]
Leider, wenn die Zusammensetzung als Schlüssel verwenden will, es ist irgendwie lahm:
>>> sorted(my_list, key=lambda n: square(sub3(n)))
[3, 2, 4, 1, 5, 0, 6, 7, 8, 9]
Dies sollte wirklich sei einfach sorted(my_list, key=square*sub3)
, denn verdammt, Funktion __mul__
wird ohnehin für nichts anderes verwendet:
>>> square * sub3
TypeError: unsupported operand type(s) for *: 'function' and 'function'
Nun lassen Sie uns es dann definieren!
>>> type(sub3).__mul__ = 'something'
TypeError: can't set attributes of built-in/extension type 'function'
D'oh!
>>> class CoolerFunction(types.FunctionType):
... pass
...
TypeError: Error when calling the metaclass bases
type 'function' is not an acceptable base type
D'oh!
class Hack(object):
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
return self.function(*args, **kwargs)
def __mul__(self, other):
def hack(*args, **kwargs):
return self.function(other(*args, **kwargs))
return Hack(hack)
Hey, jetzt irgendwo ..
>>> square = Hack(square)
>>> sub3 = Hack(sub3)
>>> [square(sub3(n)) for n in my_list]
[9, 4, 1, 0, 1, 4, 9, 16, 25, 36]
>>> [(square*sub3)(n) for n in my_list]
[9, 4, 1, 0, 1, 4, 9, 16, 25, 36]
>>> sorted(my_list, key=square*sub3)
[3, 2, 4, 1, 5, 0, 6, 7, 8, 9]
Aber ich habe keine Hack
aufrufbare Klasse wollen wir bekommen! Die Scoping-Regeln sind völlig anders, was ich nicht vollständig verstehe, und das ist sogar noch hässlicher als das "Lameda". Ich möchte die Funktionen monkeypatch. Wie kann ich das machen?
nie etwas ähnlich wie diese gesehen haben, haben Sie versucht, mit 'partials' stattdessen ähnlich wie' Hack' aber vielleicht marginal besser – dashesy
Warum nicht: 'key = Lambda n: Quadrat (n) * sub3 (n)' –
@MalikBrahimi das ist nicht Funktion Zusammensetzung, die ist was Wim will. http: //en.wikipedia.org/wiki/Function_composition –