Les itérateurs de Python sont super et tous, mais parfois, je veux vraiment un style C pour boucle - pas une boucle de foresach. Par exemple, j'ai une date de début et une date de fin et je veux faire quelque chose pour chaque jour dans cette plage. Je peux le faire avec une boucle de temps, bien sûr:
current = start
while current <= finish:
do_stuff(current)
current += timedelta(1)
4 Réponses :
Pour les raisons d'itération seulement, vous devriez réellement utiliser xrange strong> sur la plage sur la plage, puisque Xrange retournera simplement un itérateur, tandis que la plage créera un objet de liste réelle contenant la gamme entièrement entière du premier au dernier. -1 (qui est évidemment moins efficace lorsque tout ce que vous voulez est une simple boucle de boucle): En outre, il y a énumérable, qui retourne un objet énumérable qui donnera un nombre incrémené et le Valeur d'une collection, à savoir: p> résultat: p>
-1 tester les réponses avant de publier. Le résultat est typeError: un entier est requis code>. Tous les arguments de xRange () code> doivent être entiers.
xrange code> aurait dû être nommé irrange code> car il renvoie un itérateur alors que plage code> doit toujours renvoyer une liste; La seule contrainte sur xrange code> devrait être que suivent = commencer; suivant = prochain + étape; Jusqu'à la prochaine == fin code>, c'est-à-dire que Démarrer code> doit être code> __ ajouter __ code> Capable to étape code> et le résultat doit être __ CMP __ < / code> capable de fin code>
La manière élégante et pythonique de le faire consiste à encapsuler l'idée d'une gamme de dates dans son propre générateur, puis utilisez ce générateur dans votre code: impressions: P > Ceci est similaire à la réponse à propos de plage code>, sauf que la plage code> intégrée code> ne fonctionne pas avec les date Nous devons créer la nôtre, mais au moins nous pouvons le faire juste une fois de manière encapsulée. p> p>
+1 Non seulement parce que c'est la seule réponse à laquelle fonctionne réellement b> mais aussi la bacause c'est le bon. Sérieusement, ne vérifiez pas les réponses que est bonne i>
le faire de manière compacte, ce n'est pas facile dans Python, car l'un des concepts de base de la langue n'est pas capable de faire des missions sur des comparaisons.
Pour quelque chose de complexe, comme une date, je pense que la réponse de NED est génial, mais pour des cas plus faciles, j'ai trouvé très utile la fonction iteroTools.Count (), qui renvoie des chiffres consécutifs. p> Je l'ai trouvé moins sujet d'erreur, Comme vous l'avez dit, comme vous l'avez dit, d'oublier le 'actuel + = 1'. Pour moi, il semble plus naturel de faire une boucle infinie puis de vérifier une condition finale. P> p>
Wtf? Pourquoi pas seulement utiliser pour i in xrange (début, fin): code>?
Cela fonctionnera dans une pincée:
def cfor(start, test_func, cycle_func):
"""A generator function that emulates the most common case of the C for
loop construct, where a variable is assigned a value at the begining, then
on each next cycle updated in some way, and exited when a condition
depending on that variable evaluates to false. This function yields what
the value would be at each iteration of the for loop.
Inputs:
start: the initial yielded value
test_func: called on the previous yielded value; if false, the
the generator raises StopIteration and the loop exits.
cycle_func: called on the previous yielded value, retuns the next
yielded value
Yields:
var: the value of the loop variable
An example:
for x in cfor(0.0, lambda x: x <= 3.0, lambda x: x + 1.0):
print x # Obviously, print(x) for Python 3
prints out
0.0
1.0
2.0
3.0
"""
var = start
while test_func(var):
yield var
var = cycle_func(var)