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.
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
