Chaque jour, j'aime de plus en plus python.
Aujourd'hui, j'écrivais du code comme:
for i in xrange(N):
do_something()
J'ai dû faire quelque chose N fois. Mais chaque fois ne dépendait pas de la valeur de i
(variable d'index). J'ai réalisé que je créais une variable que je n'avais jamais utilisée ( i
), et j'ai pensé "Il y a sûrement une manière plus pythonique de faire cela sans avoir besoin de cette variable d'index inutile."
Alors ... la question est: savez-vous comment faire cette tâche simple d'une manière plus (pythonique) belle?
coding-style
for-loop
python
Manuel Aráoz
la source
la source
range
plutôt.Réponses:
Une approche légèrement plus rapide que le bouclage
xrange(N)
est:la source
Utilisez la variable _, comme je l'ai appris lorsque j'ai posé cette question , par exemple:
la source
J'utilise juste
for _ in range(n)
, c'est droit au but. Cela va générer la liste complète des nombres énormes dans Python 2, mais si vous utilisez Python 3, ce n'est pas un problème.la source
puisque la fonction est un citoyen de première classe, vous pouvez écrire un petit wrapper (à partir des réponses d'Alex)
alors vous pouvez passer la fonction comme argument.
la source
Le _ est la même chose que x. Cependant, c'est un idiome python utilisé pour indiquer un identifiant que vous n'avez pas l'intention d'utiliser. En python, ces identificateurs ne prennent pas de mémoire ni n'allouent d'espace comme le font les variables dans d'autres langages. C'est facile de l'oublier. Ce ne sont que des noms qui pointent vers des objets, dans ce cas un entier à chaque itération.
la source
J'ai trouvé les différentes réponses très élégantes (en particulier celles d'Alex Martelli) mais je voulais quantifier les performances de première main, alors j'ai concocté le scénario suivant:
J'ai également proposé une solution alternative qui s'appuie sur celle de Martelli et utilise
map()
pour appeler la fonction de charge utile. OK, j'ai un peu triché en ce sens que j'ai pris la liberté de faire accepter à la charge utile un paramètre qui est rejeté: je ne sais pas s'il existe un moyen de contourner cela. Néanmoins, voici les résultats:donc l'utilisation de la carte donne une amélioration d'environ 30% par rapport à la boucle standard pour et 19% supplémentaires par rapport à celle de Martelli.
la source
Supposons que vous ayez défini do_something comme une fonction et que vous souhaitiez l'exécuter N fois. Vous pouvez peut-être essayer ce qui suit:
la source
fn() for fn in itertools.repeat(do_something, N)
et enregistrer la pré-génération du tableau ... c'est mon idiome préféré.Qu'en est-il d'une simple boucle while?
Vous avez déjà la variable; pourquoi ne pas l'utiliser?
la source