Unidad II · Proyecto Disponible

Proyecto: Diagnóstico comparado

Escriba un programa que ilustre alcance, recursión y paso de parámetros, verifíquelo, compárelo con Java y C++ y redacte un informe de portafolio.

Objetivo de aprendizaje

Al concluir el proyecto, el estudiante será capaz de:

  1. Escribir un programa en Python que ilustre el alcance estático, la recursión y el paso de parámetros, y documentar qué mecanismo observa en cada bloque.
  2. Explicar el comportamiento de su programa con el modelo de nombres, objetos y marcos de activación.
  3. Comparar esas decisiones de diseño en Python, Java y C++, y justificar los compromisos.
  4. Probar su programa con predicciones y comparar lo anticipado con lo observado.
  5. Redactar un informe argumentado con evidencias.

El producto que se entrega

Un programa en Python, un informe (de dos a cuatro páginas) y la evidencia registrada en esta página: el resultado del verificador de requisitos y la tabla comparativa. Todo se exporta en un solo archivo desde el espacio de trabajo de la sección 6.


1. Planteamiento inicial

Al comenzar la unidad, la idea intuitiva de «variable» es una caja con un valor. Al terminarla, ese modelo se ha reemplazado por otro: nombres que apuntan a objetos, marcos de activación y reglas de alcance. El proyecto sirve para comprobar el cambio.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


2. La actividad

Escriba, en su entorno de desarrollo, un programa en Python que contenga los tres bloques siguientes y documente con comentarios qué mecanismo se observa en cada uno.

Bloque Requisito
1. Alcance Una función anidada que use un nombre de la función que la contiene, para ilustrar el alcance estático (regla LEGB)
2. Recursión Una función recursiva con al menos dos casos base
3. Parámetros Una función que reciba una lista y la modifique por mutación y otra (o la misma) que la modifique por reasignación, de modo que el programa principal imprima el resultado en ambos casos y se pueda contrastar el efecto observado desde el llamador

Además: al menos dos impresiones en el programa principal y tres líneas de comentario que expliquen los mecanismos observados.

Nota: el verificador de la sección 4 solo admite el subconjunto de Python estudiado en la unidad (funciones, listas, ciclos, condicionales; sin clases ni importaciones). Si su programa usa otras construcciones, el verificador lo indicará. En ese caso, conserve su versión y escriba una versión reducida para el verificador.


3. Siga la ejecución de su programa

Antes de verificar, ejecute su programa paso a paso en la corrida de escritorio siguiente. Escriba o pegue su programa en el recuadro y active la predicción de la salida: anticipe lo que mostrará antes de verlo. Observe los marcos, los objetos y la búsqueda de nombres.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


4. Verifique los requisitos

El verificador analiza su programa, lo ejecuta y comprueba cada requisito de la actividad. El resultado se registra en su libreta como evidencia.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: el verificador comprueba la estructura (por ejemplo, que exista una función recursiva con dos casos base), pero no puede juzgar si su explicación es correcta. Esa es la finalidad del informe y de la revisión de su docente.


5. Diagnóstico comparado: Python, Java y C++

La unidad se estudia con tres lenguajes: Python, Java y C++. Cada uno toma decisiones distintas sobre los mismos elementos. Complete la tabla con lo que cree que hace cada lenguaje y compare con la referencia.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: las respuestas de Java y C++ de esta tabla son una referencia didáctica y están simplificadas (por ejemplo, C++ moderno ofrece punteros inteligentes que automatizan la liberación de memoria). Se utilizan para razonar sobre compromisos, no como descripción exhaustiva de los lenguajes.


6. Planeación y redacción del informe

El informe no es un resumen de lo que se hizo, sino un argumento: explica qué observó, por qué ocurre y cómo lo comprobó. Algunas pautas:

  • Use el modelo de la unidad. Explique con los términos nombre, objeto, ligadura, marco de activación y alcance.
  • Presente evidencia. En lugar de «la función muta la lista», indique qué mostró la corrida y qué cambió en el objeto.
  • Incluya sus predicciones. Anote qué anticipó y si coincidió; las discrepancias son lo más informativo.
  • Nombre los compromisos. Cada decisión de diseño favorece algo y cuesta algo.

Ejemplo de una explicación pobre: «reasignar la lista no funciona porque Python así lo hace». Ejemplo de una explicación sólida: «dentro de reasignar, el parámetro lista es un nombre local ligado al mismo objeto que datos; la sentencia lista = [0] religa solo ese nombre local a otro objeto, de modo que datos sigue ligado a la lista original. En cambio, lista.append(99) modifica el objeto compartido y por eso es visible desde el llamador».

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Importante: lo que registra en esta página solo vive en su navegador. Si cambia de equipo o borra los datos de navegación, lo perderá. Exporte el archivo con frecuencia y conserve una copia.


7. Autoevaluación y contraste

Antes de entregar, valore su proyecto con la rúbrica.

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Contraste con el planteamiento inicial

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.


8. Libreta y lista de verificación para la entrega

Este laboratorio interactivo requiere JavaScript habilitado en el navegador.

Antes de entregar, compruebe que:

  • Su programa cumple los siete requisitos del verificador.
  • Comentó, en el código, qué mecanismo se observa en cada bloque.
  • Completó la tabla comparativa y revisó las explicaciones de las diferencias.
  • Las siete secciones del informe tienen contenido y evidencias.
  • Incluyó predicciones y su comparación con lo observado.
  • Hizo la autoevaluación y atendió los criterios más bajos.
  • Exportó el informe y conservó una copia del archivo y de su programa.
  • Puede explicar con sus propias palabras cada decisión de su trabajo.

9. Preguntas de reflexión

  1. ¿Qué parte de la unidad le resultó más contraria a su intuición inicial y por qué?
  2. Si tuviera que explicarle a una persona que empieza a programar por qué una función no puede intercambiar dos enteros, ¿qué le diría?
  3. ¿Qué decisión de diseño de Python cambiaría? ¿Qué criterio mejoraría y qué costo tendría?
  4. ¿Qué ventajas le encuentra a conocer el comportamiento de Java o C++ aunque programe solo en Python?
  5. ¿Cómo aplicaría lo aprendido a un lenguaje que todavía no conoce?

10. Lecturas recomendadas

  • Sebesta, R. (2015). Concepts of programming languages (11th ed.), capítulos sobre nombres y alcance, tipos de datos, subprogramas y su implementación. Pearson.
  • Python Software Foundation. The Python Language Reference, secciones «Data model» y «Execution model». Acceso libre en docs.python.org.
  • Scott, M. (2015). Programming language pragmatics (4th ed.), capítulos sobre nombres, alcances y ligaduras, y sobre abstracción del control. Morgan Kaufmann.