web-dev-qa-db-fra.com

Plus de façon pythonique d'exécuter un processus X fois

Quel est le plus pythonique?

Boucle While:

count = 0
while count < 50:
    print "Some thing"
    count = count + 1

Pour la boucle:

for i in range(50):
    print "Some thing"

Edit: pas de duplication car cela permet de déterminer ce qui est le plus clair, par opposition à la manière de gérer une plage sans 'i' - même si cela a fini par être le plus élégant

69
Lionel

Personnellement:

for _ in range(50):
    print "Some thing"

si vous n'avez pas besoin de i. Si vous utilisez Python <3 et que vous souhaitez répéter la boucle plusieurs fois, utilisez xrange car il n'est pas nécessaire de générer la liste complète à l'avance.

86
Felix Kling

La boucle for est définitivement plus Pythonic, car elle utilise la fonctionnalité intégrée de niveau supérieur de Python pour transmettre ce que vous faites à la fois de manière plus claire et concise. Le surcoût de range vs xrange, et l'affectation d'une variable inutilisée i, proviennent de l'absence d'une instruction telle que l'instruction repeat de Verilog. La principale raison de rester fidèle à la solution for range est que les autres méthodes sont plus complexes. Par exemple:

from itertools import repeat

for unused in repeat(None, 10):
    del unused   # redundant and inefficient, the name is clear enough
    print "This is run 10 times"

L'utilisation de repeat au lieu de range est moins claire car sa fonction est moins connue et plus complexe parce que vous devez l'importer. Si vous avez besoin d'une référence, les principaux guides de style sont PEP 20 - Le zen de Python et PEP 8 - Guide de style pour Python Code .

Nous notons également que la version for range est un exemple explicite utilisé à la fois dans référence du langage et tutoriel , bien que dans ce cas, la valeur soit utilisée. Cela signifie que la forme sera forcément plus familière que l'extension while d'un style C pour une boucle.

2
Yann Vernier

Si vous êtes après les effets secondaires qui se produisent dans la boucle, je choisirais personnellement l'approche range().

Si vous vous souciez du résultat des fonctions que vous appelez dans la boucle, je préférerais une compréhension de la liste ou une approche map. Quelque chose comme ça:

def f(n):
    return n * n

results = [f(i) for i in range(50)]
# or using map:
results = map(f, range(50))
1
knutin