REVIT ARCHITECTURE (995) – PYTHON – Bucles (79) – Entendiendo range(start, stop, step) in Python y revit

Hoy vamos a analizar un ejercicio muy interesante sobre cómo funciona la función range() cuando se le pasan tres argumentos: start, stop y step.

El código a estudiar es el siguiente:

Línea por línea de código
1. for i in range(0, 6, 3):

Aquí creamos un bucle for que recorre los valores generados por range(0, 6, 3).

Recordemos la sintaxis de range(start, stop, step):

start = 0 → el primer número será 0.

stop = 6 → el rango llegará hasta 6 pero sin incluirlo.

step = 3 → cada valor aumentará en 3 unidades.

Por tanto, la secuencia será: 0, 3.

print(i)

En la primera iteración, i = 0, por lo que imprime 0.

En la segunda iteración, i = 3, por lo que imprime 3.

Luego el siguiente valor sería 6, pero como el rango excluye el límite superior (stop = 6), el bucle termina.

Resultado en pantalla

Ejemplo aplicado a Revit

Imagina que tienes un conjunto de niveles en un edificio y quieres iterar sobre ellos de tres en tres (por ejemplo, revisar solo los niveles 0, 3, 6, …).

Un pseudocódigo sería:

Explicación del código línea a línea

range(0, 12, 3): crea un objeto range que genera una secuencia de enteros comenzando en 0, avanzando de 3 en 3 y parando antes de 12. Por tanto los valores que genera son 0, 3, 6, 9.

start = 0, stop = 12 (no incluido), step = 3.

list(…): convierte ese objeto range en una lista concreta: [0, 3, 6, 9].

Ventaja de convertir a lista: puedes indexarla, obtener len(), inspeccionarla varias veces, etc.

Desventaja: ocupa memoria adicional; si la secuencia fuera muy larga, sería más eficiente iterar directamente sobre range(…) sin pasar por list.

Asignación niveles = …: guarda la lista resultante en la variable niveles, que ahora es una lista de enteros.

Inicia un bucle for que recorre la lista niveles elemento por elemento.

En cada iteración la variable nivel toma uno de los valores de la lista (primero 0, luego 3, luego 6, luego 9).

Notas:

Si no necesitas la lista para otras operaciones, podrías evitar la conversión y escribir directamente for nivel in range(0, 12, 3):, consumiendo menos memoria.

Si necesitas también el índice (posición) de cada nivel, podrías usar for idx, nivel in enumerate(niveles):.

print(…) imprime en la consola la cadena que le pases.

f»Revisando el nivel {nivel}» es una f-string (cadena formateada). Dentro de {} se evalúa la variable nivel y su valor se inserta en la cadena.

Si nivel vale 3, la f-string produce «Revisando el nivel 3».

Por defecto print añade un salto de línea al final, así cada iteración aparecerá en una línea nueva.

Salida esperada (ejecución)

Notas prácticas (contexto Revit)

En Revit, un nivel real no es solo un número; suele ser un objeto con propiedades (Name, Elevation, Id). Aquí hemos usado números como ejemplo conceptual (p. ej. identificar niveles 0, 3, 6, 9).

Si trabajas con objetos Revit, el bucle probablemente sería:

Recomendación: si la secuencia es grande (muchos niveles o muchas iteraciones), itera sobre range(…) directamente en lugar de crear una lista con list(range(…)) para ahorrar memoria:

Bonus 1: range() y la importancia del parámetro step

Cuando usamos range(), muchas veces solo lo vemos con un inicio y un final. Pero el tercer parámetro (step) es muy potente:

Si usas step positivo → la secuencia crece.

Si usas step negativo → la secuencia decrece.

Si omites step, por defecto vale 1.

Salida:

En un contexto Revit, esta lógica es útil cuando necesitas recorrer niveles, fases o elementos en orden inverso (de arriba hacia abajo, de más reciente a más antiguo, etc.).

Bonus 2: Argumentos en funciones de Python y la importancia del nombre

En matemáticas, una función normalmente recibe un solo argumento:

Aquí, la entrada x siempre produce una salida definida.

