Estoy tratando de aumentar gradualmente el límite inferior de un rango durante un ciclo for. Supuestamente así es como funcionaría (soy nuevo en Python, así que asuma la ignorancia completa):

start = 0
reset = bool

for i in range(start, 6):
    print(i)

    if i > 4:
        reset = True

    if reset == True:
        start += 1
        i = start

Idealmente, esto tendría resultados como:

0, 1, 2, 3, 4, 5 restablecer

1, 2, 3, 4, 5 restablecer

2, 3, 4, 5 * reinicio

Intenté el código anterior pero fue en vano.

Etcetera.

Esto debe ser posible hacer, ¿no? Tenga en cuenta que estoy tratando de usar esto en un bucle anidado mucho más complicado, por lo que idealmente la solución funcionaría con eso.

¡Gracias de antemano!

2
Kai 15 may. 2020 a las 16:10

4 respuestas

La mejor respuesta

Problema

Un solo ciclo for no funcionará ya que el rango (inicio, 6) crea un iterador basado en el valor de inicio inicial a través del cual estoy secuenciando.

Cambiar el inicio después no tiene efecto en esta secuencia de números.

Prueba el ciclo while único

start = 0
i = start
while i < 6:
  print(i)
  i += 1

  reset = i > 4

  if reset:
    print('reset')
    start += 1
    i = start

Salida

0
1
2
3
4
reset
1
2
3
4
reset
2
3
4
reset
3
4
reset
4
reset
5
reset
0
DarrylG 15 may. 2020 a las 13:24

Cambiar la variable de control de bucle no servirá de nada aquí porque:

for i in some_range:
    do_something_with(i)

Es efectivamente lo mismo que (pseudocódigo similar a Python):

i = some_range.start
while i != some_range.end:
    do_something_with(i)
    i = some_range.next

En otras palabras, independientemente de los cambios que realice en i dentro del ciclo, el ciclo en sí mismo lo desechará en la próxima iteración.

Algo como esto es probablemente un buen punto de partida:

# Starting limits.

start = 0
stop = 6

# Outer loop responsible for resets.

while start < stop:
    # Disallow reset to start with.

    reset = False

    # Inner loop responsible for a single sequence.

    for i in range(start, stop):
        print(i, end=' ')

         # Whatever rule you need to trigger reset.

        if i > 4:
            reset = True

        # The actual reset that sets up and starts the next sequence.

        if reset == True:
            print()
            start += 1
            break

En ese código, en realidad tiene un bucle externo que gestiona los restablecimientos. Cuando llega el momento de restablecer, simplemente modifique los parámetros para el siguiente ciclo externo y simplemente salga del ciclo interno:

0 1 2 3 4 5    
1 2 3 4 5
2 3 4 5
3 4 5
4 5
5
0
paxdiablo 15 may. 2020 a las 13:30

No puede actualizar un range una vez que se declara. Alternativamente, use while y cambie el rango inferior al final del ciclo. Puede tener una variable separada start para inicializar i cada vez.

print("") es solo un salto de línea

k = 6
i = 0
start = 0
while i < k:
    print(i, end="")
    i += 1
    if i == k:
        print("")
        start += 1
        i = start
0
testuserme 15 may. 2020 a las 13:57

¡no trabajará! la primera vez para entra, evalúa "rango (inicio, 6)" y usa ese resultado. ¡así que incluso si cambia "inicio" después de que ya está hecho!

Lo que puedes hacer es usar un bucle while para tu propósito

start = 0  
reset = bool

while start<6:
    print(i)

    if i > 4:
        reset = True

    if reset == True:
        start += 1
        i = start
0
user1438644 15 may. 2020 a las 13:18