Python / range() / Crear enteros consecutivos o espaciados regularmente
En Python, range() crea una secuencia inmutable de enteros espaciados regularmente. Incluye el inicio y excluye el límite stop; el signo de step elige la dirección. Es distinto de una lista que guarda todos los valores y de un generador consumido al iterar.
Reglas de start, stop y step
La referencia de range describe range(stop), range(start, stop) y range(start, stop, step). Si se omiten, start vale cero y step uno. Los argumentos deben ser enteros o admitir el protocolo de índice entero; floats ordinarios y cadenas numéricas no se convierten automáticamente.
Use Python 3. Guarde cada ejemplo completo en UTF-8 como range_example.py y ejecute python range_example.py, o python3 según su instalación. Sustituya el contenido para probarlos por separado. En rangos pequeños, list() muestra todos los valores.
print(list(range(4)))
print(list(range(1, 6)))
print(list(range(1, 10, 2)))
Resultado esperado:
[0, 1, 2, 3]
[1, 2, 3, 4, 5]
[1, 3, 5, 7, 9]
range(4) va de cero a tres y range(1, 6) de uno a cinco. Para incluir cinco con paso creciente de uno, use stop seis. Con paso dos, el último valor no tiene que ser stop menos uno: debe cumplir tanto el espaciado como el límite.
Pasos negativos y rangos vacíos
Un paso positivo incluye valores menores que stop; uno negativo, valores mayores. Para descender, indique un paso negativo. Si la dirección no encaja con los límites, el resultado queda vacío en vez de generar un error.
print(list(range(10, -5, -3)))
print(list(range(5, 0, -1)))
print(list(range(5, 0)))
print(list(range(0, 5, -1)))
print(list(range(3, 3)))
[10, 7, 4, 1, -2]
[5, 4, 3, 2, 1]
[]
[]
[]
range(10, -5, -3) produce 10, 7, 4, 1, -2. El siguiente, -5, coincide con stop y se excluye. Use range(5, 0, -1) para bajar de cinco a uno. Inicio y fin iguales también generan un rango vacío, cuyo cuerpo de bucle nunca se ejecuta.
Índices e iteración sin una lista
Imprimir un range muestra su representación, no todos los elementos. Calcula valores a partir de límites y paso y admite longitud, índices, cortes y pertenencia. Al ser inmutable, no permite reemplazar elementos mediante asignación a índices.
numbers = range(2, 10, 2)
print(numbers)
print(len(numbers))
print(numbers[0], numbers[-1])
print(list(numbers[1:3]))
print(6 in numbers, 7 in numbers)
print(list(numbers))
print(list(numbers))
range(2, 10, 2)
4
2 8
[4, 6]
True False
[2, 4, 6, 8]
[2, 4, 6, 8]
Convertir dos veces el mismo range a lista produce los mismos elementos. El range no es un generador que se agota. Un iterador separado creado con iter(numbers) sí se consume: distíngalo de la secuencia. Un corte devuelve otro range, que aquí se convierte a lista para verlo.
Paso cero, floats y cadenas generan errores
El paso cero no define avance y provoca ValueError. 3.0 sigue siendo float aunque tenga valor entero; "3" es una cadena. Ambos producen TypeError.
for arguments in ((1, 5, 0), (3.0,), ("3",)):
try:
print(range(*arguments))
except (ValueError, TypeError) as error:
print(type(error).__name__)
ValueError
TypeError
TypeError
Si se permite texto entero, valídelo y conviértalo por separado con int(). Truncar floats sin criterio puede crear un rango inesperado; defina primero la política de entrada. Este manejo de excepciones compara entradas incorrectas, no trata silenciosamente los fallos como éxitos.
Elegir range o enumerate para el bucle
Un bucle con range sirve para una cantidad fija o pasos enteros. Recorra la lista directamente si solo necesita sus elementos. Para elementos numerados, enumerate() evita cálculos manuales de índices.
for number in range(1, 4):
print("Step", number)
names = ["Ada", "Bo"]
for number, name in enumerate(names, start=1):
print(number, name)
Step 1
Step 2
Step 3
1 Ada
2 Bo
El primer bucle tiene tres pasos, del uno al tres. En el segundo, start=1 cambia la numeración sin saltar el primer elemento. range(len(items)) sigue siendo útil cuando necesita índices reales o cálculos de posición.
Rangos enormes y recursos reales
Un range representa límites grandes sin almacenar la lista completa, pero no elimina el tiempo de recorrer cada valor. En CPython, el límite de representación de longitud de len() puede generar OverflowError aunque sea posible crear el rango.
import sys
numbers = range(sys.maxsize + 1)
print(numbers[0])
print(numbers[-1] == sys.maxsize)
try:
print(len(numbers))
except OverflowError:
print("OverflowError")
0
True
OverflowError
El ejemplo solo comprueba extremos y error de longitud, sin recorrer la secuencia. sys.maxsize varía según el entorno. Evite materializar rangos enormes con list(); recorra solo la parte necesaria o procese resultados de forma incremental.




