47 votes

Python idiomatique : boucle 'times

Disons que j'ai une fonction foo que je veux appeler n temps. En Ruby, j'écrivais :

n.times { foo }

En Python, je pouvais écrire :

for _ in xrange(n): foo()

Mais cela semble être une façon peu pratique de faire les choses.

Ma question : Existe-t-il un moyen idiomatique de faire cela en Python ?

43voto

TM. Points 20051

Vous avez déjà montré la manière idiomatique :

for _ in range(n): # or xrange if you are on 2.X
    foo()

Je ne vois pas ce que cela a de "pirate". Si vous avez un cas d'utilisation plus spécifique à l'esprit, veuillez fournir plus de détails, et il pourrait y avoir quelque chose de mieux adapté à ce que vous faites.

17voto

Carson Myers Points 11135

Si vous voulez le times et que vous devez l'utiliser dans vos propres fonctions, essayez ceci :

def times(self, n, *args, **kwargs):
    for _ in range(n):
        self.__call__(*args, **kwargs)

import new
def repeatable(func):
    func.times = new.instancemethod(times, func, func.__class__)
    return func

ajoutez maintenant un @repeatable à toute méthode pour laquelle vous avez besoin d'un times méthode sur :

@repeatable
def foo(bar):
    print bar

foo.times(4, "baz") #outputs 4 lines of "baz"

16voto

Alex Martelli Points 330805

Le plus rapide et le plus propre est itertools.repeat :

import itertools

for _ in itertools.repeat(None, n):
    foo()

9voto

msw Points 25319

La question présuppose que l'appel de foo() n temps est un a priori chose nécessaire. D'où vient N ? C'est la longueur de quelque chose d'itérable ? Ensuite, il faut itérer sur l'itérable. Au fur et à mesure que je me familiarise avec Python, je constate que je n'utilise que peu ou pas de valeurs arbitraires ; il y a une signification plus importante derrière vos n qui s'est perdue quand elle est devenue un nombre entier.

Plus tôt dans la journée, je suis tombé sur le document provocateur de Nicklaus Wirth pour IEEE Computer intitulé Les bonnes idées - De l'autre côté du miroir (archivé version pour les futurs lecteurs). Dans la section 4, il apporte un éclairage différent sur les constructions de programmation que tout le monde (y compris lui-même) considère comme acquises mais qui présentent des défauts d'expression :

"La généralité de l'Algol for La déclaration aurait dû être un avertissement d'avertissement à tous les futurs concepteurs pour toujours garder l'objectif principal d'une construction et de se méfier des généralités exagérées. généralité et de complexité exagérées, qui peuvent facilement devenir contre-productives."

L'algol for est équivalent à celui de C/Java for il en fait trop. Cet article est une lecture utile, ne serait-ce que parce qu'il nous pousse à ne pas prendre pour acquis tout ce que nous faisons si facilement. Donc peut-être qu'une meilleure question est "Pourquoi auriez-vous besoin d'une boucle qui s'exécute un nombre arbitraire de fois ?".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X