Programación en Python: Una introducción a la ciencia de la computación
Este es un libro de texto introductorio de nivel universitario diseñado para enseñar los principios fundamentales de la informática utilizando Python como lenguaje de programación principal. Se centra en la resolución de problemas, el diseño y la programación mediante un modelo de cobertura espiral y un enfoque orientado a gráficos.
Descripción del curso
📚 Resumen del Contenido
Este es un libro de texto universitario introductorio diseñado para enseñar los principios fundamentales de la informática utilizando Python como lenguaje de programación principal. Se centra en la resolución de problemas, el diseño y la programación mediante un modelo de cobertura espiralada y un enfoque orientado a gráficos.
Una introducción suave y completa al arte de la informática a través de la perspectiva de Python.
Autor: John M. Zelle
Agradecimientos: Guido van Rossum (Prólogo), Jim Leisy, y colegas académicos de la Wartburg College y diversas universidades, incluyendo a Owen Astrachan, Cay Horstmann y Nell Dale.
🎯 Objetivos de Aprendizaje
- Distinguir entre hardware/software y algoritmos/programas.
- Explicar cómo un intérprete de Python traduce código de alto nivel en instrucciones ejecutables a través de bytecode.
- Definir e invocar funciones simples de Python usando parámetros y argumentos.
- Enumerar y describir las seis etapas del Proceso de Desarrollo de Software.
- Aplicar las reglas de sintaxis de Python para crear identificadores válidos y expresiones matemáticas con precedencia de operadores correcta.
- Diferenciar entre los modelos de variable "Caja" y "Nota adhesiva" y explicar el proceso de evaluación y asignación.
- Distinguir entre los tipos de datos
intyfloaty aplicar conversiones explícitas de tipo. - Implementar el patrón de acumulador para resolver problemas matemáticos como los factoriales.
- Utilizar la biblioteca
mathde Python para resolver ecuaciones algebraicas, incluyendo la fórmula cuadrática. - Definir y aplicar conceptos centrales de programación orientada a objetos: objetos, métodos, accesores, mutadores y aliasing.
🔹 Lección 1: Introducción a la Informática y Conceptos Básicos de Python
Resumen: Esta lección introduce la informática como el estudio de procesos computables, más que simplemente el estudio de máquinas físicas. Los estudiantes explorarán el concepto de la "Máquina Universal", donde el software proporciona el poder para transformar el hardware en cualquier herramienta imaginable. La sesión concluye con una introducción técnica a los conceptos básicos de Python, incluyendo su ejecución basada en intérprete, la definición de funciones y la distinción entre sintaxis y semántica.
Resultados de Aprendizaje:
- Distinguir entre hardware/software y algoritmos/programas.
- Explicar cómo un intérprete de Python traduce código de alto nivel en instrucciones ejecutables a través de bytecode.
- Definir e invocar funciones simples de Python usando parámetros y argumentos.
🔹 Lección 2: El Proceso de Desarrollo de Software y Programas Simples
Resumen: Esta lección presenta el enfoque sistemático para crear software mediante el proceso de desarrollo en seis pasos y los bloques fundamentales de la programación en Python. Los estudiantes explorarán la sintaxis básica, incluyendo identificadores, expresiones y asignación, contrastando el modelo de variable "Nota adhesiva" con conceptos tradicionales. La lección concluye con la implementación de bucles determinados usando la función range() para manejar cálculos repetitivos.
Resultados de Aprendizaje:
- Enumerar y describir las seis etapas del Proceso de Desarrollo de Software.
- Aplicar las reglas de sintaxis de Python para crear identificadores válidos y expresiones matemáticas con precedencia de operadores correcta.
- Diferenciar entre los modelos de variable "Caja" y "Nota adhesiva" y explicar el proceso de evaluación y asignación.
🔹 Lección 3: Representación Numérica de Datos y la Biblioteca Math
Resumen: Esta lección explora cómo los ordenadores representan y manipulan datos numéricos, distinguiendo entre números enteros discretos (enteros) y aproximaciones de números reales (punto flotante). Los estudiantes aprenderán a realizar cálculos complejos usando los operadores integrados de Python y la biblioteca math, comprendiendo las limitaciones subyacentes de la representación binaria y la precisión.
Resultados de Aprendizaje:
- Distinguir entre los tipos de datos
intyfloaty aplicar conversiones explícitas de tipo. - Implementar el patrón de acumulador para resolver problemas matemáticos como los factoriales.
- Utilizar la biblioteca
mathde Python para resolver ecuaciones algebraicas, incluyendo la fórmula cuadrática.
🔹 Lección 4: Gráficos Orientados a Objetos y GUIs Interactivas
Resumen: Esta lección lleva a los estudiantes desde la programación basada en texto hacia interfaces gráficas de usuario (GUIs) usando un enfoque orientado a objetos (OO). Los estudiantes aprenderán a manipular objetos gráficos (puntos, líneas, formas), gestionar sistemas de coordenadas y crear programas interactivos que responden a clics del mouse, pulsaciones de teclado y entradas de texto.
Resultados de Aprendizaje:
- Definir y aplicar conceptos centrales de POO: objetos, métodos, accesores, mutadores y aliasing.
- Construir y mostrar objetos gráficos incluyendo Puntos, Líneas, Círculos, Rectángulos, Óvalos y Polígonos.
- Implementar transformaciones de coordenadas y elementos interactivos (mouse/teclado/casillas de entrada) para crear GUIs funcionales.
🔹 Lección 5: Secuencias: Cadenas, Listas y Entrada/Salida de Archivos
Resumen: Esta lección explora cómo la informática representa y manipula secuencias de datos, centrándose específicamente en cadenas y listas. Los estudiantes aprenderán los mecanismos de indexación y segmentación, la distinción crítica entre objetos mutables e inmutables, y cómo interactuar con datos externos mediante el procesamiento de archivos. Además, la lección cubre la codificación de datos mediante Unicode y los principios fundamentales de la criptografía usando cifrados básicos.
Resultados de Aprendizaje:
- Realizar manipulaciones avanzadas de cadenas y listas usando indexación, segmentación y métodos integrados (split, join, upper, lower).
- Diseñar e implementar algoritmos básicos de codificación/descodificación y cifrados criptográficos (César y Sustitución).
- Desarrollar programas de procesamiento por lotes que abren, leen, procesan y cierran archivos de datos externos.
🔹 Lección 6: Definición de Funciones y Ámbito de Variables
Resumen: Esta lección explora la transición de escribir scripts monolíticos a crear programas modulares usando funciones. Cubre la sintaxis para definir y llamar funciones, el mecanismo de paso de información mediante parámetros formales y actuales, y cómo las funciones comunican resultados de vuelta mediante valores de retorno (incluyendo múltiples valores y el objeto None). Los estudiantes también aprenderán sobre el ámbito de variables—específicamente la diferencia entre variables locales y globales—y cómo las funciones pueden modificar parámetros mutables para influir en el estado del programa.
Resultados de Aprendizaje:
- Demostrar cómo definir e invocar funciones para reducir la duplicación de código y mejorar la estructura del programa.
- Diferenciar entre parámetros formales y actuales y explicar el emparejamiento por posición.
- Implementar funciones que devuelven un solo valor, múltiples valores o tienen como valor predeterminado el objeto
None.
🔹 Lección 7: Estructuras de Decisión y Manejo de Excepciones
Resumen: Esta lección introduce las estructuras de decisión, que permiten a los programas ejecutar diferentes secuencias de instrucciones según condiciones específicas. Los estudiantes aprenderán a formar expresiones booleanas usando operadores relacionales, implementar decisiones de una vía, dos vías y múltiples vías, y usar anidamiento para lógica compleja. La lección también cubre la ejecución modular con la variable __name__ y la gestión robusta de errores mediante el manejo de excepciones.
Resultados de Aprendizaje:
- Implementar estructuras de decisión simples, de dos vías y múltiples vías usando
if,elseyelif. - Construir y evaluar expresiones booleanas usando operadores relacionales y el orden lexicográfico para cadenas.
- Aplicar el patrón
try-exceptpara manejar errores en tiempo de ejecución y prevenir caídas del programa.
🔹 Lección 8: Bucles Indefinidos y Lógica Booleana
Resumen: Esta lección pasa de los bucles definidos ("contados") a los bucles indefinidos, que se ejecutan según condiciones en lugar de una secuencia fija. Los estudiantes dominarán la sentencia while y diversos patrones de diseño para procesamiento de datos, incluyendo bucles interactivos, bucles con centinela y bucles basados en archivos. Además, la lección cubre la lógica booleana, proporcionando las herramientas algebraicas necesarias para construir y simplificar estructuras de toma de decisiones complejas en código.
Resultados de Aprendizaje:
- Diseñar e implementar bucles indefinidos usando la sentencia
whilede Python. - Aplicar patrones comunes de bucle, incluyendo bucles interactivos, bucles con centinela y el patrón de lectura inicial.
- Simplificar condiciones lógicas complejas usando álgebra booleana y leyes de DeMorgan.
🔹 Lección 9: Simulación, Diseño y Refinamiento Gradual
Resumen: Esta lección explora el proceso sistemático de desarrollar programas informáticos complejos mediante el diseño descendente y el refinamiento gradual. Los estudiantes aprenderán a descomponer problemas grandes en "trozos" manejables usando abstracción y modularización, visualizar jerarquías de programas mediante diagramas de estructura, e implementar simulaciones usando técnicas de Monte Carlo. El currículo también cubre estrategias de desarrollo iterativo como prototipado y desarrollo espiral, junto con métodos robustos de prueba como pruebas unitarias.
Resultados de Aprendizaje:
- Descomponer un problema complejo en subproblemas más pequeños y solucionables usando el diseño descendente.
- Construir e interpretar diagramas de estructura que ilustran el flujo de datos (parámetros y valores de retorno) entre módulos.
- Aplicar técnicas de simulación de Monte Carlo para modelar eventos probabilísticos usando la biblioteca
randomde Python.
🔹 Lección 10: Definición de Clases y Programación Basada en Eventos
Resumen: Esta lección pasa del diseño procedimental basado en funciones al diseño basado en objetos usando clases de Python. Los estudiantes aprenderán a encapsular datos (variables de instancia) y comportamientos (métodos) dentro de una sola unidad, crear widgets de interfaz gráfica de usuario (GUI) interactivos y gestionar el flujo del programa mediante programación basada en eventos y bucles de animación sincronizados.
Resultados de Aprendizaje:
- Diferenciar entre diseños de programas basados en funciones y basados en objetos.
- Definir clases personalizadas de Python usando constructores (
__init__), variables de instancia y el parámetroself. - Implementar encapsulación y documentación usando cadenas de documentación (docstrings).
🔹 Lección 11: Colecciones de Datos: Listas Avanzadas y Diccionarios
Resumen: Esta lección explora técnicas avanzadas de colecciones de datos en Python, centrándose en la versatilidad de listas y diccionarios. Los estudiantes aprenderán a distinguir listas de arreglos tradicionales, realizar operaciones listas complejas como segmentación y ordenamiento de registros, y aplicar mapeos no secuenciales mediante diccionarios. El módulo culmina con la aplicación de estas estructuras al análisis estadístico y algoritmos clásicos como el Tamiz de Eratóstenes.
Resultados de Aprendizaje:
- Contrastar las listas dinámicas de Python con arreglos de tamaño fijo y homogéneos.
- Realizar manipulaciones avanzadas de listas incluyendo segmentación, eliminación selectiva y ordenamiento personalizado de registros de objetos.
- Implementar algoritmos estadísticos (media, mediana, desviación estándar) y diseños basados en tablas usando colecciones.
🔹 Lección 12: Principios del Diseño Orientado a Objetos (OOD)
Resumen: Esta lección explora la transición del diseño funcional descendente al Diseño Orientado a Objetos (OOD), un enfoque centrado en datos donde los sistemas se describen como una colección de "cajas negras" interactivas (objetos). Los estudiantes aprenderán a identificar objetos y métodos candidatos, implementar simulaciones multi-clase como Racquetball y Poker de Dados, y aplicar los tres pilares de la POO: Encapsulamiento, Polimorfismo e Herencia. La lección culmina con la gestión de interacciones complejas en GUIs mediante herencia y sobrescritura de métodos.
Resultados de Aprendizaje:
- Identificar clases y métodos potenciales a partir de un enunciado de problema analizando sustantivos y verbos.
- Implementar una simulación compleja multi-objeto usando clases estructuradas (por ejemplo,
Jugador,Partida,Estadísticas). - Distinguir y aplicar los conceptos fundamentales de encapsulamiento, polimorfismo e herencia.
🔹 Lección 13: Diseño de Algoritmos, Recursividad y Eficiencia
Resumen: Esta lección explora las técnicas fundamentales utilizadas para resolver problemas computacionales de manera eficiente. Cubre estrategias de búsqueda, la mecánica de la resolución recursiva de problemas (casos base y pasos recursivos), y una comparación de algoritmos de ordenamiento como el Ordenamiento por Selección y el Ordenamiento por Fusión para comprender cómo el diseño de algoritmos afecta el rendimiento.
Resultados de Aprendizaje:
- Comparar e implementar estrategias de búsqueda lineal y binaria.
- Diseñar funciones recursivas usando casos base y pasos recursivos para problemas como la inversión de cadenas y la exponenciación rápida.
- Analizar las compensaciones de rendimiento entre recursión e iteración, y entre diferentes algoritmos de ordenamiento (n^2 vs. n \log n).