J'essaie d'écrire une fonction dans Python qui ressemble à: où par exemple si je définis carré comme: p> et j'ai appelé p> f code> est une fonction qui prend un argument et
n est un entier positif. p>
repeated(square, 2)(3)
7 Réponses :
quelque chose comme ça?
C'est probablement, mais je pense que cela montre ce que l'OP veut construire.
Si vous modifiez le chèque à n == 0 code> et retourner
lambda x: x code> dans ce cas, vous faites que votre approche fonctionne pour zéro aussi.
qui devrait le faire: sortie: p> ou lambda code> sans valeur? p>
Je pense que vous voulez la composition de la fonction:
Notez que OP demande une fonction supérieure de commande. Vous avez créé une fonction récursive qui applique à plusieurs reprises la même fonction. Pas exactement pareil.
Cette réponse suggère def compose (f, x, n): retour functools.Reduce (Lambda x, _: f (x), plage (n), x) code>
voici une recette utilisant i appelez ce Réduire code>:
alléaire code>, car c'est littéralement quelle est la fonction de puissance, avec Composition Remplacement de la multiplication. P>
(f,) * p code> crée un tuple de longueur
p code> rempli avec
f code> dans chaque index . Si vous vouliez avoir une fantaisie, vous utiliseriez un générateur pour générer une telle séquence (voir
iTertools code>) - mais la note qu'il faudrait être créée à l'intérieur de la Lambda. P>
MyApply code> est défini dans la liste des paramètres de sorte qu'il soit créé uniquement une fois. p> p>
Pour Big P, cela a l'inconvénient de construire explicitement un tuple de longueur n.
@ Uwekleine-König Oui, c'est pourquoi il y a 5 ans, j'ai mentionné utiliser des générateurs Itertools comme alternative.
Utiliser réduire code> et lamba.
Construisez un tuple commençant par votre paramètre, suivi de toutes les fonctions que vous souhaitez appeler:
>>> path = "/a/b/c/d/e/f"
>>> reduce(lambda val,func: func(val), (path,) + (os.path.dirname,) * 3)
"/a/b/c"
Utilisation de réduire et d'itheroTools.Repeat (comme le suggéra Marcin): Vous pouvez l'utiliser comme suit: p> (après Importation OS code> ou définissant
carré code> respectivement) p> p>
Utilisez une recette iTertools appelée donné fort> p> de ITERTOOLS Recettes : p> Démo strong> p> facultatif: vous pouvez utiliser une bibliothèque tierce, répéterfunc code> qui effectue cette opération.
plus_itétools code>
, qui implémente facilement ces recettes: P> import more_itertools as mit
list(mit.repeatfunc(square, 2, 3))
# [9, 9]