Diminuer les boucles for en Python est-il impossible?


93

Je peux me tromper (faites-le moi savoir et je supprimerai la question) mais il semble que python ne répondra pas

for n in range(6,0):
    print n

J'ai essayé d'utiliser xrange et cela n'a pas fonctionné non plus. Comment puis-je mettre cela en œuvre?


Par curiosité, l'utilisez-vous pour quelque chose? Il est assez rare d'avoir besoin de cette fonctionnalité!
Katriel

@katrielalex Je l'utilise pour parcourir une matrice de droite à gauche. y a-t-il une manière différente que vous suggérez de le faire?
Gal du

vous pouvez essayer for i in reversed(mat):même si cela pourrait être plus lent
Katriel

Veuillez jeter un oeil à Imprimer une liste dans l'ordre inverse avec la gamme , il offre d'autres informations utiles.
RF

1
Veuillez jeter un oeil Imprimez une liste dans l'ordre inverse avec la gamme , la réponse acceptée l'explique très clairement.
RF du

Réponses:


216
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]

20
Betcha OP voulait vraiment range(5,-1,-1). Bien qu'il puisse probablement comprendre cela par essais et erreurs.
kojiro

42

C'est très tard, mais je voulais juste ajouter qu'il existe une manière plus élégante: utiliser reversed

for i in reversed(range(10)):
    print i

donne:

4
3
2
1
0

1
Qu'est-ce qui est élégant à ce sujet? Vous passez du temps à inverser une liste au lieu de la générer comme vous le souhaitez.
alexis

5
@alexis ça ne coûte rien. Vous obtenez reversed(range)gratuitement grâce à la belle range_reverseoptimisation intégrée à CPython. J'ai fait quelques points de repère rapides et je n'ai pas trouvé de différence de coût significative entre step=-1et reversed()dans les deux Python 2.7 et 3.3. Veuillez également noter que cet idiome est utilisé dans heapq .
kojiro

Merci, @kojiro, c'est intéressant. Mais à moins que vous ne l'utilisiez xrangedans vos tests Python 2.7, reverseil fonctionnera sur une liste ordinaire déjà générée, pas sur un objet range; alors dites-vous que n'importe quelle liste peut être efficacement inversée, ou juste des range/xrangeobjets? (le code heapq auquel vous liez implique un objet de plage Python 3).
alexis

@alexis Je ne serais pas assez audacieux pour suggérer que n'importe quelle liste peut être efficacement inversée - c'est une affirmation trop sans réserve pour que je puisse répondre de toute façon. Il est révélateur, cependant, que le code heapify est passé de step=-1à reversed()entre Python 2.3 et 2.4
kojiro

1
reversed(range(10))ne peut pas sortir 4via 0. Vous vouliez peut-être dire range(5)?
Abhijit Sarkar

13
for n in range(6,0,-1)

Cela vous donnerait 6,5,4,3,2,1

Pour ce qui est de

for n in reversed(range(0,6))

te donnerait 5,4,3,2,1,0




2

0 est la valeur conditionnelle lorsque cette condition est vraie, la boucle continuera à s'exécuter, 10 est la valeur initiale. 1 est le modificateur où peut être un simple décrément.

for number in reversed(range(0,10,1)):
print number;

1

En retard à la fête, mais pour toute personne chargée de créer la sienne ou souhaitant voir comment cela fonctionnerait, voici la fonction avec un bonus supplémentaire de réorganiser les valeurs de démarrage-arrêt en fonction de l'incrément souhaité:

def RANGE(start, stop=None, increment=1):
    if stop is None:
        stop = start
        start = 1

    value_list = sorted([start, stop])

    if increment == 0:
        print('Error! Please enter nonzero increment value!')
    else:
        value_list = sorted([start, stop])
        if increment < 0:
            start = value_list[1]
            stop = value_list[0]
            while start >= stop:
                worker = start
                start += increment
                yield worker
        else:
            start = value_list[0]
            stop = value_list[1]
            while start < stop:
                worker = start
                start += increment
                yield worker

Incrément négatif:

for i in RANGE(1, 10, -1):
    print(i)

Ou, avec start-stop inversé:

for i in RANGE(10, 1, -1):
    print(i)

Production:

10
9
8
7
6
5
4
3
2
1

Incrément régulier:

for i in RANGE(1, 10):
    print(i)

Production:

1
2
3
4
5
6
7
8
9

Incrément zéro:

for i in RANGE(1, 10, 0):
    print(i)

Production:

'Error! Please enter nonzero increment value!'

0

Pour python3 où -1indiquer la valeur à décrémenter à chaque étape for n in range(6,0,-1): print(n)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.