¿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?


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]

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

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




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;

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!'

0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.