En Python, en cambio, las funciones son mucho más versátiles:

  • Pueden recibir cero, uno o múltiples argumentos.

  • Incluso pueden tener argumentos opcionales con valores por defecto.

Ejemplo:

1) def area_rectangulo(base, altura=1):

def crea una función en Python. No ejecuta el cuerpo ahora; lo que hace es crear un objeto función y lo asigna al nombre area_rectangulo en el espacio de nombres actual.

area_rectangulo es el nombre de la función (identifica qué acción hace — en este caso calcular el área de un rectángulo).

Parámetros:

base — parámetro posicional obligatorio: cuando llames a la función debes darle un valor para base (a menos que uses un valor por defecto, pero aquí no lo tiene).

altura=1 — parámetro con valor por defecto (1). Si al llamar no pasas altura, Python usará automáticamente 1.

Importante: el valor por defecto (1) se evalúa en el momento de definir la función. Si el valor por defecto fuera un objeto mutable (por ejemplo una lista []), podría compartirse entre llamadas (caveat).

return base * altura

Esta línea es el cuerpo de la función; se ejecuta cuando llamas a area_rectangulo(…).

Qué hace: calcula el producto base * altura y lo devuelve al llamador.

El operador * funciona según los tipos de los operandos: usualmente multiplica números (e.g. 5 * 3 = 15), pero si base fuera una cadena y altura un entero, produciría repetición de cadena («a» * 3 == «aaa»).

return termina la ejecución de la función y devuelve el valor resultante. Si una función no tiene return, devuelve None.

print(area_rectangulo(5, 3)) # 15

Orden de evaluación cuando se encuentra print(area_rectangulo(5, 3)):

Se evalúan los argumentos de la llamada: el intérprete prepara los valores 5 y 3.

Se llama a la función area_rectangulo con base=5 y altura=3.

Dentro de la función, base y altura se asocian a esos valores; se ejecuta return base * altura, que da 15.

La llamada area_rectangulo(5, 3) produce el valor 15, que es pasado a print.

print(15) muestra 15 en la consola.

Resultado en consola: 15

Aquí aparecen dos tipos de argumentos:

Argumento posicional obligatorio → base

Este siempre hay que proporcionarlo al llamar a la función.

Si no lo das, Python lanza un TypeError.

Ejemplo:

Argumento con valor por defecto → altura=1

Si no lo especificas, Python asigna el valor 1.

Esto lo convierte en argumento opcional.

Ejemplo:

Argumentos posicionales vs. nombrados (keywords)

En Python, al llamar a la función, puedes pasar valores:

Por posición → el orden importa.

Por nombre (keyword arguments) → el orden no importa.

Más allá de este ejemplo

En general, Python permite varios tipos de argumentos en funciones (aunque aquí solo usamos dos):

Posicionales obligatorios (como base).

Opcionales con valor por defecto (como altura=1).

Arbitrarios posicionales (*args) → reciben una tupla de valores.

Arbitrarios con nombre (**kwargs) → reciben un diccionario de valores nombrados.

Ejemplo completo:

Tipos de argumentos en funciones de Python

Tipo de argumento Definición Ejemplo de función Ejemplo de llamada Resultado
Posicional obligatorio Debe pasarse siempre. def f(a): return a*2 f(3) 6
Con valor por defecto Tiene un valor si no se pasa. def f(a, b=1): return a*b f(4) 4
Keyword (nombrado) Se pasa indicando el nombre. def f(a, b): return a+b f(b=5, a=3) 8
Arbitrarios posicionales (*args) Captura múltiples valores posicionales en una tupla. def f(*args): return args f(1,2,3) (1, 2, 3)
Arbitrarios con nombre (**kwargs) Captura múltiples pares clave=valor en un diccionario. def f(**kwargs): return kwargs f(x=1, y=2) {'x':1,'y':2}

La importancia del nombre en la función

El nombre de la función es clave: debe describir claramente qué hace.

Una función llamada calcular_area() es mucho más legible que f1().

En proyectos grandes (como un Open Source Revit Converter), usar nombres expresivos como exportar_muro() o obtener_niveles() facilita el trabajo en equipo y evita errores.

Licencia Creative Commons Contenido Web de Yolanda Muriel está sujeto bajo Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.

Deja un comentario