range() en Python crea una secuencia inmutable de números enteros. Su uso más conocido aparece en los bucles for, pero también sirve para repetir acciones, generar índices, contar hacia atrás, construir intervalos y trabajar con secuencias numéricas sin almacenar todos los valores en memoria.
La función parece sencilla, aunque muchos errores de principiantes surgen por olvidar que el límite final no se incluye o por usar un paso con una dirección incompatible. En esta guía aprenderás las tres formas de range(), secuencias ascendentes y descendentes, indexación, pertenencia, comprensión de listas y situaciones donde enumerate() expresa mejor la intención.
Sintaxis de range()
La documentación oficial de Python sobre range define tres formas:
range(stop)
range(start, stop)
range(start, stop, step)Los argumentos deben ser enteros o valores compatibles con enteros. La secuencia incluye start, pero excluye stop. Esta convención también aparece en el slicing de Python.
Usar range(stop)
Con un argumento, la secuencia comienza en cero:
for numero in range(5):
print(numero)El resultado es 0, 1, 2, 3 y 4. El valor 5 no aparece. Esta forma resulta útil para repetir una operación una cantidad fija de veces:
for _ in range(3):
print("Procesando...")El guion bajo comunica que el valor de la variable no se utiliza.
Usar range(start, stop)
for numero in range(3, 8):
print(numero)La salida contiene 3, 4, 5, 6 y 7. Para incluir 8, el límite debe ser 9:
for numero in range(3, 9):
print(numero)Una regla práctica es pensar: empieza en start y continúa mientras el siguiente valor permanezca antes de stop.
Usar el paso
for numero in range(0, 11, 2):
print(numero)El resultado son los números pares desde 0 hasta 10. El paso no puede ser cero:
range(1, 10, 0) # ValueErrorUn paso cero impediría que la secuencia avanzara, por lo que Python lo rechaza.
Contar hacia atrás
Utiliza un paso negativo:
for numero in range(10, 0, -1):
print(numero)
print("¡Comienza!")La secuencia termina en 1 porque 0 es el límite excluido. El inicio debe ser mayor que el final cuando el paso es negativo. Esta expresión genera una secuencia vacía:
list(range(1, 10, -1)) # []El paso negativo se aleja del límite 10. Python no invierte automáticamente una configuración incoherente.
Convertir range en lista
numeros = range(1, 6)
print(numeros) # range(1, 6)
print(list(numeros)) # [1, 2, 3, 4, 5]No conviertas siempre. Un objeto range almacena principalmente inicio, final y paso. Una lista guarda cada entero. Para secuencias grandes, esta diferencia afecta de forma importante al consumo de memoria.
Por qué range es eficiente
enorme = range(1_000_000_000)Esta línea no crea mil millones de objetos enteros. Los valores se calculan cuando se necesitan. Por eso puedes recorrer un intervalo grande sin reservar memoria para toda la secuencia. La sección del tutorial oficial sobre range() explica este comportamiento.
Longitud, pertenencia e índices
valores = range(10, 31, 5)
print(len(valores)) # 5
print(20 in valores) # True
print(21 in valores) # False
print(valores[0]) # 10
print(valores[-1]) # 30
print(valores[1:4]) # range(15, 30, 5)Los objetos range se comportan como secuencias: admiten longitud, pertenencia, índices y slicing. La comprobación de pertenencia aprovecha la estructura aritmética y no necesita recorrer todos los elementos.
Repetir intentos
for intento in range(1, 4):
print(f"Intento {intento} de 3")Las f-strings permiten insertar valores con claridad. Consulta la guía de depuración con f-strings para formatos y representaciones.
Crear una tabla de multiplicar
numero = 7
for multiplicador in range(1, 11):
resultado = numero * multiplicador
print(f"{numero} x {multiplicador} = {resultado}")Sumar un intervalo
total = sum(range(1, 101))
print(total)El límite se establece en 101 porque la intención es incluir 100.
Crear coordenadas con bucles anidados
for fila in range(3):
for columna in range(4):
print(fila, columna)Los bucles anidados son útiles en cuadrículas, aunque el número de iteraciones se multiplica. La guía de bucles en Python explica for, while, break y continue.
range(len()) o enumerate()
lenguajes = ["Python", "Java", "JavaScript"]
for indice in range(len(lenguajes)):
print(indice, lenguajes[indice])El código funciona, pero enumerate() suele ser más claro:
for indice, lenguaje in enumerate(lenguajes):
print(indice, lenguaje)Usa range(len(...)) cuando necesitas operaciones con posiciones, como comparar un elemento con el anterior. Usa enumerate() cuando solo necesitas el valor y su índice. Consulta la guía de enumerate() en Python.
Comparar elementos consecutivos
temperaturas = [18, 21, 20, 24, 27]
for indice in range(1, len(temperaturas)):
anterior = temperaturas[indice - 1]
actual = temperaturas[indice]
cambio = actual - anterior
print(f"Día {indice}: {cambio:+d}")Comenzar en 1 evita que indice - 1 apunte accidentalmente al último valor mediante índices negativos.
Crear un range desde la entrada del usuario
try:
inicio = int(input("Inicio: "))
final = int(input("Final: "))
paso = int(input("Paso: "))
if paso == 0:
raise ValueError("El paso no puede ser cero")
for numero in range(inicio, final, paso):
print(numero)
except ValueError as error:
print(f"Valor inválido: {error}")La guía de manejo de excepciones explica cómo validar conversiones sin ocultar errores inesperados.
range y comprensiones
cuadrados = [numero ** 2 for numero in range(1, 11)]
multiplos = [
numero
for numero in range(1, 31)
if numero % 3 == 0
]Las comprensiones son adecuadas para transformaciones breves. La guía de list comprehensions muestra alternativas y reglas de legibilidad.
Errores frecuentes
- Esperar que stop se incluya:
range(1, 5)termina en 4. - Usar decimales: range genera enteros y no acepta un paso como 0.5.
- Olvidar la dirección:
range(10, 0)está vacío porque el paso predeterminado es positivo. - Crear una lista enorme: recorre el range directamente.
- Usar índices sin necesidad: recorre los valores cuando la posición no importa.
- Usar paso cero: produce ValueError inmediatamente.
Mini proyecto: cuenta regresiva
import time
segundos = 5
for restante in range(segundos, 0, -1):
print(restante)
time.sleep(1)
print("¡Tiempo terminado!")Este ejemplo combina un range descendente con una espera fija. En interfaces gráficas o aplicaciones asíncronas, evita bloquear el hilo principal, pero el patrón muestra claramente inicio, final y paso.
Conclusión
range() representa una secuencia eficiente definida por inicio, final y paso. Recuerda que el límite final se excluye, que el paso determina la dirección y que cero no es válido. Recorre el objeto directamente para ahorrar memoria, utiliza enumerate() cuando necesites valores e índices y conviértelo en lista solamente cuando otra operación requiera almacenar todos los números.






