PyQuiz 20 – range() parámetros en Python
El reto
numeros = list(range(10, 0, -2))
print(numeros)
¿Cuál es el resultado?
- a) [10, 8, 6, 4, 2, 0]
- b) [10, 8, 6, 4, 2]
- c) [8, 6, 4, 2, 0]
Piensa tu respuesta antes de seguir leyendo…
Concepto: range() parámetros
La función range(inicio, fin, paso) genera una secuencia de números que comienza en inicio, avanza de paso en paso y se detiene antes de llegar a fin. Este comportamiento de exclusión del límite final es consistente con el slicing y otras convenciones de Python.
Cuando el paso es negativo, la secuencia desciende. Para que genere valores, inicio debe ser mayor que fin. Si el paso negativo hace que se alcance o cruce el límite inferior, la secuencia se detiene sin incluirlo.
En range(10, 0, -2), la secuencia empieza en 10 y resta 2 en cada paso: 10, 8, 6, 4, 2. El siguiente valor sería 0, que es el límite y queda excluido. Por tanto, el 0 nunca aparece.
Paso a paso
range(10, 0, -2)— el rango empieza en10, tiene límite inferior0(excluido) y paso-2.- Generación de valores:
10(10 > 0, incluir),8(8 > 0, incluir),6(6 > 0, incluir),4(4 > 0, incluir),2(2 > 0, incluir),0(0 > 0 es False, parar). numeros = list(range(10, 0, -2))— convierte el rango a lista:[10, 8, 6, 4, 2].print(numeros)— se imprime[10, 8, 6, 4, 2]. El0no aparece porque el límite es exclusivo.
📥 Llévate el cheatsheet de Python (gratis)
PDF de 6 páginas con lo esencial: tipos, condicionales, bucles, estructuras de datos, funciones y los errores que más vas a cometer. Para tener al lado mientras programas.
Sin spam. Te apuntas a la lista, descargas el cheatsheet y recibes contenido de Python cada semana.
Solución
Respuesta correcta: B) [10, 8, 6, 4, 2]
range(10, 0, -2) empieza en 10, baja de 2 en 2, y se detiene ANTES de llegar a 0. Resultado: [10, 8, 6, 4, 2].
Sabías que…
range() es un objeto de tipo range, no una lista. Ocupa memoria constante independientemente de cuántos números genere. Solo al convertirlo con list() se materializan todos los valores.
import sys
# range es eficiente en memoria
r = range(0, 1_000_000)
print(sys.getsizeof(r)) # ~48 bytes, siempre!
print(sys.getsizeof(list(r))) # ~8 MB
# range con paso positivo
print(list(range(0, 10, 3))) # [0, 3, 6, 9]
# Verificar si un número está en range (O(1), muy rápido)
print(500_000 in range(0, 1_000_000, 2)) # True
# range con un solo argumento: empieza en 0
print(list(range(5))) # [0, 1, 2, 3, 4]
Prueba tú mismo
¿Qué genera list(range(5, 20, 3))? Inténtalo en papel: ¿cuántos elementos tiene la lista resultante?
Más PyQuizzes en elpythonista.com/pyquizzes
Tutorial relacionado: Rangos y enumerate en Python
¿Quieres aprender Python en orden, no a saltos?
Esto que has leído es solo una pieza. En El Pythonista lo verás todo encadenado: 11 módulos, 37+ horas de vídeo, 734 actividades y un proyecto real (MovieTracker) que crece contigo desde la primera variable hasta el deploy a producción.
37+ horas · 734 actividades · Proyecto real · Acceso de por vida · 14 días de garantía
