12
votes

Est-ce que Python a-t-il d'équivalent en boucle (pas de prévoyance)

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)


0 commentaires

4 Réponses :


-2
votes

Pour les raisons d'itération seulement, vous devriez réellement utiliser xrange 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): xxx

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: xxx

résultat: xxx


2 commentaires

-1 tester les réponses avant de publier. Le résultat est typeError: un entier est requis . Tous les arguments de xRange () doivent être entiers.


xrange aurait dû être nommé irrange car il renvoie un itérateur alors que plage doit toujours renvoyer une liste; La seule contrainte sur xrange devrait être que suivent = commencer; suivant = prochain + étape; Jusqu'à la prochaine == fin , c'est-à-dire que Démarrer doit être __ ajouter __ Capable to étape et le résultat doit être __ CMP __ < / code> capable de fin



29
votes

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: xxx

impressions: xxx

Ceci est similaire à la réponse à propos de plage , sauf que la plage intégrée 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.


1 commentaires

+1 Non seulement parce que c'est la seule réponse à laquelle fonctionne réellement mais aussi la bacause c'est le bon. Sérieusement, ne vérifiez pas les réponses que est bonne



2
votes

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. xxx

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.


1 commentaires

Wtf? Pourquoi pas seulement utiliser pour i in xrange (début, fin): ?



1
votes

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)


0 commentaires