¿Es imposible disminuir los bucles for en Python?

94

Podría estar equivocado (solo avíseme y eliminaré la pregunta) pero parece que Python no responderá

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

Intenté usar xrange y tampoco funcionó. ¿Cómo puedo implementar eso?

Galón
fuente
Por curiosidad, ¿estás usando esto para algo? ¡Es bastante poco común necesitar esta funcionalidad!
Katriel
@katrielalex Lo uso para iterar sobre una matriz de derecha a izquierda. ¿Hay alguna forma diferente en la que sugieres que debería hacerlo?
Gal
podría intentarlo, for i in reversed(mat):aunque podría ser más lento
Katriel
Por favor, eche un vistazo a Imprimir una lista en orden inverso con rango . Ofrece otra información útil.
RF
1
Por favor, eche un vistazo Imprima una lista en orden inverso con rango , la respuesta aceptada lo explica muy claramente.
RF

Respuestas:

217
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]
Steve Tjoa
fuente
20
Apuesto a que OP realmente quería range(5,-1,-1). Aunque probablemente podría averiguarlo por ensayo y error.
kojiro
42

Esto es muy tarde, pero solo quería agregar que hay una forma más elegante: usar reversed

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

da:

4
3
2
1
0
pratikm
fuente
1
¿Qué tiene eso de elegante? Dedica tiempo a invertir una lista en lugar de generarla de la manera que desea.
alexis
5
@alexis no cuesta nada. Obtienes reversed(range)gratis debido a la buena range_reverseoptimización incorporada en CPython. Hice algunos puntos de referencia rápida y no pude encontrar una diferencia significativa entre el coste step=-1y reversed()tanto en Python 2.7 y 3.3. También tenga en cuenta que este idioma se usa en heapq .
kojiro
Gracias, @kojiro, eso es interesante. Pero a menos que haya utilizado xrangeen sus pruebas de Python 2.7, reverseestará operando en una lista ordinaria, ya generada, no en un objeto de rango; Entonces, ¿estás diciendo que cualquier lista se puede revertir de manera eficiente o solo range/xrangeobjetos? (el código de heapq al que se vincula implica un objeto de rango de Python 3).
alexis
@alexis No sería tan atrevido como para sugerir que cualquier lista se puede revertir de manera eficiente; de ​​todos modos, esa es una declaración demasiado incondicional para que la responda. Sin embargo, es revelador que el código de heapify cambió de step=-1a reversed()entre Python 2.3 y 2.4
kojiro
1
reversed(range(10))posiblemente no pueda salir a 4través 0. ¿Quizás quisiste decir range(5)?
Abhijit Sarkar
13
for n in range(6,0,-1)

Esto te daría 6,5,4,3,2,1

Como para

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

te daría 5,4,3,2,1,0

Handy Jodana
fuente
3
for n in range(6,0,-1):
    print n
cji
fuente
2
>>> range(6, 0, -1)
[6, 5, 4, 3, 2, 1]
vanza
fuente
2

0 es un valor condicional cuando esta condición es verdadera, el ciclo seguirá ejecutándose. 10 es el valor inicial. 1 es el modificador donde puede ser un simple decremento.

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

Llega tarde a la fiesta, pero para cualquiera que tenga la tarea de crear el suyo propio o quiera ver cómo funcionaría, aquí está la función con una ventaja adicional de reorganizar los valores de inicio-parada según el incremento deseado:

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

Incremento negativo:

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

O, con arranque-parada invertido:

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

Salida:

10
9
8
7
6
5
4
3
2
1

Incremento regular:

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

Salida:

1
2
3
4
5
6
7
8
9

Incremento cero:

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

Salida:

'Error! Please enter nonzero increment value!'
Mark Moretto
fuente
0

Para python3 donde -1indicar el valor que se decrementará en cada paso for n in range(6,0,-1): print(n)

SREERAG R NANDAN
fuente