7
votes

Comment répéter une fonction n fois

J'essaie d'écrire une fonction dans Python qui ressemble à: xxx pré>

f code> est une fonction qui prend un argument et n est un entier positif. p>

par exemple si je définis carré comme: p> xxx pré>

et j'ai appelé p>

repeated(square, 2)(3)


0 commentaires

7 Réponses :


3
votes

quelque chose comme ça? XXX


2 commentaires

C'est probablement, mais je pense que cela montre ce que l'OP veut construire.


Si vous modifiez le chèque à n == 0 et retourner lambda x: x dans ce cas, vous faites que votre approche fonctionne pour zéro aussi.



25
votes

qui devrait le faire: xxx

sortie: xxx

ou lambda sans valeur? xxx


0 commentaires

0
votes

Je pense que vous voulez la composition de la fonction: xxx


2 commentaires

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)



0
votes

voici une recette utilisant Réduire : xxx

i appelez ce alléaire , car c'est littéralement quelle est la fonction de puissance, avec Composition Remplacement de la multiplication.

(f,) * p crée un tuple de longueur p rempli avec f 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 ) - mais la note qu'il faudrait être créée à l'intérieur de la Lambda.

MyApply est défini dans la liste des paramètres de sorte qu'il soit créé uniquement une fois.


2 commentaires

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.



9
votes

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"


0 commentaires

1
votes

Utilisation de réduire et d'itheroTools.Repeat (comme le suggéra Marcin): xxx

Vous pouvez l'utiliser comme suit: xxx

(après Importation OS ou définissant carré respectivement)


0 commentaires

1
votes

Utilisez une recette iTertools appelée répéterfunc code> qui effectue cette opération.

donné fort> p> xxx pré>

Code strong> p>

de ITERTOOLS Recettes : p> xxx pré>

Démo strong> p>

facultatif: vous pouvez utiliser une bibliothèque tierce, plus_itétools code> , qui implémente facilement ces recettes: P>

import more_itertools as mit


list(mit.repeatfunc(square, 2, 3))
# [9, 9]


0 commentaires