9
votes

Comment ajouter des fonctions

J'ai regardé partout, mais c'est un sujet difficile à rechercher sans beaucoup de bruit. Je veux faire quelque chose comme ceci: xxx

mais je reçois des erreurs sur l'affectation à la cubefunction comme: xxx

n'y a pas de fonction algèbre Possible en python ou je fais juste une erreur muette?

Edit: Beaucoup plus tard, je lisais l'introduction officielle de Python à la programmation fonctionnelle ( http://docs.python.org/howto/functional.html ), et vers le bas, il fait référence à un package tiers" fonctionnel "( http://oakwinter.com/code/functional/documentation/ ), qui peut composer des fonctions, à savoir: < / p> xxx


4 commentaires

Cependant, votre exemple semble indiquer que vous souhaitez soulever une valeur à la quatrième puissance et non cube.


J'imagine + est censé être la composition "gof"? (Ce n'est pas que cela aide à répondre à une réponse à surcharge + sur un objet de fonction ).


Oups, je veux dire (f + g) (x) ==> f (g (x)) ... Quoi qu'il en soit, je veux m'assurer que le terme - est clair. Il existe déjà une réponse montrant une technique d'utilisation d'un type intermédiaire / wrapper.


PST: Je n'ai pas vraiment pensé des détails, je vais comprendre ceux qui sont plus tard, je voulais juste ajouter des fonctions aux fonctions de manière naturelle. Aurait probablement dû être un peu plus clair ..


6 Réponses :


1
votes

Je pense que ce que vous voulez faire est:

cubefunction = (lambda x: add(f(x), f(x)))


1 commentaires

Non, je pense que ce qu'il tente de faire est de définir __ ajouter __ sur les fonctions.



6
votes

Je ne pense pas que vous puissiez faire cela. Cependant, en utilisant la méthode Magic code> __ code>, vous permet de définir votre propre classe appelable qui agit en tant que fonction et sur laquelle vous peut em> définir __ ajouter __ code>:

>>> from types import MethodType, FunctionType
>>> f = lambda: None
>>> f.__add__ = MethodType(lambda self, other: "summed!", f, FunctionType)
>>> f.__add__(f)
'summed!'
>>> f + f
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'function' and 'function'


6 commentaires

+1 pour montrer à l'aide d'un type intermédiaire et _ appel _ . Cependant, je pense que (f + g) (x) ==> f (g (x)) - c'est-à-dire la composition de la fonction.


@pst: heh c'est une notation icky. J'ai ajouté en composition pour l'OP.


@pst ouais, Katrieaslex est totalement juste à ce sujet. Les fonctions sont généralement prises pour être une bague. + est un ajout universellement ponctuel. * peut soit une multiplication ponctuelle ou composition (dans la mesure du possible).


RE: Question intéressante - "Pour les classes de style neuf, les invocations implicites de méthodes spéciales ne sont garantis que de fonctionner correctement si définis sur le type d'objet, pas dans le dictionnaire d'instance de l'objet." docs.python.org/reference/ ...


Oui, ce n'est pas la réponse que je cherchais, mais une réponse qui fonctionne, je sais sur appelez classes. Je vais marquer cela comme répondu si rien de mieux ne se présente mieux.


@Yoda: Python est très dynamique. Le prix que vous payez est que oui, vous pouvez faire des choses vraiment très mauvaises. Ce n'est pas la moitié d'entre eux.



1
votes

Dans votre code, F doit être une classe, pas une fonction. Si vous avez une classe, vous pouvez mettre en œuvre une méthode ajouter (auto, autre) qui surchargera l'opérateur +.


0 commentaires


1
votes

Eh bien, je pense avoir quelque chose d'intéressant pour ajouter des fonctions. Il s'agit de la fonction Lambda et cela pourrait résoudre votre problème. Au moins il est fixé mine: xxx

et pour ceux qui sont intéressés à passer des paramètres xxx


0 commentaires

1
votes

Un peu en retard, mais ce type d'algèbre peut être fait facilement à l'aide de fonctions Lambda: xxx

(f et g ne doit pas nécessairement être des fonctions Lambda)

Vous pouvez faire toutes sortes de choses intéressantes avec cela. Disons que vous voulez définir la fonction f (x) = 1 + x + x ** 2 + ... + x ** n pour un n . Vous pouvez faire: xxx

pour comprendre pourquoi j'ai fait la Lambda de cette façon ( lambda x, j = i + 1, k = f: ) est préférable de lire ceci: https://docs.python.org/3.5/faq/programming.html#why-do-lambdas-definefine-in-a-loop-with-Différent -Values-tout-retour-le-même-résultat

Long Histoire Short: Les paramètres d'une fonction Lambda n'ont pas de copie locale. Si j'avais utilisé le i de la boucle comme dans lambda x, k = f: k (x) + x ** (i + 1) , nous aurions eu La fonction f (x) = 1 + x ** 3 + x ** 3 + x ** 3 .


0 commentaires