-
Introducción
Mostrar más Mostrar menosIntroducción
Queridos participantes,
¡Bienvenidos a esta emocionante aventura digital! Nos entusiasma ser parte de este viaje de aprendizaje, en el que descubrirán nuevas herramientas, adquirirán valiosos conocimientos y desarrollarán habilidades que les acompañarán a lo largo de su trayectoria.
Les invitamos a familiarizarse con la plataforma, conocer el curso y participar activamente.
¡Estamos aquí para apoyarlos en cada paso de este proceso!
¡Mucho éxito en este inicio!
El equipo de PUCE Virtual
-
Tutoriales
Sílabo
Manual del estudiante
-
Resultados de Aprendizaje y Criterios de Evaluación
Texto de introducción de la asignatura
RESULTADOS DE APRENDIZAJE
RDA 1: RDA 1: Asociar los conceptos fundamentales de la programación: sintaxis, manejo de tipos de datos, variables, entrada/salida de datos y estructuras de control básicas, en un lenguaje estructurado.
- Criterio de evaluación 1: Comprende lo que son los tipos de datos y operadores, y cómo se utilizan en el desarrollo de un programa informático utilizando un lenguaje de programación estructurado.
- Criterio de evaluación 2: Comprende lo que son las variables y entrada/salida de datos, y cómo se utilizan en el desarrollo de un programa informático utilizando un lenguajde de programación estructurado.
RDA 2: Reconocer las estructuras básicas de un lenguaje de programación estructurado, su sintaxis y su utilidad en la solución de problemas de programación.
- Criterio de evaluación 1: Comprende lo que son las estructuras de control selectivas para el flujo de información que sigue un programa informático utilizando un lenguaje de programación estructurado.
- Criterio de evaluación 2: Comprende lo que son las estructuras de control iterativas para el flujo de información que sigue un programa informático utilizando un lenguaje de programación estructurado.
RDA 3: Solucionar problemas de programación de mediano nivel, mediante el uso de algoritmos basados en matemáticas, pudiendo descompoenerlos en tareas más simples por medio del uso de técnicas de programación como funciones.
- Criterio de evaluación 1: Aplica las herramientas disponibles en un lenguaje de programación para la implementación de algoritmos que soluciones problemas de bajo y medio nivel.
- Criterio de evaluación 2: Comprende lo que son las funciones en un lenguaje de programación estructurado y las utiliza para dividir tareas.
-
PROYECTO FINAL
El proyecto final es la evaluación sumativa de los retos, se considera como el entregable final de la asignatura.
Objetivo General
Desarrollar una calculadora avanzada que integre operaciones matemáticas básicas y avanzadas, aplicando los conceptos de programación estructurada (variables, estructuras de control, funciones y manejo de archivos), para resolver problemas de complejidad media con eficiencia y claridad en el código.
Objetivos Específicos
- Implementar un menú interactivo que permita seleccionar y ejecutar operaciones matemáticas de forma repetitiva.
- Modularizar el código mediante funciones para operaciones básicas y avanzadas (ej: raíces, potencias, matrices).
- Garantizar la persistencia de datos mediante el almacenamiento de historial de operaciones en un archivo de texto.
Descripción del Proyecto
El proyecto consiste en una calculadora multifuncional desarrollada en un lenguaje estructurado (Python o C#), que evoluciona en cuatro etapas (retos). Comienza con operaciones básicas y culmina con funcionalidades avanzadas y guardado de historial.
Actividades
Reto Actividades Reto 1 - Crear variables para operandos.
- Implementar entrada/salida de datos.
- Realizar operaciones básicas (+, -, *, /).
Reto 2 - Diseñar un menú interactivo con if-else.
- Usar bucles para repetir operaciones.
- Validar opciones del usuario
Reto 3 - Crear funciones para operaciones avanzadas (ej: calcular_potencia(), calcular_raiz()).
- Implementar operaciones con matrices (suma, multiplicación).
Reto 4 - Guardar resultados en un archivo .txt.
- Recuperar y mostrar historial de operaciones.
- Integrar y depurar todas las funcionalidades.
Metodología (CRISP-DM)
- Desarrollo incremental: Cada reto corresponde a una entrega parcial del proyecto.
- Pruebas unitarias: Verificar cada función individualmente antes de integrarla.
- Control de versiones: Usar Git para gestionar cambios y colaboración (opcional para equipos).
- Cada reto corresponde a una entrega parcial del proyecto.
Criterios de Evaluación del proyecto
Criterio Ponderación Detalle Funcionalidad completa 40% Cumplimiento de los 4 retos con operaciones básicas y avanzadas. Estructura del código 25% Uso de funciones, bucles y condicionales de manera eficiente. Manejo de archivos 20% Historial de operaciones guardado y recuperado correctamente. Documentación 10% Comentarios en el código + informe breve explicando el diseño. Cronograma de entregables del Proyecto
Semana Reto Entregable Contenido 4 Reto 1 Calculadora básica Programa que realiza las 4 operaciones básicas con entrada de usuario. 8 Reto 2 Menú interactivo con bucles Versión que permite repetir operaciones y elegirlas desde un menú. 12 Reto 3 Funciones avanzadas y matrices Desarrollo de modelos y análisis inicial de la calidad de este 16 Reto 4 Sistema final + historial Versión integrada con guardado en archivo y todas las funcionalidades. Retos de aprendizaje de la asignatura
RETO 1: Fundamentos de Programación (Variables, Tipos de Datos y Operadores)Objetivo: Crear una calculadora básica que realice operaciones matemáticas simples (suma, resta, multiplicación, división) utilizando variables, tipos de datos y operadores.
Indicaciones:
- Entrada/Salida de datos:
- Solicitar al usuario dos números mediante input().
- Mostrar resultados con print().
- Operaciones básicas:
- Implementar las cuatro operaciones aritméticas usando +, -, *, /.
- Validación simple:
- Asegurarse de que los valores ingresados sean numéricos (ej: usar float() o int()).
RETO 2: Estructuras de Control (Condicionales y Bucles)Objetivo: Implementar un menú interactivo que permita al usuario seleccionar operaciones y repetir cálculos.
Indicaciones:
- Menú de opciones:
- Usar if-elif-else para manejar las opciones (ej: 1=Suma, 2=Resta).
- Bucle de repetición:
- Utilizar while para preguntar al usuario si desea realizar otra operación.
- Validación de entradas:
- Manejar opciones inválidas (ej: si el usuario ingresa "5", mostrar "Opción no válida").
RETO 3: Funciones y Operaciones Avanzadas (Modularización)Objetivo: Agregar funcionalidades avanzadas a la calculadora (potencias, raíces, matrices) mediante funciones.
Indicaciones:
- Modularización
- Crear funciones como calcular_potencia(base, exponente) o sumar_matrices(matriz1, matriz2).
- Estructuras de datos:
- Usar arreglos para manejar matrices (ej: matriz = [[1, 2], [3, 4]]).
- Integración con el menú:
- Añadir nuevas opciones al menú principal para acceder a estas funciones.
RETO 4: Persistencia de Datos (Manejo de Archivos)Objetivo: Guardar y recuperar el historial de operaciones en un archivo de texto.
Indicaciones:
- Guardar historial:
- Usar open() en modo "a" (append) para añadir cada operación al archivo historial.txt.
- Recuperar historial:
- Leer el archivo y mostrar su contenido al usuario si así lo solicita.
- Formato del archivo:
- Almacenar cada operación con formato claro (ej: 2024-10-05 14:30: 5 + 3 = 8).
-
Índice
Resultados de aprendizajeClasesResultado de aprendizaje 1
Asociar los conceptos fundamentales de la programación: sintaxis, manejo de tipos de datos, variables, entrada/salida de datos y estructuras de control básicas, en un lenguaje estructurado.
Resultado de aprendizaje 2
Reconocer las estructuras básicas de un lenguaje de programación estructurado, su sintaxis y su utilidad en la solución de problemas de programación.
Resultado de aprendizaje 3
Solucionar problemas de programación de mediano nivel, mediante el uso de algoritmos basados en matemáticas, pudiendo descompoenerlos en tareas más simples por medio del uso de técnicas de programación como funciones.
Mostrar más-
-
RETO 1: Fundamentos de Programación (Variables, Tipos de Datos y Operadores)
Objetivo: Crear una calculadora básica que realice operaciones matemáticas simples (suma, resta, multiplicación, división) utilizando variables, tipos de datos y operadores.
Indicaciones:
- Entrada/Salida de datos:
- Solicitar al usuario dos números mediante input().
- Mostrar resultados con print().
- Operaciones básicas:
- Implementar las cuatro operaciones aritméticas usando +, -, *, /.
- Validación simple:
- Asegurarse de que los valores ingresados sean numéricos (ej: usar float() o int()).
Actividades
- Crear variables para operandos.
- Implementar entrada/salida de datos.
- Realizar operaciones básicas (+, -, *, /).
-
Introducción
Esta primera clase se inicia con una cálida bienvenida al fascinante mundo de la programación, donde exploraremos los conceptos fundamentales que constituyen la base para desarrollar soluciones tecnológicas. En un diálogo cercano y motivador, conversaremos sobre qué es un algoritmo, qué implica tener un programa y la importancia del código fuente. Durante este recorrido, se plantearán ejemplos cotidianos y se realizará una analogía con procesos lógicos de la vida diaria para que el estudiante pueda identificar, de manera intuitiva, los elementos que componen la programación estructurada.
Además, en esta sesión se destacará la relevancia de conocer las diferencias entre compiladores e intérpretes, y se presentarán algunos de los lenguajes de programación más populares (como Python, Java y C++), subrayando sus particularidades y ámbitos de aplicación. De esta forma, se busca no solo que el estudiante asocie los conceptos teóricos, sino que también se sienta estimulado a indagar más allá de la teoría y a experimentar con ejemplos prácticos que lo inviten a profundizar en el campo de la ingeniería en ciberseguridad y gestión de TI. -
1.1 Conceptos Básicos de Programación
El primer bloque temático aborda la esencia de la programación. Se parte de la definición y aplicación de conceptos que constituyen el esqueleto de cualquier lenguaje:
Algoritmo: Un algoritmo es, en esencia, una secuencia finita y ordenada de instrucciones diseñadas para resolver un problema o ejecutar una tarea específica. Se le puede considerar como la "receta" que, paso a paso, guía la solución de un problema concreto. Por ejemplo, para preparar un café, se siguen instrucciones precisas: calentar agua, agregar café a una taza, verter el agua caliente, remover y servir. De manera similar, en programación, un algoritmo establece la secuencia lógica necesaria para transformar entradas en salidas deseadas.Para ilustrar este concepto, imaginemos un algoritmo que determine si un número es par o impar. La secuencia de pasos sería la siguiente:
- I. Recibir el número ingresado por el usuario.
- II. Dividir el número por 2 y determinar el residuo.
- III. Si el residuo es 0, entonces el número es par; de lo contrario, es impar.
- IV. Mostrar el resultado al usuario.
Esta representación secuencial enfatiza la importancia de descomponer un problema en pasos simples y lógicos. El algoritmo, por tanto, se puede expresar de forma gráfica mediante un diagrama de flujo, lo que ayuda a visualizar el recorrido lógico y a identificar posibles mejoras o errores en la secuencia.
Una definición clara y precisa de cada paso en un algoritmo es crucial para evitar ambigüedades y facilitar su posterior implementación en un lenguaje de programación.
Figura 1: Diagrama de flujo de un algoritmo que muestra la secuencia para determinar si un número es par o impar.
Damián Nicolalde Rodríguez. (2024).En el contexto de la programación, el algoritmo es el esqueleto que sustenta la solución de cualquier problema. La práctica de diseñar algoritmos fomenta el pensamiento crítico y el análisis lógico, habilidades esenciales para cualquier desarrollador. Se recomienda que los estudiantes practiquen la redacción de pseudocódigo, que es una representación informal del algoritmo en un lenguaje natural adaptado a estructuras de programación, lo que facilita la transición al código real.
Para una mejor comprensión revise el video:
Qué es un algoritmo y para qué se usa
Programa: Un programa es la implementación de uno o varios algoritmos utilizando un lenguaje de programación. Es un conjunto de instrucciones escritas que la computadora puede interpretar y ejecutar para realizar una tarea determinada. Por ejemplo, un programa que calcula el promedio de una serie de números implementa un algoritmo que suma los números y divide el total por la cantidad de elementos.
La estructura de un programa moderno se basa en la modularización, es decir, la división del código en partes o módulos que realizan tareas específicas. Esto permite que el programa sea más fácil de entender, mantener y escalar, ya que cada módulo puede desarrollarse y probarse de manera independiente. Además, un buen programa incorpora mecanismos de control de errores, entradas y salidas de datos y, en general, se organiza siguiendo principios de programación estructurada.
La modularización y la claridad en la estructura de un programa facilitan tanto la depuración como la futura ampliación del software, aspectos vitales en proyectos de gran escala.
Figura 2: Esquema gráfico que muestra la estructura de un programa dividido en módulos y funciones, destacando la relación entre el algoritmo principal y los submódulos.
Damián Nicolalde Rodríguez. (2024).En el diseño de un programa, es importante seguir un proceso iterativo que incluya la planificación, codificación, pruebas y optimización. Este proceso no solo garantiza que el programa funcione correctamente, sino que también promueve buenas prácticas de desarrollo y mantenimiento del código. El uso de comentarios y la adopción de estándares de codificación son aspectos complementarios que ayudan a que el programa sea comprensible para otros desarrolladores y para el propio autor en futuras revisiones.
Código fuente: El código fuente es la versión original del programa, escrita en un lenguaje de programación. Este código es legible por los humanos y sirve como base para la creación del programa ejecutable, ya sea a través de la compilación o la interpretación. La calidad del código fuente es determinante, ya que un código bien estructurado y documentado reduce la probabilidad de errores y facilita el mantenimiento a lo largo del tiempo.
Consideremos el siguiente ejemplo en Python, donde se imprime un mensaje en la consola:# Ejemplo de código fuente en Python para imprimir "Hola Mundo"
print("Hola Mundo")Este breve fragmento ilustra cómo una instrucción puede transformar la idea en una acción concreta. Sin embargo, en aplicaciones más complejas, el código fuente debe estar organizado en funciones, clases y módulos, siguiendo principios de diseño que favorezcan la reutilización y la legibilidad.
La calidad del código fuente se refleja en la claridad, consistencia y documentación del mismo, factores que reducen significativamente la aparición de errores.
Captura de pantalla de un entorno de desarrollo integrado (IDE) mostrando un ejemplo de código fuente en Python.
Damián Nicolalde Rodríguez. (2024). Código fuente en Python.Captura de pantalla de un entorno de desarrollo integrado (IDE) mostrando un ejemplo de código fuente en Python.
Damián Nicolalde Rodríguez. (2024). Código fuente en Python.Además, el código fuente es el punto de partida para la optimización de la seguridad y eficiencia del programa, aspectos especialmente críticos en contextos de ciberseguridad. La adopción de buenas prácticas de programación, como el uso de nombres descriptivos para variables y funciones, la organización modular y la inclusión de comentarios explicativos, son esenciales para que el código pueda ser comprendido y mejorado por otros desarrolladores.
Para una mejor comprensión revise el video:
Qué es código fuente en el lenguaje de programación
-
1.2 Diferencias entre Compiladores e Intérpretes
En el proceso de transformación del código fuente a un programa ejecutable, existen dos métodos fundamentales: la compilación y la interpretación. Cada método tiene características propias que influyen en el rendimiento, la flexibilidad y la facilidad de depuración del software.
Compiladores: Un compilador es un programa especializado que traduce el código fuente completo a un lenguaje máquina, generando un archivo ejecutable independiente. Este proceso se realiza antes de la ejecución del programa, de manera que el archivo resultante puede ser distribuido y ejecutado sin necesidad del código fuente original. Entre las ventajas de los compiladores se encuentran la optimización del código, que mejora la velocidad de ejecución, y una mayor seguridad, puesto que el código binario resultante es menos susceptible a modificaciones no autorizadas.
Por ejemplo, en lenguajes como C++ o Java (en el caso de la compilación previa a la ejecución en la JVM), la compilación permite transformar programas complejos en aplicaciones eficientes y robustas. No obstante, un inconveniente es que cualquier modificación en el código fuente requiere una recompilación completa, lo que puede ralentizar el ciclo de desarrollo en proyectos de gran envergadura.
La compilación es fundamental en entornos donde el rendimiento es prioritario, aunque puede resultar menos flexible durante la fase de desarrollo.
Figura 4: Diagrama que ilustra el proceso de compilación, mostrando la conversión del código fuente en un archivo ejecutable, pasando por etapas de análisis, optimización y generación de código máquina.
Damián Nicolalde Rodríguez. (2024). Proceso de compilación.Figura 4: Diagrama que ilustra el proceso de compilación, mostrando la conversión del código fuente en un archivo ejecutable, pasando por etapas de análisis, optimización y generación de código máquina.
Damián Nicolalde Rodríguez. (2024). Proceso de compilación.El proceso de compilación también permite detectar errores de sintaxis y optimizar el uso de recursos, lo cual es crucial para aplicaciones de misión crítica. Los compiladores modernos incorporan técnicas avanzadas de análisis y optimización que pueden transformar un código poco eficiente en una aplicación de alto rendimiento, aprovechando al máximo las capacidades del hardware.
Intérpretes: A diferencia de los compiladores, un intérprete traduce y ejecuta el código fuente línea por línea en tiempo real. Este método permite que el desarrollador observe de forma inmediata los resultados de cada instrucción, facilitando la identificación y corrección de errores durante el desarrollo. Los lenguajes interpretados, como Python, se benefician de esta característica, ya que permiten una mayor flexibilidad y rapidez en la fase de prototipado.
La ejecución interpretada ofrece la ventaja de poder modificar el código y ver los resultados sin necesidad de un proceso de compilación completo, lo que acelera el ciclo de pruebas y desarrollo. Sin embargo, la ejecución en tiempo real puede conllevar una penalización en el rendimiento, ya que cada línea debe ser traducida al momento de su ejecución.
La interpretación es ideal para entornos de desarrollo y enseñanza, donde la rapidez en la retroalimentación y la facilidad para corregir errores son factores determinantes.
Figura 5: Esquema ilustrativo del proceso de interpretación, en el que se muestra cómo el código fuente es leído y ejecutado de manera secuencial, permitiendo la interacción inmediata con el entorno de desarrollo.
Damián Nicolalde Rodríguez. (2024). Proceso de interpretación. Creación de autor.El uso de intérpretes favorece la experimentación y el aprendizaje, ya que los estudiantes pueden modificar y ejecutar fragmentos de código sin esperar largos tiempos de compilación. Esta característica es especialmente útil en un entorno educativo, donde la retroalimentación inmediata permite consolidar el aprendizaje de manera más efectiva.
-
1.3 Lenguajes de Programación Populares (Python, Java, C++)
Esta parte del contenido se centra en la presentación y análisis de tres lenguajes de programación que han tenido un impacto significativo en la industria y la educación. Cada uno de ellos posee características únicas que los hacen idóneos para diferentes tipos de aplicaciones y contextos de desarrollo.
Python: es un lenguaje de programación interpretado reconocido por su sintaxis limpia y legible. Su diseño favorece la productividad y la claridad, lo que lo convierte en una opción privilegiada tanto para principiantes como para expertos. Python se utiliza en múltiples áreas, tales como análisis de datos, inteligencia artificial, desarrollo web, automatización y scripting. Su extenso ecosistema de librerías y frameworks lo hace extremadamente versátil.
Ejemplo de código en Python:# Ejemplo simple en Python para imprimir "Hola Mundo" print("Hola Mundo")
La sencillez de Python permite a los desarrolladores concentrarse en la lógica del problema en lugar de en la sintaxis compleja, lo que resulta en un desarrollo más rápido y menos propenso a errores. Además, el soporte comunitario y la abundancia de recursos educativos hacen de Python una herramienta ideal para introducir a los estudiantes en la programación.
Figura 6: Logo oficial de Python, ampliamente reconocido en la industria del software.
Python Software Foundation. (n.d.). Python Software Foundation. https://www.python.org/psf-landing/.Durante el desarrollo de este curso, se explorarán ejemplos prácticos en los que se utilicen librerías populares como NumPy para cálculos numéricos y Pandas para la manipulación de datos, demostrando cómo Python puede resolver problemas complejos de manera eficiente y con un código legible.
Java: es un lenguaje de programación compilado que se ejecuta sobre la Máquina Virtual de Java (JVM), lo que le confiere una gran portabilidad y robustez. Su diseño orientado a objetos fomenta la reutilización del código y la implementación de soluciones escalables. Java es ampliamente utilizado en el desarrollo de aplicaciones empresariales, sistemas móviles (especialmente en Android) y aplicaciones de gran escala.
Ejemplo de código en Java:
La fortaleza de Java reside en su capacidad para ofrecer un entorno seguro y gestionado, donde aspectos como la gestión de memoria y la seguridad son manejados automáticamente por la JVM. Este enfoque reduce la carga del desarrollador y permite centrarse en la lógica de la aplicación. Java permite aplicar conceptos fundamentales de la programación orientada a objetos, tales como la encapsulación, la herencia y el polimorfismo, demostrando cómo estos principios se implementan para crear aplicaciones robustas y mantenibles.
Figura 7: Logo oficial de Java, representativo de su robustez y versatilidad.
Oracle Corporation. (n.d.). Java. https://www.java.com/es/.Además, Java al igual que otros lenguajes de programación permite la gestión de excepciones y el manejo de errores, elementos cruciales en el desarrollo de aplicaciones críticas. Java ha sido utilizado para desarrollar soluciones empresariales de alto rendimiento.
C++: es un lenguaje de programación compilado que se distingue por su alto rendimiento y su capacidad para gestionar recursos a bajo nivel. Este lenguaje es ampliamente utilizado en el desarrollo de sistemas operativos, videojuegos y aplicaciones que requieren un control preciso sobre el hardware. C++ combina características de la programación estructurada con las ventajas de la programación orientada a objetos, lo que lo convierte en una herramienta poderosa para la creación de software de alto rendimiento.
Ejemplo de código en C++:
La capacidad de C++ para manipular directamente la memoria y optimizar el uso de recursos lo hace indispensable en aplicaciones donde el rendimiento es crítico. En próximas asignaturas, se explicarán conceptos clave como la gestión dinámica de memoria, punteros y referencias, así como la importancia de la eficiencia en el desarrollo de software. Los estudiantes aprenderán a identificar cuándo es apropiado utilizar C++ en función de las necesidades del proyecto, comparándolo con otros lenguajes de programación.
Figura 8: Logo oficial de C++, símbolo que representa la eficiencia y el control de bajo nivel en el desarrollo de aplicaciones.
Bloodshed Software. (n.d.). Bloodshed Software. https://bloodshed.net/.Se hará hincapié en que la elección del lenguaje de programación depende del contexto y los requisitos del proyecto. Mientras Python es ideal para prototipos rápidos y análisis de datos, Java y C++ ofrecen ventajas en términos de rendimiento y robustez en aplicaciones de gran escala. La discusión se complementará con ejemplos de proyectos reales y estudios de caso que demuestren cómo cada lenguaje aporta soluciones a problemas específicos en el ámbito de la ingeniería en ciberseguridad y la gestión de TI.
-
-
-
Actividades
-
-
-
Introducción
En esta sección, profundizaremos en dos aspectos cruciales que resultan determinantes para la planificación y el desarrollo de software. En primer lugar, analizaremos las fases que componen el ciclo de vida de un proyecto de software —concretamente, el análisis, el diseño, la codificación y la prueba—, explicando en detalle cada una de ellas y subrayando su relevancia para la creación de soluciones que no solo sean funcionales, sino también robustas y eficientes. Estas fases conforman un proceso iterativo, donde cada etapa colabora con la siguiente para minimizar el riesgo de errores, optimizar la utilización de recursos y asegurar que el producto final cumpla con los requerimientos planteados por el cliente o por el entorno en el que se despliegue.
En segundo lugar, exploraremos cómo herramientas de planificación como el pseudocódigo y los diagramas de flujo pueden aportar claridad al momento de estructurar la lógica de un algoritmo antes de comenzar la implementación. El pseudocódigo, al ser una representación textual simplificada, permite que el programador y el equipo de trabajo se centren en la secuencia de pasos y la resolución de la problemática sin verse distraídos por la sintaxis particular de un lenguaje de programación. Por su parte, los diagramas de flujo brindan una visión visual y global de los pasos que seguirá el software, facilitando la comunicación entre miembros del equipo y la detección temprana de inconsistencias o redundancias en la lógica. Esta combinación de recursos —pseudocódigo y diagramas— promueve un entendimiento compartido de la solución, lo cual es esencial para proyectos de ingeniería en ciberseguridad y gestión de TI, donde la colaboración y la precisión adquieren un papel protagónico. -
2.1 Fases del desarrollo de software: análisis, diseño, codificación, prueba
El proceso de desarrollo de software es un conjunto de etapas interrelacionadas que aseguran la creación de soluciones robustas y eficientes. Cada fase aporta actividades específicas que, al integrarse, permiten detectar y corregir errores de forma temprana, optimizar recursos y garantizar que el software cumpla con los requerimientos del usuario.
Para una mejor comprensión revise el video:
Aprende qué es Desarrollo de Software y sus etapas
2.1.1 Análisis
La fase de análisis constituye el punto de partida en cualquier proyecto de desarrollo de software, ya que durante este período se definen con claridad el problema a resolver y los requerimientos específicos del usuario o cliente. A lo largo de esta etapa, el equipo responsable del proyecto recopila información mediante entrevistas, encuestas, observación directa y la revisión de documentos existentes, con el fin de entender a fondo las necesidades, expectativas y posibles restricciones. Este trabajo inicial es crucial porque sienta las bases de todo el proceso subsiguiente, evitando que el desarrollo se realice sobre suposiciones inexactas o metas poco definidas. Cuando el análisis se realiza de forma metódica, se establecen objetivos claros y se identifican los actores involucrados (por ejemplo, propietarios, empleados y clientes), lo que facilita la alineación de todos los participantes con la visión del proyecto.
Para ilustrarlo, en el caso de un sistema de gestión de inventario destinado a una tienda, el análisis abarcaría aspectos como la identificación de quienes usarán el sistema (propietario, personal de ventas, encargados de bodega), los requerimientos que permitirán controlar el stock de productos, registrar entradas y salidas de mercancía, y generar reportes de ventas. Además, en esta fase se suele llevar a cabo un estudio de viabilidad, tanto técnica como económica, que evalúa si las tecnologías disponibles, los plazos y el presupuesto son adecuados para desarrollar la solución propuesta. Si en este punto se descubren limitaciones insalvables (como un presupuesto muy reducido o requerimientos imposibles de cumplir con la tecnología elegida), se pueden ajustar las expectativas antes de comprometer recursos en etapas más costosas.
Un análisis exhaustivo reduce la probabilidad de malentendidos o re-trabajos en fases posteriores, dado que, cuanto más claro sea el entendimiento del problema y de los objetivos, menos correcciones serán necesarias en el futuro. Por ello, la precisión y la profundidad en la recolección de datos son decisivas: cualquier error u omisión en la fase de análisis podría repercutir en todas las etapas siguientes (diseño, codificación y prueba), incrementando costos y retrasando la entrega del producto final. De esta manera, la etapa de análisis no solo delimita el alcance del proyecto, sino que también contribuye a que el diseño posterior se ajuste realmente a las necesidades detectadas, estableciendo una base sólida para un desarrollo exitoso.
Un análisis detallado y riguroso es la clave para un desarrollo de software exitoso.
Figura 1: Diagrama Esquemático de las Fases del Desarrollo de Software.
Damián Nicolalde Rodríguez. (2024). Diagrama Esquemático de las Fases del Desarrollo de Software.2.1.2 Diseño
La fase de diseño es una etapa esencial en el desarrollo de software, donde se establece la estructura lógica y técnica que guiará el desarrollo del sistema previamente definido en la fase de análisis. En esta etapa se traducen los requerimientos y necesidades identificados durante el análisis en una solución técnica clara, organizada y eficiente. El diseño implica decisiones fundamentales sobre la arquitectura del software, la selección de algoritmos y la definición detallada de los componentes y relaciones que conformarán el sistema. Durante este proceso, se emplean diversas herramientas que permiten organizar y representar gráficamente la lógica del software, tales como diagramas de flujo, diagramas UML, esquemas de bases de datos y pseudocódigo. Por ejemplo, si pensamos en el desarrollo de un sistema de inventario, el diseño implicaría inicialmente descomponer el sistema en módulos funcionales. Se podrían considerar módulos como: gestión de productos, control de entradas y salidas del almacén, módulo de reportes y módulo de usuarios. Luego, se elaboran diagramas de casos de uso que permiten visualizar claramente cómo interactúan los usuarios (por ejemplo, administradores y empleados de inventario) con cada uno de los módulos y qué acciones específicas pueden realizar. Esto facilita identificar las funciones clave y los procesos que el sistema debe soportar para cumplir sus objetivos.
Además, el diseño debe contemplar cómo estos módulos interactúan entre sí. Aquí es donde los diagramas de clases entran en juego. Estos diagramas describen los objetos o entidades que conforman el sistema (productos, categorías, ventas, empleados, etc.), mostrando claramente sus atributos y las relaciones existentes entre ellos, lo que ayuda a visualizar la organización lógica y las dependencias. Esto es crucial para determinar la estructura del código fuente en la siguiente fase (codificación), ya que establece claramente la relación y jerarquía entre diferentes componentes.
Otro aspecto fundamental en el diseño es la planificación del flujo lógico del programa mediante el uso del pseudocódigo. Este recurso permite describir detalladamente las operaciones del programa de manera clara y concisa, pero sin las limitaciones sintácticas propias de los lenguajes de programación. Por ejemplo, al implementar la lógica para registrar nuevos productos en un inventario, el pseudocódigo ayudaría a visualizar paso a paso cómo debería operar esta funcionalidad antes de escribir la codificación final, asegurando que la lógica sea robusta y sin ambigüedades.
Un buen diseño no solo optimiza el proceso de desarrollo, sino que también facilita la detección temprana de posibles errores, reduciendo significativamente los costos asociados a correcciones durante la fase de pruebas o incluso después del lanzamiento del sistema. Por tanto, dedicar tiempo suficiente y esfuerzo meticuloso al diseño es indispensable para asegurar la calidad y eficiencia del producto final.Fase Objetivo Principal Ejemplo de Actividad Análisis Definir el problema y recabar requerimientos. Entrevistar usuarios, análisis de documentación. Diseño Planificar la solución y definir la arquitectura del sistema. Elaboración de diagramas de casos de uso y de clases. Codificación Traducir el diseño a código fuente usando buenas prácticas. Escribir módulos y funciones, pruebas unitarias. Prueba Verificar que el software cumple los requerimientos y funciona correctamente. Pruebas unitarias, de integración y de sistema. Tabla 1: Cuadro Comparativo de las Fases del Desarrollo de Software
Damián Nicolalde (2024)HeaderContent2.1.3 Codificación
La fase de codificación es un paso esencial en el desarrollo del software, donde las ideas plasmadas durante las etapas previas de análisis y diseño finalmente cobran vida a través de un lenguaje de programación específico. En esta fase, los desarrolladores escriben el código fuente siguiendo estrictamente los lineamientos definidos anteriormente, transformando las especificaciones teóricas en soluciones prácticas y operativas. Aquí, el énfasis recae en mantener el código claro, eficiente y bien documentado, asegurando que sea legible no solo para quien lo escribe, sino también para futuros desarrolladores que podrían mantener o ampliar el sistema.
Por ejemplo, retomando nuestro caso práctico del sistema de gestión de inventarios, durante la etapa de codificación se crean funciones individuales para cada aspecto esencial del sistema. Se desarrollan funciones específicas para registrar nuevos productos, actualizar cantidades en stock, y gestionar la salida de productos. También se escriben rutinas que permiten realizar consultas rápidas sobre el estado actual del inventario. Durante la codificación, se integran validaciones exhaustivas para prevenir errores comunes (como ingresar valores incorrectos) mediante estructuras condicionales (if-else) y manejo de excepciones (try-except), garantizando así la estabilidad del sistema en situaciones reales.
Además, en la fase de codificación, cobra importancia la aplicación de buenas prácticas de programación. Esto incluye la elección adecuada de nombres de variables utilizando convenciones como snake_case para mejorar la legibilidad y mantener consistencia en todo el código. La elección del lenguaje, en este caso Python, facilita enormemente el proceso gracias a su sintaxis clara, lo que permite que el código sea intuitivo y más sencillo de depurar y mantener.
Es común también que, durante esta fase, se implementen comentarios claros y concisos que expliquen la lógica del código, facilitando así la comprensión por parte de otros miembros del equipo o para futuras revisiones del software. Además, la incorporación de manejo de errores es clave. Esto incluye, por ejemplo, implementar bloques try-except que permitan gestionar adecuadamente excepciones o situaciones inesperadas como la introducción incorrecta de datos por parte del usuario.
Finalmente, aunque la fase de codificación parece ser una simple traducción del diseño, es en realidad una etapa crítica que requiere atención minuciosa a los detalles, ya que pequeños errores en esta etapa pueden propagarse y causar problemas significativos más adelante. Por lo tanto, es recomendable realizar revisiones constantes del código mediante técnicas como revisiones cruzadas entre compañeros (pair programming) o mediante herramientas automatizadas que faciliten la detección temprana de errores antes de avanzar a la fase de pruebas.
La calidad del código depende de la organización y la aplicación rigurosa de buenas prácticas de programación.2.1.4 Prueba
La fase de pruebas es esencial en el desarrollo del software, ya que permite asegurar que el producto final cumple con los requerimientos establecidos en las etapas anteriores y funciona correctamente bajo distintos escenarios y condiciones. Es fundamental que el software se someta a un proceso exhaustivo de verificación antes de su implementación, identificando posibles fallos o inconsistencias que afecten la calidad del sistema. Durante esta etapa, se ejecutan diversas pruebas especializadas, cada una dirigida a un aspecto particular del software:
- Pruebas unitarias: Consisten en verificar cada componente del sistema de forma independiente, generalmente utilizando casos específicos y aislados. Permiten confirmar que cada módulo responde correctamente a entradas esperadas y maneja adecuadamente las situaciones extremas.
- Pruebas de integración: Evalúan el funcionamiento conjunto de varios módulos que ya fueron validados unitariamente. En estas pruebas, el objetivo es asegurarse de que la interacción entre los módulos no genere errores adicionales, ya sea por problemas de comunicación interna, interfaces incompatibles o lógicas conflictivas.
- Pruebas de sistema: Son pruebas más generales que se realizan al software completo, simulando un ambiente similar al entorno final donde será utilizado. Se enfoca en evaluar no solo las funcionalidades individuales, sino también aspectos como el rendimiento general, la usabilidad, la eficiencia y la estabilidad del sistema bajo distintas condiciones operativas.
- }Pruebas de aceptación: Corresponden a la validación final antes de que el sistema sea entregado al usuario final. Se realizan junto con el usuario o cliente final, asegurando que la solución desarrollada cumple satisfactoriamente con las expectativas y requerimientos previamente establecidos.
Cada tipo de prueba juega un papel crucial para garantizar la estabilidad y fiabilidad del sistema final, ya que permite detectar errores en etapas tempranas cuando resulta menos costoso resolverlos. Las pruebas deben estar documentadas claramente, especificando los casos evaluados, resultados obtenidos, errores encontrados y soluciones implementadas. Además, se recomienda utilizar herramientas de automatización, como frameworks de testing (pytest en Python), para facilitar el proceso de ejecución y repetición sistemática de estas pruebas, especialmente en proyectos de gran escala. Esto asegura un seguimiento efectivo del estado del software y su evolución hacia un producto confiable y robusto.
La implementación adecuada y rigurosa de estas pruebas representa una inversión de tiempo significativa, pero crucial para reducir riesgos de fallos críticos en la operación diaria del software. En consecuencia, la fase de pruebas no solo valida la solución técnica, sino que también aumenta la confianza del usuario en la calidad y efectividad del producto final desarrollado.
Las pruebas rigurosas permiten identificar y corregir errores antes de que el software entre en producción.Fase Características Clave Objetivo Final Análisis Recolección de datos, definición de requerimientos, delimitación del problema. Establecer una base sólida para el proyecto. Diseño Creación de modelos, diagramas, planificación de la arquitectura. Visualizar y estructurar la solución. Codificación Escritura de código, aplicación de buenas prácticas, modularización. Traducir el diseño en un programa funcional. Prueba Ejecución de pruebas unitarias, integración, sistema y aceptación. Garantizar la fiabilidad y eficiencia del software. Tabla 2: Características y Objetivos de Cada Fase del Desarrollo
Damián Nicolalde (2024).HeaderContentEl proceso de desarrollo de software es iterativo y colaborativo. Cada fase – análisis, diseño, codificación y prueba – contribuye a la creación de soluciones sólidas, permitiendo detectar errores tempranamente y optimizar el uso de recursos. Una adecuada aplicación de estas fases asegura que el producto final cumpla con las expectativas del usuario y se mantenga a lo largo del tiempo.
-
2.2 Pseudocódigo y diagramas de flujo.
Las herramientas de planificación son esenciales para transformar ideas en soluciones de software. El pseudocódigo y los diagramas de flujo permiten a los desarrolladores estructurar la lógica de un algoritmo de forma clara y organizada antes de proceder a la codificación.
Pseudocódigo
El pseudocódigo es una representación textual simplificada de un algoritmo. Se utiliza para describir la secuencia de pasos necesarios para resolver un problema sin la rigidez de la sintaxis de un lenguaje de programación. Su principal ventaja es que permite concentrarse en la lógica y la estructura del algoritmo.
Ejemplo de Pseudocódigo: Para calcular el área de un rectángulo.Código
INICIO LEER largo LEER ancho CALCULAR area = largo * ancho MOSTRAR area FIN
Este ejemplo detalla de forma sencilla cada paso del proceso, haciendo hincapié en la lógica y en la estructura secuencial del algoritmo.
Figura 2: Ejemplo Gráfico de Pseudocódigo para el Cálculo de Área.
Damián Nicolalde Rodríguez. (2024). Gráfico de Pseudocódigo para el Cálculo de Área.2.2.2 Diagramas de Flujo
Los diagramas de flujo son representaciones gráficas que ilustran la secuencia de pasos y decisiones en un algoritmo. Utilizan símbolos estandarizados, tales como:
- Óvalos: para representar el inicio y el fin del proceso.
- Rectángulos: para procesos o acciones.
- Rombos: para decisiones (condiciones).
- Paralelogramos: para entradas y salidas.
Ejemplo: Para el problema del área de un rectángulo, el diagrama de flujo incluiría:
- Inicio (óvalo).
- Entrada de "largo" (paralelogramo).
- Entrada de "ancho" (paralelogramo).
- Proceso de cálculo (rectángulo).
- Salida del resultado (paralelogramo).
- Fin (óvalo).
Figura 3. Diagrama de Flujo para la Validación de Datos.
Damián Nicolalde Rodríguez. (2024). Diagrama de Flujo para la Validación de Datos.2.2.3 Integración de Pseudocódigo y Diagramas de Flujo
El uso conjunto del pseudocódigo y los diagramas de flujo permite abordar la planificación de un algoritmo desde dos perspectivas complementarias: una textual y otra visual. Mientras el pseudocódigo ofrece un desglose detallado de cada paso, el diagrama de flujo permite visualizar la secuencia global de operaciones y decisiones. Esta integración facilita la identificación de errores y mejora la comunicación dentro del equipo.
Ejemplo de Integración: Si se desea crear un algoritmo para validar la entrada de datos numéricos, el pseudocódigo puede describir los pasos para leer, convertir y validar los datos, mientras que el diagrama de flujo mostrará gráficamente la bifurcación en función de si los datos son válidos o no.
Figura 4. Diagrama de Flujo Integrativo del Proceso de Desarrollo
Damián Nicolalde Rodríguez. (2024). Diagrama de Flujo Integrativo del Proceso de Desarrollo.Para una mejor comprensión revise el video:
Programación: Diagramas de flujo y pseudocódigo
La integración de las fases del desarrollo de software con el uso de herramientas de planificación es esencial para la creación de soluciones robustas y de alta calidad. Un análisis detallado y un diseño estructurado permiten que la codificación sea más ordenada y las pruebas sean efectivas, reduciendo la incidencia de errores y facilitando el mantenimiento futuro del software.
El pseudocódigo y los diagramas de flujo actúan como puentes entre la teoría y la práctica, permitiendo a los desarrolladores estructurar la lógica de un algoritmo sin las restricciones de la sintaxis de un lenguaje de programación. Mientras que el pseudocódigo se enfoca en detallar la secuencia de pasos de forma textual, el diagrama de flujo ofrece una representación visual que facilita la comunicación y el análisis colaborativo.
La implementación de estas herramientas en el proceso de desarrollo no solo mejora la calidad del software, sino que también optimiza el uso de recursos y fomenta la colaboración en equipo. En entornos complejos, como en la ingeniería en ciberseguridad y la gestión de TI, donde la precisión y la confiabilidad son críticas, estas metodologías se vuelven aún más relevantes.
El contenido presentado en esta clase, ofrece una base sólida para comprender el ciclo de vida del desarrollo de software y las herramientas que lo acompañan. La planificación y la estructuración meticulosa de los procesos son la clave para el éxito en la creación de software de calidad, y el dominio de estas técnicas es indispensable para cualquier profesional en el campo de la programación y la ciberseguridad.
Aspecto Pseudocódigo Diagrama de Flujo Formato Texto, en lenguaje natural. Gráfico, con símbolos estandarizados. Propósito Describir la lógica de forma secuencial y detallada. Visualizar la secuencia de operaciones y decisiones. Ventaja Principal Facilidad para detallar la lógica sin errores de sintaxis. Claridad en la representación visual del proceso. Aplicación Planificación y documentación de algoritmos. Revisión, comunicación y análisis colaborativo de la lógica. Tabla 3: Resumen Comparativo – Pseudocódigo vs. Diagrama de Flujo
Damián Nicolalde (2024).HeaderContentLa importancia de planificar adecuadamente antes de comenzar la codificación. Un análisis riguroso y un diseño bien estructurado son la base de cualquier proyecto exitoso. Además, el uso de herramientas visuales fortalece la capacidad de identificar y corregir fallas en el proceso de desarrollo, lo que es especialmente crítico en entornos complejos como la ingeniería en ciberseguridad y la gestión de TI.
-
-
-
Actividades
-
Hacer intentos: 1
-
-
-
Introducción
EEn esta sección profundizaremos de manera detallada en aspectos fundamentales para el dominio inicial de Python, un lenguaje ampliamente utilizado en múltiples ámbitos debido a su flexibilidad y claridad sintáctica. Nos centraremos en comprender a fondo los tipos de datos primitivos, las convenciones para nombrar variables, y los operadores básicos que Python utiliza para manipular información, conceptos esenciales para desarrollar algoritmos eficientes y claros.
Iniciaremos explorando los tipos de datos más básicos, conocidos como datos primitivos, los cuales constituyen la piedra angular para manejar información en cualquier lenguaje de programación. Entre estos destacan los enteros (int), los números con decimales (float), los valores booleanos (bool) y las cadenas de texto (str). Cada uno de estos tipos de datos posee características particulares y es esencial comprender sus propiedades y limitaciones para utilizarlos de forma efectiva en programas estructurados. Adicionalmente, se detallarán las reglas prácticas para declarar variables en Python, así como las convenciones recomendadas para nombrarlas adecuadamente, lo que promueve una mejor legibilidad y mantenimiento del código especialmente cuando se trabaja en equipos colaborativos.
Adicionalmente, abordaremos el uso y funcionalidad de los operadores básicos en Python, herramientas fundamentales que permiten la manipulación eficiente y precisa de datos en diversas situaciones. Los operadores pueden clasificarse principalmente en tres grandes grupos: operadores aritméticos, operadores relacionales y operadores lógicos. Cada grupo de operadores cumple funciones específicas dentro del desarrollo de programas, facilitando desde cálculos matemáticos simples hasta la evaluación de condiciones más complejas para controlar el flujo lógico de la ejecución.
Por ejemplo, mediante los operadores aritméticos (+, -, *, /, %), podemos realizar desde cálculos básicos, como sumar dos valores numéricos, hasta complejas operaciones que impliquen la combinación y manipulación de múltiples datos numéricos. Por su parte, los operadores relacionales como mayor que (>), menor que (<), igual a (==), entre otros, son herramientas esenciales para determinar relaciones entre valores y tomar decisiones de forma precisa dentro de los programas. Finalmente, los operadores lógicos and, or y not permiten construir expresiones compuestas capaces de evaluar múltiples condiciones, otorgando una enorme flexibilidad al controlar el flujo del programa. -
3.1 Tipos de datos primitivos: int, float, bool, str
3.1.1 Introducción a Python como Lenguaje de Programación
Python es un lenguaje interpretado, considerado de alto nivel debido a su proximidad al lenguaje humano. Se caracteriza por permitir diversos enfoques de programación, conocidos como paradigmas. Este lenguaje ha ganado popularidad notable en la última década, principalmente debido a su facilidad de aprendizaje, su código limpio y legible, y su gran versatilidad en proyectos complejos. La simplicidad en la sintaxis es uno de sus rasgos distintivos, permitiendo a los desarrolladores escribir soluciones de manera ágil y eficiente, lo que facilita enormemente la curva de aprendizaje en comparación con otros lenguajes más rígidos y sintácticamente complejos.
Creado inicialmente por Guido van Rossum hacia finales de la década de 1980 como un proyecto personal para mejorar la claridad del código en comparación con otros lenguajes populares en aquel entonces, Python fue lanzado oficialmente en el año 1991. Desde su publicación, ha experimentado múltiples actualizaciones que han incorporado mejoras significativas, convirtiéndose hoy en día en una herramienta indispensable para distintos campos profesionales. Actualmente, Python no solo destaca en áreas tradicionales del desarrollo como la creación de sitios web dinámicos, aplicaciones de escritorio o scripts de automatización, sino que se ha convertido en el lenguaje preferido para la ciencia de datos, el aprendizaje automático, la inteligencia artificial, y múltiples áreas tecnológicas emergentes debido a su flexibilidad y potencia.
Entre las características fundamentales que distinguen a Python están:
- Sintaxis Sencilla y Clara: La estructura del lenguaje está diseñada para ser intuitiva y cercana al idioma inglés, lo cual facilita que personas con poca experiencia previa en programación puedan entender rápidamente el código. Esta claridad disminuye notablemente la probabilidad de errores, facilitando además las tareas de mantenimiento y modificación del código a largo plazo.
- Tipado Dinámico: A diferencia de lenguajes con tipado estático, en Python no es obligatorio definir explícitamente el tipo de una variable antes de su uso. El intérprete reconoce automáticamente el tipo en el momento de la ejecución del programa. Esta característica reduce el tiempo necesario para escribir código, otorgando flexibilidad al desarrollador, especialmente durante las primeras fases del desarrollo de una aplicación.
- Amplio Ecosistema y Bibliotecas Robustas: Una de las ventajas más atractivas de Python es su biblioteca estándar extensa, acompañada por miles de paquetes externos disponibles de forma gratuita y mantenidos por la comunidad. Herramientas populares como NumPy y Pandas para análisis y manipulación de datos, Django y Flask para desarrollo web, o TensorFlow y PyTorch para inteligencia artificial y aprendizaje automático, demuestran cómo Python cubre con solvencia prácticamente cualquier necesidad tecnológica actual.
- Comunidad Activa y Colaborativa: Python cuenta con una de las comunidades más grandes y colaborativas dentro del mundo de la programación. Esto implica una gran cantidad de recursos disponibles para aprendizaje, documentación bien estructurada, cursos gratuitos en múltiples plataformas educativas, y foros activos donde los desarrolladores intercambian soluciones a problemas frecuentes y se ayudan mutuamente. Esta comunidad vigorosa es esencial para que el lenguaje se mantenga en constante evolución, integrando mejoras continuas y adaptándose a las necesidades cambiantes de sus usuarios.
Además, para maximizar la productividad al utilizar Python, es recomendable trabajar en un entorno de desarrollo integrado (IDE). Estos entornos proporcionan herramientas que facilitan enormemente la programación, tales como el autocompletado de código, funciones de depuración avanzadas que permiten identificar y resolver errores con facilidad, gestión organizada de proyectos grandes con múltiples archivos, y una interfaz visual cómoda para la escritura del código. Entre los IDE más populares se encuentran Visual Studio Code y PyCharm. Ambos son ampliamente usados en la industria y por desarrolladores profesionales debido a su robustez y a las facilidades que ofrecen para mantener el orden y la estructura del código, lo que repercute directamente en una mejora considerable en la eficiencia y calidad del software desarrollado.
Adicionalmente, Python es un lenguaje multiplataforma. Esto quiere decir que un mismo programa puede ejecutarse sin mayores modificaciones en diversos sistemas operativos como Windows, macOS y distribuciones de Linux, haciendo que las aplicaciones desarrolladas con Python sean altamente portables y accesibles a un público amplio. Esta característica fortalece la adopción del lenguaje en empresas que requieren soluciones tecnológicas flexibles y compatibles con diversas plataformas de trabajo.
Un entorno de desarrollo adecuado potencia la eficiencia y la calidad del código.
Figura 1: Diagrama que ilustra la Instalación y Configuración de Python
Damián Nicolalde Rodríguez. (2024). Instalación y Configuración de Python en VS CodeProfundiza más
Instalación y Configuración de Python en Visual Studio Code ¡Accede aquí!
-
3.2 Tipos de datos primitivos: int, float, bool, str
Los tipos de datos primitivos son la base para la manipulación de la información y el control de los procesos en un programa. Estos tipos se utilizan para representar valores y realizar operaciones matemáticas y lógicas.
En Python, los datos primitivos incluyen principalmente:
- int: Números enteros.
- float: Números con parte decimal.
- bool: Valores lógicos (True o False).
- str: Cadenas de texto.
3.2.1. int (entero)
El tipo int se utiliza para representar números enteros, es decir, aquellos sin parte decimal. Estos números se emplean en operaciones aritméticas básicas, conteos y estructuras de iteración. Por ejemplo, al definir la variable edad = 25, se está asignando un valor entero.
Ejemplo en Python:
edad = 25 cantidad_de_items = 100
Aquí, edad y cantidad_de_items son variables de tipo entero que pueden usarse en cálculos, comparaciones y ciclos. El manejo de números enteros es esencial para cálculos precisos y control de flujos mediante bucles y condicionales.
3.2.2 float (Flotantes)
El tipo float representa números con parte decimal, lo que es fundamental en aplicaciones que requieren precisión en cálculos, como mediciones o finanzas. Los números flotantes permiten trabajar con decimales y son imprescindibles para operaciones matemáticas complejas.
Ejemplo en Python:
precio = 19.99 distancia = 3.75
Estos valores se usan cuando se requiere un mayor grado de precisión en cálculos matemáticos.
3.2.3 bool (Booleanos)
El tipo bool es utilizado para almacenar valores lógicos, que pueden ser True o False. Son fundamentales en la toma de decisiones dentro del flujo de un programa, ya que permiten evaluar condiciones y determinar la ejecución de bloques de código.
Ejemplo en Python:
es_aprobado = True tiene_permiso = False
El uso de valores booleanos es crucial para la toma de decisiones en el flujo del programa.
3.2.4 str (Cadenas de Texto)
El tipo str se utiliza para representar secuencias de caracteres. Es la base para trabajar con textos, nombres, mensajes y cualquier dato alfanumérico. Las cadenas permiten almacenar y manipular información textual de manera eficiente.
Ejemplo en Python:
nombre = "Juan" mensaje = "Bienvenido al curso de Programación 1"
La manipulación de cadenas es vital en aplicaciones que requieren la interacción con el usuario o el procesamiento de texto.
Figura 2: Ejemplo Visual de Tipos de Datos en Python
Damián Nicolalde Rodríguez. (2024). Ejemplo Visual de Tipos de Datos en Python.Profundiza más
Para complementar y profundizar, se sugieren acceder a este recurso ¡Accede aquí!
3.2.5 Operadores
Los operadores son símbolos que realizan operaciones sobre los datos. Python los clasifica en varias categorías que permiten llevar a cabo cálculos, comparaciones y evaluaciones lógicas.
3.2.5.1 Operadores Aritméticos
Estos operadores realizan operaciones matemáticas básicas, tales como suma, resta, multiplicación, división, módulo y exponenciación. Son esenciales para realizar cálculos y transformar datos numéricos.
Ejemplos:
- Suma: +
- Resta: -
- Multiplicación: *
- División: /
- Módulo (resto): %
- Exponenciación: **
Ejemplo en Python:
suma = 10 + 5 # 15 producto = 10 * 5 # 50 resta = 10 - 5 # 5 division = 10 / 5 # 2.0 modulo = 10 % 3 # 1 potencia = 2 ** 3 # 8
Cada uno de estos operadores permite manipular números de manera efectiva y es fundamental en el desarrollo de algoritmos.
3.2.5.2 Operadores de Comparación
Los operadores de comparación se utilizan para comparar dos valores y devuelven un resultado booleano. Permiten establecer relaciones entre variables, lo que es clave para la toma de decisiones en el código.
Ejemplos:
- Igual a: ==
- No igual a: !=
- Mayor que: >
- Menor que: < Mayor o igual que:>=
- Menor o igual que: <=
Ejemplo en Python:
es_igual = (10 == 10) # True no_es_igual = (10 != 5) # True mayor = (10 > 5) # True menor = (5 < 10) # True
Estos operadores son esenciales para construir condiciones en estructuras de control, permitiendo decisiones precisas en la lógica del programa.
Categoría Ejemplos de Operadores Uso Principal Aritméticos +, -, *, /, %, ** Realizar operaciones matemáticas. Comparación ==, !=, >, <,>=, <= Comparar valores y devolver un valor booleano. Lógicos and, or, not Combinar condiciones y formar expresiones lógicas. Tabla 1: Resumen Operadores en Python HeaderContent3.2.5.3 Operadores Lógicos
Los operadores lógicos combinan expresiones y permiten la formación de condiciones complejas. Los principales son:
- and: Devuelve True si ambas condiciones son verdaderas.
- or: Devuelve True si al menos una condición es verdadera.
- not: Invierte el valor lógico.
Ejemplo en Python:
resultado = (10 > 5) and (5 < 3) # Resultado: False condicion = not (10 == 5) # Resultado: True
El uso de operadores lógicos es crucial para la evaluación de condiciones complejas y el control del flujo de ejecución.
Figura 3: Diagrama de Operadores en Python Descripción: clasificación y ejemplificación de los operadores aritméticos, de comparación y lógicos en Python.
Damián Nicolalde Rodríguez. (2024). clasificación y ejemplificación de los operadores. -
3.3 Declaración de variables y convenciones de nombres
La declaración de variables en Python es sencilla debido al tipado dinámico, lo que significa que el tipo de una variable se determina automáticamente en el momento de la asignación. Sin embargo, seguir convenciones de nombres es esencial para mantener la claridad y la legibilidad del código.
3.3.1 Declaración de Variables
Para crear una variable, se asigna un valor directamente. La simplicidad de Python permite definir variables en una sola línea, lo que reduce la complejidad del código y agiliza la programación.
Ejemplo en Python:
nombre = "Carlos" edad = 30 precio = 15.75 activo = True
Cada variable se crea de manera simple y sin la necesidad de declarar su tipo explícitamente.
3.3.2 Convenciones de Nombres
Las convenciones de nombres son pautas que aseguran que los identificadores sean claros y consistentes. En Python, se recomienda usar el estilo snake_case, en el que se escriben las palabras en minúsculas y se separan con guiones bajos.
Ejemplos:
- Correcto: numero_de_clientes
- Incorrecto: numClientes o NumeroDeClientes
Estas convenciones facilitan la lectura del código y su mantenimiento en equipos de trabajo, ya que se genera un estándar que todos los miembros pueden seguir.
Variable Valor Convención Correcta nombre_usuario "María" Uso de minúsculas y guiones bajos (snake_case) edad_usuario 28 Nombre descriptivo en minúsculas. precio_producto 12.50 Uso adecuado de separación de palabras. es_activo True Nombre claro que indica un valor booleano. Tabla 2: Ejemplos de Declaración de Variables y Convenciones de Nombres
Damián Nicolalde Rodríguez. (2024).HeaderContent3.3.3 Integración de Conceptos en Ejemplos Prácticos
Para consolidar el conocimiento, es fundamental aplicar los conceptos en ejemplos prácticos que integren la declaración de variables, el uso de operadores y estructuras de control. Un ejercicio práctico refuerza la teoría y muestra cómo los fundamentos se traducen en código funcional.
Ejercicio Propuesto
Elabore un pequeño programa en Python que realice lo siguiente:- Solicite al usuario su nombre, edad y salario.
- Determine si el usuario es mayor de edad y si su salario supera un valor umbral (por ejemplo, 1000).
- Imprima un mensaje que combine ambos resultados utilizando operadores aritméticos, de comparación y lógicos.
Código
# Solicitar datos al usuario nombre_usuario = input("Ingrese su nombre: ") edad_usuario = int(input("Ingrese su edad: ")) salario_usuario = float(input("Ingrese su salario: ")) # Evaluar condiciones es_mayor = edad_usuario >= 18 salario_alto = salario_usuario > 1000 # Imprimir resultados if es_mayor and salario_alto: print(f"{nombre_usuario}, usted es mayor de edad y tiene un salario alto.") elif es_mayor and not salario_alto: print(f"{nombre_usuario}, usted es mayor de edad pero su salario es menor o igual a 1000.") else: print(f"{nombre_usuario}, usted no es mayor de edad.") # Fin del programa
Este ejercicio combina la declaración de variables, el uso de diferentes tipos de operadores y la aplicación de estructuras condicionales, consolidando el aprendizaje de conceptos fundamentales en Python.
Figura 4: Captura de Pantalla de un Código en Python
Damián Nicolalde Rodríguez. (2024). Captura de Pantalla de un Código en Python.
El dominio de los tipos de datos primitivos, operadores y la correcta declaración de variables en Python es crucial para desarrollar programas robustos y eficientes. Estos elementos básicos constituyen el andamiaje sobre el cual se construyen algoritmos complejos y se implementan soluciones de software.
Python, con su sintaxis sencilla y tipado dinámico, permite a los programadores concentrarse en la lógica del problema sin verse agobiados por detalles sintácticos, lo que acelera el proceso de desarrollo y minimiza errores. La declaración de variables y las convenciones de nombres no solo mejoran la legibilidad del código, sino que también promueven la consistencia en equipos de trabajo, facilitando la colaboración y el mantenimiento del software.
Las herramientas de planificación, como el pseudocódigo y los diagramas de flujo, son complementarias y esenciales para estructurar la lógica antes de codificar. El pseudocódigo ayuda a detallar cada paso de un algoritmo de forma textual, mientras que los diagramas de flujo proporcionan una visión gráfica que facilita la identificación de errores y la comunicación entre los miembros del equipo. Esta combinación de metodologías fortalece la capacidad de los desarrolladores para diseñar soluciones efectivas y colaborativas.
La planificación y la estructura clara del código son la base de un software robusto y mantenible.
Figura 5: Infografía: Desarrollo Efectivo en Python
Damián Nicolalde Rodríguez. (2024). Infografía: Desarrollo Efectivo en Python. -
-
-
Actividades
-
-
-
Introducción
En esta sección continuamos explorando los elementos esenciales de la programación, enfocándonos particularmente en dos tipos específicos de operadores: los aritméticos y los lógicos. Estos operadores constituyen herramientas fundamentales que permiten realizar tareas indispensables, tales como procesar datos, efectuar cálculos complejos o sencillos, evaluar situaciones específicas y tomar decisiones sobre el flujo que seguirá un programa. A partir de los conceptos previamente abordados sobre cómo declarar variables adecuadamente y manejar distintos tipos de datos, ahora se analizará con mayor profundidad cómo estas estructuras se combinan para transformar y evaluar información, brindando la capacidad de resolver eficientemente problemas cotidianos o específicos que puedan surgir en diferentes contextos.
Los operadores aritméticos y lógicos actúan como los elementos básicos para manipular valores almacenados en variables, y permiten que un programa pueda tomar decisiones o ejecutar cálculos precisos. Por ejemplo, mediante los operadores aritméticos es posible implementar operaciones matemáticas como sumas, restas, multiplicaciones o divisiones, facilitando el desarrollo de programas que requieren de cómputos numéricos constantes, desde simples cálculos de promedios o totales hasta análisis estadísticos más sofisticados.
Por otro lado, los operadores lógicos son esenciales para establecer condiciones que determinan qué acciones deben ejecutarse en función de los valores almacenados en variables o resultados intermedios del programa. Estos operadores permiten evaluar múltiples criterios simultáneamente, lo que es particularmente útil en escenarios donde el software necesita reaccionar de forma dinámica ante diversas situaciones. Por ejemplo, en un sistema de registro de usuarios, un programa puede utilizar operadores lógicos para comprobar si un nombre de usuario y una contraseña cumplen simultáneamente con criterios específicos antes de permitir el acceso.
Asimismo, mediante ejemplos claros y concretos, se ilustrará cómo estos operadores interactúan directamente con las variables para generar resultados útiles que apoyan el objetivo final del software desarrollado. Estos ejemplos abarcarán situaciones cotidianas que van desde la validación sencilla de entradas proporcionadas por un usuario hasta operaciones matemáticas más avanzadas, que podrían ser requeridas en aplicaciones financieras, científicas o técnicas.
En esta sección profundizamos en los operadores aritméticos y lógicos, complementando el conocimiento adquirido sobre la declaración de variables y los tipos de datos. Veremos cómo estas herramientas permiten transformar y evaluar información para resolver problemas de diversa índole, desde cálculos matemáticos hasta el control del flujo en un programa. -
4.1 Operadores aritméticos (+, -, *, /, %).
Los operadores aritméticos son elementos esenciales en la programación, cuya función principal es realizar cálculos matemáticos utilizando los valores que previamente han sido almacenados en las variables. Gracias a estos operadores, es posible efectuar desde operaciones aritméticas básicas hasta procesos numéricos avanzados, lo que brinda al programador la capacidad de desarrollar algoritmos flexibles y funcionales. Dichos algoritmos pueden ser aplicados en múltiples contextos profesionales, tales como el análisis financiero, la gestión administrativa, la investigación científica o incluso la ciberseguridad, especialmente al realizar cálculos relacionados con análisis estadísticos complejos o procesamiento masivo de datos.
Cada operador aritmético en Python cumple con un propósito específico y concreto.
- La suma (+), por ejemplo, permite la adición de dos valores numéricos, facilitando tareas fundamentales como llevar un registro acumulado de ventas, calcular totales en una factura o sumar diferentes puntuaciones en una evaluación académica.
- Por otro lado, la resta (-) proporciona un método sencillo para establecer diferencias entre dos números, resultando particularmente útil en contextos como el análisis financiero para determinar pérdidas y ganancias, en la gestión de inventarios para calcular diferencias en las cantidades almacenadas, o en procesos que impliquen medición de distancias o intervalos.
- Otro operador esencial es la multiplicación (*), que ofrece una manera eficaz de combinar cantidades a través de factores multiplicativos, siendo especialmente relevante en áreas donde los cálculos repetitivos son frecuentes, como en la determinación de costos totales cuando se compra cierta cantidad de un producto a un precio fijo, o en el manejo de datos tabulares mediante operaciones matriciales para estudios estadísticos o análisis matemáticos avanzados.
- Asimismo, la división (/) tiene una función crítica en situaciones en las que es necesario distribuir una cantidad en partes iguales o realizar promedios exactos. Cabe mencionar que en Python 3, esta operación siempre genera resultados flotantes (números decimales), aunque los operandos sean números enteros, lo cual ofrece una precisión significativa, pero requiere cuidado especial en ciertos cálculos financieros o científicos donde la exactitud decimal es crucial.
- Finalmente, el operador módulo (%) merece una mención especial, pues permite determinar el residuo resultante de una división entre dos números. Esta capacidad es particularmente útil cuando se necesita identificar patrones específicos, verificar si un número es divisible por otro (por ejemplo, determinar si es par o impar), o implementar ciclos y procesos repetitivos en programas, donde la lógica del algoritmo dependa de resultadosperiódicos o secuenciales.
Los operadores aritméticos en Python proporcionan las herramientas necesarias para manejar y transformar la información numérica de manera efectiva, facilitando así la creación de soluciones eficientes y adaptativas para resolver una amplia gama de problemas prácticos en distintos ámbitos profesionales.
Código
num1 = 10 num2 = 3 suma = num1 + num2 # 13 resta = num1 - num2 # 7 producto = num1 * num2 # 30 division = num1 / num2 # 3.333... modulo = num1 % num2 # 1
En este ejemplo, cada operador se aplica a dos números enteros, pero Python también permite combinar tipos de datos (como int y float) y obtener resultados en punto flotante.
Ventajas y Aplicaciones:
- Manipulación directa de datos numéricos: Permite la realización de operaciones financieras, científicas o estadísticas de manera eficiente.
- Base de cálculos en un programa: Se combinan con estructuras de control (if, while, for) para resolver problemas complejos, como simulaciones o validaciones.
- Flexibilidad de tipos: Python maneja automáticamente las conversiones entre int y float al realizar operaciones, facilitando la escritura de código.
Limitaciones:
- Precisión en división con float: En contextos de alta exactitud (por ejemplo, cálculos monetarios), la división flotante puede introducir errores de redondeo, siendo necesario recurrir a librerías específicas.
- Módulo y divisor cero: El operador % requiere que el divisor sea distinto de cero para evitar errores en tiempo de ejecución.
Los operadores aritméticos permiten transformar datos numéricos y constituyen la base de la lógica computacional que involucra cálculos.
Operador Función Ejemplo Resultado + Suma dos valores 10 + 5 15 - Resta un valor de otro 10 - 3 7 * Multiplica dos valores 4 * 2 8 / Divide un valor por otro, devolviendo un float 10/4 2.5 % Módulo: obtiene el resto de la división 10 % 3 1 Tabla 1: Operadores Aritméticos en python
Damián Nicolalde Rodríguez. (2024)HeaderContent
Figura 1: Infografía de Operadores Aritméticos
Damián Nicolalde Rodríguez. (2024). Infografía de Operadores Aritméticos.
Profundiza más
Guía Completa de Operaciones Aritméticas en Python ¡Accede aquí!
Para ilustrar aún más el uso de los operadores aritméticos, se presenta la siguiente tabla que describe escenarios comunes donde se aplican estos operadores, destacando su relevancia en la solución de problemas reales.
Caso de Uso Operadores Involucrados Descripción Ejemplo de Código Cálculo de Promedios +, / Se suman varios valores numéricos y se dividen entre la cantidad de elementos para obtener el promedio, útil en calificaciones, mediciones o análisis estadísticos. notas = [8, 7, 9] promedio = sum(notas) / len(notas) # 8.0 Control de Inventario -, +, % Al registrar ventas o compras, se ajustan los niveles de stock (resta o suma) y, a veces, se utiliza el módulo para agrupar productos en lotes de tamaño fijo. stock_inicial = 50 venta = 12 Cálculos Financieros *, /, -, % Permiten calcular intereses, comisiones, descuentos, etc. Se combinan operaciones para obtener resultados precisos, por ejemplo, determinar cuánto se paga de impuestos. precio_base = 100.0 impuesto = 12.5 # 12.5% total = precio_base + (precio_base * impuesto / 100) # 112.5 Verificación de Par/Impar % El operador módulo (% 2) se utiliza para determinar si un número es par (resultado 0) o impar (resultado 1), facilitando validaciones en bucles o estructuras condicionales. numero = 13 if numero % 2 == 0: print("Par") else: print("Impar") Conversión de Unidades +, -, *, / En proyectos que involucran medidas (por ejemplo, metros a kilómetros), los operadores aritméticos transforman los valores de entrada para producir resultados en diferentes unidades. metros = 1500 kilometros = metros / 1000 # 1.5 Tabla 2: Casos de Uso y Ejemplos Detallados
Damián Nicolalde Rodríguez. (2024). Casos de Uso y Ejemplos Detallados.HeaderContent -
4.2 Operadores lógicos (and, or, not).
Los operadores lógicos permiten combinar expresiones booleanas para formar condiciones complejas y evaluar múltiples factores en la ejecución de un programa.
Los operadores lógicos son herramientas esenciales para combinar múltiples condiciones o criterios que se evalúan como verdaderos o falsos. Estos operadores son particularmente útiles porque permiten crear decisiones compuestas y complejas, facilitando la ejecución dinámica del código según distintas circunstancias. Con ellos, un programa puede evaluar diversas situaciones simultáneamente y determinar si estas cumplen o no ciertas reglas o requisitos específicos. Gracias a esta característica, se pueden implementar procesos inteligentes y precisos, fundamentales en diversas áreas como la seguridad informática, la validación de datos, la automatización industrial o el control de calidad.- El operador lógico and es utilizado para combinar dos o más condiciones, devolviendo un valor True únicamente si todas las condiciones evaluadas se cumplen simultáneamente. Por ejemplo, en un sistema que gestiona accesos, podría utilizarse para verificar si un usuario es mayor de edad y cuenta con los permisos necesarios al mismo tiempo, permitiendo así un control más estricto y seguro sobre el acceso a ciertas funcionalidades o recursos sensibles. Este operador es especialmente importante en contextos donde la seguridad o la precisión dependen de múltiples factores simultáneos.
- Por otro lado, el operador lógico or proporciona mayor flexibilidad al permitir que el programa retorne True si al menos una de varias condiciones evaluadas es verdadera. Esto es sumamente útil en escenarios donde basta con que se cumpla una sola condición para proceder, como por ejemplo en el acceso alternativo a un sistema mediante varios métodos de autenticación diferentes, donde cumplir uno solo de los métodos sería suficiente para autorizar al usuario. La capacidad del operador or de evaluar múltiples caminos posibles aporta una gran adaptabilidad a las aplicaciones desarrolladas.
- Finalmente, el operador lógico not tiene una función complementaria y crítica, que es invertir el resultado de una expresión lógica. Este operador convierte una condición inicialmente verdadera en falsa, y viceversa. La capacidad del not para invertir condiciones es particularmente útil en contextos en los que resulta más sencillo o natural expresar una condición en negativo; por ejemplo, verificar si una operación no se ha completado o si una contraseña ingresada no coincide con la almacenada, generando así una lógica más directa y comprensible en ciertas situaciones.
En conjunto, estos operadores permiten al desarrollador crear programas complejos que reaccionan adecuadamente ante una gran variedad de situaciones, fortaleciendo la capacidad de decisión del software y aumentando significativamente la eficiencia del código escrito. El dominio efectivo de los operadores lógicos garantiza no solo soluciones funcionales, sino que también mejora la legibilidad y la robustez del código, aspectos clave en cualquier desarrollo profesional.
Código
edad = 20 salario = 1200 es_estudiante = True condicion_and = (edad > 18) and (salario > 1000) # True condicion_or = (edad > 25) or (es_estudiante) # True condicion_not = not (edad < 18) # True
En este ejemplo, se combina la comparación de la edad y el salario con el operador and, se evalúa si el usuario es mayor de 25 años o estudiante con or, y se invierte la condición de ser menor de edad con not.
Ventajas y Aplicaciones:
- Evaluación simultánea de condiciones: Los operadores lógicos permiten combinar múltiples factores, creando condiciones más ricas y adaptables que las evaluaciones individuales.
- Control del flujo de ejecución: Son esenciales en la implementación de estructuras condicionales (if, elif, else) y en bucles (while, for), ayudando a decidir qué se ejecuta según la combinación de condiciones.
- Validaciones de datos: Se aplican en formularios, sistemas de acceso y cualquier lógica que dependa de varios criterios (por ejemplo, permisos, rangos de valores, roles de usuario).
Limitaciones:
- Complejidad en expresiones anidadas: Expresiones con varios and, or y not pueden volverse confusas, requiriendo un entendimiento sólido de la lógica booleana para evitar resultados inesperados.
- Cortocircuito (short-circuit): En Python, and y or implementan una evaluación por cortocircuito, lo que significa que dejan de evaluar el resto de la expresión si el resultado ya se ha determinado. Esto es útil en muchos casos, pero puede causar sorpresas si no se comprende a fondo.
Los operadores lógicos permiten la evaluación simultánea de condiciones, siendo fundamentales para el control del flujo de ejecución en Python.Operador Función Ejemplo Resultado and Retorna True si ambas condiciones son verdaderas. (edad > 18) and (salario > 1000) True, si ambas se cumplen or Retorna True si al menos una condición es verdadera. (edad > 18) or (salario > 1000) True, si una de ellas es True not Invierte el valor booleano de una expresión (True ↔ False). not (edad < 18) True, si edad < 18 es False Tabla 3: Operadores Lógicos en Python HeaderContent
Figura 2: Ejemplo de Operadores Lógicos en un Diagrama
Damián Nicolalde Rodríguez. (2024). Ejemplo de Operadores.
De Morgan y la Lógica BooleanaEn la lógica booleana, las leyes de De Morgan establecen reglas para la conversión de expresiones cuando se aplica la negación a condiciones combinadas:
-
1. not (A and B) es equivalente a (not A) or (not B).
2. not (A or B) es equivalente a (not A) and (not B).
Estas leyes resultan útiles para simplificar o reescribir expresiones complejas, mejorando la legibilidad y facilitando la identificación de errores lógicos. Por ejemplo, si se desea evaluar la negación de una expresión and, se puede transformar en un or negando cada uno de los operandos, lo que a veces hace el código más claro.
Profundiza más
Guía Completa de Operaciones lógicos (and, or, not) en Python ¡Accede aquí!
Para ilustrar los operadores lógicos en escenarios reales, se presenta la siguiente tabla que describe algunos casos de uso comunes, explicando cómo se aplican and, or y not para tomar decisiones:
Caso de Uso Operadores Involucrados Descripción Ejemplo de Código Validación de Acceso and, or Combina roles y permisos para decidir si un usuario puede entrar a un sistema. and garantiza que se cumplan todas las condiciones, or facilita condiciones alternativas. rol = "admin" tiene_permiso = True acceso = (rol == "admin") or (tiene_permiso) Procesamiento de Formularios and, not Verifica que los campos requeridos no estén vacíos y que las condiciones se cumplan (por ejemplo, edad mayor de 18 y correo válido). edad = 20 email_valido = True form_completo = (edad >= 18) and (email_valido) Control de Bucles and, or Se emplean para determinar si se continúa iterando (por ejemplo, mientras un contador no exceda un límite o se cumpla alguna condición). contador = 0 while (contador < 5) or (usuario_quiere_seguir): contador +=1 Configuración de Parámetros not Se puede usar not para invertir condiciones (por ejemplo, si no se ha establecido una variable de entorno, asignar un valor por defecto). config = None if not config: config = "default_config" Tabla 4: Casos de Uso de Operadores Lógicos
Damián Nicolalde Rodríguez. (2024).HeaderContent
INTEGRACIÓN DE CONCEPTOS Y EJEMPLO PRÁCTICOPara consolidar los conocimientos de tipos de datos, operadores aritméticos y operadores lógicos, se presenta el siguiente ejemplo práctico:
Ejercicio de Aplicación:
- 1. Solicitar al usuario su nombre, su edad y dos números enteros.
- 2. Calcular la suma, la resta, la multiplicación y el módulo de los números ingresados.
- 3 .Evaluar, mediante operadores lógicos, si el usuario es mayor de edad y si alguno de los números es mayor que un umbral (por ejemplo, 50).
- 4 .Mostrar un mensaje personalizado basado en la evaluación de las condiciones.
Código
# Solicitar datos al usuario nombre = input("Ingrese su nombre: ") edad = int(input("Ingrese su edad: ")) num1 = int(input("Ingrese el primer número: ")) num2 = int(input("Ingrese el segundo número: ")) # Operaciones aritméticas suma = num1 + num2 resta = num1 - num2 multiplicacion = num1 * num2 modulo = num1 % num2 # Evaluación lógica umbral = 50 mayor_de_edad = (edad >= 18) supera_umbral = (num1 > umbral) or (num2 > umbral) condicion_final = mayor_de_edad and supera_umbral # Mostrar resultados print(f"\nHola, {nombre}. Estos son los resultados de tus cálculos:") print(f"Suma: {suma}, Resta: {resta}, Multiplicación: {multiplicacion}, Módulo: {modulo}") if condicion_final: print("Eres mayor de edad y al menos uno de los números supera el umbral.") else: print("No cumples con ambas condiciones al mismo tiempo.")
Explicación del Código:
- Se declaran variables para almacenar la información ingresada por el usuario, aplicando las convenciones de nombres en minúsculas y usando snake_case (por ejemplo, mayor_de_edad, supera_umbral).
- Se utilizan operadores aritméticos para calcular la suma, resta, multiplicación y módulo.
- Se combinan operadores lógicos (and, or) para evaluar condiciones complejas, determinando si el usuario es mayor de edad y si alguno de los números supera el umbral de 50.
- Se imprime un mensaje personalizado que integra los resultados de los cálculos y la evaluación lógica.
Figura 3: Captura de Pantalla del Programa Integrado
Damián Nicolalde Rodríguez. (2024). Captura de Pantalla del Programa Integrado. -
-
-
Actividades
-
Hacer un envío
-
-
-
RETO 2: Estructuras de Control (Condicionales y Bucles)
Objetivo: Implementar un menú interactivo que permita al usuario seleccionar operaciones y repetir cálculos.
Indicaciones:
- Menú de opciones:
- Usar if-elif-else para manejar las opciones (ej: 1=Suma, 2=Resta).
- Bucle de repetición:
- Utilizar while para preguntar al usuario si desea realizar otra operación.
- Validación de entradas:
- Manejar opciones inválidas (ej: si el usuario ingresa "5", mostrar "Opción no válida").
Actividades
- Diseñar un menú interactivo con if-else.
- Usar bucles para repetir operaciones.
- Validar opciones del usuario
-
Introducción
Bienvenidos a la Clase 5! Hoy nos sumergiremos en los fundamentos del flujo de ejecución secuencial en Python y la forma básica de entrada y salida de datos. Imagina que, hasta este punto, hemos aprendido a definir variables, tipos de datos y operadores; ahora, veremos cómo estos elementos se ejecutan de manera lineal en un programa, sin saltos ni bifurcaciones. La secuencialidad es esencial para entender cómo el código avanza de la primera instrucción hasta la última, permitiéndonos crear algoritmos simples pero funcionales.
Además, conoceremos la función input(), que nos permitirá leer datos del usuario, haciendo nuestros programas más interactivos. Verás cómo se combina la estructura secuencial con la lectura de valores para procesarlos y presentar resultados de forma ordenada. Dominar la estructura secuencial y la función input() es el primer paso para desarrollar aplicaciones de mayor complejidad en el futuro.
-
5. Flujo de ejecución secuencial y entrada/salida básica (Parte 1)
En esta clase, profundizaremos en la forma más elemental de organizar las instrucciones en un programa: el flujo de ejecución secuencial. Bajo este modelo, cada línea de código se ejecuta de forma lineal, en el orden en que aparece, sin tomar decisiones lógicas ni saltos condicionales. Este tipo de flujo resulta ideal para tareas como la inicialización de variables, la realización de cálculos básicos o la presentación de resultados de manera progresiva. Al no haber bifurcaciones, es más sencillo comprender y depurar el comportamiento del programa, pues cada instrucción se procesa inmediatamente después de la anterior.
Para llevar la secuencialidad un paso más allá, aprenderemos cómo interactuar con el usuario a través de la función input(), que permite leer datos durante la ejecución. Esta capacidad otorga dinamismo al programa, al solicitar información que se procesará secuencialmente antes de mostrar una salida. Con ello, podemos desarrollar aplicaciones que realicen operaciones básicas (suma, resta, concatenaciones) basadas en los valores ingresados por el usuario, lo cual enriquece la experiencia y fomenta la interactividad.
Dividiremos el contenido en dos secciones principales:
- Estructura de un programa secuencial: Explicaremos cómo se organizan las instrucciones de forma lineal y qué ventajas y limitaciones conlleva este modelo.
- Función input() para lectura de datos en Python: Veremos cómo solicitar valores al usuario, convertirlos a distintos tipos y utilizarlos en cálculos o validaciones simples.
Esta aproximación te permitirá desarrollar programas que ejecuten pasos en un orden estricto, soliciten información al usuario y presenten resultados de manera ordenada. Asimismo, sentará las bases para la introducción de estructuras de control más complejas (condicionales y bucles) en clases posteriores, cuando sea necesario tomar decisiones o repetir instrucciones. De este modo, la secuencialidad servirá como cimiento para la evolución hacia algoritmos más completos y potentes.
-
5.1. Estructura de un programa secuencial
La estructura secuencial representa la forma más básica y directa para organizar y ejecutar instrucciones dentro de un programa. Se caracteriza principalmente por la ejecución lineal y continua de cada línea de código, donde cada instrucción se realiza justo después de haber finalizado la anterior, sin saltos ni interrupciones lógicas que modifiquen el orden establecido inicialmente. Esta manera de trabajar facilita notablemente el entendimiento y el seguimiento del flujo del programa, especialmente en etapas iniciales del aprendizaje de la programación.
Este modelo secuencial es ampliamente utilizado en situaciones donde las tareas son claras y no requieren condiciones particulares o repetición cíclica, resultando muy eficiente para realizar procesos simples o inicializaciones básicas. Por ejemplo, cuando se desea preparar un programa que calcule el salario de un trabajador a partir del número de horas laboradas y su tarifa por hora, simplemente se ingresan estos datos de forma consecutiva, se realiza la operación de multiplicación correspondiente, y finalmente se presenta el resultado al usuario. Este proceso no necesita evaluaciones condicionales ni estructuras repetitivas, por lo que una secuencia lineal es perfectamente adecuada.
Para comprender mejor cómo funciona, se puede dividir la estructura secuencial en cuatro etapas claramente diferenciadas:
- Instrucciones en Orden: Esta primera etapa implica ejecutar las órdenes una por una, en el mismo orden en que aparecen escritas en el código. Cada instrucción finalizada da paso inmediato a la siguiente, lo que ofrece una predictibilidad que facilita su comprensión.
- Declaraciones y Asignaciones: En esta fase inicial, el programador define las variables necesarias para almacenar información durante la ejecución del programa. Las variables se inicializan asignándoles valores iniciales, lo que garantiza que el programa tenga datos definidos claramente antes de proceder a realizar operaciones más avanzadas.
- Operaciones y Cálculos: Posteriormente, se llevan a cabo las operaciones matemáticas o las manipulaciones básicas necesarias, tales como sumas, restas, multiplicaciones o divisiones, así como transformaciones sencillas de los datos. Es importante destacar que, en la estructura secuencial pura, estas operaciones no dependen de condiciones específicas o decisiones lógicas, sino que se realizan siempre en el orden establecido.
- Salida de Resultados: Finalmente, los resultados obtenidos se presentan al usuario, ya sea mediante mensajes en pantalla, guardando la información en archivos o mediante otro medio de almacenamiento. Este paso concluye el proceso, entregando al usuario una respuesta clara y directa derivada de las operaciones realizadas previamente.
Entre las principales ventajas de utilizar una estructura secuencial destacan:
- Facilidad de Entendimiento: Gracias a su linealidad, cualquier persona puede seguir fácilmente el flujo del programa, lo cual simplifica notablemente tanto la enseñanza como el aprendizaje en etapas iniciales.
- Rapidez en la Depuración: Al no contar con bifurcaciones o decisiones complejas, identificar y corregir errores resulta más sencillo, permitiendo a los desarrolladores detectar rápidamente el punto exacto donde ocurre el problema.
Por otro lado, la estructura secuencial presenta limitaciones que es importante considerar:
- Limitada Capacidad de Adaptación: Debido a la ausencia de estructuras condicionales y repetitivas, no es posible adaptar el programa a situaciones cambiantes o inesperadas. Esta rigidez limita significativamente su aplicación en entornos dinámicos o complejos.
- Escalabilidad Limitada: Cuando los programas crecen en tamaño o complejidad, una estructura meramente secuencial se vuelve insuficiente, requiriendo inevitablemente complementarse con mecanismos que permitan condiciones y repeticiones, como estructuras condicionales (if-else) o bucles (for, while).
Por lo tanto, aunque la estructura secuencial es el punto de partida ideal para aprender a programar y es eficiente en contextos específicos, es fundamental combinarla con otras estructuras de control a medida que la complejidad del proyecto aumenta. De esta forma, se asegura un desarrollo adecuado, eficiente y adaptativo que responda satisfactoriamente a las diversas necesidades del software actual.
La secuencialidad permite comprender cómo se ejecuta un programa paso a paso, siendo la base de la lógica computacional.
Imagen 1: Diagrama Esquemático de la Estructura Secuencial - Damián Nicolalde Rodríguez. (2024). Imagen 1: Diagrama Esquemático de la Estructura Secuencial - Damián Nicolalde Rodríguez. (2024).
La tabla 1 presenta un ejemplo sencillo de cómo se organiza un programa siguiendo la estructura secuencial en Python. Se muestran tres pasos fundamentales: en primer lugar, se declaran las variables y se les asignan valores. A continuación, se realizan operaciones simples, como un cálculo aritmético. Finalmente, se imprime el resultado o se guarda en un archivo, completando así el ciclo secuencial.
Paso Descripción Ejemplo de Código Declaración de Variables
Se definen variables y se les asignan valores iniciales.
nombre = "Carlos"
edad = 25
Operaciones Simples
Se realizan cálculos aritméticos o lógicos básicos.
resultado = edad + 5
Presentación de Resultados
Se imprime el resultado o se guarda en un archivo, completando el ciclo secuencial.
print("Nombre:", nombre)
print("Nueva edad:", resultado)
Tabla 1: Ejemplo de Estructura Secuencial en un Programa Damián Nicolalde Rodríguez. (2024). Declaración de VariablesDescripción: Se definen variables y se les asignan valores iniciales.
Ejemplo de Código:
nombre = "Carlos"
edad = 25
Operaciones SimplesDescripción: Se realizan cálculos aritméticos o lógicos básicos.
Ejemplo de Código:
resultado = edad + 5
Presentación de ResultadosDescripción: Se imprime el resultado o se guarda en un archivo, completando el ciclo secuencial.
Ejemplo de Código:
print("Nombre:", nombre)
print("Nueva edad:", resultado)
Imagen 2: Ejemplo de Programa Secuencial - Damián Nicolalde Rodríguez. (2024). Imagen 2: Ejemplo de Programa Secuencial - Damián Nicolalde Rodríguez. (2024).
La tabla 2 expone diversos casos de uso y escenarios en los que la estructura secuencial resulta particularmente útil en Python. Cada fila describe una situación típica donde las instrucciones se ejecutan de forma lineal y ordenada, sin necesidad de condicionales ni bucles. Por ejemplo, en el escenario de Inicialización de Variables, el programa simplemente define y asigna valores base (contador, nombre, mensaje) al comienzo, mientras que, en el caso de Cálculos Matemáticos Simples, se efectúan operaciones lineales como sumar o restar sin ramificaciones lógicas. Del mismo modo, se ilustran situaciones donde se imprime información secuencialmente o se llevan a cabo rutinas de limpieza o configuración previas a la ejecución principal de un sistema. En conjunto, estos ejemplos refuerzan la idea de que la estructura secuencial es la base para organizar instrucciones que se ejecuten paso a paso, de manera clara y progresiva.
Escenario Descripción Ejemplo Práctico Inicialización de Variables
Se definen y asignan valores base antes de que el programa avance a pasos más complejos.
Declarar contador = 0, nombre = "Usuario" y mensaje = "Bienvenido" en las primeras líneas.
Cálculos Matemáticos Simples
Operaciones que no requieren bifurcación, como sumar, restar o multiplicar.
Un script que calcula el precio final de un producto sumando impuestos de forma lineal.
Presentación Secuencial de Datos
Mostrar mensajes o reportes en orden estricto, sin condicionales.
Imprimir un resumen de ventas diarias, línea tras línea, sin verificación de condiciones especiales.
Rutinas de Limpieza o Setup
Tareas que se realizan siempre en el mismo orden antes de iniciar la lógica principal de un sistema.
Cargar configuraciones básicas, abrir un archivo y leerlo, luego mostrar un menú inicial, todo sin bifurcaciones.
Tabla 2: Casos de Uso y Escenarios para Estructura Secuencial - Damián Nicolalde Rodríguez. (2024). Inicialización de VariablesDescripción: Se definen y asignan valores base antes de que el programa avance a pasos más complejos.
Ejemplo Práctico: Declarar contador = 0, nombre = "Usuario" y mensaje = "Bienvenido" en las primeras líneas.
Cálculos Matemáticos SimplesDescripción: Operaciones que no requieren bifurcación, como sumar, restar o multiplicar.
Ejemplo Práctico: Un script que calcula el precio final de un producto sumando impuestos de forma lineal.
Presentación Secuencial de DatosDescripción: Mostrar mensajes o reportes en orden estricto, sin condicionales.
Ejemplo Práctico: Imprimir un resumen de ventas diarias, línea tras línea, sin verificación de condiciones especiales.
Rutinas de Limpieza o SetupDescripción: Tareas que se realizan siempre en el mismo orden antes de iniciar la lógica principal de un sistema.
Ejemplo Práctico: Cargar configuraciones básicas, abrir un archivo y leerlo, luego mostrar un menú inicial, todo sin bifurcaciones.
Aprende más
El video “Estructura secuencial en Python” muestra cómo las instrucciones de un programa se ejecutan de manera lineal y ordenada, sin bifurcaciones. A través de ejemplos sencillos, se ilustran pasos como la declaración de variables, la realización de operaciones aritméticas básicas y la impresión de resultados, destacando la importancia de la secuencialidad como base para comprender y organizar el código antes de introducir estructuras de control más complejas. ¡Accede aquí!
-
5.2. Función input() para lectura de datos (en Python)
La función input() es la forma más sencilla de leer datos proporcionados por el usuario durante la ejecución de un programa.
La función input() es una de las herramientas más importantes en Python para la interacción directa con el usuario, permitiendo captar la información que este proporcione durante la ejecución del programa. Su sencillez radica en la facilidad con la que puede solicitar y recibir datos. Cuando un programa ejecuta esta función, aparece en pantalla un mensaje opcional dirigido al usuario, indicándole qué tipo de información se espera. A continuación, el programa detiene temporalmente su ejecución hasta que el usuario ingrese los datos solicitados y confirme su respuesta pulsando la tecla Enter. En ese momento, Python toma lo ingresado y lo devuelve al programa en forma de cadena de texto (tipo str), que puede ser posteriormente procesada según la necesidad específica del contexto.
El uso de la función input() constituye la base fundamental para programas interactivos, pues gracias a esta característica es posible que la ejecución de un software se ajuste a las diferentes necesidades o preferencias de quien lo utiliza en cada ocasión. Por ejemplo, un sistema de reservaciones puede solicitar información personalizada, como nombre, edad, fecha o preferencias específicas de cada usuario, adaptando sus respuestas o comportamiento dependiendo directamente de esos datos ingresados. Esto mejora enormemente la flexibilidad y utilidad práctica de cualquier aplicación.
Aunque input() ofrece una gran simplicidad en su uso, también requiere atención especial debido a ciertas particularidades relacionadas con el tipo de datos retornado. Es importante considerar que todo lo ingresado mediante esta función se obtiene inicialmente como texto, incluso si lo que se ingresa parece ser numérico. Esto implica que, para realizar cálculos matemáticos, comparaciones numéricas o cualquier otro procesamiento específico con valores numéricos, será indispensable convertir explícitamente estos datos a los tipos adecuados como int (entero) o float (decimal). De lo contrario, podrían generarse errores o resultados inesperados en la ejecución del programa.
Por ejemplo, si un programa necesita saber la edad del usuario y posteriormente compararla con un valor numérico específico, será necesario utilizar una conversión de datos explícita para manejar correctamente esta información. La forma más habitual es la siguiente:
Código
edad = int(input("Ingrese su edad: "))
En este ejemplo, la función input() primero pide al usuario que ingrese su edad mediante un mensaje claro. A continuación, convierte inmediatamente ese valor en un número entero mediante la función int(), asegurando que el programa maneje el dato como un número en lugar de texto. De esta forma, el valor ingresado puede ser usado de manera eficiente en operaciones numéricas posteriores, tales como validar la mayoría de edad o verificar que la edad ingresada esté dentro de un rango lógico.
La claridad en los mensajes mostrados al usuario también es fundamental cuando se utiliza input(). Un mensaje preciso y bien formulado ayuda significativamente a reducir posibles errores humanos, asegurando que los datos introducidos sean pertinentes y acordes al contexto esperado por el programa. Por ejemplo, si un programa requiere el ingreso de la temperatura en grados Celsius, un mensaje explícito como "Ingrese la temperatura actual en grados Celsius:" es más efectivo que una solicitud generalizada como "Ingrese un valor:".
Aunque la función input() es sencilla y muy eficaz para conseguir interacción directa con los usuarios, exige del programador atención a la correcta conversión de datos y claridad en las instrucciones proporcionadas. Con ello, se mejora notablemente la experiencia de usuario y se evitan errores innecesarios durante la ejecución del programa, haciendo que las aplicaciones desarrolladas sean más robustas y amigables.
Uso Básico de input():
Código
nombre = input("Ingrese su nombre: ") print("Hola,", nombre)
Aquí, el programa solicita el nombre y lo almacena en la variable nombre. Luego, se imprime un saludo personalizado.
Conversión de Tipos: Como input() retorna siempre una cadena, para realizar operaciones numéricas debemos convertir el valor a int o float:
Código
edad = int(input("Ingrese su edad: ")) altura = float(input("Ingrese su altura en metros: "))
Esto posibilita el uso de operadores aritméticos en los valores ingresados.
Mensajes Claros: Es recomendable mostrar mensajes claros que indiquen al usuario qué tipo de dato debe ingresar (por ejemplo, “Ingrese un número entero”). Esto reduce errores y confusiones durante la ejecución.
Ventajas de input():
Interactividad: Permite que el usuario ingrese valores en tiempo de ejecución, haciendo el programa dinámico y adaptable.
Simplicidad: Es fácil de usar y suficiente para muchos programas introductorios que requieran entrada de datos.
Limitaciones de input():
Solo Retorna Cadenas: Para trabajar con números o valores booleanos, se requiere conversión manual.
Sin Validación Integrada: No evita automáticamente que el usuario ingrese texto en lugar de números; es necesario implementar verificación o manejo de excepciones para evitar errores.
La función input() brinda interactividad al programa, permitiendo al usuario ingresar datos que se procesan secuencialmente.
Imagen 3: Ejemplo de Input y Output en Python - Damián Nicolalde Rodríguez. (2024) Imagen 3: Ejemplo de Input y Output en Python - Damián Nicolalde Rodríguez. (2024)
La Tabla 3 ilustra diferentes casos de uso para la función input() en Python, enfatizando la necesidad de convertir los valores retornados (siempre cadenas) a tipos numéricos o lógicos según la finalidad del programa. En el primer caso, se muestra cómo solicitar datos numéricos que exigen la conversión a int o float para realizar operaciones matemáticas. El segundo caso aborda la lectura de texto con fines de validación (por ejemplo, contraseñas), mientras que el tercero combina la entrada de datos de distintos tipos (nombre, edad, salario) en un solo flujo secuencial. En conjunto, estos ejemplos subrayan la importancia de mensajes claros para el usuario y la conversión de tipo apropiada, con el fin de manipular correctamente la información que se ingresa.
Caso de Uso Descripción Ejemplo de Código Ingreso de Datos Numéricos
Solicita valores para realizar operaciones matemáticas, exigiendo conversión a int o float.
num1 = int(input("Ingrese un número entero: "))
num2 = float(input("Ingrese un número decimal: ")
Lectura de Texto para Validaciones
Permite procesar cadenas para comparaciones lógicas (por ejemplo, contraseñas).
contraseña = input("Ingrese su contraseña: ")
if contraseña == "segura":
print("Acceso permitido")
Combinación de Entradas
Solicita múltiples datos de distintos tipos en un flujo secuencial.
nombre = input("Nombre: ")
edad = int(input("Edad: "))
salario = float(input("Salario: "))
Tabla 3: Casos de Uso de input() y su Conversión - Damián Nicolalde Rodríguez. (2024) HeaderContent5.2.1. try-except
En Python, manejar errores durante la lectura de datos es fundamental para evitar que el programa se bloquee o arroje excepciones no controladas cuando el usuario ingresa información inesperada. Para ello, se utiliza el bloque try-except, que permite intentar ejecutar un código y, en caso de que se produzca un error, atraparlo y manejarlo de manera amigable. A continuación, se presenta un ejemplo que ilustra el manejo de un ValueError al convertir una cadena a un entero:
Código
try: numero = int(input("Ingrese un número entero: ")) print(f"El número ingresado es: {numero}") except ValueError: print("Error: Debe ingresar un valor numérico válido.")
- Bloque try:
- Dentro del bloque try, se realiza la conversión de la cadena retornada por input() a un entero mediante int().
- Si el usuario ingresa algo que no puede convertirse a número (por ejemplo, "hola" en lugar de "42"), Python genera un ValueError.
- Bloque except ValueError:
- Este bloque captura específicamente la excepción ValueError que ocurre cuando se intenta convertir a entero (o flotante) una cadena no numérica.
- En lugar de que el programa se bloquee y muestre un mensaje de error técnico, se imprime un mensaje claro al usuario, indicando que debe ingresar un valor numérico válido.
- Ventajas del try-except:
- Mejora la Experiencia de Usuario: Evita que el programa se detenga abruptamente, ofreciendo un mensaje descriptivo sobre el error.
- Control Fino de Excepciones: Puedes capturar distintos tipos de errores (por ejemplo, ValueError, ZeroDivisionError, etc.) y responder de manera diferente en cada caso.
- Código Más Robusto: Permite que el programa continúe ejecutándose o solicite nuevamente la información, en lugar de cerrarse inesperadamente.
- Posible Extensión – Reintento o Mensajes Más Detallados:
- Podrías envolver este bloque en un bucle para solicitar nuevamente el dato hasta que el usuario ingrese un valor válido.
- Podrías mostrar mensajes más específicos, como “El valor ingresado no es un número entero. Por favor, inténtelo de nuevo.”, mejorando aún más la interacción.
El bloque try-except brinda un mecanismo para intentar ejecutar un código que podría fallar y capturar la excepción correspondiente, ofreciendo una forma de manejar el error sin interrumpir la ejecución del programa. Esto enriquece la experiencia de usuario y hace que el software sea más tolerante a fallos y sencillo de depurar.
Ejemplo de código en Python que envuelve la conversión de input() en un bloque try-except, manejando el error cuando el usuario ingresa texto en lugar de un número.
Imagen 4: Manejo de Excepciones al Usar input() - Damián Nicolalde Rodríguez. (2024). Manejo de Excepciones al Usar input(). Imagen 4: Manejo de Excepciones al Usar input() - Damián Nicolalde Rodríguez. (2024). Manejo de Excepciones al Usar input().
Aprende más
El video “Excepciones en Python: manejo de errores con try-except” explica cómo capturar y manejar errores de manera elegante, evitando que el programa se bloquee al presentarse condiciones inesperadas (por ejemplo, convertir una cadena no numérica a entero). Se muestran ejemplos prácticos que ilustran cómo envolver el código en un bloque try-except, detectar el tipo de excepción y responder con mensajes claros al usuario. ¡Accede aquí!
-
-
-
Actividades
-
-
-
Introducción
Bienvenidos a la Clase 6! En la clase anterior, aprendimos la ejecución secuencial y la función input() para interactuar con el usuario. Hoy profundizaremos en dos aspectos esenciales: formateo de salida con print() y validación básica de datos. Imagina que tu programa ya lee valores, pero ahora queremos mostrar resultados de forma clara y profesional, al tiempo que verificamos que la información ingresada cumpla ciertos criterios. La robustez de una aplicación se ve reflejada en la forma en que maneja la presentación de la información y cómo responde a entradas inesperadas.
Así es, y descubrirás que la interacción con el usuario mejora sustancialmente cuando puedes controlar la apariencia de los mensajes (mediante print() y f-strings) y evitar bloqueos al validar los datos ingresados. Dominar el formateo y la validación es esencial para aplicaciones reales, donde la experiencia del usuario y la confiabilidad del sistema marcan la diferencia.
-
6. Flujo de ejecución secuencial y entrada/salida básica (Parte 2)
En esta segunda parte sobre el flujo de ejecución secuencial y la entrada/salida básica, profundizaremos en dos aspectos fundamentales que te permitirán crear programas no solo funcionales, sino también amigables y confiables para el usuario. Hasta ahora, hemos visto cómo organizar instrucciones en un orden lineal (de arriba hacia abajo), solicitar datos con la función input() y realizar operaciones sencillas. Sin embargo, la presentación de los resultados y la validación de la información ingresada son pasos decisivos para llevar tu código a un nivel más profesional y robusto.
- Formateo de salida con print() (f-strings en Python): Aprenderás a dar estilo a la información que presentas en pantalla, haciendo uso de f-strings, una de las características más potentes y sencillas para manejar cadenas en Python. Con ellas, podrás incrustar variables y expresiones dentro de una cadena de texto de forma directa, controlar la cantidad de decimales al mostrar números, alinear textos y números en columnas, e incluso rellenar espacios con caracteres específicos para lograr un diseño más ordenado. De esta manera, tus reportes, resultados de cálculos y mensajes al usuario lucirán claros y consistentes, brindando una mejor experiencia.
- Validación básica de datos ingresados por el usuario: Veremos cómo asegurarnos de que los valores capturados mediante input() cumplan con lo que tu programa espera (por ejemplo, que sean numéricos, que estén dentro de cierto rango o que sigan un patrón particular). Para lograrlo, exploraremos el manejo de excepciones (como ValueError) y la verificación de rangos. Con este conocimiento, tu programa podrá detectar entradas inválidas, mostrar mensajes de error claros y, si lo deseas, solicitar al usuario que ingrese la información de nuevo. Esto fortalece la solidez del software, evitando bloqueos y reduciendo la posibilidad de resultados inadecuados por datos mal introducidos.
Al concluir esta clase, estarás en capacidad de crear programas secuenciales que no solo soliciten información al usuario, sino que también formateen la salida con f-strings para presentarla de manera clara y estética, al tiempo que verifiquen la validez de los datos antes de proceder. Este conjunto de técnicas te permitirá construir aplicaciones más flexibles y agradables de usar, sentando las bases para que, en futuras sesiones, incorpores estructuras de control (condicionales, bucles) y mejores aún más la complejidad y adaptabilidad de tus proyectos. De esta forma, tu software no solo funcionará de manera lineal y ordenada, sino que interactuará con el usuario de forma más efectiva, manejando entradas y salidas de datos con profesionalismo y robustez.
-
6.1. Formateo de salida con print() (ej: f-strings en Python).
6.1.1. Repaso de print()
La función print() es, por defecto, la vía más sencilla y directa para mostrar información al usuario en Python. Aunque su uso más elemental consiste en colocar las variables y textos separados por comas, generando espacios entre ellos, este método puede limitar la legibilidad y la flexibilidad cuando se requieren resultados más elaborados o consistentes. A continuación, profundizamos en los aspectos básicos de print() para comprender cómo funciona antes de adentrarnos en métodos más avanzados de formateo.
Múltiples argumentos.
Por defecto, print() puede tomar múltiples argumentos, separados por comas, que se muestran con un espacio entre ellos:
Código
nombre = "Carlos" edad = 30 print("Hola,", nombre, ". Tienes", edad, "años.")
En este caso, la consola mostrará:
Resultado
Hola, Carlos . Tienes 30 años. Observa que se inserta un espacio adicional entre "Carlos" y el punto, y otro entre el punto y "Tienes", lo cual puede resultar en un formato menos pulcro si tenemos varias variables y textos mezclados.
Esto es suficiente para programas sencillos, pero puede volverse engorroso al requerir operaciones más sofisticadas, como formateo decimal o alineaciones.
Separador Personalizado (sep).
De manera opcional, print() permite especificar un separador distinto al espacio por defecto. Por ejemplo:
Código
print("Hola,", "Carlos", sep=" - ")
Produciría la salida:
Resultado
Hola, - Carlos Este parámetro resulta útil cuando deseamos unir varios elementos con un carácter distinto, como comas, guiones o incluso saltos de línea.
Terminación de Línea (end).
Por defecto, print() finaliza su salida con un salto de línea (\n). Sin embargo, puedes modificarlo con el parámetro end. Por ejemplo:
Código
print("Hola,", end=" ") print("Carlos")
En este caso, ambos textos se muestran en la misma línea, separándolos con un espacio en lugar de un salto de línea, quedando:
Resultado
Hola, Carlos Usos Sencillos en Programas Pequeños
- Para scripts simples, la sintaxis básica de print() con argumentos separados por comas suele ser suficiente. Permite concatenar variables sin tener que convertirlos explícitamente a cadenas, y, en muchos casos, este método cumple con las necesidades de presentación.
- Sin embargo, cuando empiezas a requerir mayor control sobre la forma en que se muestran los datos (por ejemplo, un número de decimales específicos, alineación de columnas, o inserción de caracteres de relleno), esta forma elemental se queda corta y puede complicar el código.
Limitaciones del Enfoque Básico
- Cuando un programa comienza a crecer y necesita presentar varios valores o resultados, la repetición de print() con comas puede volverse engorrosa. Ajustar manualmente los espacios o insertar cadenas intermedias para formatear números no es tan intuitivo, provocando que el código sea más difícil de mantener.
- Si necesitamos mostrar, por ejemplo, precios con dos decimales o tablas con columnas alineadas, el método tradicional de print("Texto", variable, "Texto") no provee una forma fácil de lograrlo sin añadir una gran cantidad de concatenaciones y conversiones.
- En ocasiones, se requieren operaciones directas dentro de la cadena (por ejemplo, mostrar edad + 5). Con el método básico, esto implica generar variables temporales o concatenar resultados convertidos a cadena, lo cual puede volverse repetitivo y propenso a errores.
Evolución hacia Métodos de Formateo Avanzado:
- Ante las limitaciones del método básico, Python introdujo otras formas de formatear la salida. Antiguamente, se utilizaba la sintaxis de formateo con el operador % y, más tarde, el método str.format(). Sin embargo, a partir de Python 3.6, f-strings se convirtieron en la opción más clara y potente. En las siguientes secciones, veremos cómo los f-strings permiten incrustar variables, controlar decimales y alinear contenido sin sacrificar la legibilidad.
En definitiva, el uso elemental de print() con comas es una forma rápida de concatenar texto y variables para scripts pequeños o demostraciones simples. No obstante, a medida que un proyecto crece y requiere una salida más refinada, es esencial transicionar hacia métodos más avanzados.
Aprende más
El video explica el uso de la función print() en Python 3.13.1, explicando su sintaxis básica, parámetros clave. ¡Accede aquí!
-
6.1.2. Introducción a los f-Strings
Los f-strings representan una de las formas más claras y poderosas para formatear cadenas en Python, al permitir incrustar variables y expresiones directamente dentro de llaves {}. Este enfoque resulta en un código más legible, al eliminar la necesidad de concatenaciones tediosas o el uso de placeholders complicados. En lugar de escribir:
Código
nombre = "Carlos" edad = 30 print("Hola, " + nombre + ". Tienes " + str(edad) + " años.")
podemos simplemente usar:
Código
nombre = "Carlos" edad = 30 print(f"Hola, {nombre}. Tienes {edad} años.")
Este método mejora la legibilidad y reduce la propensión a errores de concatenación. Además, admite expresiones dentro de {}, como:
Código
print(f"El doble de tu edad es {edad * 2}.")
A partir de Python 3.6, se introdujo este nuevo método de formateo, donde se antepone la letra f a la cadena de texto, habilitando la posibilidad de evaluar el contenido que va dentro de las llaves {}. Dicho contenido puede ser una variable (por ejemplo, {nombre}), una expresión ({edad * 2}) o incluso una llamada a función ({mi_funcion(param)}). Esto permite escribir código que sea tanto conciso como explícito, ya que el texto y las variables se mezclan de forma natural, evitando la complejidad de concatenar múltiples fragmentos de texto y funciones de conversión.
Ventajas de los f-Strings:
- El código se lee casi como una oración, integrando las variables en la misma cadena sin generar confusión ni interrupciones. Esto reduce los errores que surgen al olvidar convertir variables numéricas a cadenas o al insertar espacios adicionales.
- Los f-strings permiten formatear números (decimales, porcentajes, etc.), alinear texto, controlar el número de decimales y mucho más. Con una sintaxis como :.2f, por ejemplo, se puede mostrar un número flotante con exactamente dos decimales.
- Es posible colocar dentro de {} operaciones como {edad + 5}, funciones como {len(nombre)} o incluso condiciones simples, haciendo que el mensaje sea dinámico y se adapte a la situación sin necesidad de pasos intermedios.
Limitaciones y Consideraciones:
- Los f-strings solo están disponibles a partir de Python 3.6. En versiones anteriores, es necesario usar otros métodos de formateo como %-formatting o str.format().
- Aunque puedes incluir cálculos dentro de {}, se recomienda mantener estas expresiones cortas y claras. Colocar operaciones muy largas o llamadas anidadas puede dificultar la lectura y complicar la depuración.
- Si requieres realizar cálculos extensos, hazlos en líneas anteriores y solo inserta el resultado en la cadena, garantizando que el código mantenga su simplicidad y se comprenda de un vistazo.
Usar f-strings facilita la presentación de datos, otorgando un código más limpio y legible.
Imagen 1: Ejemplo de f-Strings con Variables y Expresiones - Damián Nicolalde Rodríguez. (2024). Imagen 1: Ejemplo de f-Strings con Variables y Expresiones - Damián Nicolalde Rodríguez. (2024).
Ejemplos Prácticos de f-Strings
A continuación, se muestra cómo los f-strings pueden simplificar distintas tareas de formateo:
Código
# Ejemplo 1: Inserción directa de variables nombre = "Carlos" edad = 30 print(f"Hola, {nombre}. Tienes {edad} años.") # Ejemplo 2: Expresiones dentro de {} print(f"El doble de tu edad es {edad * 2}.") # Ejemplo 3: Formato decimal pi = 3.14159 print(f"Pi con 2 decimales: {pi:.2f}") # Ejemplo 4: Alineación de texto y relleno codigo = 42 print(f"Código: {codigo:04d}") # Rellena con ceros hasta 4 dígitos # Ejemplo 5: Llamada a función dentro de {} def saludar(nombre): return f"Hola, {nombre}" print(f"Función saludar: {saludar('Ana')}")
Importancia en la Ejecución Secuencial
Al utilizar f-strings en un programa secuencial, la lógica del programa fluye de manera lineal: primero se definen o calculan las variables, luego se imprimen con la sintaxis de f-strings. Este enfoque facilita que, en programas más largos, cada paso sea transparente: se ve claramente cuándo se obtiene un valor y cómo se muestra. Cuando combinamos esto con validaciones de datos, la secuencialidad se vuelve aún más clara: primero se valida, luego se formatea la salida si todo está en orden.
-
6.1.3. Opciones Avanzadas de Formateo
Los f-strings no solo simplifican la inserción de variables y expresiones en cadenas, sino que también ofrecen una gran variedad de parámetros y códigos de formato que permiten personalizar la presentación de la información. A continuación, profundizamos en algunas de las opciones más útiles, que resultan esenciales para elaborar reportes, tablas o mensajes de salida con un nivel profesional de detalle y consistencia.
- Limitar Decimales:
- Alineación de Textos y Números:
- Relleno con Caracteres:
Uno de los casos más frecuentes en la programación es controlar la cantidad de decimales que se muestran al imprimir números de tipo float. Con los f-strings, podemos especificar el número de decimales a través de la sintaxis :.Nf, donde N es la cantidad deseada:
Código
pi = 3.1415926535 print(f"Pi con 4 decimales: {pi:.4f}")
Permite mostrar 3.1416 en lugar de muchos dígitos.
Con f-strings, es sencillo alinear el contenido de una variable dentro de un ancho fijo, lo cual resulta invaluable para la creación de tablas o reportes ordenados.
Por ejemplo, para alinear a la derecha en un campo de 5 caracteres:
Código
numero = 42 print(f"|{numero:>5}|") # Alineado a la derecha con 5 espacios
Esto produce algo como | 42|, donde el número queda a la derecha y se rellena el espacio restante con espacios en blanco. Esto resulta muy útil en la impresión de tablas o reportes.
Asimismo, se puede alinear a la izquierda (:<5) o centrar (:^5). Este control es sumamente útil cuando se tienen múltiples columnas (por ejemplo, nombre, precio, cantidad) y se desea que los valores se presenten de forma consistente en cada columna. De otro modo, la información puede verse desalineada y confusa, dificultando la comparación visual de datos.
Además de los espacios, Python permite rellenar los huecos con otros caracteres para mejorar la legibilidad o destacar secciones de un reporte. Por ejemplo:
Código
palabra = "Hi" print(f"|{palabra:*<8}|") # Alineado a la izquierda y rellenado con '*'
Aquí, * se utiliza para llenar el ancho restante de 8 caracteres, generando la salida |Hi******|. Esto se vuelve muy útil cuando queremos resaltar secciones, crear bordes o distinguir diferentes partes de un reporte.
Otros caracteres de relleno pueden ser 0 (cero), -, . o cualquier símbolo que ayude a la identificación de los datos.
Combinación de Formateo y Expresiones:
Las opciones anteriores pueden combinarse para lograr resultados más complejos. Por ejemplo, limitar decimales y alinear a la derecha en un espacio de 10 caracteres:
Código
precio = 1599.5 print(f"Precio final: {precio:>10.2f}")
Esto imprime el valor en 10 espacios, alineado a la derecha, con dos decimales (1599.50). Dicha flexibilidad es esencial cuando se requiere un aspecto coherente y uniforme en las salidas, especialmente en entornos donde la presentación de datos debe ser clara (sistemas de facturación, reportes contables, tablas de estadísticas, etc.).
Funcionalidad Ejemplo de Código Resultado Decimales limitados
valor = 2.7182818
print(f"E: {valor:.3f}")
E: 2.718
Alineación a la derecha (5 espacios)
num = 7
print(f"{num:>5}")
7 (cuatro espacios + 7)
Alineación al centro (10 espacios)
texto = "Python"
print(f"{texto:^10}")
Python (centrado en 10 espacios)
Relleno con ceros
codigo = 42
print(f"{codigo:05d}")
00042
Expresión directa
print(f"La suma de 2 y 3 es {2+3}")
La suma de 2 y 3 es 5
Tabla 1: Ejemplos de Formateo Avanzado con f-Strings - Damián Nicolalde Rodríguez. (2024). Decimales limitadosEjemplo de Código:
valor = 2.7182818
print(f"E: {valor:.3f}")Resultado:
E: 2.718Alineación a la derecha (5 espacios)Ejemplo de Código:
num = 7
print(f"{num:>5}")Resultado:
7 (cuatro espacios + 7)Alineación al centro (10 espacios)Ejemplo de Código:
texto = "Python"
print(f"{texto:^10}")Resultado:
Python (centrado en 10 espacios)Relleno con cerosEjemplo de Código:
codigo = 42
print(f"{codigo:05d}")Resultado:
00042Expresión directaEjemplo de Código:
print(f"La suma de 2 y 3 es {2+3}")Resultado:
La suma de 2 y 3 es 5Como podemos ver, las opciones avanzadas de formateo en f-strings ofrecen un control muy detallado sobre cómo se muestran los datos. Desde la cantidad de decimales hasta la alineación y relleno, estas características aportan un nivel de profesionalismo y usabilidad que trasciende la simple concatenación de cadenas. Cuando se combina con la lógica secuencial, se garantiza que al final de un flujo de operaciones, la información aparezca en la pantalla de forma clara, ordenada y sencilla de interpretar.
Imagen 2: Salida Formateada de una Tabla de Precios - Damián Nicolalde Rodríguez. (2024). Imagen 2: Salida Formateada de una Tabla de Precios - Damián Nicolalde Rodríguez. (2024).
-
6.2. Validación básica de datos ingresados por el usuario
La función input() permite que el usuario ingrese datos, pero no garantiza que estos sean correctos. Un programa robusto requiere verificar los valores y manejar posibles errores, evitando bloqueos o resultados incoherentes.
6.2.1. Manejo de Excepciones con try-except
Cuando intentamos convertir a int o float un texto no numérico, Python lanza un ValueError. Para evitar que el programa se bloquee, usamos bloques try-except:
Código
try: edad = int(input("Ingrese su edad: ")) print("Edad aceptada:", edad) except ValueError: print("Error: Debe ingresar un número entero.")
Este método captura el error y muestra un mensaje claro, sin detener la ejecución abruptamente.
Imagen 3: Diagrama de Flujo para Validar Edad y Salario - Damián Nicolalde Rodríguez. (2024) Imagen 3: Diagrama de Flujo para Validar Edad y Salario - Damián Nicolalde Rodríguez. (2024)
A menudo, al validar datos ingresados por el usuario, surgen situaciones o errores comunes que pueden bloquear el programa o confundir al usuario si no se manejan de forma adecuada. Estos errores van desde no capturar excepciones específicas (como ValueError) hasta presentar mensajes poco claros que no orientan correctamente a la persona que ingresa los datos. A continuación, se presenta una tabla que enumera los problemas más frecuentes y ofrece soluciones o recomendaciones para cada caso, ayudando a que la validación sea efectiva y el programa mantenga su robustez y legibilidad.
Tabla 2: Errores Comunes y Soluciones en Validación - Damián Nicolalde Rodríguez. (2024).Error Común Descripción Solución o Recomendación No Manejar Excepciones (ValueError)
El programa se cierra al recibir texto en lugar de un número.
Usar try-except ValueError para capturar el error y pedir datos de nuevo.
Mensajes Confusos al Usuario
El usuario no sabe qué se espera, ingresando información inadecuada.
Mostrar mensajes descriptivos (ej. “Ingrese un número entero para su edad.”).
Falta de Verificación de Rango
Se aceptan valores ilógicos (ej. edad = -10, edad = 999).
Comparar los datos con un rango razonable y mostrar un mensaje si se exceden.
Confundir la Lógica de Validación y Cálculo
Se mezclan validaciones con operaciones, dificultando la lectura del código.
Separar la validación en funciones o bloques distintos, manteniendo la claridad de cada paso del programa.
Tabla 1: Teoría psicoanalítica No Manejar Excepciones (ValueError)Descripción: El programa se cierra al recibir texto en lugar de un número.
Solución: Usar
try-except ValueError
para capturar el error y pedir datos de nuevo.Mensajes Confusos al UsuarioDescripción: El usuario no sabe qué se espera, ingresando información inadecuada.
Solución: Mostrar mensajes descriptivos (ej. “Ingrese un número entero para su edad.”).
Falta de Verificación de RangoDescripción: Se aceptan valores ilógicos (ej. edad = -10, edad = 999).
Solución: Comparar los datos con un rango razonable y mostrar un mensaje si se exceden.
Confundir la Lógica de Validación y CálculoDescripción: Se mezclan validaciones con operaciones, dificultando la lectura del código.
Solución: Separar la validación en funciones o bloques distintos, manteniendo la claridad de cada paso del programa.
-
6.2.2 Verificación de Rango y Patrones
Además de verificar que un valor sea numérico, podemos comprobar si está dentro de un rango lógico. Por ejemplo:
Código
edad = int(input("Ingrese su edad: ")) if 0 <= edad <= 120: print("Edad válida.") else: print("Edad fuera de rango.")
Esto evita datos absurdos y enriquece la confiabilidad del programa. Para cadenas, podemos comprobar longitud o patrones (por ejemplo, correos electrónicos) mediante expresiones regulares, aunque eso va más allá de la validación básica.
6.2.3. Ejemplos de Validación Combinada
Podemos encadenar validaciones. Primero, verificamos si es numérico; luego, si el rango es correcto:
Código
try: salario = float(input("Ingrese su salario: ")) if salario < 0: print("Error: El salario no puede ser negativo.") else: print(f"Salario aceptado: {salario:.2f}") except ValueError: print("Debe ingresar un valor numérico (ej. 1500.00).")
De esta forma, cubrimos tanto la conversión de tipo como la coherencia del dato.
Validar entradas es esencial para la estabilidad y usabilidad de cualquier aplicación, evitando bloqueos y confusiones.
Imagen 4: Ilustración de Bloque try-except en Validación- Damián Nicolalde Rodríguez. (2024) Imagen 4: Ilustración de Bloque try-except en Validación- Damián Nicolalde Rodríguez. (2024)
Para integrar el formateo con f-strings y la validación de datos, se presenta la siguiente tabla de ejemplos.
Ejemplo Código Explicación try:
precio = float(input("Ingrese el precio: "))
print(f"Precio con 2 decimales: {precio:.2f}")
except ValueError:
print("Error: Debe ingresar un valor decimal.")
Si el usuario ingresa un número válido, se imprime con 2 decimales; en caso de error, se muestra un mensaje claro.
Verificación de Rango + f-Strings
nota = float(input("Nota: "))
if 0 <= nota <= 10:
print(f"Su nota es {nota:.1f}, valor válida.")
else:
print("Nota fuera de rango (0-10).")
Se valida el rango de la nota (0 a 10) y se imprime con 1 decimal. En caso de exceder el rango, se informa al usuario.
Texto y Validación de Longitud
nombre = input("Nombre: ")
if len(nombre.strip()) == 0:
print("Error: Nombre vacío.")
else:
print(f"Bienvenido, {nombre}")
Comprueba que el nombre no esté vacío y luego lo imprime de manera formateada, subrayando la utilidad de la validación secuencial.
Tabla 3: Ejemplos Combinados de Formateo y Validación - Damián Nicolalde Rodríguez. (2024). Manejo de Excepciones con f-StringsCódigo:
try: precio = float(input("Ingrese el precio: ")) print(f"Precio con 2 decimales: {precio:.2f}") except ValueError: print("Error: Debe ingresar un valor decimal.")
Explicación: Si el usuario ingresa un número válido, se imprime con 2 decimales; en caso de error, se muestra un mensaje claro.
Verificación de Rango + f-StringsCódigo:
nota = float(input("Nota: ")) if 0 <= nota <= 10: print(f"Su nota es {nota:.1f}, valor válida.") else: print("Nota fuera de rango (0-10).")
Explicación: Se valida el rango de la nota (0 a 10) y se imprime con 1 decimal. En caso de exceder el rango, se informa al usuario.
Texto y Validación de LongitudCódigo:
nombre = input("Nombre: ") if len(nombre.strip()) == 0: print("Error: Nombre vacío.") else: print(f"Bienvenido, {nombre}")
Explicación: Comprueba que el nombre no esté vacío y luego lo imprime de manera formateada, subrayando la utilidad de la validación secuencial.
Imagen 5: Diferencias entre Ejecución Secuencial y Estructuras Condicionales - Damián Nicolalde Rodríguez. (2024) Imagen 5: Diferencias entre Ejecución Secuencial y Estructuras Condicionales - Damián Nicolalde Rodríguez. (2024)
Para cerrar esta sección, se presenta una tabla que compara métodos de formateo (f-strings, str.format(), concatenación) y estrategias de validación (bloques try-except, comprobaciones con isdigit(), etc.):
Aspecto f-Strings str.format() Concatenación Básica Validación con try-except Validación con Métodos (isdigit()) Sintaxis
f"Hola, {nombre}"
"Hola, {}".format(nombre)
"Hola, " + nombre
try: ... except ValueError:
if entrada.isdigit(): ... else: ...
Legibilidad
Alta, variables y texto se integran en la misma cadena.
Moderada, requiere placeholders {} y métodos.
Baja, se tiende a sumar muchas cadenas y variables.
Alta, si se mantiene el código organizado.
Moderada, puede requerir checks adicionales.
Flexibilidad
Permite formatear números, fechas, expresiones directamente.
Permite formato pero la sintaxis es más extensa.
Muy limitada, no es fácil formatear números.
Captura múltiples tipos de errores en un solo bloque.
Solo chequea un patrón (por ejemplo, dígitos), no excepciones.
Uso Recomendado
A partir de Python 3.6, es la opción preferida.
Para versiones <3.6 o cuando se requiere una sintaxis distinta.
Programas muy simples o versiones muy antiguas.
Ideal para entradas numéricas y control de errores.
Verificación rápida de que el texto cumpla un criterio.
Desventajas
No disponible en Python <3.6.
Puede volverse confuso con muchos placeholders.
Difícil de mantener al crecer el programa.
Requiere bloque try-except para cada tipo de error.
No maneja rangos ni excepciones, solo checks básicos.
Tabla 4: Comparativa de Métodos de Formateo y Validación - Damián Nicolalde Rodríguez. (2024). HeaderContent
Imagen 6: Representación Visual de Rango de Datos Válidos - Damián Nicolalde Rodríguez. (2024) Imagen 6: Representación Visual de Rango de Datos Válidos - Damián Nicolalde Rodríguez. (2024)
Aprende más
Video práctico que enseña métodos para validar datos en Python, manejo de excepciones (try-except) y validación personalizada con funciones. Incluye ejemplos útiles (formularios, entradas de usuario) y buenas prácticas para evitar errores comunes. ¡Accede aquí!
Profundiza más
Este recurso te ayudará a enfatizar sobre pasos esenciales para desarrollar un programa secuencial eficiente en Python ¡Accede aquí!
-
-
-
Actividades
-
Hacer intentos: 1
-
-
-
Introducción
Bienvenidos a la Clase 7! Hasta el momento, hemos explorado la ejecución secuencial y la entrada/salida básica en Python. Ahora, profundizaremos en el manejo de decisiones dentro de un programa, enfocándonos en condicionales (if, else, elif) y la manera en que podemos anidar estas estructuras para enfrentar múltiples escenarios. Imagina que, hasta este punto, tu software ejecutaba las instrucciones de forma lineal; con las sentencias condicionales, podrás bifurcar la lógica y responder a situaciones diversas, desde verificar rangos de valores hasta procesar opciones de un menú.
En esta sesión también aprenderemos a usar operadores relacionales (>, <, ==, etc.) que te permitirán comparar valores numéricos y cadenas para tomar decisiones en tiempo de ejecución. Dominar las estructuras condicionales es crucial para crear aplicaciones interactivas y robustas, pues el programa deja de ser un simple flujo lineal y se convierte en un sistema capaz de reaccionar según las condiciones que se presenten. ¡Comencemos con esta herramienta esencial en la programación!
-
7. Condicionales y anidamiento (Parte 1)
En esta Clase 7, nos centraremos en dos temas que amplían la capacidad de un programa para responder a distintas situaciones:
- Condicionales if, else, elif: Aprenderemos a manejar estructuras condicionales simples y múltiples, evaluando condiciones que bifurcan la ejecución del programa. Veremos ejemplos que van desde la verificación de un valor único hasta la selección entre varias opciones.
- Uso de operadores relacionales (>, <, ==, etc.): Analizaremos cómo comparar valores numéricos y cadenas para determinar si algo es mayor, menor, igual o distinto, creando la base lógica para las decisiones en if-elif-else. Observaremos la importancia de la exactitud en la comparación de cadenas (orden lexicográfico) y la relevancia de >=, <=, etc.
Al finalizar esta clase, podrás crear programas que no solo sigan un flujo secuencial, sino que evalúen condiciones y respondan de manera distinta según el caso, estableciendo las bases para anidar múltiples decisiones en el futuro.
7.1 Sentencias if, else, elif.
Las sentencias condicionales representan uno de los pilares fundamentales de la programación, ya que permiten que un programa rompa su linealidad y ejecute diferentes bloques de código en función de valores o situaciones específicas. Sin estas estructuras, el flujo de ejecución se vería obligado a seguir un camino único de principio a fin. Con if, else y elif, el software puede reaccionar a la información ingresada, evaluando condiciones que bifurcan la lógica y otorgando un comportamiento más inteligente y adaptativo.
Veamos cómo if, else y elif trabajan conjuntamente para manejar desde decisiones simples (por ejemplo, verificar si una persona es mayor de edad) hasta casos más complejos que involucran múltiples intervalos de valores o diversos escenarios (por ejemplo, clasificar notas, edades, o estados). Además, revisaremos la importancia de la legibilidad cuando se anidan condicionales y cómo evitar un uso excesivo que dificulte la comprensión del código.
7.1.1. If y Else Básico
La forma más elemental de toma de decisiones en Python se da mediante la estructura if-else. Con ella, el programa evalúa una condición booleana y, dependiendo de si esta es verdadera (True) o falsa (False), ejecuta uno de dos bloques de código. Observemos el siguiente ejemplo:
Código
edad = int(input("Ingrese su edad: ")) if edad >= 18: print("Mayor de edad.") else: print("Menor de edad.")
- Evaluación de la Condición: La expresión edad >= 18 se verifica para determinar si es True o False. Si edad es 18 o mayor, la condición resulta True; de lo contrario, es False.
- Rama Verdadera (If): En caso de ser True, el programa ejecuta el bloque de instrucciones alineado debajo de if, en este ejemplo, imprime "Mayor de edad."
- Rama Falsa (Else): Si la condición es False, el programa salta al bloque asociado a else, mostrando "Menor de edad."
- Interrupción de la Secuencialidad Pura: Hasta este punto, un programa secuencial habría continuado con la siguiente línea sin bifurcar. Sin embargo, la estructura if-else divide el flujo en dos posibles caminos, con resultados distintos.
Ventajas del If-Else Básico:
- El if-else expresa una decisión binaria de forma muy intuitiva: “¿Cumple la condición? Sí/No.”
- Ideal para casos sencillos, como verificar si una variable supera cierto umbral, o chequear si un valor coincide con una regla simple (por ejemplo, contraseñas, rangos mínimos).
- Con pocas líneas, se maneja la bifurcación del programa sin necesidad de estructuras adicionales.
Consideraciones:
- Cuando solo existen dos rutas posibles (True/False), el if-else es suficiente. Sin embargo, si se requieren más de dos rutas (por ejemplo, varios intervalos de edad), se recurre a elif (explicado en la siguiente sección).
- El if-else básico es fácil de leer, siempre y cuando la condición sea clara y no se aniden demasiadas lógicas dentro del mismo bloque.
El if-else permite un control básico de flujo, esencial para introducir decisiones simples en un programa, como validar mayor/menor de edad, determinar si un número es positivo/negativo, etc.
Imagen 1: Diagrama de Flujo de un If-Else - Damián Nicolalde Rodríguez. (2024) Imagen 1: Diagrama de Flujo de un If-Else - Damián Nicolalde Rodríguez. (2024)
-
7.1.2. If-Elif-Else para Múltiples Casos
A menudo, un problema no se limita a dos rutas (True/False), sino que puede requerir varias salidas posibles. Para estos casos, Python introduce la cláusula elif, que te permite encadenar evaluaciones:
Código
nota = float(input("Ingrese su nota (0-10): ")) if nota < 5: print("Reprobado") elif nota < 7: print("Aprobado con suficiencia") elif nota < 9: print("Aprobado con mérito") else: print("Excelente")
- Cadena de Condiciones: Cada elif se evalúa en orden, y la primera condición que resulte True interrumpe la evaluación de las siguientes, ejecutando el bloque correspondiente.
- Rama Final (Else): En caso de que ninguna de las condiciones anteriores se cumpla, la cláusula else actúa como “ruta por defecto”.
- Legibilidad vs. Anidamiento: El uso de elif evita la necesidad de anidar varios if dentro de else, algo que podría volverse confuso. Así, la lógica se expresa de manera lineal y clara.
Uso Típico de If-Elif-Else:
- Menús de Opciones: (1 para sumar, 2 para restar, 3 para multiplicar, etc.).
- Clasificación de Valores: Como el ejemplo de notas (0-5 reprobado, 5-7 regular, 7-9 bien, 9-10 excelente).
- Diferentes Rutas de Ejecución: Permite diseñar respuestas múltiples sin complicar el código con anidamientos excesivos.
Ventajas:
- Escalabilidad: Soporta fácilmente la adición de nuevos casos (nuevos elif) sin reescribir la lógica anterior.
- Legibilidad Mejorada: Comparado con anidar if-else, elif hace la secuencia de evaluaciones más fácil de seguir.
Limitaciones:
- Demasiados elif: Aunque elif es preferible al anidamiento, demasiadas condiciones en línea también pueden volverse difíciles de gestionar. En esos casos, puede resultar conveniente usar estructuras de datos (diccionarios) o funciones separadas para manejar la complejidad.
Estructura Descripción Ejemplo de Código If simple
Verifica una única condición y ejecuta su bloque si es True.
if edad >= 18:
print("Mayor de edad")
If-Else
Maneja un camino alterno cuando la condición no se cumple.
if edad >= 18:
print("Mayor de edad")
else:
print("Menor de edad")
If-Elif-Else (múltiples)
Soporta varios escenarios; la primera condición verdadera se ejecuta.
if nota < 5:
print("Reprobado")
elif nota < 7:
print("Regular")
else:
print("Bien")
If Anidado (a moderar)
Se anidan if dentro de otros if, útil para casos específicos, pero puede volverse confuso si abunda.
if edad > 0:
if edad < 18:
print("Menor")
else:
print("Mayor")
Combinación con Lógica
Uso de operadores relacionales y lógicos (and, or, not) para condicionar la ejecución.
if (edad >= 18) and (edad <= 65):
print("Adulto en edad laboral")
Tabla 1: Ejemplos de Condicionales y Anidamiento - Damián Nicolalde Rodríguez. (2024) If simpleVerifica una única condición y ejecuta su bloque si es True.
if edad >= 18:
print("Mayor de edad")If-ElseManeja un camino alterno cuando la condición no se cumple.
if edad >= 18:
print("Mayor de edad")
else:
print("Menor de edad")If-Elif-ElseSoporta varios escenarios; la primera condición verdadera se ejecuta.
if nota < 5:
print("Reprobado")
elif nota < 7:
print("Regular")
else:
print("Bien")If AnidadoSe anidan if dentro de otros if, útil para casos específicos, pero puede volverse confuso si abunda.
if edad > 0:
if edad < 18:
print("Menor")
else:
print("Mayor")Combinación con LógicaUso de operadores relacionales y lógicos (and, or, not) para condicionar la ejecución.
if (edad >= 18) and (edad <= 65):
print("Adulto en edad laboral")
Imagen 2: Salida Diferenciada según Rangos de Nota - Damián Nicolalde Rodríguez. (2024) Imagen 2: Salida Diferenciada según Rangos de Nota - Damián Nicolalde Rodríguez. (2024)
-
7.1.3. Condicionales Anidados
Existen casos donde un simple if-elif-else no abarca la lógica jerárquica que deseas expresar. Entonces, es posible anidar condicionales, es decir, colocar un if-else dentro de la rama verdadera o falsa de otro if. Esto crea un flujo en capas:
Código
edad = int(input("Edad: ")) if edad >= 18: if edad > 60: print("Adulto mayor") else: print("Adulto") else: print("Menor de edad")
- Flujo en Capas: Primero se verifica edad >= 18. Si True, se anida otra condición (edad > 60). Si False, se va a la rama else de “Menor de edad”.
- Riesgo de Legibilidad: Aunque puede ser útil para reflejar lógica compleja, un exceso de anidamiento vuelve el código difícil de seguir.
- Alternativas: Cuando la complejidad es alta, se recomienda usar elif o dividir la lógica en funciones o bloques separados, evitando profundizar en demasiados niveles de if.
Casos Típicos:
- Situaciones en las que, tras verificar una condición principal, se necesitan subverificaciones (ej. verificar la edad y, si es adulta, ver si supera 60 años).
- Validaciones complejas, donde primero se corrobora un criterio y luego se desglosan subcriterios.
El anidamiento debe usarse con moderación para no comprometer la legibilidad. Si requieres muchos niveles de profundidad, considera reorganizar tu lógica o utilizar elif en su lugar.
Caso Ejemplo de Código Comentario If dentro de If
if edad >= 18:
if edad >= 60:
print("Adulto mayor")
else:
print("Adulto")
else:
print("Menor")
Primero se determina si la persona es mayor de edad; luego, dentro de esa rama, se evalúa si es un adulto mayor.
If-Elif con Subcondición en else
if nota < 5:
print("Reprobado")
elif nota < 7:
if nota < 6:
print("Aprobado con D")
else:
print("Aprobado con C")
else:
print("Excelente")
Dentro de un elif, se anida otro if para desglosar el rango de nota (5-7) en subrangos (por ejemplo, 5-6 y 6-7).
Uso de Operadores Lógicos + Anidado
if (edad >= 18) and (edad <= 60):
if edad < 30:
print("Adulto joven")
else:
print("Adulto maduro")
Combina un if con operadores lógicos y, dentro, se anida otra verificación para subclasificar la edad.
Tabla 2: Ejemplos de Condicionales Anidados - Damián Nicolalde Rodríguez. (2024). If dentro de IfEjemplo de Código:
if edad >= 18:
if edad >= 60:
print("Adulto mayor")
else:
print("Adulto")
else:
print("Menor")Comentario: Primero se determina si la persona es mayor de edad; luego, dentro de esa rama, se evalúa si es un adulto mayor.
If-Elif con Subcondición en elseEjemplo de Código:
if nota < 5:
print("Reprobado")
elif nota < 7:
if nota < 6:
print("Aprobado con D")
else:
print("Aprobado con C")
else:
print("Excelente")Comentario: Dentro de un elif, se anida otro if para desglosar el rango de nota (5-7) en subrangos.
Operadores Lógicos + AnidadoEjemplo de Código:
if (edad >= 18) and (edad <= 60):
if edad < 30:
print("Adulto joven")
else:
print("Adulto maduro")Comentario: Combina un if con operadores lógicos y, dentro, se anida otra verificación para subclasificar la edad.
Las sentencias if, else y elif ofrecen la columna vertebral para que un programa abandone la linealidad y responda a condiciones variables. Con ellas, podemos clasificar datos, decidir rutas de ejecución, construir menús, validar rangos, entre otros. Sin embargo, es vital mantener la legibilidad, usando elif para varios casos y moderando el anidamiento, a fin de que el código sea fácil de entender y de mantener. De este modo, tu software se vuelve mucho más versátil, capaz de adaptarse a situaciones diferentes sin perder claridad en la lógica.
Aprende más
Este video explica el funcionamiento de las estructuras condicionales IF, ELSE y ELIF, enseñando cómo tomar decisiones en programas según condiciones lógicas. El contenido muestra ejemplos prácticos desde comparaciones simples hasta condiciones múltiples, ayudando a principiantes a dominar este concepto fundamental de programación en Python. ¡Accede aquí!
-
7.2. Uso de operadores relacionales (>, <, ==, etc.).
Para que un programa tome decisiones de forma efectiva, no basta con las estructuras condicionales en sí (if, else, elif). Es necesario comparar valores para determinar si cumplen o no una determinada condición. En este sentido, los operadores relacionales resultan fundamentales, ya que permiten establecer relaciones lógicas entre dos operandos (ya sean numéricos, cadenas o incluso otros tipos) y producir un resultado booleano (True o False). Estas evaluaciones constituyen la base sobre la cual las sentencias condicionales deciden qué ruta de ejecución seguir.
La relevancia de los operadores relacionales se hace evidente en múltiples escenarios: desde validar si una edad supera un umbral (mayoría de edad) hasta clasificar cadenas alfabéticamente o verificar si un valor se encuentra dentro de un intervalo. A continuación, profundizaremos en los operadores principales, sus usos en datos numéricos y en cadenas, y los detalles que se deben tener en cuenta para evitar resultados inesperados o errores sutiles.
7.2.1. Principales Operadores
Python dispone de seis operadores relacionales clave:
- == (Igualdad):
- Verifica si ambos operandos tienen el mismo valor.
- Retorna True si son iguales; False en caso contrario.
- Uso típico: comprobar si una variable coincide con un valor esperado (por ejemplo, if edad == 18: ...).
- != (Desigualdad):
- Evalúa si los operandos difieren en su valor.
- Retorna True si no son iguales; False si son idénticos.
- Uso típico: para descartar un caso particular (por ejemplo, if nombre != "": ... para asegurar que la cadena no está vacía).
- > (Mayor que):
- Devuelve True si el operando izquierdo es mayor que el derecho.
- Se aplica principalmente en datos numéricos, aunque con ciertas restricciones también puede usarse en cadenas, comparando su orden lexicográfico.
- Ejemplo: if salario > 1000: ... determina si un salario supera un cierto umbral.
- < (Menor que):
- Retorna True si el operando izquierdo es menor que el derecho.
- Similar a >, se utiliza para verificar si un valor es inferior a otro.
Ejemplo: if nota < 5: ... para clasificar notas como reprobadas cuando estén por debajo de 5.
- >= (Mayor o igual):
- <= (Menor o igual):
- Retorna True si el valor izquierdo es menor o igual que el derecho.
- Uso frecuente en intervalos, como if 0 <= nota <= 10: para verificar que la nota se halle dentro de un rango válido.
- Ejemplo:
Combina el significado de “mayor” con “igual”.
Retorna True si el valor izquierdo es mayor o igual que el derecho.
Ejemplo: if edad >= 65: ... para determinar si alguien es un adulto mayor.
Código
x = 10 y = 5 if x > y: print("x es mayor que y") if x == 10: print("x vale 10")
Primera Comparación (x > y): Verifica si 10 > 5, que resulta True, imprimiendo "x es mayor que y".
Segunda Comparación (x == 10): Evalúa si x es igual a 10, también True, imprimiendo "x vale 10".
Observa cómo estas evaluaciones habilitan que el programa tome distintas acciones basadas en la relación entre x y y. Sin estos operadores, el software se vería obligado a ejecutar una sola ruta lineal, sin la capacidad de responder de forma diferenciada a los valores.
Ventajas de los Operadores Relacionales:
- Expresan relaciones matemáticas o alfabéticas de forma directa (edad >= 18, nombre1 < nombre2).
- Funcionan tanto en enteros, flotantes y, en cierto grado, con cadenas.
- Se combinan con operadores lógicos (and, or, not) para construir condiciones complejas.
Riesgos y Errores Frecuentes:
- Un error común es usar = en lugar de ==, lo que provoca un fallo de sintaxis o de lógica.
- Intentar comparar un número con una cadena (ej. "10" < 5) puede derivar en errores. Asegúrate de que ambos operandos sean del mismo tipo o que la comparación tenga sentido semántico.
- Al comparar valores flotantes, las imprecisiones de punto flotante pueden resultar en resultados inesperados. Puede requerirse una tolerancia o margen de error.
Imagen 3: Operadores Relacionales en un Diagrama de jerarquía - Damián Nicolalde Rodríguez. (2024). Imagen 3: Operadores Relacionales en un Diagrama de jerarquía - Damián Nicolalde Rodríguez. (2024).
-
7.2.2. Comparaciones Numéricas y de Cadenas
Aunque los operadores relacionales suelen asociarse de manera inmediata con números, Python también permite comparar cadenas, aplicando un orden lexicográfico. A continuación, profundizamos en ambos contextos.
Comparaciones Numéricas
- Verificación de Rangos: Es muy habitual querer comprobar si un valor numérico (por ejemplo, una nota, un salario, una edad) se halla en un intervalo. Python facilita esto con la posibilidad de encadenar comparaciones, como 0 <= nota <= 10, lo que mejora la legibilidad en comparación con un if anidado (ej. if nota >= 0 and nota <= 10:).
- Igualdad vs. Asignación: Se debe distinguir entre = (asignar valor a una variable) y == (comparar si dos valores son iguales). Un error típico consiste en usar = en un if, provocando un fallo. Por ejemplo:
- Precisión en Flotantes: En muchos escenarios (por ejemplo, cálculos científicos, monetarios), comparar dos flotantes con == puede dar resultados sorprendentes debido a pequeñas imprecisiones de punto flotante. Por ejemplo, 0.1 + 0.2 no es exactamente 0.3. Para evitar falsos negativos, se recomienda emplear una tolerancia (ej. abs((0.1 + 0.2) - 0.3) < 1e-9).
- Uso Práctico en la Ejecución Secuencial: Un programa secuencial puede solicitar datos (edad, nota, salario) y, antes de continuar, usar operadores relacionales para chequear su validez (edad >= 0, nota <= 10). Si la comparación falla, puede desviar el flujo a un else que notifique el error o solicite un nuevo valor.
Código
x = 5 # Asignación if x == 5: # Comparación print("x es 5")
Cambiar == por = resultaría en un error o en una lógica incorrecta (dependiendo de la versión de Python y el contexto).
Comparaciones con Cadenas
- Orden Lexicográfico: Python compara cadenas carácter por carácter según la tabla Unicode (o ASCII). Esto significa que "Ana" < "Carlos" es True porque "A" precede a "C" en el alfabeto. Sin embargo, "abc" < "Abc" puede ser True o False dependiendo de cómo se interpreten las mayúsculas. En ASCII, el código de 'A' (65) es menor que el de 'a' (97), por lo que "A" < "a".
- Implicaciones Prácticas:
- Ordenar Listas de Nombres: Se pueden usar estas comparaciones para determinar qué cadena precede a otra, facilitando la clasificación alfabética.
- Filtrar o Buscar: Combinando operadores relacionales y lógicos, podemos filtrar nombres que comiencen con cierta letra o que se encuentren en un rango alfabético (por ejemplo, if "Carlos" < nombre < "Luis": ...).
- Comparación de Contraseñas: if password == "segura": ... evalúa la exactitud de la cadena ingresada.
- Consideraciones de Mayúsculas/Minúsculas: Dado que "Z" puede ser menor que "a" en ASCII, la comparación de cadenas puede resultar en comportamientos contraintuitivos si no se tiene en cuenta la normalización o conversión (.lower(), .upper()). Para casos más complejos, existen librerías de localización que aplican reglas específicas del idioma.
Ejemplo Combinado:
Código
nombre1 = "Carlos" nombre2 = "Ana" if nombre1 < nombre2: print("Carlos precede a Ana en orden alfabético.") else: print("Ana precede a Carlos o ambos son iguales.")
Aquí, "Carlos" < "Ana" se evalúa carácter por carácter. 'C' (67 en ASCII) vs 'A' (65 en ASCII). Al ser 'C' mayor, la condición resulta False, imprimiendo la rama else.
Tipo de Comparación Ejemplo Resultado Numérico (==, >, <)
x = 5
if x > 3:
print("Mayor que 3")
Imprime "Mayor que 3" si x = 5
Cadenas (==, !=, <)
if "Ana" < "Carlos":
print("Ana precede a Carlos")
True si "Ana" precede a "Carlos" en orden lexicográfico
Rango numérico
nota = 8
if 0 <= nota <= 10:
print("Nota válida")
Verifica que nota se ubique entre 0 y 10 inclusive
Mezcla con Operadores Lógicos
if (edad >= 18) and (edad < 65):
print("Adulto laboral")
Combina relacionales con lógicos (and, or) para mayor flexibilidad
Tabla 3: Comparaciones Numéricas y de Cadenas - Damián Nicolalde Rodríguez. (2024). Numérico (==, >, <)Ejemplo:
x = 5
if x > 3:
print("Mayor que 3")Resultado:
Imprime "Mayor que 3" si x = 5Cadenas (==, !=, <)Ejemplo:
if "Ana" < "Carlos":
print("Ana precede a Carlos")Resultado:
True si "Ana" precede a "Carlos" en orden lexicográficoRango numéricoEjemplo:
nota = 8
if 0 <= nota <= 10:
print("Nota válida")Resultado:
Verifica que nota se ubique entre 0 y 10 inclusiveMezcla con Operadores LógicosEjemplo:
if (edad >= 18) and (edad < 65):
print("Adulto laboral")Resultado:
Combina relacionales con lógicos (and, or) para mayor flexibilidad
Imagen 4: Visualización de Comparaciones - Damián Nicolalde Rodríguez. (2024). Imagen 4: Visualización de Comparaciones - Damián Nicolalde Rodríguez. (2024).
Los operadores relacionales (==, !=, >, <, >=, <=) constituyen el núcleo de la toma de decisiones en un programa, ya que permiten determinar si un valor es igual, distinto, mayor o menor que otro. Su aplicación abarca tanto datos numéricos como cadenas, con particular énfasis en la comparación alfabética en estas últimas. Comprender los matices de cada operador —así como la precisión en flotantes o el orden lexicográfico en strings— es esencial para que las sentencias if, else y elif funcionen según lo esperado, evitando sorpresas o errores sutiles.
Al combinar estos operadores con la lógica booleana (and, or, not), se pueden construir condiciones aún más complejas, abriendo paso a un sinfín de posibilidades en el control del flujo de un programa. Por ejemplo, verificar si un valor numérico está en un rango determinado y, simultáneamente, si un texto precede a otro alfabéticamente, todo dentro de una misma condición. De esta forma, tu software adquiere la flexibilidad necesaria para manejar escenarios variados y tomar decisiones inteligentes basadas en los datos ingresados.
Aprende más
Este video del Curso Python explica los operadores relacionales (como >, <, ==, !=, >=, <=) que permiten comparar valores y devolver resultados booleanos (True/False). El contenido muestra cómo estos operadores funcionan con distintos tipos de datos y su aplicación en estructuras condicionales. Se presentan ejemplos prácticos para que los principiantes entiendan cómo implementar comparaciones en sus programas Python. ¡Accede aquí!
Profundiza más
Este recurso te ayudará a enfatizar sobre Condicionales y anidamiento ¡Accede aquí!
-
-
-
Actividades
-
-
-
Introducción
En el desarrollo de programas, uno de los aspectos más importantes es la capacidad de tomar decisiones. A través de estructuras de control condicionales, los programadores pueden guiar el flujo de ejecución del programa según diferentes condiciones. Estas estructuras permiten que el programa ejecute ciertos bloques de código dependiendo de si se cumplen ciertas condiciones, lo que es fundamental en casi todas las aplicaciones. En esta clase, profundizaremos en dos conceptos fundamentales: condicionales anidadas y el operador ternario.
Las condicionales anidadas permiten tener decisiones dentro de otras decisiones, lo que crea un flujo más dinámico y flexible. Esta técnica es crucial cuando se necesita hacer múltiples verificaciones y ejecutar distintas acciones según cada resultado. Además, aprenderemos a usar el operador ternario, que proporciona una forma compacta y eficiente de hacer decisiones simples en una sola línea de código. Ambas herramientas son esenciales para mejorar la legibilidad y eficiencia de los programas, especialmente cuando se manejan múltiples condiciones o cuando se busca simplificar estructuras condicionales complejas.
-
8.1. Condicionales anidados (ej: menús de opciones)
Las condicionales anidadas son una herramienta fundamental en programación, ya que permiten tomar decisiones dentro de otras decisiones, lo que a su vez habilita una mayor flexibilidad en el diseño del flujo del programa. Esta estructura es particularmente útil cuando se deben realizar múltiples verificaciones en función de una serie de condiciones. Sin esta capacidad, un programa estaría limitado a realizar solo decisiones simples, incapaz de manejar casos más complejos o interactivos.
¿Qué son las Condicionales Anidadas?
En términos sencillos, una condicional anidada es una estructura if, else o elif que se encuentra dentro de otra estructura if, else o elif. Esto permite que el programa realice una serie de comprobaciones antes de ejecutar una acción específica. El flujo de ejecución se bifurca de manera secuencial y puede manejar situaciones más complejas que involucran varias condiciones.
Por ejemplo, imagina que estamos creando un sistema de control de acceso donde, después de que un usuario ingrese su contraseña, necesitamos verificar si tiene permisos especiales o si debe acceder a un nivel específico de la aplicación. En este caso, usaríamos condicionales anidadas para manejar cada uno de estos pasos de forma eficiente.
Para ilustrar el uso de las condicionales anidadas, supongamos que estamos creando un programa que permita al usuario elegir una operación matemática básica. El menú presentará las opciones de suma, resta, multiplicación y salida, y dependiendo de la elección, el programa pedirá los números y ejecutará la operación correspondiente. Si el usuario ingresa una opción inválida, el programa le indicará que elija una opción válida.
Las condicionales anidadas son una herramienta esencial para crear aplicaciones interactivas. Pueden ser utilizadas en una amplia variedad de escenarios, como la creación de menús de opciones, formularios de validación de datos o incluso en sistemas de control de acceso, donde el flujo de ejecución depende de varios factores evaluados de manera secuencial.
Ejemplo 1 en Python: Menú de Opciones
Imaginemos que estamos construyendo un programa simple que permite al usuario realizar operaciones matemáticas básicas como suma, resta y multiplicación. Para hacer este programa interactivo, vamos a usar un menú que le permita al usuario elegir entre las diferentes operaciones. Dependiendo de la opción que elija, el programa pedirá los números necesarios y realizará la operación correspondiente.
Código
# Menú de opciones print("Menú de opciones:") print("1. Sumar") print("2. Restar") print("3. Multiplicar") print("4. Salir") # Entrada de usuario opcion = int(input("Elija una opción (1-4): ")) # Condicionales anidados para manejar las opciones if opcion == 1: num1 = float(input("Ingrese el primer número: ")) num2 = float(input("Ingrese el segundo número: ")) print(f"La suma es: {num1 + num2}") elif opcion == 2: num1 = float(input("Ingrese el primer número: ")) num2 = float(input("Ingrese el segundo número: ")) print(f"La resta es: {num1 - num2}") elif opcion == 3: num1 = float(input("Ingrese el primer número: ")) num2 = float(input("Ingrese el segundo número: ")) print(f"La multiplicación es: {num1 * num2}") elif opcion == 4: print("¡Hasta luego!") else: print("Opción no válida. Por favor, elija una opción entre 1 y 4.")
Este código es un ejemplo clásico de cómo las condicionales anidadas pueden ser usadas para manejar un menú de opciones. El programa primero le presenta al usuario las opciones disponibles (sumar, restar, multiplicar y salir). Luego, según la opción seleccionada, se ejecuta una operación matemática, y si la opción no es válida, el programa le indica al usuario que debe elegir una opción válida.
Este tipo de programa es sencillo, pero ejemplifica perfectamente el uso de las condicionales anidadas, ya que cada opción (suma, resta, multiplicación) depende de una evaluación previa de la opción seleccionada.
Imagen 1. Diagrama de flujo de un menú interactivo - Damián Nicolalde Rodríguez. (2025). Imagen 1. Diagrama de flujo de un menú interactivo - Damián Nicolalde Rodríguez. (2025).
Las condicionales anidadas se vuelven aún más útiles cuando necesitamos evaluar más de una condición dentro de una misma opción. En este sentido, las condicionales anidadas no solo permiten que un bloque de código esté dentro de otro, sino que también pueden manejar varios niveles de decisiones.
Imaginemos un menú con subopciones, donde dentro de la opción "Operaciones Básicas", el programa ofrece un submenú para elegir la operación matemática (suma, resta, multiplicación). Aquí, las condicionales anidadas permiten gestionar tanto la selección del menú principal como las subopciones de manera eficiente.
Ejemplo 2: Menú con Subopciones
Expandimos el ejemplo anterior, agregando subopciones dentro de la opción de "Operaciones Básicas". Ahora, el programa pedirá al usuario que elija una operación dentro del submenú después de seleccionar el menú principal.
Código
# Menú principal print("Menú Principal:") print("1. Operaciones básicas") print("2. Salir") # Entrada de usuario opcion = int(input("Elija una opción (1-2): ")) # Condicionales anidados para manejar las opciones if opcion == 1: print("Submenú de operaciones:") print("1. Sumar") print("2. Restar") print("3. Multiplicar") subopcion = int(input("Elija una operación (1-3): ")) num1 = float(input("Ingrese el primer número: ")) num2 = float(input("Ingrese el segundo número: ")) if subopcion == 1: print(f"La suma es: {num1 + num2}") elif subopcion == 2: print(f"La resta es: {num1 - num2}") elif subopcion == 3: print(f"La multiplicación es: {num1 * num2}") else: print("Subopción no válida.") elif opcion == 2: print("¡Hasta luego!") else: print("Opción no válida.")
Este ejemplo amplía el concepto de las condicionales anidadas al introducir un submenú dentro de una de las opciones del menú principal. Después de que el usuario selecciona la opción "Operaciones básicas", se le presenta un submenú con tres operaciones: suma, resta y multiplicación. Dependiendo de su selección, el programa ejecutará la operación correspondiente.
Este tipo de menú con subopciones es más dinámico y flexible, permitiendo que el programa se adapte mejor a situaciones más complejas.
Imagen 2: Diagrama de flujo de un menú con subopciones - Damián Nicolalde Rodríguez. (2025). Imagen 2: Diagrama de flujo de un menú con subopciones - Damián Nicolalde Rodríguez. (2025).
Este diagrama ilustra cómo el programa maneja un menú con subopciones. Las decisiones dentro del submenú se evalúan dentro de las decisiones del menú principal, creando un flujo de ejecución más complejo.
Beneficios de las Condicionales Anidadas
Las condicionales anidadas tienen numerosos beneficios, especialmente cuando se trata de manejar situaciones más complejas donde se deben evaluar varias condiciones antes de tomar una acción.
- Manejo de múltiples condiciones: Permiten manejar múltiples condiciones dentro de un solo bloque de código. Esto es útil cuando se necesita evaluar diversas situaciones antes de tomar una decisión. Los menús interactivos y los sistemas de validación de datos son ejemplos donde se puede aplicar esta estructura de manera eficiente.
- Flexibilidad en la toma de decisiones: Las condicionales anidadas permiten construir programas más dinámicos y adaptativos. Por ejemplo, en sistemas de clasificación, el programa puede evaluar una serie de condiciones antes de asignar un valor o tomar una acción.
- Mejor control del flujo de ejecución: El uso de condicionales anidadas brinda un control más detallado sobre el flujo del programa. Esto es particularmente útil en aplicaciones que requieren un comportamiento específico dependiendo de las condiciones que se cumplan.
Las condicionales anidadas son una herramienta poderosa en la programación que permiten manejar decisiones complejas dentro de un programa. Son especialmente útiles en menús de opciones, formularios de validación o cualquier sistema que requiera decisiones basadas en múltiples condiciones. Al aprender a implementar estas estructuras, los programadores pueden crear aplicaciones más flexibles y robustas que respondan dinámicamente a las entradas del usuario.
Este concepto es fundamental para la creación de programas interactivos y adaptativos, y dominar su uso es esencial para la construcción de aplicaciones más sofisticadas y útiles.
Aprende más
En este video aprenderán sobre como manipular las sentencias condicionales anidadas. ¡Accede aquí!
-
8.2. Operador ternario para simplificar código
El operador ternario es una estructura condicional compacta que nos permite realizar decisiones simples en una sola línea de código. Es ideal para situaciones en las que solo necesitamos escoger entre dos posibles resultados basados en una condición. Este operador es una forma eficiente de escribir decisiones en programas, especialmente cuando se trata de condiciones que no requieren bloques de código largos.
¿Qué es el Operador Ternario?
El operador ternario permite hacer una evaluación condicional en una sola línea de código, lo cual es mucho más eficiente que usar un bloque if-else tradicional cuando solo tenemos dos posibles resultados. Su sintaxis es la siguiente:
Código
resultado = valor_true if condición else valor_false
El operador ternario permite realizar una evaluación condicional y retornar un valor de manera más eficiente. En lugar de escribir un bloque completo de código if-else, se puede realizar la evaluación y asignar el valor en una sola línea, lo que hace que el código sea más limpio y fácil de leer. Esta técnica es ideal cuando solo se necesita tomar una decisión sencilla entre dos opciones.
Ventajas del Operador Ternario
- Concisión: Evita la escritura de un bloque de código if-else completo, simplificando las decisiones condicionales simples.
- Legibilidad: El código es más limpio y más fácil de entender cuando solo se trata de una condición binaria.
- Eficiencia: Cuando solo hay dos posibles resultados, el operador ternario es una opción mucho más eficiente que un bloque completo de if-else.
Es importante recordar que el operador ternario es más adecuado para decisiones simples. Si se requieren verificaciones más complejas o múltiples condiciones, el uso de if-else es más apropiado.
Ejemplo:
Vamos a comenzar con un ejemplo sencillo para mostrar cómo usar el operador ternario para evaluar una condición y elegir entre dos opciones. Supongamos que queremos verificar si una persona es mayor de edad.
Código
# Ejemplo de uso del operador ternario edad = int(input("Ingrese su edad: ")) # Uso del operador ternario mensaje = "Mayor de edad" if edad >= 18 else "Menor de edad" print(mensaje)
En este ejemplo, el operador ternario evalúa la condición edad >= 18. Si la condición es verdadera (es decir, la edad es mayor o igual a 18), la variable mensaje recibirá el valor "Mayor de edad". Si la condición es falsa (es decir, la edad es menor a 18), se asignará el valor "Menor de edad". Este es un ejemplo típico de una decisión simple, donde solo tenemos dos posibles resultados.
Este tipo de implementación es mucho más compacta y clara que si usáramos una estructura if-else tradicional:
Código
if edad >= 18: mensaje = "Mayor de edad" else: mensaje = "Menor de edad"
El siguiente diagrama visualiza cómo el operador ternario evalúa la condición y elige entre dos posibles valores en una sola línea de código. Este diagrama ilustra de manera clara la eficiencia y simplicidad del operador ternario.
Imagen 3: Ejemplo visual del operador ternario - Damián Nicolalde Rodríguez. (2025) Imagen 3: Ejemplo visual del operador ternario - Damián Nicolalde Rodríguez. (2025)
Ahora, vamos a ver un uso más avanzado del operador ternario, donde evaluaremos múltiples condiciones en cadena utilizando el operador ternario anidado. Imaginemos que tenemos un sistema de clasificación de calificaciones, y queremos asignar una categoría a la calificación ingresada, como "Excelente", "Bueno", "Suficiente" o "Insuficiente".
Código
# Clasificación de calificación nota = float(input("Ingrese la calificación (0-10): ")) # Operador ternario anidado para clasificación de calificación resultado = "Excelente" if nota >= 9 else "Bueno" if nota >= 7 else "Suficiente" if nota >= 5 else "Insuficiente" print(f"Calificación: {resultado}")
En este ejemplo, el operador ternario está anidado, lo que significa que dentro de una decisión else, evaluamos una nueva condición. Dependiendo de la calificación ingresada:
- Si la calificación es mayor o igual a 9, el resultado será "Excelente".
- Si la calificación es mayor o igual a 7 pero menor que 9, el resultado será "Bueno".
- Si la calificación es mayor o igual a 5 pero menor que 7, el resultado será "Suficiente".
- Si la calificación es menor que 5, el resultado será "Insuficiente".
Este tipo de clasificación es muy eficiente y evita la necesidad de escribir un bloque if-elif-else largo, manteniendo el código más compacto y legible.
Imagen 4: Diagrama del Operador Ternario Anidado - Damián Nicolalde Rodríguez. (2025). Imagen 4: Diagrama del Operador Ternario Anidado - Damián Nicolalde Rodríguez. (2025).
Aprende más
En este video, profundizaremos en uno de los conceptos más útiles y poderosos de Python: el operador ternario. Si eres un programador de Python o estás comenzando a aprender, este es un concepto que definitivamente querrás dominar. ¡Accede aquí!
En la siguiente tabla, se presentan dos estructuras condicionales ampliamente utilizadas en programación: if-else y el operador ternario. A continuación, se muestra un ejemplo de código para cada una de estas estructuras, junto con una descripción de sus características principales. Esta comparación te ayudará a comprender las diferencias clave entre ambas y cuándo es más apropiado utilizar cada una según la complejidad de la decisión que deseas tomar en tu código.
Estructura Ejemplo Código Características if-else
if (edad >= 18): print("Mayor de edad") else: print("Menor de edad")
Bloques de código más largos. Ideal para decisiones complejas.
Operador ternario
mensaje = "Mayor de edad" if edad >= 18 else "Menor de edad"
Expresión en una sola línea. Ideal para decisiones simples.
Tabla 1. Comparación entre if-else y operador ternario if-elseEjemplo Código:
if (edad >= 18):
print("Mayor de edad")
else:
print("Menor de edad")Características:
Bloques de código más largos. Ideal para decisiones complejas.Operador ternarioEjemplo Código:
mensaje = "Mayor de edad" if edad >= 18 else "Menor de edad"Características:
Expresión en una sola línea. Ideal para decisiones simples.Damián Nicolalde Rodríguez. (2025).
En esta clase, hemos aprendido a manejar dos herramientas esenciales para la toma de decisiones dentro de un programa: las condicionales anidadas y el operador ternario. Las condicionales anidadas permiten que un programa ejecute diferentes bloques de código dependiendo de varias condiciones, como en los menús interactivos. Por otro lado, el operador ternario nos ofrece una forma eficiente y compacta de tomar decisiones simples entre dos posibles resultados, mejorando la legibilidad del código.
Estas herramientas mejoran la flexibilidad del programa, permitiendo que el código responda de manera dinámica a las entradas del usuario o a diversas condiciones. Al comprender y dominar estas estructuras, los estudiantes estarán mejor preparados para escribir programas más complejos, con flujos de ejecución que no solo sigan un camino lineal, sino que también puedan adaptarse a situaciones complejas.
Imagen 5: Diagrama de flujo con subopciones en un menú interactivo - Damián Nicolalde Rodríguez. (2025). Imagen 5: Diagrama de flujo con subopciones en un menú interactivo - Damián Nicolalde Rodríguez. (2025).
Imagen 6: Ejemplo de menú interactivo con múltiples niveles de decisión - Damián Nicolalde Rodríguez. (2025). Imagen 6: Ejemplo de menú interactivo con múltiples niveles de decisión - Damián Nicolalde Rodríguez. (2025).
Profundiza más
Este recurso te ayudará a enfatizar sobre uso de condicionales anidadas y operadores ternarios para gestionar un sistema de calificaciones ¡Accede aquí!
-
-
-
Actividades
-
-
-
RETO 3: Funciones y Operaciones Avanzadas (Modularización)
Objetivo: Agregar funcionalidades avanzadas a la calculadora (potencias, raíces, matrices) mediante funciones.
Indicaciones:
- Modularización
- Crear funciones como calcular_potencia(base, exponente) o sumar_matrices(matriz1, matriz2).
- Estructuras de datos:
- Usar arreglos para manejar matrices (ej: matriz = [[1, 2], [3, 4]]).
- Integración con el menú:
- Añadir nuevas opciones al menú principal para acceder a estas funciones.
Actividades
- Crear funciones para operaciones avanzadas (ej: calcular_potencia(), calcular_raiz()).
- Implementar operaciones con matrices (suma, multiplicación).
-
Introducción
En la clase 9, se profundiza en el uso de los bucles for, una de las estructuras de control más importantes en Python. Los bucles for permiten iterar sobre secuencias de datos como listas, tuplas, diccionarios y cadenas de texto, facilitando la ejecución repetitiva de un bloque de código sin necesidad de escribir instrucciones duplicadas. Se exploraron ejemplos básicos de cómo recorrer listas y cadenas, y cómo trabajar con diccionarios, lo que mejora la eficiencia al procesar colecciones de datos. Además, se abordó cómo aplicar estos bucles en operaciones más complejas, como la iteración sobre matrices y el uso de la función range() para generar secuencias numéricas específicas.
La clase también se centró en cómo los bucles anidados, es decir, bucles dentro de otros bucles, pueden ser utilizados para recorrer estructuras de datos bidimensionales, como matrices, lo que permite realizar operaciones más avanzadas. La comprensión de los bucles for y su capacidad para manejar secuencias y datos más complejos es crucial para el desarrollo de programas interactivos y dinámicos. Al final de la clase, los estudiantes adquirirán una comprensión sólida de cómo usar bucles for de manera flexible y eficiente, lo que les permite realizar tareas repetitivas y optimizar su código de manera efectiva.
-
9.1. Bucles for (Iterar sobre listas o rangos)
Los bucles for en Python son una de las estructuras de control más poderosas y flexibles que nos permiten recorrer secuencias de datos, como listas, tuplas, diccionarios, cadenas de texto y rangos de números. Los bucles for son fundamentales en la programación, ya que permiten ejecutar un bloque de código múltiples veces sin necesidad de escribir repetidamente el mismo conjunto de instrucciones.
Sintaxis Básica del Bucle for
Código
for item in secuencia: # Código a ejecutar para cada item
- item: Es una variable que toma el valor de cada elemento en la secuencia en cada iteración del bucle.
- secuencia: Es un objeto iterable (como una lista, tupla, cadena de texto, etc.), cuyos elementos serán procesados por el bucle.
El bucle for itera sobre los elementos de la secuencia de izquierda a derecha, y ejecuta el bloque de código una vez por cada elemento de la secuencia. Esta estructura hace que el código sea más compacto y fácil de entender, evitando la necesidad de usar un índice explícito para acceder a los elementos, como sería necesario en otros lenguajes.
Ventajas de los bucles for en Python- Simplicidad: La sintaxis de un bucle for es muy directa, lo que facilita su uso y comprensión.
- Legibilidad: La legibilidad del código es una característica destacada en Python. Los bucles for hacen que las operaciones repetitivas sean fáciles de entender, incluso para aquellos que son nuevos en la programación.
- Flexibilidad: Los bucles for pueden trabajar con cualquier tipo de secuencia, ya sea una lista, un rango de números o una cadena de texto, lo que les permite ser extremadamente versátiles.
Ejemplo: Iteración sobre una lista de númerosUn ejemplo muy básico y fundamental de un bucle for es iterar sobre una lista de números. Supongamos que tenemos una lista con algunos números y queremos imprimir cada uno de ellos.
Código
# Lista de números numeros = [1, 2, 3, 4, 5] # Iteración sobre la lista for numero in numeros: print(numero)
Resultado
1
2
3
4
5
En este ejemplo, el bucle for toma cada numero de la lista numeros y lo imprime en una nueva línea. Este es un caso muy básico donde simplemente recorremos los elementos de la lista y realizamos una acción con ellos (en este caso, imprimirlos).
Ejemplo: Iteración sobre una cadena de textoLos bucles for también pueden ser usados para recorrer cadenas de texto. En este caso, recorreremos cada carácter de una cadena y los imprimiremos.
Código
# Cadena de texto saludo = "Hola Mundo" # Iteración sobre la cadena de texto for letra in saludo: print(letra)
Resultado
H
o
l
a
M
u
n
d
o
El bucle for recorre cada carácter de la cadena de texto saludo, y los imprime uno por uno. Es importante observar cómo cada letra en la cadena se convierte en un item que el bucle procesa.
Ejemplo: Iteración sobre una lista de diccionariosEn muchos escenarios de programación, especialmente al trabajar con datos estructurados, se hace necesario utilizar colecciones de diccionarios. Los diccionarios en Python son estructuras de datos que permiten almacenar pares de claves y valores, lo que los hace especialmente útiles para representar información relacionada.
Un diccionario en Python es una estructura de datos que almacena pares de elementos, donde cada elemento está compuesto por una clave y su valor correspondiente. A diferencia de las listas, que almacenan elementos en un orden secuencial y accesible por índice, los diccionarios permiten acceder a sus elementos a través de claves únicas, lo que proporciona una forma más eficiente y clara de organizar la información.
La sintaxis básica de un diccionario es la siguiente:
Código
diccionario = {'clave1': 'valor1', 'clave2': 'valor2', 'clave3': 'valor3'}
En este ejemplo, 'clave1', 'clave2', y 'clave3' son las claves del diccionario, y 'valor1', 'valor2', y 'valor3' son los valores correspondientes. Es importante destacar que las claves deben ser únicas dentro del diccionario.
Características de los Diccionarios:
- Acceso rápido: El acceso a los elementos mediante claves es muy rápido en comparación con otros tipos de colecciones, como las listas.
- No ordenados: Los diccionarios no mantienen un orden de inserción (hasta Python 3.7, donde se introdujo el ordenamiento por inserción). El acceso se realiza mediante la clave.
- Mutables: Los diccionarios en Python pueden ser modificados después de su creación, permitiendo agregar, cambiar o eliminar pares clave-valor.
- Claves únicas: Cada clave debe ser única dentro del diccionario. Si se asigna una nueva clave con un valor ya existente, el valor anterior será reemplazado.
Supongamos que tenemos una lista de diccionarios, donde cada diccionario almacena la información de una persona, como su nombre y edad. Queremos recorrer esta lista y mostrar la información contenida en cada diccionario.
Veamos el código de ejemplo:
Código
# Lista de diccionarios personas = [ {'nombre': 'Juan', 'edad': 28}, {'nombre': 'Ana', 'edad': 22}, {'nombre': 'Luis', 'edad': 34} ] # Iteración sobre la lista de diccionarios for persona in personas: print(f"Nombre: {persona['nombre']}, Edad: {persona['edad']}")
Explicación del código:
- Lista de diccionarios: La variable personas contiene una lista de tres diccionarios. Cada diccionario representa una persona con dos claves: 'nombre' y 'edad'. Los valores asociados a estas claves son los nombres y las edades de las personas.
- Bucle for: El bucle for recorre cada diccionario dentro de la lista personas. En cada iteración, la variable persona toma el valor de un diccionario de la lista.
- Acceso a claves dentro del diccionario: Dentro de cada diccionario, se accede a los valores correspondientes utilizando las claves. En este caso, persona['nombre'] obtiene el nombre de la persona y persona['edad'] obtiene su edad.
- Impresión de la información: El bloque de código dentro del bucle imprime el nombre y la edad de cada persona en el formato especificado por la cadena de formato f"Nombre: {persona['nombre']}, Edad: {persona['edad']}".
Resultado
Nombre: Juan, Edad: 28
Nombre: Ana, Edad: 22
Nombre: Luis, Edad: 34
El uso de diccionarios en listas es muy común cuando se quiere organizar la información de manera estructurada y accesible por claves, como en el caso de los nombres y edades de las personas. Este ejemplo demuestra cómo los bucles for son una herramienta poderosa y sencilla para iterar sobre colecciones de datos complejos como listas de diccionarios.
Los diccionarios permiten representar relaciones claras y comprensibles entre elementos (en este caso, las claves 'nombre' y 'edad'), lo que facilita la manipulación de los datos.
Ejemplo: Sumar elementos de una lista utilizando un bucle forOtro ejemplo útil es cuando deseamos realizar operaciones con los elementos de una lista. En este caso, sumaremos todos los elementos de una lista de números utilizando un bucle for.
Código
# Lista de números numeros = [10, 20, 30, 40, 50] # Variable para almacenar la suma suma = 0 # Iteración sobre la lista para sumar los números for numero in numeros: suma += numero # Imprimir el resultado print(f"La suma total es: {suma}")
Salida:
Resultado
La suma total es: 150
En este ejemplo, el bucle for recorre la lista numeros, y en cada iteración, agrega el valor de numero a la variable suma. Al final, el valor de suma es la suma de todos los elementos de la lista.
Ejemplo: Recorrer una lista de listas (matriz)En ocasiones, necesitamos trabajar con matrices, que son listas de listas. A continuación, mostramos cómo recorrer una matriz de 2x3 (dos filas y tres columnas) y realizar una operación, como imprimir cada elemento.
Código
# Matriz 2x3 matriz = [[1, 2, 3], [4, 5, 6]] # Iteración sobre las filas y columnas for fila in matriz: for elemento in fila: print(elemento, end=" ") print()
Salida:
Resultado
1 2 3
4 5 6El primer bucle for recorre cada fila de la matriz, y el segundo bucle for recorre cada elemento de la fila, imprimiendo los elementos de manera ordenada.
Ejemplo: Operaciones con Matrices utilizando forFinalmente, un ejemplo más avanzado es trabajar con una matriz de 3x3 y realizar una operación, como sumar 10 a cada elemento de la matriz. Este tipo de operaciones son comunes en el procesamiento de datos y álgebra computacional.
Código
# Matriz 3x3 matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # Operación: sumamos 10 a cada elemento for i in matriz: # Recorrer las filas for j in i: # Recorrer las columnas print(j + 10, end=" ") print()
Salida:
Resultado
11 12 13
14 15 16
17 18 19Este ejemplo recorre la matriz matriz y suma 10 a cada elemento de la matriz. Usamos dos bucles for anidados, donde el primero recorre las filas y el segundo recorre los elementos dentro de cada fila.
Ejemplo: Recorrer y Modificar Caracteres de una CadenaRecorrer los caracteres de una cadena es otra operación común en programación. Supongamos que necesitamos reemplazar las vocales en una cadena por un asterisco (*):
Código
# Cadena original texto = "programacion" # Nueva cadena con las vocales cambiadas nuevo_texto = "" for caracter in texto: if caracter in "aeiou": nuevo_texto += "*" else: nuevo_texto += caracter print(nuevo_texto)
Salida:
Resultado
pr*gr*m*c**n
Figura 1: Diagrama de flujo para reemplazar caracteres en una cadena Fuente: Creación de autor, D. Nicolalde. Figura 1: Diagrama de flujo para reemplazar caracteres en una cadena Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo se recorre cada carácter de la cadena de texto y se reemplazan las vocales por asteriscos.
-
9.2. Uso de range() en Python
La función range() en Python es una herramienta clave cuando necesitamos generar una secuencia de números, particularmente cuando trabajamos con bucles for. Esta función genera números enteros que se utilizan en el bucle para realizar tareas repetitivas. El rango generado por range() se puede controlar con tres parámetros: start, stop y step. Vamos a profundizar en cómo funciona esta función y cómo aprovechar sus capacidades para construir secuencias de manera eficiente.
Sintaxis de range()
Código
range(start, stop, step)
- start (valor inicial): Es el primer número de la secuencia. Si no se especifica, el valor predeterminado es 0. Es importante recordar que start es inclusivo, es decir, el rango comenzará desde el valor especificado.
- stop (valor final): Es el número hasta el cual se generará la secuencia, pero no se incluye. En otras palabras, el rango se detendrá antes de llegar a este valor. Este parámetro es obligatorio.
- step (diferencia entre cada número): Es el incremento entre cada número en la secuencia. Si no se especifica, el valor predeterminado es 1, lo que significa que los números generados serán consecutivos. step puede ser negativo, lo que genera una secuencia descendente.
Ejemplo: Uso de range() con Paso PersonalizadoSupongamos que necesitamos imprimir una secuencia de números de 0 a 20, pero con un paso de 5. Aquí es donde range() es muy útil.
Código
for i in range(0, 21, 5): print(i)
Resultado
0
5
10
15
20
Figura 2: Diagrama de flujo de range() con paso definido Fuente: Creación de autor, D. Nicolalde. Figura 2: Diagrama de flujo de range() con paso definido Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo range(0, 21, 5) genera una secuencia de números desde 0 hasta 20, con un incremento de 5
Ejemplo: Uso de range() para Crear una Secuencia DescendentePodemos usar range() con un paso negativo para generar secuencias descendentes.Código
for i in range(10, 0, -1): print(i)
Salida:
Resultado
10
9
8
7
6
5
4
3
2
1
Figura 3: Diagrama de flujo de range() descendente Fuente: Creación de autor, D. Nicolalde. Figura 3: Diagrama de flujo de range() descendente Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama ilustra cómo range(10, 0, -1) genera una secuencia decreciente de números.
Ejemplo: Anidamiento de Bucles con range() para MatricesSi trabajamos con estructuras de datos bidimensionales, como matrices, los bucles anidados son esenciales. A continuación, se muestra cómo recorrer una matriz utilizando range() y bucles anidados:
Código
# Crear una matriz 4x4 for i in range(4): for j in range(4): print(f"Posición ({i},{j})")
Salida:
Resultado
Posición (1,0)
Posición (1,1)
Posición (1,2)
Posición (1,3)
Posición (2,0)
Posición (2,1)
Posición (2,2)
Posición (2,3)
Posición (3,0)
Posición (3,1)
Posición (3,2)
Posición (3,3)
Figura 4: Diagrama de flujo para recorrer una matriz 4x4 con range() Fuente: Creación de autor, D. Nicolalde. Figura 4: Diagrama de flujo para recorrer una matriz 4x4 con range() Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo dos bucles for anidados recorren las filas y columnas de una matriz de 4x4, utilizando range() para controlar las iteraciones.
Ejemplo: Operaciones con Matrices utilizando forUna de las aplicaciones más comunes de los bucles for es la iteración sobre matrices (listas de listas). A continuación, mostramos cómo recorrer una matriz de 3x3 y realizar una operación, como sumar 10 a cada elemento.
Código
# Matriz 3x3 matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # Operación: sumamos 10 a cada elemento for i in range(len(matriz)): # Recorrer las filas for j in range(len(matriz[i])): # Recorrer las columnas matriz[i][j] += 10 # Imprimir la matriz resultante print(matriz)
Salida:
Resultado
[[11, 12, 13], [14, 15, 16], [17, 18, 19]]
Figura 5: Diagrama de flujo para recorrer una matriz Fuente: Creación de autor, D. Nicolalde. Figura 5: Diagrama de flujo para recorrer una matriz Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama ilustra cómo un bucle anidado recorre las filas y columnas de una matriz, realizando una operación sobre cada elemento.
Aprende más
Vemos como trabaja el bucle For en python y sus diferencias a otros lenguajes de programación. ¡Accede aquí!
En la tabla 1 se proporciona una comparación detallada de los tres parámetros clave que se pueden usar con la función range() en Python: start, stop, y step. La función range() se usa comúnmente dentro de bucles for para generar una secuencia de números, controlando de manera precisa cómo se genera esa secuencia. Cada parámetro tiene un papel importante en el comportamiento del rango generado.
Parámetro Descripción Ejemplo start El número inicial de la secuencia. range(2, 6) genera 2, 3, 4, 5. stop El número final de la secuencia (exclusivo). range(1, 4) genera 1, 2, 3. step El valor de incremento entre números. range(0, 10, 2) genera 0, 2, 4, 6, 8. Tabla 1: Comparación de range() con Bucles for Fuente: Creación de autor, D. Nicolalde. startDescripción: El número inicial de la secuencia.
Ejemplo: range(2, 6) genera 2, 3, 4, 5.
stopDescripción: El número final de la secuencia (exclusivo).
Ejemplo: range(1, 4) genera 1, 2, 3.
stepDescripción: El valor de incremento entre números.
Ejemplo: range(0, 10, 2) genera 0, 2, 4, 6, 8.
La tabla 2, muestran varios ejemplos prácticos de cómo utilizar bucles for en combinación con range(). Los ejemplos proporcionan una idea de cómo se pueden usar de diferentes maneras para recorrer secuencias de números y realizar tareas repetitivas. Esta tabla es útil para ilustrar las distintas formas de utilizar range() en bucles.
Bucle Descripción Ejemplo de código for básico Itera sobre una secuencia fija de elementos. for i in range(5): print(i) for con range Genera números en un rango específico. for i in range(2, 10, 2): print(i) for anidado Itera dentro de otro bucle for. for i in range(3):
for j in range(3):
print(f"Posición ({i},{j})")Tabla 2: Ejemplo de Uso de Bucles y range() Fuente: Creación de autor, D. Nicolalde. for en Python for básicoDescripción: Itera sobre una secuencia fija de elementos.
Ejemplo: for i in range(5): print(i)
for con rangeDescripción: Genera números en un rango específico.
Ejemplo: for i in range(2, 10, 2): print(i)
for anidadoDescripción: Itera dentro de otro bucle for.
Ejemplo:
for i in range(3): for j in range(3): print(f"Posición ({i},{j})")
Los bucles for y la función range() son herramientas esenciales en Python para controlar el flujo de ejecución, iterando sobre secuencias y realizando tareas repetitivas de manera eficiente.
Gracias a su simplicidad y versatilidad, los bucles permiten realizar tareas complejas como recorrer matrices y trabajar con secuencias de números de manera estructurada.
Al combinar bucles anidados con range(), es posible gestionar estructuras de datos bidimensionales y realizar operaciones más avanzadas como la manipulación de matrices.
Estas herramientas permiten a los programadores crear programas que son no solo funcionales, sino también eficientes y fácilmente escalables.
Aprende más
Este video explica cómo utilizar el bucle for junto con la función range() en Python, ¡Accede aquí!
Profundiza más
Este recurso te ayudará a enfatizar sobre Bucles y anidamiento ¡Accede aquí!
-
-
-
Actividades
-
Hacer intentos: 1
-
-
-
Introducción
En esta Clase 10, profundizaremos en el uso de los bucles while y do-while, fundamentales para ejecutar bloques de código repetidamente mientras se cumpla una condición booleana. A diferencia de los bucles for, que iteran sobre secuencias predefinidas, los bucles while se utilizan cuando no sabemos cuántas iteraciones son necesarias, pero sí sabemos que el ciclo debe continuar hasta que una condición cambie. Además, exploraremos cómo simular el comportamiento de un bucle do-while en Python, una característica de otros lenguajes de programación como C y Java. Los bucles while son esenciales cuando se necesita un control dinámico sobre el flujo del programa, ya que permiten que el código se ejecute de manera continua hasta que se cumpla una condición específica.
A lo largo de esta clase, también abordaremos cómo controlar el flujo de ejecución dentro de los bucles con los comandos break y continue. El comando break interrumpe un bucle en el momento en que se cumple una condición específica, mientras que continue omite la iteración actual y pasa a la siguiente. Estas herramientas proporcionan una flexibilidad importante, permitiendo al programador crear estructuras de control más sofisticadas y adaptativas. Al finalizar esta clase, los estudiantes estarán mejor preparados para escribir programas más dinámicos, con una lógica de flujo controlada por condiciones y ciclos que pueden ejecutarse de manera eficiente en función de la situación.
-
10.1. Bucles while y do-while
Los bucles while y do-while son estructuras de control fundamentales que permiten ejecutar un bloque de código mientras se cumpla una condición booleana. En Python, el bucle while se utiliza ampliamente, y podemos simular el comportamiento del do-while utilizando un bucle while con una condición al final. Ambos bucles son útiles cuando no sabemos cuántas iteraciones se necesitan de antemano, pero sí sabemos que el bucle debe ejecutarse hasta que una condición cambie.
Bucle while:El bucle while en Python es una de las estructuras de control más utilizadas. Permite repetir una acción mientras se cumpla una condición específica. La sintaxis básica de un bucle while es sencilla:
Código
while condición: # Código a ejecutar
Condición Inicial: En un bucle while, la condición se evalúa antes de ejecutar el bloque de código. Si la condición es True, el código dentro del bucle se ejecuta, y luego se evalúa nuevamente la condición antes de volver a ejecutar el código. Este ciclo continúa hasta que la condición sea False.
Un aspecto importante de los bucles while es que la condición se evalúa antes de la ejecución, lo que significa que si la condición es falsa desde el principio, el bloque de código no se ejecutará ni una vez.
Importancia de la Condición:La condición es la clave que mantiene el bucle activo o lo detiene. El uso adecuado de la condición es crucial para evitar ciclos infinitos, los cuales pueden llevar al agotamiento de los recursos del sistema e incluso al colapso de la aplicación. Es importante asegurarse de que la condición cambiará eventualmente para evitar este tipo de problemas. Esto se puede hacer modificando las variables utilizadas en la condición durante el ciclo o utilizando otras estructuras como el break para salir del bucle manualmente.
Características del Bucle while:
- Evaluación Previa: Como ya se mencionó, la condición del bucle se evalúa antes de la ejecución del bloque de código. Esto es ventajoso en situaciones donde es necesario verificar las condiciones antes de realizar cualquier acción.
- Posibilidad de No Ejecutarse: Si la condición inicial es falsa, el bloque de código no se ejecutará ni una vez. Esto lo convierte en una estructura útil cuando no se sabe cuántas iteraciones serán necesarias, pero se sabe que el ciclo debe cumplirse solo si la condición se cumple desde el inicio.
- Uso Dinámico en Condiciones Variadas: Los bucles while son muy flexibles y se utilizan en muchas situaciones donde la cantidad de iteraciones depende de factores que no son previsibles, como la entrada del usuario o el estado de una aplicación.
Simulación del do-while en Python:Python no tiene un bucle do-while explícito, pero podemos simular este comportamiento utilizando un bucle while con una condición que siempre sea verdadera al principio y un break para salir del bucle si la condición no se cumple. Este enfoque asegura que el código dentro del bucle se ejecute al menos una vez, independientemente de si la condición es verdadera al principio.
Un ejemplo de cómo simular un bucle do-while sería:
Código
while True: # Bloque de código if condición_de_terminación: break
Comportamiento del do-while:En un bucle do-while, el bloque de código siempre se ejecuta al menos una vez, lo que es útil cuando se desea que un programa ejecute una acción inicial antes de evaluar si debe continuar o no. La estructura básica de un do-while en otros lenguajes (como C, C++ y Java) es la siguiente:
Código
do { // Código a ejecutar }
En la tabla 1, se muestra una comparación entre while y do-while:
Característica while do-while Evaluación de la Condición Se evalúa antes de ejecutar el código. Se evalúa después de ejecutar el código. Ejecución Inicial Puede no ejecutarse si la condición es falsa desde el principio. Siempre se ejecuta al menos una vez. Casos de Uso Útil cuando no se sabe cuántas veces se debe ejecutar el ciclo, pero se tiene una condición clara. Ideal cuando se necesita que el código se ejecute al menos una vez, como en la validación de datos. Complejidad Más flexible, pero puede ser propenso a ciclos infinitos si la condición no cambia. Más rígido, pero garantiza la ejecución inicial del código. Fuente: Creación de autor, D. Nicolalde. Evaluación de la Condiciónwhile: Se evalúa antes de ejecutar el código.
do-while: Se evalúa después de ejecutar el código.
Ejecución Inicialwhile: Puede no ejecutarse si la condición es falsa desde el principio.
do-while: Siempre se ejecuta al menos una vez.
Casos de Usowhile: Útil cuando no se sabe cuántas veces se debe ejecutar el ciclo, pero se tiene una condición clara.
do-while: Ideal cuando se necesita que el código se ejecute al menos una vez, como en la validación de datos.
Complejidadwhile: Más flexible, pero puede ser propenso a ciclos infinitos si la condición no cambia.
do-while: Más rígido, pero garantiza la ejecución inicial del código.
Figura 1: Diagrama de flujo de un bucle while Fuente: Creación de autor, D. Nicolalde. Figura 1: Diagrama de flujo de un bucle while Fuente: Creación de autor, D. Nicolalde.
Ejemplo Básico: Bucle while con contadorUn ejemplo básico utilizando while es contar hacia abajo hasta llegar a cero:
Código
contador = 5 while contador > 0: print(contador) contador -= 1
Salida
Resultado
5
4
3
2
1En este ejemplo, el bucle while repite la impresión del valor de contador y lo va decrementando hasta que llegue a cero.
Ejemplo: Bucle while con validación de entradaEn este ejemplo, el bucle seguirá pidiendo una entrada válida hasta que el usuario ingrese un valor positivo:
Código
edad = -1 while edad <= 0: edad = int(input("Por favor, ingrese una edad válida: ")) print(f"Edad ingresada: {edad}")
Salida (dependiendo de la entrada del usuario):
Resultado
Por favor, ingrese una edad válida: -5
Por favor, ingrese una edad válida: 25
Edad ingresada: 25El bucle while sigue ejecutándose hasta que el valor de edad sea mayor que 0.
Figura 2: Diagrama de flujo del bucle while con validación Fuente: Creación de autor, D. Nicolalde. Figura 2: Diagrama de flujo del bucle while con validación Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo un bucle while puede usarse para validar datos, repitiendo una solicitud hasta que la condición se cumpla.
Ejemplo: Bucle while con validación de múltiples condicionesA continuación, utilizamos un while para pedir a un usuario que ingrese un número mayor que 100:
Código
numero = 0 while numero < 100: numero = int(input("Ingrese un número mayor que 100: ")) if numero <= 100: print("El número es demasiado pequeño. Intente de nuevo.") print("Número aceptado:", numero)
Salida:
Resultado
Ingrese un número mayor que 100: 50
El número es demasiado pequeño. Intente de nuevo.
Ingrese un número mayor que 100: 150
Número aceptado: 150Este bucle sigue pidiendo la entrada hasta que se ingresa un número mayor a 100.
Simulación de un Bucle do-while en Python:Python no tiene una estructura do-while directa, pero podemos simularla con un bucle while:
Código
while True: opcion = input("Ingrese 'salir' para salir del programa: ") if opcion == "salir": print("Programa finalizado") break else: print("Aún no ha salido del programa.")
Este ejemplo asegura que el código se ejecute al menos una vez, simulando el comportamiento de un do-while.
Aprende más
En este vídeo comenzamos a hablar sobre los bucles y veremos el bucle while ¡Accede aquí!
-
10.2. Control de Bucles con break y continue
Los comandos break y continue se utilizan para controlar el flujo de ejecución de los bucles, y nos proporcionan más flexibilidad y control.
Uso de break:El comando break permite interrumpir la ejecución de un bucle de inmediato. Es útil cuando se cumple una condición específica y no se necesita seguir iterando.
Ejemplo básico de break:Código
for i in range(10): if i == 5: print("Número encontrado, saliendo del bucle.") break print(i)
Salida:
Resultado
0
1
2
3
4
Número encontrado, saliendo del bucle.
Figura 3: Diagrama de flujo del uso de break en un bucle for Fuente: Creación de autor, D. Nicolalde. Figura 3: Diagrama de flujo del uso de break en un bucle for Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo el comando break interrumpe el bucle al encontrar una condición específica.
Ejemplo de break: búsqueda de un número determinadoCódigo
numeros = [1, 2, 3, 4, 5, 6] busqueda = 4 for numero in numeros: if numero == busqueda: print(f"El número {busqueda} ha sido encontrado.") break else: print(f"El número {busqueda} no está en la lista.")
Salida:
Resultado
El número 4 ha sido encontrado.
Uso de continue:El comando continue omite la iteración actual y continúa con la siguiente. Es útil cuando queremos saltar una iteración específica sin interrumpir el bucle.
Ejemplo de continue: evalúa una condiciónCódigo
for i in range(10): if i % 2 == 0: continue print(i)
Salida:
Resultado
1
3
5
7
9
Figura 4: Diagrama de flujo del uso de continue Fuente: Creación de autor, D. Nicolalde. Figura 4: Diagrama de flujo del uso de continue Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo el comando continue salta una iteración y continúa con la siguiente sin ejecutar el bloque de código para los valores específicos.
Ejemplo del uso de continue: validación de datosCódigo
calificaciones = [40, 55, 60, 45, 80, 33, 50] for calificacion in calificaciones: if calificacion < 50: continue print(f"Calificación aprobatoria: {calificacion}")
Salida:
Resultado
Calificación aprobatoria: 55
Calificación aprobatoria: 60
Calificación aprobatoria: 80
Calificación aprobatoria: 50
Figura 5: Diagrama de flujo de continue con validación de datos Fuente: Creación de autor, D. Nicolalde. Figura 5: Diagrama de flujo de continue con validación de datos Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama ilustra cómo continue omite las iteraciones con valores no deseados, en este caso, calificaciones reprobadas.
La tabla 2 compara las características de los bucles while y for en Python. El bucle while se basa en una condición que se evalúa antes de cada iteración, mientras que el bucle for recorre una secuencia predefinida. El bucle while es ideal para condiciones indeterminadas, mientras que el for se utiliza comúnmente para iterar sobre listas o rangos.
Característica Bucle while Bucle for Control de iteración Basado en condición Basado en secuencia Uso típico Condiciones indeterminadas Recorrer listas, rangos o caracteres Salida anticipada break o condición falsa break o fin de secuencia Condición inicial Definida antes del bucle Definida en la secuencia Tabla 2: Comparación entre bucles while y for. Fuente: Creación de autor, D. Nicolalde. Control de iteraciónBucle while: Basado en condición
Bucle for: Basado en secuencia
Uso típicoBucle while: Condiciones indeterminadas
Bucle for: Recorrer listas, rangos o caracteres
Salida anticipadaBucle while: break o condición falsa
Bucle for: break o fin de secuencia
Condición inicialBucle while: Definida antes del bucle
Bucle for: Definida en la secuencia
La tabla 3 explica el uso de las sentencias break y continue en bucles. break se utiliza para interrumpir un bucle cuando se cumple una condición específica, deteniendo la ejecución del bucle inmediatamente. continue, por otro lado, omite la iteración actual y pasa a la siguiente, permitiendo que el bucle continúe sin ejecutar el código restante de la iteración actual.
Tipo de Control Ejemplo de Uso Descripción break Interrumpir un bucle cuando se cumple una condición El bucle se detiene de inmediato al encontrar la condición. continue Omitir la iteración actual y continuar con la siguiente Salta una iteración específica y continúa con las siguientes. Tabla 3: Ejemplos de control de flujo con break y continue. Fuente: Creación de autor, D. Nicolalde. breakEjemplo de Uso: Interrumpir un bucle cuando se cumple una condición
Descripción: El bucle se detiene de inmediato al encontrar la condición.
continueEjemplo de Uso: Omitir la iteración actual y continuar con la siguiente
Descripción: Salta una iteración específica y continúa con las siguientes.
Aprende más
En este vídeo aprende a trabajar con las instrucciones break y continue en Python. ¡Accede aquí!
Vamos a plantear un ejemplo completo: Sistema Interactivo de Clasificación de EstudiantesEn este ejemplo, vamos a crear un sistema interactivo que permita al usuario ingresar las calificaciones de varios estudiantes, calcular su promedio y clasificarlos según su rendimiento. El programa utilizará varias estructuras de control como bucles anidados, condicionales if-else, y los comandos break y continue para controlar el flujo del programa.
Este sistema tiene como objetivo permitir a los usuarios ingresar los datos de los estudiantes de forma repetida. Para cada estudiante, el programa calcula el promedio de sus calificaciones y determina si el estudiante está en la categoría de "Excelente", "Aprobado" o "Reprobado", basándose en su promedio.
Flujo del Programa- Bucle principal (while): El programa continuará pidiendo la información de nuevos estudiantes hasta que el usuario decida no ingresar más datos. Este flujo es controlado por un bucle while que se ejecuta mientras la variable continuar sea True.
- Ingreso del nombre del estudiante: Primero, el programa pide el nombre del estudiante. Si el usuario deja el campo vacío, se vuelve a pedir que ingrese un nombre, utilizando el comando continue para omitir la iteración actual del bucle.
- Ingreso de las calificaciones: Después de obtener el nombre del estudiante, el programa solicita las calificaciones. Las calificaciones se ingresan como una cadena de texto, separadas por comas. Luego, el programa las convierte en una lista de números flotantes. Si el usuario introduce algo que no sea un número, se captura el error con try-except, y se le pide al usuario que vuelva a ingresar las calificaciones.
- Cálculo del promedio: Una vez que las calificaciones se han almacenado correctamente en una lista, el programa calcula el promedio de las calificaciones utilizando la función sum() para sumar todos los valores de la lista y luego dividiendo entre el número de elementos en la lista.
-
Clasificación con if-else: Según el promedio calculado, el programa clasifica al estudiante:
- Si el promedio es mayor o igual a 9, el estudiante es clasificado como "Excelente".
- Si el promedio es mayor o igual a 6 pero menor que 9, el estudiante es clasificado como "Aprobado".
- Si el promedio es menor a 6, el estudiante es clasificado como "Reprobado".
- Mostrar resultados: El programa imprime el nombre del estudiante, su promedio y la categoría en la que se encuentra.
- Repetir o salir: Después de mostrar el resultado, el programa pregunta al usuario si desea ingresar otro estudiante. Si la respuesta es "n", el bucle while se termina y el programa imprime un mensaje de despedida. Si la respuesta es "s", el programa comienza el proceso de nuevo para un nuevo estudiante.
Aquí está el código completo del ejemplo:
Código
# Sistema Interactivo de Clasificación de Estudiantes print("Bienvenido al sistema de clasificación de estudiantes") continuar = True # Variable de control para el bucle while # Bucle principal que permite ingresar datos de estudiantes repetidamente while continuar: # Ingreso de información del estudiante nombre = input("Ingrese el nombre del estudiante: ") if nombre == "": # Si el nombre está vacío, se omite esta iteración y pide el nombre nuevamente print("Debe ingresar un nombre para el estudiante.") continue # Omite la iteración actual y pasa a la siguiente try: # Ingreso de las calificaciones del estudiante calificaciones = input(f"Ingrese las calificaciones de {nombre} separadas por comas: ") calificaciones = [float(i) for i in calificaciones.split(",")] except ValueError: print("Error: Ingrese solo números separados por comas.") continue # Si hay error en las calificaciones, salta a la siguiente iteración # Calcular el promedio de las calificaciones promedio = sum(calificaciones) / len(calificaciones) # Clasificación del estudiante según el promedio usando if-else if promedio >= 9: categoria = "Excelente" elif promedio >= 6: categoria = "Aprobado" else: categoria = "Reprobado" # Mostrar el resultado de la clasificación print(f"El estudiante {nombre} tiene un promedio de {promedio:.2f} y está en la categoría: {categoria}") # Preguntar al usuario si desea continuar ingresando más estudiantes continuar_respuesta = input("¿Desea ingresar otro estudiante? (s/n): ").lower() if continuar_respuesta == "n": continuar = False # Sale del bucle while # Mensaje de despedida print("Gracias por usar el sistema de clasificación de estudiantes.")
Salida: Al ejecutar el programa, se genera la siguiente salida basada en las entradas del usuario:
Resultado
Bienvenido al sistema de clasificación de estudiantes
Ingrese el nombre del estudiante: Juan
Ingrese las calificaciones de Juan separadas por comas: 9, 8, 7
El estudiante Juan tiene un promedio de 8.00 y está en la categoría: Aprobado
¿Desea ingresar otro estudiante? (s/n): s
Ingrese el nombre del estudiante: Ana
Ingrese las calificaciones de Ana separadas por comas: 10, 9, 9
El estudiante Ana tiene un promedio de 9.33 y está en la categoría: Excelente
¿Desea ingresar otro estudiante? (s/n): n
Gracias por usar el sistema de clasificación de estudiantes.Este ejercicio es un ejemplo práctico de cómo usar bucles anidados, condicionales if-else, y los comandos break y continue en Python. Permite al usuario interactuar con el programa, ingresar datos dinámicos y realizar múltiples iteraciones mientras se realiza un proceso de clasificación. El uso del bucle while asegura que el proceso sea repetitivo y flexible, mientras que continue se utiliza para manejar errores en la entrada de datos, y el break (si lo aplicáramos más adelante) podría ser utilizado para finalizar el bucle bajo ciertas condiciones, como cuando el promedio es menor que un valor específico.
Este tipo de sistemas interactivos son fundamentales en el desarrollo de aplicaciones prácticas que manejan entradas dinámicas y requieren de lógica condicional para organizar y clasificar la información.
Profundiza más
Este recurso te ayudará a enfatizar sobre Condicionales y anidamiento ¡Accede aquí!
-
-
-
Actividades
-
Hacer intentos: 1
-
-
-
Introducción
En la clase 11, nos adentramos en el uso de los arreglos unidimensionales, también conocidos como listas en Python, que son estructuras de datos fundamentales para la manipulación de colecciones de elementos. A lo largo de esta lección, aprenderemos cómo definir y trabajar con listas, explorar su flexibilidad y cómo se pueden manipular de manera eficiente para almacenar datos heterogéneos. Además, profundizaremos en la sintaxis básica de los arreglos y en cómo acceder, modificar y recorrer sus elementos utilizando bucles, especialmente el bucle for. Esta clase también proporciona las bases para aplicar arreglos a problemas más complejos, mostrando su uso en situaciones como la filtración de datos y la iteración con condicionesr
El tema también se expandirá a cómo recorrer arreglos con bucles for, profundizando en cómo las estructuras de control pueden mejorar la eficiencia de nuestros programas al manipular grandes cantidades de datos de manera dinámica. A través de ejemplos prácticos y ejercicios, los estudiantes podrán familiarizarse con el uso de arreglos unidimensionales en conjunto con estructuras de control como break y continue, lo que les permitirá gestionar iteraciones de manera efectiva, eliminando elementos, modificando valores y aplicando condiciones específicas dentro de sus bucles. Esta clase es crucial para dominar uno de los aspectos más importantes de la programación en Python: el manejo de colecciones de datos y su procesamiento.
-
11.1. Arreglos Unidimensionales: Definición y Sintaxis
Los arreglos unidimensionales, también conocidos como listas en Python, son estructuras de datos fundamentales que permiten almacenar colecciones de elementos bajo un mismo nombre de variable. Estas estructuras son esenciales en la programación, ya que facilitan la manipulación y organización de datos relacionados de manera eficiente. En Python, las listas son especialmente populares debido a su versatilidad y facilidad de uso, lo que las convierte en una de las herramientas más utilizadas para almacenar secuencias de elementos.
Los arreglos unidimensionales en Python tienen varias características importantes que los hacen muy poderosos. En primer lugar, pueden almacenar un número arbitrario de elementos y permiten que estos elementos sean de diferentes tipos de datos. Esta capacidad de manejar datos heterogéneos es una de las grandes ventajas de las listas en Python, ya que no es necesario que todos los elementos sean del mismo tipo (por ejemplo, enteros, cadenas o incluso otras listas pueden convivir en una misma lista).
Una de las características más destacadas de los arreglos unidimensionales (listas) es que son dinámicos. Esto significa que puedes modificar una lista después de su creación sin restricciones. Puedes agregar nuevos elementos, eliminar los existentes o incluso cambiar el valor de los elementos ya almacenados. Esta flexibilidad es fundamental en muchos contextos, ya que no es necesario conocer el tamaño exacto de la lista desde el principio.
Las listas también permiten la inserción de elementos en cualquier posición dentro de la secuencia. Esto puede ser útil cuando se requiere una estructura de datos flexible y eficiente en términos de tiempo para realizar cambios en las posiciones de los elementos.
Definición y Sintaxis de ArreglosLa sintaxis básica para definir un arreglo unidimensional en Python es bastante simple. Usamos los corchetes [] para crear la lista y separamos los elementos con comas. Así, una lista puede contener cualquier tipo de dato: números, cadenas de texto, booleanos, etc.
Código
arreglo = [elemento1, elemento2, ..., elementoN]
Donde:
- arreglo es el nombre de la lista.
- elemento1, elemento2, ..., elementoN son los elementos de la lista, los cuales pueden ser de diferentes tipos de datos.
Por ejemplo, una lista con números enteros sería:
Código
numeros = [10, 20, 30, 40, 50]
Mientras que una lista con diferentes tipos de datos podría verse así:
Código
mi_lista = [10, "Hola", True, 3.14]
Esto significa que arreglo puede contener cualquier tipo de objeto y no está restringido a un tipo específico de datos. Además, las listas pueden ser de cualquier longitud, desde una lista vacía hasta una lista con millones de elementos.
Figura 1: Diagrama de flujo para la creación de un arreglo unidimensional Fuente: Creación de autor, D. Nicolalde. Figura 1: Diagrama de flujo para la creación de un arreglo unidimensional Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo se crea un arreglo unidimensional y cómo acceder a los elementos por índice.
Aprende más
En este vídeo te estaré mostrando arreglos unidimensionales en python en Windows, Linux e IOS. ¡Accede aquí!
Acceso y Modificación de ElementosEn Python, los elementos dentro de un arreglo unidimensional son accesibles mediante un índice, el cual comienza desde 0 para el primer elemento de la lista. El índice se coloca entre corchetes, justo después del nombre de la lista.
Por ejemplo, si queremos acceder al primer elemento de la lista numeros, lo hacemos de la siguiente forma:
Código
print(numeros[0]) # Imprime 10
De igual manera, podemos acceder a cualquier otro elemento de la lista usando su índice. Es importante recordar que los índices son basados en cero, lo que significa que el primer elemento tiene un índice de 0, el segundo elemento tiene un índice de 1, y así sucesivamente.
Python también permite el acceso a los elementos de la lista utilizando índices negativos. Un índice negativo comienza desde el último elemento de la lista, y va hacia atrás. Por ejemplo, numeros[-1] accedería al último elemento de la lista.
Código
print(numeros[-1]) # Imprime 50, el último elemento
Ejemplo de Acceso y Modificación de ElementosAdemás de acceder a los elementos, también es posible modificar un elemento en una lista. Para cambiar un valor de la lista, simplemente asignamos un nuevo valor a la posición deseada:
Código
arreglo = [10, 20, 30, 40, 50] print(arreglo[2]) # Imprime el tercer elemento de la lista, que es 30 # Modificar un elemento en la posición 3 arreglo[3] = 35 print(arreglo) # Imprime [10, 20, 30, 35, 50]
Salida:
Resultado
30
[10, 20, 30, 35, 50]
Figura 2: Diagrama de flujo para modificar elementos en un arreglo Fuente: Creación de autor, D. Nicolalde. Figura 2: Diagrama de flujo para modificar elementos en un arreglo Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama ilustra cómo acceder y modificar los elementos de un arreglo utilizando índices.
-
11.2. Recorrer Arreglos con Bucles For
El bucle for en Python es la estructura más utilizada para recorrer los elementos de un arreglo o lista. Permite realizar acciones repetitivas de forma eficiente, iterando sobre cada uno de los elementos de la secuencia (ya sean listas, tuplas, cadenas de texto o cualquier otro tipo de colección iterable). En lugar de utilizar índices manuales, el bucle for maneja automáticamente cada elemento, lo que simplifica la escritura del código y lo hace más limpio y legible.
Sintaxis Básica del Bucle ForLa sintaxis para recorrer un arreglo con un bucle for es:
Código
for item in arreglo: # Código a ejecutar para cada item
- item: Es la variable temporal que toma el valor de cada elemento del arreglo durante cada iteración del bucle.
- arreglo: Es la lista o secuencia que estamos recorriendo.
- Cuerpo del bucle: El bloque de código que se ejecuta en cada iteración, donde se puede realizar cualquier operación sobre el elemento actual del arreglo.
Figura 3: Diagrama de flujo para recorrer un arreglo con un bucle for Fuente: Creación de autor, D. Nicolalde. Figura 3: Diagrama de flujo para recorrer un arreglo con un bucle for Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo un bucle for recorre cada elemento de un arreglo y ejecuta un bloque de código para cada uno de ellos.
Ejemplo: Recorrer una Lista de NúmerosCódigo
arreglo = [1, 2, 3, 4, 5] for numero in arreglo: print(numero)
Salida:
Resultado
1
2
3
4
5En este ejemplo, el bucle for recorre cada número de la lista arreglo y lo imprime en la consola. El valor de item (en este caso numero) se toma del arreglo en cada iteración, lo que permite realizar operaciones sobre cada número individualmente.
El bucle for no solo se puede utilizar para recorrer listas simples, sino que también se puede aplicar a estructuras más complejas como listas de listas (matrices), diccionarios y tuplas.
Ejemplo: Recorrer Arreglo con Condiciones
En ocasiones necesitamos no solo recorrer los elementos de un arreglo, sino también aplicar condiciones sobre esos elementos. A continuación, mostramos un ejemplo donde se filtran los números mayores a 20.
Código
arreglo = [10, 20, 30, 40, 50] for numero in arreglo: if numero > 20: print(f"El número {numero} es mayor que 20.")
Salida:
Resultado
El número 30 es mayor que 20.
El número 40 es mayor que 20.
El número 50 es mayor que 20.En este caso, el bucle for recorre cada número de la lista y solo imprime aquellos que son mayores que 20. Esto demuestra cómo podemos aplicar condiciones dentro de un bucle para filtrar los resultados.
Figura 4: Diagrama de flujo de un bucle for con condición Fuente: Creación de autor, D. Nicolalde. Figura 4: Diagrama de flujo de un bucle for con condición Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo se usa un bucle for con una condición que filtra los elementos durante la iteración.
Ejemplo: Recorrer una Lista de DiccionariosEn situaciones más complejas, puede ser necesario trabajar con listas que contienen diccionarios. Estos se utilizan para almacenar múltiples pares de clave-valor. A continuación, mostramos cómo recorrer una lista de diccionarios y extraer información de ellos. Supongamos que tenemos una lista de diccionarios que contienen información sobre varios estudiantes. Cada diccionario tiene claves como nombre y edad. A continuación, un ejemplo de cómo recorrer esta lista de diccionarios:
Código
personas = [ {'nombre': 'Juan', 'edad': 28}, {'nombre': 'Ana', 'edad': 22}, {'nombre': 'Luis', 'edad': 34} ] for persona in personas: print(f"Nombre: {persona['nombre']}, Edad: {persona['edad']}")
Salida:
Resultado
Nombre: Juan, Edad: 28
Nombre: Ana, Edad: 22
Nombre: Luis, Edad: 34Este ejemplo demuestra cómo acceder a las claves de un diccionario dentro de una lista utilizando un bucle for, lo que nos permite extraer y trabajar con datos más estructurados.
Ejemplo: Bucle For con Arreglo AnidadoLos bucles for también se pueden usar para recorrer arreglos bidimensionales, como matrices. Aquí se muestra un ejemplo donde recorremos una matriz (una lista de listas).
Código
arreglo = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] for fila in arreglo: for numero in fila: print(numero, end=" ") print()
Salida:
Resultado
1 2 3
4 5 6
7 8 9Este ejemplo utiliza dos bucles for anidados para recorrer un arreglo bidimensional. El primer bucle for recorre las filas de la matriz, y el segundo bucle for recorre los elementos de cada fila. Esto permite imprimir todos los elementos de la matriz de forma ordenada.
Figura 5: Diagrama de flujo de un bucle for anidado Fuente: Creación de autor, D. Nicolalde. Figura 5: Diagrama de flujo de un bucle for anidado Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo se utilizan dos bucles for anidados para recorrer un arreglo bidimensional y procesar sus elementos.
En esta clase hemos aprendido cómo trabajar con arreglos unidimensionales en Python, utilizando bucles for para recorrer sus elementos y realizar operaciones con ellos. A lo largo de los ejemplos, vimos cómo aplicar condiciones dentro de los bucles, cómo trabajar con listas de diccionarios, y cómo utilizar bucles anidados para recorrer estructuras más complejas, como arreglos bidimensionales. Los bucles for y el manejo de arreglos son esenciales para trabajar con colecciones de datos de manera eficiente.
En la tabla 1 se detalla otros métodos útiles que se pueden aplicar a las listas unidimensionales en Python, ampliando la variedad de operaciones que los estudiantes pueden realizar en sus arreglos.
Método Descripción Ejemplo de Uso extend() Añade todos los elementos de un iterable al final de la lista. numeros.extend([60, 70]) index() Devuelve el índice del primer elemento que coincide con el valor dado. numeros.index(25) count() Devuelve el número de veces que un valor aparece en la lista. numeros.count(25) sort() Ordena los elementos de la lista en orden ascendente o descendente. numeros.sort(reverse=True) reverse() Invierte el orden de los elementos en la lista. numeros.reverse() Tabla 1: Métodos Adicionales para Manipular Arreglos Unidimensionales Fuente: Creación de autor, D. Nicolalde. Métodoextend()
Añade todos los elementos de un iterable al final de la lista.
Ejemplo: numeros.extend([60, 70])Métodoindex()
Devuelve el índice del primer elemento que coincide con el valor dado.
Ejemplo: numeros.index(25)Métodocount()
Devuelve el número de veces que un valor aparece en la lista.
Ejemplo: numeros.count(25)Métodosort()
Ordena los elementos de la lista en orden ascendente o descendente.
Ejemplo: numeros.sort(reverse=True)Métodoreverse()
Invierte el orden de los elementos en la lista.
Ejemplo: numeros.reverse()La tabla 1 proporciona información sobre otros métodos importantes que pueden ser utilizados en listas. Los métodos como extend(), index(), count(), sort() y reverse() son herramientas clave para manipular las listas de manera más avanzada, permitiendo operaciones adicionales como agregar elementos desde otro iterable, buscar valores específicos, contar repeticiones, y modificar el orden de los elementos.
Aunque en Python las listas son una de las estructuras más comunes, existen otras alternativas para trabajar con colecciones de datos, como los arreglos de la librería NumPy. En la tabla 2 se compara las listas de Python y los arreglos de NumPy en términos de rendimiento y funcionalidad.
Característica Listas en Python Arreglos de NumPy Mutabilidad Sí Sí Soporte de Tipos de Datos Heterogéneo Homogéneo (todos los elementos deben ser del mismo tipo) Operaciones Matemáticas No optimizadas Optimizadas, permitiendo operaciones matemáticas eficientes sobre grandes volúmenes de datos Uso en Cálculos Numéricos Limitado Especialmente diseñado para operaciones numéricas y científicas Velocidad Más lenta para grandes cantidades de datos Mucho más rápido debido a su implementación en C Funcionalidades Avanzadas Básicas (agregar, eliminar, acceder) Funciones matemáticas, estadísticas, álgebra lineal, etc. Tabla 2: Diferencias Entre Listas y Arreglos de NumPy Fuente: Creación de autor, D. Nicolalde. MutabilidadListas en Python: Sí
Arreglos de NumPy: Sí
Soporte de Tipos de DatosListas en Python: Heterogéneo
Arreglos de NumPy: Homogéneo (todos los elementos deben ser del mismo tipo)
Operaciones MatemáticasListas en Python: No optimizadas
Arreglos de NumPy: Optimizadas, permitiendo operaciones matemáticas eficientes sobre grandes volúmenes de datos
Uso en Cálculos NuméricosListas en Python: Limitado
Arreglos de NumPy: Especialmente diseñado para operaciones numéricas y científicas
VelocidadListas en Python: Más lenta para grandes cantidades de datos
Arreglos de NumPy: Mucho más rápido debido a su implementación en C
Funcionalidades AvanzadasListas en Python: Básicas (agregar, eliminar, acceder)
Arreglos de NumPy: Funciones matemáticas, estadísticas, álgebra lineal, etc.
La tabla 2 destaca las diferencias clave entre las listas de Python y los arreglos de NumPy. Las listas son más flexibles, pero menos eficientes para operaciones matemáticas, mientras que los arreglos de NumPy están diseñados para realizar cálculos numéricos y científicos de manera más eficiente, especialmente cuando se trabajan con grandes cantidades de datos. Esto puede ser útil cuando se comienza a explorar bibliotecas de Python para la ciencia de datos y el análisis numérico.
Uso de Break y Continue en un Bucle ForEn la programación, especialmente al trabajar con bucles, es común necesitar más control sobre cómo y cuándo se deben ejecutar las iteraciones. Los comandos break y continue son herramientas esenciales en Python para modificar el flujo de ejecución dentro de un bucle, permitiendo que el programa se comporte de manera más eficiente y flexible. A continuación, exploraremos en detalle cómo funciona cada uno de estos comandos dentro de un bucle for.
Uso de break: Salir del bucle prematuramenteEl comando break permite salir de un bucle antes de que termine todas sus iteraciones. Esto se utiliza cuando se cumple una condición específica y, en ese momento, ya no es necesario seguir ejecutando el bucle. Por ejemplo, si estamos buscando un número en una lista y lo encontramos, no es necesario seguir buscando. Entonces, podemos usar break para detener el bucle inmediatamente. Este comando es útil cuando sabemos que una vez que se cumpla una condición, no hay necesidad de seguir procesando el resto de los elementos. Ejemplo con break:
Código
# Lista de números numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9] # Recorrer la lista con un bucle for for numero in numeros: if numero == 5: break # Detener el bucle cuando el número sea 5 print(numero)
Salida:
Resultado
1
2
3
4
Uso de continue: Omitir la iteración actual y continuar con la siguienteEl comando continue permite saltar la iteración actual del bucle y continuar con la siguiente. Es útil cuando, bajo ciertas condiciones, no queremos ejecutar todo el código dentro del bucle para esa iteración específica. En lugar de detener todo el bucle (como con break), continue solo omite la parte de código que sigue en la iteración actual y pasa a la siguiente iteración del bucle.
Esto se utiliza cuando se necesita saltar ciertos elementos de la secuencia bajo una condición específica. Por ejemplo, si estamos recorriendo una lista de números y queremos omitir los números pares, podemos usar continue para saltarlos y seguir con la siguiente iteración.
Ejemplo con continue:
Código
# Lista de números numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9] # Recorrer la lista con un bucle for for numero in numeros: if numero % 2 == 0: continue # Saltar los números pares print(numero)
Salida:
Resultado
1
3
5
7
9
Ejemplo combinado de break y continue en un bucle for:Código
# Lista de números numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9] # Recorrer la lista con un bucle for for numero in numeros: if numero == 5: break # Detener el bucle cuando el número sea 5 if numero % 2 == 0: continue # Saltar los números pares print(numero)
Salida:
Resultado
1
3En este caso, el bucle se detiene cuando encuentra el número 5, debido al break, y omite los números pares debido al continue.
Aprende más
En este vídeo se muestran ejemplos de arreglos unidimensionales ¡Accede aquí!
Profundiza más
Este recurso te ayudará a enfatizar sobre Estructuras de Control en Conjunto y Arreglos ¡Accede aquí!
-
-
-
Actividades
-
Hacer intentos: 1
-
-
-
Introducción
En la clase 12, nos adentramos en el estudio de los arreglos multidimensionales y los métodos más comunes que se utilizan para manipular y gestionar listas en Python. Los arreglos multidimensionales, comúnmente conocidos como matrices, son estructuras de datos esenciales en programación que permiten organizar datos en múltiples dimensiones, representados en filas y columnas. En esta clase, aprenderemos cómo crear y manipular matrices bidimensionales utilizando listas de listas en Python. Además, exploraremos cómo trabajar con estos arreglos para realizar operaciones matemáticas y organizar datos de manera eficiente. Esta parte del curso es crucial para abordar problemas más complejos, como el procesamiento de imágenes o el análisis de datos, donde la organización tabular de la información es fundamental.
A lo largo de esta clase, también profundizaremos en los métodos comunes que Python proporciona para modificar, ordenar y gestionar listas. Herramientas como append(), remove(), sort(), reverse(), y extend() serán fundamentales para aprender a manejar y optimizar el trabajo con listas. Estas funciones son esenciales para realizar operaciones eficientes sobre las listas y mejorar la estructura de nuestros programas. Además, veremos cómo aplicar estos métodos en situaciones prácticas, como filtrar, modificar y organizar los datos dentro de las listas, lo que permite a los estudiantes trabajar de manera más ágil y precisa en la manipulación de colecciones de datos.
-
12.1. Arreglos multidimensionales (matrices).
Los arreglos multidimensionales son estructuras de datos avanzadas que nos permiten almacenar y organizar información en más de una dimensión. En términos simples, los arreglos unidimensionales son como una lista lineal, mientras que los arreglos multidimensionales permiten representar datos en una forma de tabla, como una matriz. En programación, las matrices son esenciales para representar datos organizados en filas y columnas, lo que es fundamental para resolver muchos problemas en áreas como álgebra, análisis de datos, procesamiento de imágenes, simulaciones científicas, entre otros.
¿Qué es una Matriz?
Una matriz es una estructura bidimensional que consta de filas y columnas, donde cada posición o elemento se define por dos índices: uno para la fila y otro para la columna. En términos más generales, una matriz puede tener más de dos dimensiones, pero en este caso, nos centramos en matrices bidimensionales, es decir, matrices que tienen dos dimensiones: una que corresponde a las filas y otra que corresponde a las columnas.
Por ejemplo, si tenemos una matriz de 2x3 (dos filas y tres columnas), se vería algo como esto:
Código
Matriz 2x3: 1 2 3 4 5 6
Cada número en la matriz tiene dos índices: uno para la fila y otro para la columna. El elemento 1 se encuentra en la fila 0, columna 0 (índice [0][0]), el elemento 5 se encuentra en la fila 1, columna 1 (índice [1][1]), y así sucesivamente.
Cómo Representar y Crear Matrices en PythonEn Python, las matrices se representan utilizando listas de listas. Es decir, se crea una lista principal que contiene otras listas, y cada lista interna representa una fila de la matriz. Los elementos dentro de cada lista son las columnas de la matriz. Este enfoque es sencillo y flexible, aunque en algunos contextos más avanzados, como en cálculos científicos, se utilizan bibliotecas como NumPy para trabajar con matrices de manera más eficiente.
Figura 1: Diagrama de flujo de una matriz bidimensional Fuente: Creación de autor, D. Nicolalde. Figura 1: Diagrama de flujo de una matriz bidimensional Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama ilustra cómo se organiza una matriz de dos dimensiones, con filas y columnas, y cómo acceder a un elemento utilizando dos índices: uno para la fila y otro para la columna.
Sintaxis de Arreglos MultidimensionalesEn Python, para crear una matriz de dos dimensiones (una lista de listas), podemos hacer lo siguiente:
Código
# Matriz 2x3 (2 filas y 3 columnas) matriz = [[1, 2, 3], [4, 5, 6]]
En este ejemplo:
- La lista matriz es la matriz principal que contiene dos listas internas.
- La primera lista interna [1, 2, 3] representa la primera fila de la matriz.
- La segunda lista interna [4, 5, 6] representa la segunda fila de la matriz.
- Cada número dentro de las listas internas representa un elemento de la matriz en una columna correspondiente.
Figura 2: Acceso a elementos de una matriz Fuente: Creación de autor, D. Nicolalde. Figura 2: Acceso a elementos de una matriz Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo se accede a los elementos de una matriz bidimensional utilizando dos índices: uno para las filas y otro para las columnas.
Ejemplo: Matriz 2x3Imaginemos que tenemos la siguiente matriz que representa las calificaciones de los estudiantes en tres exámenes:
Código
Matriz de calificaciones (2x3): 90 85 78 88 92 80
En Python, representamos esta matriz como:
Resultado
calificaciones = [[90, 85, 78], [88, 92, 80]]
Características y Usos de las Matrices:Las matrices se utilizan comúnmente para representar datos que tienen una estructura tabular, como:
- Datos numéricos: Las matrices se utilizan para almacenar y manipular datos numéricos en muchas aplicaciones científicas, como álgebra lineal, procesamiento de imágenes, y más.
- Tablas de datos: Las matrices pueden ser una representación útil de tablas de datos, donde cada fila es una entrada y cada columna es un atributo o característica de esos datos.
- Cálculos matemáticos: En matemáticas, las matrices se usan para resolver ecuaciones lineales y sistemas de ecuaciones, y son fundamentales para la implementación de algoritmos como la multiplicación de matrices, determinantes y más.
Acceso a los Elementos de una Matriz:Para acceder a los elementos de una matriz en Python, se utilizan dos índices: uno para la fila y otro para la columna. La sintaxis para acceder a un elemento es la siguiente:
Código
matriz[fila][columna]
Donde:
- fila es el índice de la fila que deseas acceder (comienza desde 0).
- columna es el índice de la columna que deseas acceder (también comienza desde 0).
Por ejemplo, para acceder al elemento en la primera fila y segunda columna (el valor 2 en el ejemplo anterior), usamos:
Ejemplo de acceso y modificación a Elementos de una MatrizCódigo
# Matriz 2x3 matriz = [[1, 2, 3], [4, 5, 6]] # Acceder al elemento en la primera fila y segunda columna print(matriz[0][1]) # Imprime 2
Explicación:
- matriz[0][1]: Accede al primer elemento de la primera fila (1) y luego accede al segundo elemento de la primera fila (2).
- Los índices empiezan en 0, lo que significa que matriz[0] se refiere a la primera fila y matriz[0][1] a la segunda columna de esa fila.
Para modificar un elemento de la matriz, simplemente asignas un nuevo valor al índice deseado:
Código
# Matriz 2x3 matriz = [[1, 2, 3], [4, 5, 6]] matriz [0][1] = 20 # Acceder al elemento en la primera fila y segunda columna print(matriz[0][1]) # Imprime 20
Operaciones Comunes con Matrices:Las matrices son útiles para realizar diversas operaciones, como:
- Suma de matrices: Para sumar matrices, ambas matrices deben tener las mismas dimensiones. Se suman los elementos correspondientes de cada posición de las matrices.
- Multiplicación de matrices: Para multiplicar matrices, el número de columnas de la primera matriz debe ser igual al número de filas de la segunda matriz. La multiplicación se realiza combinando las filas de la primera matriz con las columnas de la segunda.
- Transposición de matrices: La transposición de una matriz consiste en intercambiar las filas y las columnas de la matriz.
Aprende más
Este video ofrece una introducción clara y concisa sobre qué son las matrices en programación ¡Accede aquí!
-
12.2. Métodos comunes de arreglos (ej: append(), sort() en Python).
En Python, los arreglos (listas) vienen con una variedad de métodos incorporados que permiten manipularlos de manera eficiente. Estos métodos son esenciales para modificar, ordenar y gestionar los elementos de las listas. A continuación, profundizaremos en algunos de los métodos más útiles como append(), remove(), sort(), entre otros.
Figura 3: Diagrama de flujo de append() Fuente: Creación de autor, D. Nicolalde. Figura 3: Diagrama de flujo de append() Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo el método append() agrega un nuevo elemento al final de una lista existente.
Ejemplo de Uso de append()Código
# Crear una lista numeros = [1, 2, 3] # Agregar un nuevo número al final de la lista numeros.append(4) # Imprimir la lista print(numeros) # Imprime [1, 2, 3, 4]
Explicación:
- append(4): Añade el número 4 al final de la lista numeros.
- El método append() es simple y eficiente cuando necesitamos agregar un solo elemento a una lista sin necesidad de especificar la posición exacta.
Figura 4: Diagrama de flujo de sort() Fuente: Creación de autor, D. Nicolalde. Figura 4: Diagrama de flujo de sort() Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo el método sort() ordena los elementos de una lista en orden ascendente.
Ejemplo de Uso de sort()Código
# Crear una lista desordenada numeros = [5, 3, 8, 1, 4] # Ordenar la lista numeros.sort() # Imprimir la lista ordenada print(numeros) # Imprime [1, 3, 4, 5, 8]
Explicación
- sort(): Ordena los elementos de la lista numeros en orden ascendente.
- Este método es muy útil para organizar los elementos de una lista, ya sea para visualización, búsqueda o procesamiento.
Ejemplo: Filtrar y Modificar Elementos en una ListaSupongamos que tenemos una lista de números, y queremos:
- Agregar algunos números nuevos.
- Ordenar la lista.
- Eliminar los números impares.
- Imprimir solo los números pares.
Código
# Lista de números numeros = [10, 15, 20, 25, 30] # Agregar más números usando append numeros.append(35) numeros.append(40) # Ordenar la lista numeros.sort() # Eliminar los números impares usando un bucle numeros_pares = [] for numero in numeros: if numero % 2 == 0: numeros_pares.append(numero) # Imprimir los números pares print(numeros_pares) # Imprime [10, 20, 30, 40]
Salida:
Resultado
[10, 20, 30, 40] Explicación:
- append(): Se añaden los números 35 y 40 al final de la lista.
- sort(): La lista se ordena en orden ascendente.
- for: El bucle recorre la lista y solo agrega los números pares a una nueva lista numeros_pares.
- Filtrado de pares: En este caso, solo los números que son divisibles por 2 son agregados a la lista final.
Ejemplo de Uso de reverse()Código
# Crear una lista de números numeros = [1, 2, 3, 4, 5] # Invertir el orden de la lista numeros.reverse() # Imprimir la lista invertida print(numeros) # Imprime [5, 4, 3, 2, 1]
Explicación:
- reverse(): Este método invierte la lista in situ, es decir, modifica la lista original. En este caso, la lista numeros pasa de ser [1, 2, 3, 4, 5] a [5, 4, 3, 2, 1].
- No se necesita crear una nueva lista para la inversión; el método opera directamente sobre la lista existente.
- Este método es particularmente útil en situaciones donde se necesita trabajar con los datos en orden inverso, por ejemplo, cuando se está procesando una secuencia de datos en reversa, como una pila.
Figura 5: Diagrama de flujo de reverse() Fuente: Creación de autor, D. Nicolalde. Figura 5: Diagrama de flujo de reverse() Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo el método reverse() invierte el orden de los elementos de una lista.
Ejemplo de Bucle Anidado con range() para Recorrer una MatrizCódigo
# Crear una matriz 3x3 (lista de listas) matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # Recorrer la matriz con bucles anidados for i in range(len(matriz)): # Bucle para filas for j in range(len(matriz[i])): # Bucle para columnas print(f"Elemento en posición ({i},{j}): {matriz[i][j]}")
Explicación:
- range(len(matriz)): El primer bucle itera sobre las filas de la matriz (en este caso, 3 filas).
- range(len(matriz[i])): El segundo bucle itera sobre los elementos dentro de cada fila.
- matriz[i][j]: Accede al elemento en la fila i y columna j de la matriz. Cada vez que los bucles se ejecutan, se imprime el elemento de la posición actual.
Salida:
Resultado
Elemento en posición (0,0): 1
Elemento en posición (0,1): 2
Elemento en posición (0,2): 3
Elemento en posición (1,0): 4
Elemento en posición (1,1): 5
Elemento en posición (1,2): 6
Elemento en posición (2,0): 7
Elemento en posición (2,1): 8
Elemento en posición (2,2): 9
Figura 6: Diagrama de flujo de bucles anidados con range() Fuente: Creación de autor, D. Nicolalde. Figura 6: Diagrama de flujo de bucles anidados con range() Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo se utilizan bucles anidados junto con range() para recorrer listas dentro de listas (estructuras bidimensionales).
Aprende más
En Python, las listas son una estructura de datos muy versátil y poderosa que permite almacenar y manipular colecciones de elementos. ¡Accede aquí!
Ejemplo completoEn este ejemplo, vamos a crear un programa que maneje el inventario de una tienda. El sistema permitirá ingresar productos con su nombre, cantidad en stock y precio. Luego, se mostrará el inventario completo, y se ofrecerá la opción de filtrar los productos según su cantidad (si están disponibles o no) o agregar nuevos productos.
Código
# Inventario inicial: lista de diccionarios inventario = [ {'producto': 'Camiseta', 'cantidad': 10, 'precio': 15.5}, {'producto': 'Pantalón', 'cantidad': 5, 'precio': 25.0}, {'producto': 'Zapatos', 'cantidad': 0, 'precio': 40.0} ] # Función para agregar un producto al inventario def agregar_producto(nombre, cantidad, precio): inventario.append({'producto': nombre, 'cantidad': cantidad, 'precio': precio}) # Menú interactivo para gestionar el inventario while True: print("\n1. Ver inventario") print("2. Agregar producto") print("3. Filtrar productos con stock") print("4. Salir") opcion = input("Seleccione una opción: ") if opcion == "1": # Mostrar inventario completo for producto in inventario: print(f"{producto['producto']}: {producto['cantidad']} en stock, Precio: ${producto['precio']}") elif opcion == "2": # Ingresar un nuevo producto nombre = input("Ingrese el nombre del producto: ") cantidad = int(input("Ingrese la cantidad de productos: ")) precio = float(input("Ingrese el precio del producto: ")) agregar_producto(nombre, cantidad, precio) elif opcion == "3": # Filtrar productos con stock disponible print("\nProductos con stock disponible:") for producto in inventario: if producto['cantidad'] > 0: print(f"{producto['producto']} - {producto['cantidad']} en stock") else: print(f"{producto['producto']} - Agotado") elif opcion == "4": print("Gracias por usar el sistema de gestión de inventario.") break else: print("Opción no válida. Intente nuevamente.")
Explicación
- Inventario: Se crea una lista de diccionarios que representa el inventario de productos. Cada diccionario tiene el nombre del producto, la cantidad disponible y el precio.
- Bucle while: Permite al usuario interactuar con el sistema repetidamente hasta que decida salir.
- append(): Utilizado para agregar nuevos productos al inventario.
- Bucle for: Se utiliza para recorrer el inventario y mostrar los productos.
- if y else: Se utilizan para realizar decisiones, como mostrar los productos con stock o los productos agotados.
- continue: Si se ingresa una opción no válida, el bucle continúa sin interrumpir el flujo del programa.
- break: Permite salir del bucle while cuando el usuario selecciona la opción de salir.
Salida
Resultado
1. Ver inventario
2. Agregar producto
3. Filtrar productos con stock
4. Salir
Seleccione una opción: 1
Camiseta: 10 en stock, Precio: $15.5
Pantalón: 5 en stock, Precio: $25.0
Zapatos: 0 en stock, Precio: $40.0Este ejemplo final utiliza una combinación de las estructuras y métodos que aprendimos a lo largo de las clases, incluyendo el uso de listas, bucles, condiciones, y manejo de entradas del usuario. Los estudiantes ahora pueden comprender cómo trabajar con listas y bucles para crear programas interactivos más complejos y eficientes.
Los métodos mostrados en la tabla 1 son esenciales para manejar y manipular listas en Python. A continuación, se explica cada uno de ellos en detalle:
Método Descripción Ejemplo de Uso append() Agrega un elemento al final de la lista. numeros.append(6) remove() Elimina la primera aparición del valor especificado. numeros.remove(3) sort() Ordena los elementos de la lista. numeros.sort() reverse() Invierte el orden de los elementos de la lista. numeros.reverse() extend() Agrega los elementos de otra lista al final de la lista original. numeros.extend([7, 8]) Tabla 1: Métodos Comunes de las Listas en Python append()Descripción: Agrega un elemento al final de la lista.
Ejemplo: numeros.append(6)
remove()Descripción: Elimina la primera aparición del valor especificado.
Ejemplo: numeros.remove(3)
sort()Descripción: Ordena los elementos de la lista.
Ejemplo: numeros.sort()
reverse()Descripción: Invierte el orden de los elementos de la lista.
Ejemplo: numeros.reverse()
extend()Descripción: Agrega los elementos de otra lista al final de la lista original.
Ejemplo: numeros.extend([7, 8])
La tabla 1 resume los métodos más comunes de las listas en Python y sus ejemplos de uso, lo que permite a los estudiantes manipular y gestionar listas de manera más eficiente.
En la tabla 2 se compara dos de los métodos más utilizados para agregar elementos a una lista en Python: append() y extend(). A continuación, se detallan sus diferencias clave y cómo elegir cuál usar según las necesidades del programa.
Característica append() extend() Funcionalidad Agrega un solo elemento al final de la lista. Agrega todos los elementos de un iterable al final de la lista. Modificación Modifica la lista original agregando un solo elemento. Modifica la lista original agregando múltiples elementos. Uso típico Para agregar un solo elemento (número, cadena, etc.). Para agregar varios elementos de otro iterable. Tabla 2: Diferencias entre append() y extend() append()Funcionalidad: Agrega un solo elemento al final de la lista.
Modificación: Modifica la lista original agregando un solo elemento.
Uso típico: Para agregar un solo elemento (número, cadena, etc.).
extend()Funcionalidad: Agrega todos los elementos de un iterable al final de la lista.
Modificación: Modifica la lista original agregando múltiples elementos.
Uso típico: Para agregar varios elementos de otro iterable.
La tabla 2 muestra la diferencia entre los métodos append() y extend(). append() es útil cuando se quiere agregar un solo elemento al final de una lista, mientras que extend() se utiliza para agregar varios elementos de otro iterable.
Profundiza más
Este recurso te ayudará a enfatizar sobre (TEMA) ¡Accede aquí!
-
-
-
Actividades
-
Hacer intentos: 1
-
-
-
RETO 4: Persistencia de Datos (Manejo de Archivos)
Objetivo: Guardar y recuperar el historial de operaciones en un archivo de texto.
Indicaciones:
- Guardar historial:
- Usar open() en modo "a" (append) para añadir cada operación al archivo historial.txt.
- Recuperar historial:
- Leer el archivo y mostrar su contenido al usuario si así lo solicita.
- Formato del archivo:
- Almacenar cada operación con formato claro (ej: 2024-10-05 14:30: 5 + 3 = 8).
Actividades
- Guardar resultados en un archivo .txt.
- Recuperar y mostrar historial de operaciones.
- Integrar y depurar todas las funcionalidades.
-
Introducción
En la clase 13, nos enfocamos en dos componentes fundamentales para el diseño de programas más complejos y eficientes en Python: las funciones y el alcance de las variables. Las funciones, como bloques reutilizables de código, permiten organizar programas al descomponer tareas grandes y complejas en tareas más pequeñas y manejables. Además, las funciones aceptan parámetros que permiten que el código interactúe con el resto del programa, y utilizan return para devolver resultados procesados. A lo largo de esta clase, los estudiantes aprenderán a definir, utilizar y modificar funciones, con ejemplos que incluyen la definición de parámetros y el uso del retorno de valores. El conocimiento de las funciones es esencial para modularizar código y hacerlo más eficiente y legible.
El segundo tema crucial que abordamos es el alcance de las variables, que determina el contexto en el que una variable puede ser utilizada dentro de un programa. En particular, profundizamos en las diferencias entre variables locales y variables globales, y cómo se gestionan en Python. Las variables locales son accesibles solo dentro de la función en la que se definen, mientras que las globales pueden ser accesibles en cualquier parte del programa. Aprenderemos cómo manejar estos alcances correctamente y cuándo es apropiado usar variables locales y globales. Estos conceptos son esenciales para evitar conflictos y mejorar la claridad y robustez de nuestros programas.
-
13.1. Funciones: definición, parámetros y retorno.¿Qué es una Función?
En programación, una función es un bloque de código que agrupa un conjunto de instrucciones que se pueden ejecutar de forma repetida y reutilizable. Su objetivo principal es llevar a cabo una tarea específica, y se pueden utilizar tantas veces como sea necesario, sin tener que escribir el mismo código una y otra vez. Este concepto es crucial para la organización y simplificación de los programas, ya que permite dividir un programa complejo en pequeñas unidades de trabajo llamadas funciones, cada una encargada de realizar una tarea específica.
Una de las grandes ventajas de las funciones es que permiten modularizar el código, haciendo que sea más fácil de leer, mantener y depurar. Las funciones también ayudan a evitar la duplicación de código, lo que mejora la eficiencia y la claridad en los programas.
En Python, las funciones pueden aceptar parámetros como entradas, lo que les permite recibir valores desde el exterior, y pueden devolver un resultado utilizando la palabra clave return. Al hacer esto, las funciones no solo realizan una acción, sino que también pueden interactuar con el resto del programa, entregando resultados que pueden ser utilizados en otras partes del código.
Sintaxis Básica de una Función en PythonLa sintaxis básica para definir una función en Python es bastante sencilla y se compone de los siguientes componentes:
Código
def nombre_funcion(parametro1, parametro2): # Código a ejecutar return resultado
- def es la palabra clave que indica que estamos definiendo una función.
- nombre_funcion es el nombre que le damos a la función, y debe seguir las reglas estándar de los identificadores en Python.
- parametro1, parametro2, ... son los parámetros que la función acepta. Son valores que se pasan a la función cuando se llama.
- return es utilizado para devolver un valor desde la función al programa principal.
Código
def suma(a, b): return a + b resultado = suma(5, 3) print(resultado) # Imprime 8
- Definición de la función:
- La función suma se define con def, y toma dos parámetros a y b.
- Dentro de la función, la operación a + b se realiza y el resultado se retorna con return.
- Llamada de la función:
- Cuando llamamos suma(5, 3), los valores 5 y 3 son pasados como parámetros a la función.
- El resultado de la suma de 5 y 3 es 8, y ese valor es retornado por la función.
- Uso de return:
- La palabra clave return envía el resultado fuera de la función, permitiendo que el valor sea capturado en la variable resultado para su uso posterior.
Parámetros de una Función: Entradas a la FunciónLos parámetros son los valores que las funciones reciben para realizar sus operaciones. En el ejemplo anterior, los parámetros son a y b en la función suma. Los parámetros pueden ser cualquier tipo de dato válido en Python (números, cadenas, listas, etc.).
Tipos de Parámetros:- Parámetros Posicionales: Son los parámetros más comunes. Los valores se asignan a los parámetros de la función según el orden en que se pasan.
Ejemplo:
Código
def saludar(nombre, edad): print(f"Hola, {nombre}. Tienes {edad} años.") saludar("Juan", 25) # Imprime: Hola, Juan. Tienes 25 años.
- Parámetros con Valores Predeterminados: Los parámetros pueden tener valores predeterminados. Si no se pasa un valor al llamar a la función, se usará el valor predeterminado.
Ejemplo:
Código
def saludar(nombre="Estudiante"): print(f"Hola, {nombre}.") saludar() # Imprime: Hola, Estudiante. saludar("Carlos") # Imprime: Hola, Carlos.
- Parámetros Variables (Argumentos Arbitrarios): Usamos *args para permitir que una función reciba un número variable de argumentos posicionales.
Ejemplo:
Código
def sumar_todos(*numeros): return sum(numeros) print(sumar_todos(1, 2, 3, 4)) # Imprime 10
El Uso de return: Retorno de ResultadosLa palabra clave return es esencial porque permite que la función devuelva un valor al código que la llamó. Sin return, la función simplemente ejecutará su código sin enviar nada de vuelta al resto del programa.
Ejemplo de Función con return:
Código
def multiplicar(a, b): return a * b resultado = multiplicar(4, 3) print(resultado) # Imprime 12
En este ejemplo:
- La función multiplicar toma dos parámetros, a y b, y retorna el producto de estos dos.
- El valor retornado por la función se almacena en la variable resultado y se imprime.
Figura 1: Diagrama de flujo para una función básica Fuente: Creación de autor, D. Nicolalde. Figura 1: Diagrama de flujo para una función básica Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo el flujo de ejecución se mueve hacia una función, recibe parámetros y retorna un valor.
Aprende más
: Descubre qué son las funciones y por qué son esenciales en Python. ¡Accede aquí!
-
13.2. Alcance de variables (globales vs. locales).
En programación, el alcance de una variable hace referencia a la parte del programa donde esa variable puede ser utilizada. Existen dos tipos de alcance principales para las variables: local y global. La distinción entre estas dos es fundamental para el diseño y la correcta funcionalidad de los programas, ya que influye en la accesibilidad, manipulación y gestión de los datos dentro del código.
En Python, las variables pueden ser locales, globales o no locales, dependiendo de dónde se definen y cómo se accede a ellas.
Variables LocalesLas variables locales son aquellas que se definen dentro de una función y solo son accesibles dentro de esa función. Esto significa que su existencia está limitada al bloque de código donde fueron creadas. Una vez que la función termina su ejecución, las variables locales dejan de existir.
Definición y Acceso de Variables LocalesEn el siguiente ejemplo, la variable x se define dentro de la función ejemplo_local(), por lo que solo puede ser utilizada dentro de esa función:
Código
def ejemplo_local(): x = 10 # Variable local print(x) ejemplo_local() # Imprime 10 # print(x) # Esto causaría un error, ya que x es local
- La variable x es local a la función ejemplo_local().
- Dentro de la función, podemos acceder y modificar x sin problemas.
- Sin embargo, si tratamos de acceder a x fuera de la función, como en el comentario de la línea siguiente (print(x) fuera de la función), Python lanzará un error NameError, porque x no existe fuera del alcance de la función.
Este concepto de alcance local es importante para evitar conflictos entre variables, ya que no se pueden sobrescribir ni alterar desde otras partes del programa.
Características de las Variables Locales- Accesibilidad limitada: Solo son accesibles dentro de la función donde se definieron.
- Duración de vida: Existen únicamente durante la ejecución de la función. Una vez que la función termina, la variable local se destruye.
- Evitan conflictos: Dado que las variables locales no afectan a otras partes del programa, no hay riesgo de que se sobrescriban accidentalmente.
Figura 2: Diagrama de flujo de variable local Fuente: Creación de autor, D. Nicolalde. Figura 2: Diagrama de flujo de variable local Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo las variables locales solo están accesibles dentro de su función respectiva.
Variables GlobalesLas variables globales son aquellas que se definen fuera de todas las funciones, generalmente al principio del programa. A diferencia de las variables locales, las variables globales son accesibles desde cualquier parte del código, incluyendo dentro de las funciones.
Definición y Acceso de Variables GlobalesEn el siguiente ejemplo, la variable x es global, ya que está definida fuera de cualquier función. Esto permite que pueda ser accedida y modificada tanto dentro como fuera de las funciones:
Código
x = 10 # Variable global def ejemplo_global(): print(x) # Accede a la variable global x ejemplo_global() # Imprime 10 print(x) # Imprime 10 fuera de la función
- La variable x se define fuera de cualquier función, por lo que se considera una variable global.
- Dentro de la función ejemplo_global(), podemos acceder a x sin problemas y la función imprime su valor correctamente.
- Además, fuera de la función, podemos seguir accediendo a x, ya que la variable global sigue existiendo en el programa.
Características de las Variables Globales- Accesibilidad global: Son accesibles desde cualquier parte del programa, tanto dentro como fuera de las funciones.
- Duración de vida: Existen durante toda la ejecución del programa, desde el inicio hasta el final.
- Pueden ser modificadas dentro de las funciones: Si se desea modificar una variable global dentro de una función, se debe utilizar la palabra clave global.
Figura 3: Diagrama de flujo de variable global Fuente: Creación de autor, D. Nicolalde. Figura 3: Diagrama de flujo de variable global Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo las variables globales pueden ser accedidas desde cualquier parte del código, incluyendo dentro de funciones.
Modificación de Variables Globales Dentro de una FunciónPara modificar una variable global dentro de una función, es necesario usar la palabra clave global. Esto le dice a Python que la variable que se está utilizando dentro de la función debe referirse a la variable global, no a una variable local.
Código
x = 10 # Variable global def modificar_global(): global x # Indica que queremos modificar la variable global x x = 20 # Cambia el valor de x modificar_global() print(x) # Imprime 20
- La variable x es global y su valor inicial es 10.
- Dentro de la función modificar_global(), usamos la palabra clave global para referirnos a la variable global x.
- La asignación x = 20 cambia el valor de la variable global a 20.
- Al imprimir x después de llamar a la función, veremos que su valor ha cambiado a 20.
Recomendaciones para el Uso de Variables Locales y Globales- Uso preferido de variables locales: Siempre que sea posible, utiliza variables locales para evitar problemas de modificación no deseada de datos en otras partes del programa.
- Evita el uso excesivo de variables globales: El uso de variables globales puede hacer que el programa sea difícil de depurar, ya que las variables pueden ser modificadas en múltiples lugares, lo que puede causar efectos secundarios difíciles de rastrear.
- Uso de global con precaución: Si necesitas modificar una variable global dentro de una función, usa la palabra clave global con cuidado y asegúrate de que la lógica del programa justifique la necesidad de hacerlo.
Ejemplo: Función con Listas y Variables GlobalesCódigo
# Lista global nombres = ["Juan", "Ana", "Luis"] def agregar_nombre(nombre): global nombres nombres.append(nombre) # Agrega un nuevo nombre agregar_nombre("Marta") print(nombres) # Imprime ['Juan', 'Ana', 'Luis', 'Marta']
- Definimos la lista global nombres y la función agregar_nombre para añadir nombres a la lista. Usamos global para modificar la lista.
Figura 4: Diagrama de flujo de modificación de variables globales dentro de funciones Fuente: Creación de autor, D. Nicolalde. Nombre_de_la_figura
Descripción: Este diagrama muestra cómo modificar variables globales dentro de funciones usando la palabra clave global.
Ejemplo: Sistema de Cálculo de Promedios con FuncionesCódigo
# Función para calcular el promedio def calcular_promedio(calificaciones): return sum(calificaciones) / len(calificaciones) # Función para clasificar a los estudiantes def clasificar_estudiante(nombre, calificaciones): promedio = calcular_promedio(calificaciones) if promedio >= 9: estado = "Excelente" elif promedio >= 6: estado = "Aprobado" else: estado = "Reprobado" return nombre, promedio, estado # Procesar varios estudiantes def procesar_estudiantes(): estudiantes = { "Juan": [8, 7, 6, 9], "Ana": [9, 10, 8, 9], "Luis": [5, 4, 6, 4] } for nombre, calificaciones in estudiantes.items(): estudiante, promedio, estado = clasificar_estudiante(nombre, calificaciones) print(f"{estudiante}: Promedio = {promedio:.2f}, Estado = {estado}") procesar_estudiantes()
- calcular_promedio calcula el promedio de las calificaciones.
- clasificar_estudiante determina si el estudiante está "Excelente", "Aprobado" o "Reprobado".
- procesar_estudiantes maneja varios estudiantes y muestra su clasificación.
Figura 5: Diagrama de flujo para el cálculo de promedios Fuente: Creación de autor, D. Nicolalde. Figura 5: Diagrama de flujo para el cálculo de promedios Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo las funciones se conectan para calcular el promedio y clasificar a los estudiantes.
Ejemplo: Sistema de Inventario con Funciones y ArreglosCódigo
# Inventario inicial inventario = [ {"producto": "Camiseta", "cantidad": 10, "precio": 15.5}, {"producto": "Pantalón", "cantidad": 5, "precio": 25.0}, {"producto": "Zapatos", "cantidad": 0, "precio": 40.0} ] # Función para agregar productos def agregar_producto(nombre, cantidad, precio): inventario.append({"producto": nombre, "cantidad": cantidad, "precio": precio}) # Función para mostrar el inventario def mostrar_inventario(): for producto in inventario: print(f"Producto: {producto['producto']}, Cantidad: {producto['cantidad']}, Precio: {producto['precio']}") # Función para vender productos def vender_producto(nombre, cantidad): for producto in inventario: if producto["producto"] == nombre and producto["cantidad"] >= cantidad: producto["cantidad"] -= cantidad print(f"Se vendieron {cantidad} {nombre}(s).") return print(f"No hay suficiente stock de {nombre}.") # Ejemplo de uso mostrar_inventario() agregar_producto("Chaqueta", 3, 35.0) vender_producto("Camiseta", 2) mostrar_inventario()
- El inventario está compuesto por una lista de diccionarios donde cada producto tiene un nombre, cantidad y precio.
- La función agregar_producto añade productos nuevos al inventario.
- mostrar_inventario imprime el inventario completo.
- vender_producto disminuye la cantidad de un producto cuando se vende.
Figura 6: Diagrama de flujo para el manejo del inventario Fuente: Creación de autor, D. Nicolalde. Figura 6: Diagrama de flujo para el manejo del inventario Fuente: Creación de autor, D. Nicolalde.
Aprende más
En el video te explico cómo es que funcionan las variables locales y globales dentro de las funciones ¡Accede aquí!
La tabla 1 resume los aspectos más importantes de las funciones en Python, como su definición, los parámetros que pueden recibir y cómo retornan valores. También se mencionan ejemplos básicos de su uso.
Concepto Descripción Ejemplo de Uso Definición Una función es un bloque de código reutilizable que realiza una tarea específica. def saludar(nombre):
print(f"Hola, {nombre}!")Parámetros Son valores que se pasan a la función cuando es llamada. Se definen entre los paréntesis al crear la función. def sumar(a, b):
return a + bRetorno El valor que la función devuelve después de ejecutar su tarea. Se especifica con la palabra clave return. def multiplicar(a, b):
return a * bFunción con parámetros opcionales Los parámetros pueden tener valores predeterminados si no se pasan al llamar la función. def saludar(nombre="Estudiante"):
print(f"Hola, {nombre}!")Ámbito Local Las variables definidas dentro de la función solo son accesibles dentro de ella. def mostrar_mensaje():
mensaje = "Hola"
print(mensaje)Ámbito Global Las variables definidas fuera de las funciones son accesibles desde cualquier parte del código, incluyendo dentro de las funciones si se usan correctamente. mensaje = "Hola Mundo"
def mostrar_mensaje():
print(mensaje)Tabla 1: Funciones en Python - Definición, Parámetros y Retorno Fuente: Creación de autor, D. Nicolalde. DefiniciónUna función es un bloque de código reutilizable que realiza una tarea específica.
def saludar(nombre):
print(f"Hola, {nombre}!")ParámetrosSon valores que se pasan a la función cuando es llamada. Se definen entre los paréntesis al crear la función.
def sumar(a, b):
return a + bRetornoEl valor que la función devuelve después de ejecutar su tarea. Se especifica con la palabra clave return.
def multiplicar(a, b):
return a * bFunción con parámetros opcionalesLos parámetros pueden tener valores predeterminados si no se pasan al llamar la función.
def saludar(nombre="Estudiante"):
print(f"Hola, {nombre}!")Ámbito LocalLas variables definidas dentro de la función solo son accesibles dentro de ella.
def mostrar_mensaje():
mensaje = "Hola"
print(mensaje)Ámbito GlobalLas variables definidas fuera de las funciones son accesibles desde cualquier parte del código, incluyendo dentro de las funciones si se usan correctamente.
mensaje = "Hola Mundo"
def mostrar_mensaje():
print(mensaje)
La tabla 2 compara las diferencias entre las variables locales y globales en Python, mostrando cómo se definen y cómo se accede a ellas, además de los casos donde se pueden modificar.
Tipo de Variable Descripción Ejemplo de Uso Variables Locales Son variables definidas dentro de una función y solo accesibles dentro de ella. python
def mi_funcion():
x = 10
print(x)
mi_funcion() # Imprime 10Variables Globales Son variables definidas fuera de las funciones y pueden ser accedidas desde cualquier parte del código. x = 20
def mi_funcion():
print(x)
mi_funcion() # Imprime 20Acceso a Variables Locales Solo pueden ser utilizadas dentro de la función donde fueron declaradas. def suma():
x = 5
print(x)
suma() # Accede a x solo dentro de suma()Acceso a Variables Globales Las variables globales pueden ser modificadas dentro de una función si se usa la palabra clave global. x = 10
def modificar():
global x
x = 20
modificar()
print(x) # Imprime 20Modificación de Variables Locales Para cambiar una variable local se asigna un nuevo valor dentro de la función. def mi_funcion():
x = 5
x = x + 2
print(x)
mi_funcion() # Imprime 7Modificación de Variables Globales Si se quiere modificar una variable global dentro de una función, se utiliza global. x = 5
def mi_funcion():
global x
x = 10
mi_funcion()
print(x) # Imprime 10Tabla 2: Alcance de Variables: Locales vs. Globales Fuente: Creación de autor, D. Nicolalde. Variables LocalesSon variables definidas dentro de una función y solo accesibles dentro de ella.
python
def mi_funcion():
x = 10
print(x)
mi_funcion() # Imprime 10Variables GlobalesSon variables definidas fuera de las funciones y pueden ser accedidas desde cualquier parte del código.
x = 20
def mi_funcion():
print(x)
mi_funcion() # Imprime 20Acceso a Variables LocalesSolo pueden ser utilizadas dentro de la función donde fueron declaradas.
def suma():
x = 5
print(x)
suma() # Accede a x solo dentro de suma()Acceso a Variables GlobalesLas variables globales pueden ser modificadas dentro de una función si se usa la palabra clave global.
x = 10
def modificar():
global x
x = 20
modificar()
print(x) # Imprime 20Modificación de Variables LocalesPara cambiar una variable local se asigna un nuevo valor dentro de la función.
def mi_funcion():
x = 5
x = x + 2
print(x)
mi_funcion() # Imprime 7Modificación de Variables GlobalesSi se quiere modificar una variable global dentro de una función, se utiliza global.
x = 5
def mi_funcion():
global x
x = 10
mi_funcion()
print(x) # Imprime 10A lo largo de esta clase, hemos cubierto los conceptos esenciales de funciones, alcance de variables, y arreglos multidimensionales en Python. Vimos cómo definir y utilizar funciones, cómo se pueden manejar las variables locales y globales, y cómo manipular matrices y listas para resolver problemas complejos. Al integrar estas herramientas, los estudiantes podrán desarrollar programas más eficientes, organizados y escalables, lo cual es esencial para resolver problemas de programación de mediana y alta complejidad.
Profundiza más
Este recurso te ayudará a enfatizar sobre Arreglos y funciones ¡Accede aquí!
-
-
-
Actividades
-
Hacer un envío
-
Hacer intentos: 1
-
-
-
Introducción
En esta clase, nos adentramos en dos conceptos fundamentales de la programación en Python: el paso de arreglos como parámetros y las funciones recursivas. Comprender cómo se pasan los arreglos a las funciones es clave para manipular grandes cantidades de datos de manera eficiente. A través de este concepto, aprenderemos cómo las referencias a los arreglos se pasan a las funciones, lo que permite modificar el arreglo original sin necesidad de crear copias adicionales. Este enfoque no solo optimiza la memoria y mejora la eficiencia, sino que también proporciona una base sólida para trabajar con colecciones de datos más complejas, como las matrices.
Por otro lado, exploraremos las funciones recursivas, un concepto esencial cuando se resuelven problemas que pueden descomponerse en subproblemas más pequeños y similares entre sí. Las funciones recursivas permiten repetir una misma operación varias veces, pero con entradas más simples en cada iteración, lo que las hace ideales para problemas como el cálculo de secuencias o estructuras de datos jerárquicas. Sin embargo, para evitar que una función se ejecute de manera infinita, es necesario definir un caso base que interrumpa la recursión. A lo largo de esta clase, profundizaremos en estos conceptos utilizando ejemplos prácticos y diagramas de flujo que facilitarán su comprensión.
-
14.1. Paso de arreglos como parámetros.¿Qué es un arreglo (o lista)?
Recordando que un arreglo (en Python llamado lista) es una colección de elementos, como números o cadenas, que están almacenados en un solo contenedor. Este contenedor mantiene todos esos elementos en un orden determinado. Puedes acceder a estos elementos utilizando un índice. En Python, una lista puede contener cualquier tipo de dato, y los elementos dentro de la lista pueden ser modificados.
Resultado
numeros = [1, 2, 3, 4, 5]
¿Qué significa pasar un arreglo como parámetro?Cuando pasamos un arreglo como parámetro a una función, lo que realmente estamos haciendo es pasar una referencia al arreglo, no una copia completa del mismo. Esto es importante porque significa que cualquier cambio realizado dentro de la función afectará directamente al arreglo original fuera de la función.
Concepto de "Referencia"En lugar de pasar una copia del arreglo, en Python, cuando pasamos un arreglo como parámetro, pasamos su referencia. Una referencia es simplemente una dirección de memoria que apunta al arreglo original. Así, cuando modificamos el arreglo dentro de la función, estamos modificando directamente el arreglo que está fuera de la función.
¿Por qué es útil?- Ahorro de memoria: Al pasar una referencia en lugar de una copia, evitamos usar memoria adicional para almacenar una copia del arreglo. Esto es muy útil cuando trabajamos con arreglos grandes, ya que puede ahorrar una cantidad significativa de memoria.
- Eficiencia: Al no crear una copia del arreglo, la función puede modificar el arreglo original directamente, lo que puede hacer que el programa sea más eficiente, ya que no se necesita hacer copias adicionales.
Figura 1: Diagrama de flujo para el paso de arreglos como parámetros Fuente: Creación de autor, D. Nicolalde. Figura 1: Diagrama de flujo para el paso de arreglos como parámetros Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama ilustra cómo los arreglos se pasan como parámetros a una función y cómo los cambios en el arreglo dentro de la función afectan el arreglo original.
Ejemplo:Definimos una lista y pasamos esa lista a una función que modificará sus elementos:
Código
def agregar_elemento(lista): lista.append(100) mi_lista = [1, 2, 3] agregar_elemento(mi_lista) print(mi_lista) # Imprime [1, 2, 3, 100]
- Antes de la llamada a la función: mi_lista contiene [1, 2, 3].
- Dentro de la función: Se agrega el número 100 al final de la lista.
- Después de la llamada a la función: El valor de mi_lista es [1, 2, 3, 100], lo que demuestra que la lista fue modificada directamente.
Ejemplo:En este caso, vamos a pasar un arreglo de calificaciones de estudiantes para realizar una operación (calcular la media) y modificarlo dentro de la función.
Código
def calcular_promedio(calificaciones): total = sum(calificaciones) promedio = total / len(calificaciones) return promedio calificaciones_estudiante = [9, 8, 7, 10, 6] promedio = calcular_promedio(calificaciones_estudiante) print(f"El promedio es: {promedio}") # Imprime el promedio calculado
- Dentro de la función: Se calcula el promedio de las calificaciones pasando la lista a la función.
- Resultado: La función devuelve el valor del promedio que se calcula a partir de los valores en el arreglo.
Figura 2: Diagrama de flujo para el paso de un arreglo de calificaciones Fuente: Creación de autor, D. Nicolalde. Figura 2: Diagrama de flujo para el paso de un arreglo de calificaciones Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama muestra cómo una lista de calificaciones se pasa a la función para realizar un cálculo y luego devolver el resultado.
Ejemplo:Ahora, vamos a trabajar con una lista de matrices (listas dentro de listas) y modificarla mediante una función. Esto es útil cuando se tienen arreglos multidimensionales (como matrices).
Código
def modificar_matriz(matriz): for i in range(len(matriz)): for j in range(len(matriz[i])): matriz[i][j] += 1 matriz = [[1, 2, 3], [4, 5, 6]] modificar_matriz(matriz) print(matriz) # Imprime [[2, 3, 4], [5, 6, 7]]
- La función recorre cada elemento de la matriz y le suma 1.
- Modificación: Se modifica directamente el contenido de la matriz porque los arreglos son mutables en Python.
Aprende más
En el presente video tutorial vas a aprender como programar funciones que reciben como parámetros a listas, conjuntos, diccionarios o combinación de ellos ¡Accede aquí!
-
14.2. Funciones recursivas (concepto básico).¿Qué es una Función Recursiva?
Una función recursiva es una función que se llama a sí misma durante su ejecución. Este tipo de función es especialmente útil cuando necesitamos resolver un problema que puede ser dividido en subproblemas más pequeños y similares entre sí. Es decir, podemos resolver el problema completo repitiendo la misma lógica, pero con datos más simples cada vez.
Las funciones recursivas son muy comunes en problemas de programación que siguen una estructura jerárquica o de árbol, como el cálculo de factoriales, el recorrido de estructuras de datos como árboles y gráficos, y la resolución de problemas matemáticos complejos.
¿Cómo Funciona una Función Recursiva?Las funciones recursivas trabajan de una manera especial. Tienen dos componentes esenciales para funcionar correctamente:
- El Caso Base: El caso base es una condición que detiene las llamadas recursivas. Sin un caso base, la función seguiría llamándose a sí misma de manera infinita, lo que causaría un desbordamiento de pila (stack overflow). El caso base es generalmente una condición simple y directa que resuelve el problema de manera inmediata.
- La Llamada Recursiva: La función se llama a sí misma con un conjunto más pequeño de datos o una versión más simple del problema. Esto divide el problema original en subproblemas más manejables, y la función sigue llamándose hasta llegar al caso base.
Sintaxis básica de una función recursiva:Código
def funcion_recursiva(parametro): if parametro <= 0: # Caso base return 0 else: return parametro + funcion_recursiva(parametro - 1) # Llamada recursiva
Figura 3: Diagrama de flujo para una función recursiva simple Fuente: Creación de autor, D. Nicolalde. Figura 3: Diagrama de flujo para una función recursiva simple Fuente: Creación de autor, D. Nicolalde.
Descripción: Este diagrama ilustra cómo una función recursiva realiza llamadas a sí misma hasta que alcanza el caso base.
Ejemplo de recursión:Calcular la suma de los primeros n números enteros:
Código
def suma_recursiva(n): if n == 1: # Caso base return 1 else: return n + suma_recursiva(n - 1) # Llamada recursiva resultado = suma_recursiva(5) print(resultado) # Imprime 15 (1+2+3+4+5)
- Caso base: Cuando n es 1, la función retorna 1 y termina.
- Llamada recursiva: Para valores mayores, la función suma n al resultado de la función llamada con n-1 hasta llegar al caso base.
Ejemplo Cálculo del Factorial:El factorial de un número n, denotado como n!, es el producto de todos los números enteros desde 1 hasta n. Por ejemplo:
5! = 5 × 4 × 3 × 2 × 1 = 120
Un cálculo recursivo del factorial de n puede definirse de la siguiente manera:
- Caso base: El factorial de 0 es 1 (es decir, 0!=1).
- Llamada recursiva: El factorial de n es n×(n−1)!, por lo tanto, podemos hacer una llamada recursiva para calcular (n−1)!.
Código
def factorial(n): if n == 1: # Caso base return 1 else: return n * factorial(n - 1) # Llamada recursiva resultado = factorial(5) print(resultado) # Imprime 120 (5*4*3*2*1)
- La función factorial toma un número n y verifica si n es igual a 0. Si es así, retorna 1 (el caso base).
- Si n no es 0, entonces la función retorna el valor de n×(n−1)! y para calcular (n−1)!, la función se llama a sí misma con el valor de n−1. Este proceso se repite hasta que se llega al caso base.
Ejemplo de ejecución:Supongamos que queremos calcular 5!:
Resultado
factorial(5) Esto hará lo siguiente:
- factorial(5) retorna 5×factorial(4)
- factorial(4) retorna 4×factorial(3)
- factorial(3) retorna 3×factorial(2)
- factorial(2) retorna 2×factorial(1)
- factorial(1) retorna 1×factorial(0)
- factorial(0) llega al caso base y retorna 1.
Ahora, todas las llamadas recursivas se resuelven:
- factorial(1) retorna 1×1=1
- factorial(2) retorna 2×1=2
- factorial(3) retorna 3×2=6
- factorial(4) retorna 4×6=24
- factorial(5) retorna 5×24=120
Finalmente, 5!=120
¿Por qué Funciona la Recursión?La recursión funciona porque se reduce el problema original a un problema más pequeño con cada llamada recursiva. Eventualmente, el problema alcanza el caso base, y a partir de allí las funciones se "desenrollan" y se resuelven paso a paso, volviendo al nivel original.
Ventajas y Desventajas de la Recursión Ventajas:- Simplicidad: Los problemas complejos que pueden dividirse en subproblemas similares se resuelven de manera más sencilla con la recursión. En lugar de escribir un código largo y complicado, la recursión permite una solución más compacta y elegante.
- Legibilidad: El código recursivo es más fácil de entender y leer cuando el problema sigue una estructura recursiva (como los árboles, grafos o problemas matemáticos como el factorial).
- Uso de memoria: Las funciones recursivas pueden usar más memoria debido a la pila de llamadas (cada llamada recursiva consume memoria en la pila). Si el problema es demasiado grande o no tiene un caso base adecuado, puede llevar a un desbordamiento de pila.
- Rendimiento: En algunos casos, las funciones recursivas pueden ser más lentas que las iterativas debido al sobrecosto de las llamadas y retornos múltiples.
Figura 4: Diagrama de flujo para calcular el factorial de un número n de forma recursiva Fuente: Creación de autor, D. Nicolalde. Figura 4: Diagrama de flujo para calcular el factorial de un número n de forma recursiva Fuente: Creación de autor, D. Nicolalde.
Descripción: Muestra cómo las llamadas recursivas permiten calcular el factorial de un número.
Ejemplo la secuencia de Fibonacci: ¿Qué es la Secuencia de Fibonacci?La secuencia de Fibonacci es una serie de números en la que cada número es la suma de los dos números anteriores. Comienza de la siguiente manera:
- Fibonacci(0) = 0
- Fibonacci(1) = 1
- Fibonacci(2) = Fibonacci(1) + Fibonacci(0) = 1 + 0 = 1
- Fibonacci(3) = Fibonacci(2) + Fibonacci(1) = 1 + 1 = 2
- Fibonacci(4) = Fibonacci(3) + Fibonacci(2) = 2 + 1 = 3
- Fibonacci(5) = Fibonacci(4) + Fibonacci(3) = 3 + 2 = 5
- Fibonacci(6) = Fibonacci(5) + Fibonacci(4) = 5 + 3 = 8
La secuencia de Fibonacci es fundamental en matemáticas y tiene aplicaciones en diversas áreas como la teoría de números, algoritmos de optimización, y la programación dinámica.
¿Cómo Funciona la Función Recursiva para Fibonacci?Una función recursiva es una función que se llama a sí misma para resolver un problema dividiéndolo en subproblemas más pequeños. La secuencia de Fibonacci es un ejemplo clásico donde cada número depende de los dos números anteriores. Para calcular, por ejemplo, Fibonacci(6), necesitamos saber Fibonacci(5) y Fibonacci(4), y para obtener estos, necesitamos calcular Fibonacci(4), Fibonacci(3), y así sucesivamente hasta llegar al caso base.
En una función recursiva, el caso base es esencial para detener las llamadas infinitas. En este caso, el caso base es cuando n es igual a 0 o 1, ya que los valores de Fibonacci(0) y Fibonacci(1) están definidos explícitamente como 0 y 1, respectivamente.
La secuencia de Fibonacci está definida como:
- Fibonacci(0) = 0
- Fibonacci(1) = 1
- Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2) para n > 1.
Código
def fibonacci(n): if n <= 1: # Caso base return n else: return fibonacci(n - 1) + fibonacci(n - 2) # Llamada recursiva resultado = fibonacci(6) print(resultado) # Imprime 8 (la secuencia es 0, 1, 1, 2, 3, 5, 8)
-
Caso Base: En la función fibonacci(n), si n es igual o menor a 1 (es decir, 0 o 1), la función retorna n directamente.
- Si n = 0, retorna 0.
- Si n = 1, retorna 1.
-
Llamada Recursiva: Si n es mayor que 1, la función no retorna un valor directamente. En lugar de eso, hace dos llamadas recursivas a la misma función:
- fibonacci(n - 1)
- fibonacci(n - 2)
-
Resultado: Finalmente, cuando se calcula fibonacci(6):
- La función primero llama a fibonacci(5) y fibonacci(4).
- fibonacci(5) hace dos llamadas más a fibonacci(4) y fibonacci(3).
- fibonacci(4) a su vez hace llamadas a fibonacci(3) y fibonacci(2), y así sucesivamente.
- La Estructura de Llamadas: Cuando se llama fibonacci(6), la secuencia de llamadas será algo así:
Resultado
fibonacci(6)
├── fibonacci(5)
│ ├── fibonacci(4)
│ │ ├── fibonacci(3)
│ │ │ ├── fibonacci(2)
│ │ │ │ ├── fibonacci(1) -> 1
│ │ │ │ └── fibonacci(0) -> 0
│ │ │ └── fibonacci(1) -> 1
│ │ └── fibonacci(2)
│ └── fibonacci(3)
└── fibonacci(4)Este proceso va desglosando los números hasta llegar a los casos base, y luego suma los resultados cuando se "desenrollan" las llamadas recursivas.
Salida EsperadaCuando llamamos a fibonacci(6), el resultado final será 8, ya que el número en la posición 6 de la secuencia de Fibonacci es 8.
Resultado
0, 1, 1, 2, 3, 5, 8 Este ejemplo muestra cómo las funciones recursivas pueden ser útiles para resolver problemas en los que la solución depende de subproblemas más pequeños, como la secuencia de Fibonacci.
Consideraciones Importantes- Eficiencia: La recursión para la secuencia de Fibonacci no es eficiente para números grandes debido a las múltiples llamadas redundantes. Por ejemplo, fibonacci(6) hace fibonacci(5) y fibonacci(4), y ambos a su vez llaman a fibonacci(3), lo que resulta en una gran cantidad de cálculos repetidos.
- Optimización: Este tipo de recursión puede ser optimizado usando memorización o convirtiéndola en una solución iterativa para mejorar el rendimiento.
Ejemplo de Optimización con MemorizaciónUsar memorización permite almacenar los resultados de las llamadas recursivas para que no se recalculen varias veces. Aquí tienes una versión optimizada de la función Fibonacci:
Código
def fibonacci_memorizado(n, memo={}): if n <= 1: # Caso base return n if n not in memo: # Si el valor no ha sido calculado antes memo[n] = fibonacci_memorizado(n - 1, memo) + fibonacci_memorizado(n - 2, memo) return memo[n]
- Usamos un diccionario memo para almacenar los resultados ya calculados.
- Si fibonacci(n) ya ha sido calculado, simplemente se retorna el valor guardado, evitando el cálculo redundante.
Figura 5: Diagrama de flujo para la secuencia de Fibonacci Fuente: Creación de autor, D. Nicolalde. Figura 5: Diagrama de flujo para la secuencia de Fibonacci Fuente: Creación de autor, D. Nicolalde.
Descripción: Muestra cómo las llamadas recursivas se descomponen hasta llegar al caso base y luego se resuelven de vuelta.
Las funciones recursivas son una poderosa herramienta para resolver problemas que pueden descomponerse en subproblemas similares. Para que una función recursiva sea exitosa, debe contar con un caso base que detenga las llamadas infinitas y con una llamada recursiva que reduzca el problema a uno más simple. En el caso de la secuencia de Fibonacci, la recursión permite calcular cada número de manera eficiente, aunque puede ser optimizada para problemas más grandes.
Aprende más
En el presente video tutorial vas a aprender como programar una función recursiva. ¡Accede aquí!
La tabla 1 muestra los diferentes tipos de parámetros que se pueden utilizar en las funciones de Python. Incluye los parámetros posicionales, con valores predeterminados y los parámetros arbitrarios, lo que permite mayor flexibilidad al definir funciones.
Tipo de Parámetro Descripción Ejemplo Parámetros Posicionales Son los parámetros más comunes. Los valores se asignan a los parámetros de la función según el orden en que se pasan. def suma(a, b): return a + b Parámetros con Valor Predeterminado Los parámetros pueden tener valores predeterminados. Si no se pasa un valor al llamar a la función, se usará el valor predeterminado. def saludar(nombre="Estudiante"): print(f"Hola {nombre}") Parámetros Arbitrarios (*args) Permiten recibir un número variable de argumentos. def sumar_todos(*args): return sum(args) Tabla 1: Tipos de Parámetros en Funciones Fuente: Creación de autor, D. Nicolalde. Parámetros PosicionalesSon los parámetros más comunes. Los valores se asignan a los parámetros de la función según el orden en que se pasan.
Ejemplo:
def suma(a, b): return a + bParámetros con Valor PredeterminadoLos parámetros pueden tener valores predeterminados. Si no se pasa un valor al llamar a la función, se usará el valor predeterminado.
Ejemplo:
def saludar(nombre="Estudiante"): print(f"Hola {nombre}")Parámetros Arbitrarios (*args)Permiten recibir un número variable de argumentos.
Ejemplo:
def sumar_todos(*args): return sum(args)
En la tabla 2 se comparan las variables locales y globales, mostrando cómo se definen, cómo se acceden a ellas, y cómo se modifican dentro de las funciones.
Tipo de Variable Descripción Ejemplo de Uso Variables Locales Se definen dentro de una función y solo son accesibles dentro de ella. def funcion(): x = 10; print(x) Variables Globales Se definen fuera de todas las funciones y son accesibles desde cualquier parte del código. x = 5; def funcion(): print(x) Modificación de Variables Globales Se pueden modificar dentro de funciones usando la palabra clave global. global x; x = 10 Tabla 2: Diferencias entre Variables Locales y Globales Fuente: Creación de autor, D. Nicolalde. Variables LocalesSe definen dentro de una función y solo son accesibles dentro de ella.
Ejemplo:
def funcion(): x = 10; print(x)Variables GlobalesSe definen fuera de todas las funciones y son accesibles desde cualquier parte del código.
Ejemplo:
x = 5; def funcion(): print(x)Modificación de Variables GlobalesSe pueden modificar dentro de funciones usando la palabra clave global.
Ejemplo:
global x; x = 10Profundiza más
Este recurso te ayudará a enfatizar sobre Arreglos y funciones ¡Accede aquí!
-
-
-
Actividades
-
Hacer intentos: 1
-
-
-
Introducción
En la clase 15 exploraremos una de las habilidades más importantes para cualquier programador: interactuar con archivos de texto. Esta capacidad permite que los programas puedan almacenar información de forma persistente, leer datos previamente guardados y generar registros automáticos. Para ello, aprenderemos a utilizar la función open() en Python, dominando sus distintos modos de apertura (lectura, escritura y anexado), y entenderemos cómo leer archivos completos o línea por línea, así como escribir y modificar contenido de manera segura. Esta sección introduce también el uso de estructuras como with, que permiten trabajar con archivos garantizando su cierre automático, lo cual es esencial para evitar errores en aplicaciones reales.
Asimismo, abordaremos el manejo de excepciones mediante bloques try, except, else y finally. Estos mecanismos permiten capturar y tratar errores como archivos no encontrados, permisos denegados o problemas de lectura/escritura, de forma que el programa no se detenga abruptamente. Esta parte es clave para desarrollar aplicaciones más estables, profesionales y centradas en la experiencia del usuario. Al finalizar esta clase, estarás en capacidad de leer y escribir archivos de texto eficientemente, y construirás programas más robustos capaces de responder con elegancia ante situaciones imprevistas.
-
15.1. Lectura/escritura de archivos de texto (open(), read(), write()).
El almacenamiento persistente de datos es una necesidad esencial en el desarrollo de software. Los programas no solo deben procesar información en memoria (RAM), sino también guardar datos para poder recuperarlos después de que se cierre el programa. Una forma básica y universal de lograrlo es mediante los archivos de texto.
¿Qué es un archivo de texto?Un archivo de texto es un tipo de archivo que contiene únicamente caracteres legibles por humanos. Cada carácter se representa por un valor codificado (como ASCII o UTF-8), y se organiza generalmente por líneas, con un carácter especial para indicar el salto de línea (por ejemplo, \n).
Los archivos de texto tienen varias características:
- Formato plano: sin estilos ni estructuras complejas.
- Fácil de crear y editar: se pueden abrir con editores como Bloc de notas.
- Utilidad: ideales para almacenar configuraciones, registros (logs), datos simples, etc.
Operaciones básicas: lectura y escrituraEn el contexto computacional, leer y escribir archivos de texto implica la comunicación entre el programa y el sistema de archivos del sistema operativo. Esto se logra a través de flujos de datos (streams) que conectan el programa con el archivo.
- Lectura
La lectura de un archivo de texto consiste en abrir el archivo y copiar su contenido (total o parcial) hacia la memoria del programa para su procesamiento. Puede hacerse de varias formas:
- Leer todo el contenido de una vez.
- Leer línea por línea.
- Leer por bloques (por ejemplo, de 512 caracteres).
- Escritura
La escritura en un archivo de texto es el proceso inverso: enviar información desde el programa hacia el archivo. Según el modo de escritura, se puede:
- Sobrescribir el contenido existente.
- Añadir (anexar) al final del archivo sin eliminar lo anterior.
Ciclo general de lectura/escrituraTodo proceso de entrada/salida de archivos sigue una estructura general:
- Abrir el archivo (indicando nombre y modo de acceso).
- Leer o escribir datos según se requiera.
- Cerrar el archivo para liberar recursos y garantizar que los datos se hayan guardado correctamente.
Consideraciones importantes- Codificación de caracteres: es fundamental especificar cómo están representados los caracteres (por ejemplo, ASCII vs. UTF-8) para evitar errores con símbolos especiales.
- Gestión de errores: los programas deben prever situaciones como archivos inexistentes, permisos denegados o errores de lectura/escritura.
- Persistencia y trazabilidad: la escritura en archivos permite conservar resultados, generar historiales, guardar configuraciones o registrar eventos (logs).
Archivo en PythonPara trabajar con archivos de texto en Python utilizamos la función open(), que nos devuelve un objeto de tipo file. Sus parámetros más comunes son:
- open(ruta, modo, encoding=None)
Cada vez que abrimos un archivo, debemos cerrarlo al terminar, usando file.close() o, de forma más segura, el contexto with.
Trabajar con archivos de texto en Python implica esencialmente tres pasos: abrir el archivo, operar sobre él (leer o escribir), y finalmente cerrarlo para liberar recursos del sistema. A continuación, detallamos cada aspecto:
- open(ruta, modo, encoding=None)
- ruta (str): la ubicación del archivo en tu sistema de archivos.
- modo (str): determina qué operaciones permitimos sobre el archivo:
- "r" Lectura (por defecto). Error si el archivo no existe.
- "w" Escritura: trunca (vacía) el archivo o crea uno nuevo.
- "a" Anexar: abre para escritura al final, sin borrar contenido previo; crea el archivo si no existe.
- "r+" Lectura y escritura; error si no existe, pero no trunca.
- encoding (str, opcional):
- Especifica la codificación de caracteres.
- Recomendado usar "utf-8" para garantizar compatibilidad Unicode.
- Si no lo indicas, Python usará la codificación por defecto de tu sistema (p. ej. "cp1252" en Windows en Español), lo cual puede producir errores de decodificación al leer caracteres especiales.
Código
f_lectura = open("datos.txt", "r", encoding="utf-8") f_escritura = open("salida.txt", "w", encoding="utf-8") f_anexar = open("log.txt", "a", encoding="utf-8") f_lect_escr = open("todo.txt", "r+", encoding="utf-8")
- Operaciones de lectura
Una vez tenemos el objeto file, podemos:
-
Leer todo de una vez
Código
contenido = f.read() # Lee hasta el final. Útil para archivos pequeños (< 10 MB).
-
Leer por bloques
Código
fragmento = f.read(100) # Hasta 100 caracteres. Continua desde la posición actual.
-
Leer línea a línea
Código
linea = f.readline() # Lee hasta el siguiente "\n". lineas = f.readlines() # Devuelve una lista de todas las líneas.
-
Iterar sobre el archivo
Código
for linea in f: process(linea)
-
Leer todo de una vez
Interno: Python maneja un búfer en memoria que agrupa lecturas al sistema operativo, reduciendo llamadas a disco y mejorando el rendimiento.
- Operaciones de escritura
Para escribir texto:
-
write()
Código
n = f.write("Hola, mundo\n") # Devuelve el número de caracteres escritos.
-
writelines()
Código
lineas = ["Primera línea\n", "Segunda línea\n"] f.writelines(lineas) # Escribe cada cadena, sin añadir "\n" automático.
-
flush() (opcional)
Código
f.flush() # Fuerza a vaciar el búfer a disco sin cerrar el archivo.
Atención: En modo "w" cualquier contenido previo se pierde al abrir.
-
write()
- Cierre del archivo
Siempre que abras un archivo, debes cerrarlo para:
- Liberar el descriptor de archivo (recurso limitado del sistema operativo).
- Asegurar que todo el búfer de escritura se grabe en disco.
-
Cierre manual
Código
f = open("archivo.txt", "r", encoding="utf-8") # ... leer o escribir ... f.close()
-
Uso de contexto (with)
La forma más segura y recomendada es usar un context manager:Código
with open("archivo.txt", "r", encoding="utf-8") as f: datos = f.read() # Aquí f.close() se invoca automáticamente, incluso si ocurre una excepción
Figura 1: Flujo de Apertura de un Archivo para Lectura Fuente: Creación de autor, D. Nicolalde. Figura 1: Flujo de Apertura de un Archivo para Lectura Fuente: Creación de autor, D. Nicolalde.
Descripción: Ilustra cómo open() crea un objeto file en modo lectura.
Ejemplo: Escritura y Lectura SimplesCódigo
# Escritura with open("datos.txt", "w", encoding="utf-8") as f: f.write("Hola, mundo!\n") f.write("Segunda línea.\n") # Lectura with open("datos.txt", "r", encoding="utf-8") as f: contenido = f.read() print(contenido)
En este ejemplo, abrimos el archivo datos.txt (si no existe se crea en el directorio raíz) en modo escritura ("w") dentro de un bloque with, lo que crea o sobrescribe el archivo y automáticamente lo cierra al terminar; dentro del bloque usamos f.write() para volcar dos líneas de texto con saltos de línea. A continuación, lo volvemos a abrir en modo lectura ("r") también con with, leemos todo su contenido de una vez con f.read() y lo imprimimos, obteniendo en pantalla exactamente las dos líneas que habíamos escrito. Este patrón garantiza un manejo seguro y conciso de la apertura, escritura, lectura y cierre del archivo.
Figura 2: Flujo de Lectura Completa de un Archivo Fuente: Creación de autor, D. Nicolalde. Figura 2: Flujo de Lectura Completa de un Archivo Fuente: Creación de autor, D. Nicolalde.
Descripción: Representa f.read() que extrae todo el contenido.
Ejemplo: Lectura Línea a LíneaCódigo
with open("datos.txt", "r", encoding="utf-8") as f: for linea in f: print(">>", linea.strip())
Este ejemplo abre el archivo datos.txt en modo lectura ("r") y, usando el contexto with, garantiza que el archivo se cierre automáticamente al terminar. Luego recorre el objeto fichero f línea a línea: en cada iteración, la variable linea contiene una cadena con una línea completa (incluyendo el salto de línea). Al aplicar linea.strip(), se eliminan espacios y saltos de línea al principio y al final, y con print(">>", …) se muestra cada línea limpiada precedida de los caracteres >>, lo que facilita identificar visualmente cada registro leído.
Figura 3: Flujo de Iteración Línea a Línea Fuente: Creación de autor, D. Nicolalde. Figura 3: Flujo de Iteración Línea a Línea Fuente: Creación de autor, D. Nicolalde.
Descripción: Muestra for linea in f para procesar cada línea.
Ejemplo: Anexar Registros de LogCódigo
import datetime def log_evento(mensaje): timestamp = datetime.datetime.now().isoformat() with open("app.log", "a", encoding="utf-8") as log: log.write(f"[{timestamp}] {mensaje}\n") log_evento("Inicio de la aplicación.") log_evento("Operación completada.")
Este ejemplo muestra cómo anexar (añadir) registros a un archivo de log utilizando Python. Primero, la función log_evento(mensaje) genera una marca de tiempo (timestamp) utilizando la fecha y hora actuales mediante datetime.datetime.now().isoformat(). Luego, abre el archivo "app.log" en modo de anexar ("a"), asegurando que los nuevos mensajes se añadan al final sin sobrescribir lo anterior. Finalmente, se escriben líneas en el archivo que incluyen la marca de tiempo y el mensaje proporcionado, generando un historial claro de eventos que ayuda en tareas como depuración y auditoría.
Figura 4: Flujo de Escritura en Modo Anexar ("a") Fuente: Creación de autor, D. Nicolalde. Figura 4: Flujo de Escritura en Modo Anexar ("a") Fuente: Creación de autor, D. Nicolalde.
Descripción: Ilustra cómo open(..., "a") añade sin borrar.
Ejemplo: Procesamiento de Gran VolumenCódigo
def contar_palabras(archivo): conteo = {} try: with open(archivo, "r", encoding="utf-8") as f: for linea in f: for palabra in linea.split(): conteo[palabra] = conteo.get(palabra, 0) + 1 return conteo except FileNotFoundError: print(f"Error: {archivo} no encontrado.") return {}
Este ejemplo presenta una solución eficiente para contar palabras en archivos de texto grandes, ideal cuando se trabaja con archivos que no pueden cargarse completamente en memoria. La función contar_palabras() abre el archivo con open() en modo lectura ("r") y codificación UTF-8. Usando un ciclo for, recorre línea por línea (lo que ahorra memoria), y cada línea se divide en palabras mediante split(). Luego, se utiliza un diccionario llamado conteo para registrar cuántas veces aparece cada palabra, incrementando su contador con conteo.get(palabra, 0) + 1, una forma eficiente de manejar claves nuevas o ya existentes.
Además, el uso del bloque try/except garantiza que el programa sea robusto ante errores comunes. En particular, si el archivo especificado no se encuentra, se lanza una excepción FileNotFoundError, y en lugar de interrumpir el programa, se imprime un mensaje de advertencia y se retorna un diccionario vacío. Esta práctica protege al sistema de fallos y permite que otros procesos continúen normalmente. En conjunto, este ejemplo enseña cómo combinar lectura eficiente de archivos, estructuras de datos como diccionarios y manejo de excepciones para construir herramientas útiles y resilientes para el análisis de texto.
Figura 5: Flujo de Procesamiento con Excepciones Fuente: Creación de autor, D. Nicolalde. Figura 5: Flujo de Procesamiento con Excepciones Fuente: Creación de autor, D. Nicolalde.
La tabla 1 Resume los modos de open() y sus usos típicos.
Modo Descripción Ejemplo de Uso r Lectura, error si no existe open("f.txt", "r") w Escritura, crea o sobrescribe open("f.txt", "w") a Anexar al final, crea si no existe open("f.txt", "a") r+ Lectura y escritura open("f.txt", "r+") x Creación exclusiva, error si existe open("f.txt", "x") Tabla 1: Modos de Apertura de Archivos en Python Modo: rDescripción: Lectura, error si no existe
Ejemplo: open("f.txt", "r")
Modo: wDescripción: Escritura, crea o sobrescribe
Ejemplo: open("f.txt", "w")
Modo: aDescripción: Anexar al final, crea si no existe
Ejemplo: open("f.txt", "a")
Modo: r+Descripción: Lectura y escritura
Ejemplo: open("f.txt", "r+")
Modo: xDescripción: Creación exclusiva, error si existe
Ejemplo: open("f.txt", "x")
Aprende más
Este video explica de forma clara y didáctica cómo leer y escribir archivos de texto en Python usando open(), read(), write() y with. ¡Accede aquí!
-
15.2. Manejo de excepciones (try-catch).
Durante la ejecución de un programa, pueden surgir situaciones imprevistas que impidan que el programa continúe con su flujo normal. Estos eventos pueden deberse a errores humanos (como introducir letras en lugar de números), problemas del entorno (como intentar abrir un archivo que no existe), o situaciones imprevistas en tiempo de ejecución (como dividir por cero). Si estas situaciones no se manejan correctamente, el programa se interrumpe de forma abrupta, lo que representa una mala experiencia para el usuario y una falta de robustez del software.
Para resolver esto, los lenguajes de programación modernos —como Python, Java o C++— incluyen estructuras especiales de control de errores. En Python, estas estructuras se denominan bloques try-except. En otros lenguajes como Java o C#, se llaman try-catch.
¿Qué es una excepción?Una excepción es una señal enviada por el sistema cuando ocurre un error durante la ejecución de un programa. Es decir, es un evento excepcional que rompe el flujo normal del código. Las excepciones no son errores de sintaxis (que se detectan antes de ejecutar), sino errores que surgen mientras el programa está corriendo.
Algunos ejemplos comunes de excepciones en tiempo de ejecución:
- FileNotFoundError: Cuando se intenta abrir un archivo que no existe.
- ZeroDivisionError: Al intentar dividir un número entre cero.
- ValueError: Si se intenta convertir una letra en número (ej. int("a")).
- PermissionError: Acceso denegado al intentar abrir o modificar un archivo.
- IndexError: Acceso a una posición inexistente en una lista o arreglo.
Por ejemplo:
Código
f = open("archivo_que_no_existe.txt", "r")
Este código lanza una excepción tipo FileNotFoundError porque el archivo no existe. Si no hacemos nada, el programa se detiene con un mensaje de error.
¿Qué es un bloque try-except?Es una estructura de control que permite intentar ejecutar un bloque de código, y en caso de que ocurra un error, atrapar ese error (la excepción) y decidir cómo actuar.
Código
try: # Código que puede lanzar una excepción except TipoDeError: # Código que se ejecuta si ocurre ese error
Ejemplo:Código
try: f = open("datos.txt", "r") contenido = f.read() f.close() except FileNotFoundError: print("El archivo no existe.")
Componentes adicionales del manejo de excepcionesPython también permite agregar bloques opcionales:
- else: Se ejecuta si no ocurre ninguna excepción. Es útil para separar el código seguro del arriesgado.
- finally: Se ejecuta siempre, ocurra o no una excepción. Ideal para liberar recursos (cerrar archivos, conexiones, etc.).
El uso de bloques try-except es fundamental cuando trabajamos con archivos, entradas de usuario, o cualquier recurso que pueda fallar. Es una herramienta poderosa que permite construir programas más profesionales, seguros y amigables para el usuario.
Figura 6: Flujo de Estructura try/except/finally Fuente: Creación de autor, D. Nicolalde. Figura 6: Flujo de Estructura try/except/finally Fuente: Creación de autor, D. Nicolalde.
Descripción: Muestra las fases de ejecución y manejo de errores.
Código
try: with open("config.txt", "r", encoding="utf-8") as cf: datos = cf.read() except FileNotFoundError: print("No se encontró config.txt; usando valores por defecto.") datos = "" except PermissionError: print("Permiso denegado al abrir config.txt.") datos = "" else: print("Archivo leído exitosamente.") finally: print("Bloque finally: recursos liberados.")
Este código ejemplifica el manejo robusto de errores al intentar leer un archivo llamado config.txt en Python. Utiliza la estructura try/except/else/finally para controlar el flujo de ejecución frente a posibles fallos:
- Bloque try: Intenta abrir config.txt en modo lectura ("r") con codificación UTF-8. Si tiene éxito, su contenido se almacena en la variable datos.
- except FileNotFoundError: Si el archivo no existe, se captura este error específico. Se imprime un mensaje y datos se define como una cadena vacía.
- except PermissionError: Si el programa no tiene permisos para acceder al archivo, este bloque captura el error, imprime un mensaje y también asigna datos como vacío.
- else: Si no ocurre ninguna excepción, se imprime un mensaje indicando que la lectura fue exitosa.
- finally: Este bloque se ejecuta siempre, haya habido o no un error. Aquí se indica que los recursos han sido liberados, reforzando buenas prácticas como el cierre implícito del archivo.
Este patrón es útil para mantener el programa estable frente a errores comunes de E/S, como archivos faltantes o restricciones de permisos.
En la tabla 2 se enumera errores frecuentes y su significado.
Excepción Descripción Cuándo ocurre FileNotFoundError Archivo no existe open("noexiste.txt", "r") PermissionError Permiso insuficiente para acceder o modificar archivo Acceso a archivo protegido IOError Error genérico de E/S Fallos en disco, interrupciones de I/O ValueError Modo de apertura inválido open("f.txt", "z") Tabla 2: Excepciones Comunes en Operaciones de Archivos FileNotFoundErrorDescripción: Archivo no existe
Cuándo ocurre: open("noexiste.txt", "r")
PermissionErrorDescripción: Permiso insuficiente para acceder o modificar archivo
Cuándo ocurre: Acceso a archivo protegido
IOErrorDescripción: Error genérico de E/S
Cuándo ocurre: Fallos en disco, interrupciones de I/O
ValueErrorDescripción: Modo de apertura inválido
Cuándo ocurre: open("f.txt", "z")
Ejemplo: Gestor de Tareas en ArchivoCódigo
def agregar_tarea(tarea): try: with open("tareas.txt", "a", encoding="utf-8") as tf: tf.write(tarea + "\n") except IOError as e: print("Error al escribir en tareas.txt:", e) def listar_tareas(): try: with open("tareas.txt", "r", encoding="utf-8") as tf: return [l.strip() for l in tf] except FileNotFoundError: return [] # Uso agregar_tarea("Aprender archivos en Python") agregar_tarea("Practicar manejo de excepciones") print("Tareas pendientes:") for t in listar_tareas(): print(" -", t)
Este ejemplo presenta un gestor de tareas simple en Python que permite guardar y leer tareas desde un archivo de texto (tareas.txt). La función agregar_tarea() añade nuevas tareas utilizando open() en modo "a" (anexar), lo que garantiza que las tareas anteriores no se pierdan. Se usa la estructura with open(...) para abrir el archivo de forma segura y se implementa un bloque try/except para capturar errores de escritura como IOError. Por otro lado, la función listar_tareas() abre el archivo en modo lectura y devuelve una lista con las tareas, eliminando los saltos de línea. Si el archivo no existe, se captura la excepción FileNotFoundError y se retorna una lista vacía.
Este enfoque combina manipulación de archivos de texto con manejo de excepciones, permitiendo que el programa funcione correctamente incluso en condiciones adversas, como archivos inexistentes o errores de permisos. Además, enseña buenas prácticas como el uso de with para la gestión automática de recursos y el uso de listas por comprensión para procesar líneas. Es una excelente introducción a programas reales que requieren almacenamiento persistente y una estructura de control robusta..
Salida esperadaResultado
Tareas pendientes: - Aprender archivos en Python - Practicar manejo de excepciones
Al finalizar esta clase, los estudiantes habrán adquirido las competencias para interactuar con archivos de texto de forma segura y eficiente, y para construir aplicaciones resilientes ante errores de E/S.
Aprende más
En este vídeo del curso de Python, veremos el control de las excepciones con Try, except y finally. ¡Accede aquí!
Profundiza más
Este recurso te ayudará a enfatizar sobre Funciones y archivo de texto ¡Accede aquí!
-
-
-
Actividades
-
Hacer un envío
-
Hacer intentos: 1
-
-
-
Introducción
La clase 16 marca el cierre de un proceso de aprendizaje progresivo enfocado en el desarrollo de habilidades prácticas de programación a través de un proyecto integrador. A lo largo de las clases anteriores, los estudiantes construyeron, paso a paso, una calculadora avanzada, aplicando conocimientos esenciales sobre variables, estructuras de control, funciones, modularidad, manejo de archivos y robustez del software. Esta última clase tiene como propósito consolidar todo ese conocimiento mediante la revisión y validación del sistema completo, evaluando tanto su funcionalidad técnica como su calidad estructural y experiencia de uso.
En este módulo final, además de integrar todos los componentes del proyecto, se introduce un enfoque crítico hacia la calidad del software mediante pruebas sistemáticas. Se abordan distintos tipos de pruebas: unitarias, de integración, de manejo de errores y de usabilidad, las cuales permitirán verificar que cada parte del programa funciona correctamente tanto de forma independiente como en conjunto. Asimismo, se reflexiona sobre la importancia de la persistencia de datos, el diseño modular y la validación de entradas, sentando así las bases para el desarrollo de aplicaciones confiables, eficientes y centradas en el usuario. Esta clase representa el puente entre el aprendizaje técnico y su aplicación profesional.
-
16.1. Revisiones clave para el proyecto
El proyecto desarrollado a lo largo de las 16 clases ha sido diseñado para guiar al estudiante, paso a paso, en la construcción de una calculadora avanzada. Esta calculadora, lejos de ser un simple sumador, representa una herramienta modular, estructurada, escalable y profesional, desarrollada bajo los principios fundamentales de la programación.
A lo largo de este trayecto, se ha reforzado el enfoque por retos. Cada uno de los retos no solo representó un avance funcional, sino que también consolidó un conjunto específico de competencias relacionadas con los Resultados de Aprendizaje (RDA). Este enfoque promueve la progresividad, la comprensión profunda y la integración de conocimientos teóricos con habilidades prácticas.
Reto 1: Variables, Tipos de Datos y Operaciones BásicasEste primer reto marca el punto de partida en la construcción del proyecto, y está diseñado para familiarizar a los estudiantes con los fundamentos de la programación. En esta etapa inicial, los estudiantes trabajaron con variables, que son espacios en memoria donde se almacenan datos, y aprendieron cómo declarar, asignar y manipular su contenido. Se profundizó en los tipos de datos primitivos en Python, como int (enteros), float (decimales) y str (cadenas de texto), y se discutió cómo estos tipos determinan el comportamiento de las operaciones que se pueden realizar.
El foco principal estuvo en desarrollar la capacidad de realizar operaciones aritméticas básicas como suma, resta, multiplicación y división, entendiendo las reglas de precedencia y el uso correcto de operadores. A través de ejercicios prácticos, los estudiantes también comprendieron la diferencia entre entrada de datos (input()) y salida de datos (print()), lo cual les permitió construir programas interactivos simples.
Además, se introdujo el concepto de conversión de tipos (casting), indispensable cuando se requiere operar entre diferentes tipos de datos (por ejemplo, convertir una cadena a número para poder sumar). Esta etapa sienta las bases para la lógica computacional y el pensamiento algorítmico, elementos esenciales que se irán reforzando en los siguientes retos del proyecto.
Figura 1: Flujo básico de entrada, operación y salida Fuente: Creación de autor, D. Nicolalde. Figura 1: Flujo básico de entrada, operación y salida Fuente: Creación de autor, D. Nicolalde.
Reto 2: Control de Flujo y RepeticiónEn este segundo reto, los estudiantes profundizaron en el control de flujo del programa, aprendiendo a tomar decisiones basadas en condiciones mediante el uso de estructuras como if, elif y else. Estas herramientas permitieron que el programa no solo realice cálculos, sino que reaccione de forma inteligente ante diferentes entradas del usuario. Por ejemplo, si el usuario seleccionaba una operación no válida, el sistema podía mostrar un mensaje de advertencia o repetir la pregunta, mejorando la interacción con el sistema.
Otro componente clave de este reto fue la introducción y práctica intensiva de los bucles de repetición: while y for. Se enseñó a los estudiantes cómo usar estos bucles para repetir instrucciones múltiples veces, ya sea en función de un contador (for) o de una condición lógica (while). Esto habilitó la creación de menús interactivos, donde el usuario podía seleccionar varias operaciones sin tener que reiniciar el programa, lo cual representó un paso importante hacia la automatización y fluidez de la interfaz.
También se abordaron conceptos fundamentales como las expresiones booleanas, los operadores lógicos (and, or, not) y los errores comunes al diseñar condiciones. En conjunto, este reto fue esencial para ayudar a los estudiantes a comprender cómo se comportan los programas cuando enfrentan diferentes caminos posibles de ejecución, y cómo controlar esos caminos para crear programas más versátiles, robustos y adaptables.
Figura 2: Diagrama de flujo para selección de operación y bucle Fuente: Creación de autor, D. Nicolalde. Figura 2: Diagrama de flujo para selección de operación y bucle Fuente: Creación de autor, D. Nicolalde.
Descripción: Ilustra cómo el usuario elige una operación del menú y puede repetirla.
Reto 3: Funciones, Modularidad y ComplejidadEn este tercer reto, los estudiantes dieron un paso crucial hacia una programación más profesional mediante la introducción de funciones. Se promovió la práctica del principio de modularidad, que consiste en dividir un programa en partes más pequeñas y manejables llamadas funciones. Cada función fue diseñada para realizar una tarea específica, lo que permitió encapsular la lógica, reducir la repetición de código y mejorar significativamente la organización y claridad del programa.
Los estudiantes aprendieron a declarar funciones con parámetros de entrada, que permiten recibir información desde otros puntos del programa, y valores de retorno, que permiten enviar resultados de vuelta al bloque principal o a otras funciones. Esta dinámica fomentó una mayor comprensión sobre el flujo de datos entre funciones, así como sobre el diseño de interfaces claras entre los diferentes componentes del sistema.
A nivel técnico, este reto introdujo operaciones matemáticas más complejas, como el cálculo de potencias mediante el operador ** o la función pow(), y raíces cuadradas utilizando math.sqrt() o exponenciación fraccionaria. Además, se comenzaron a integrar estructuras más avanzadas como listas y matrices, permitiendo a los estudiantes trabajar con colecciones de datos para operaciones como suma de elementos, recorrido con bucles anidados y validaciones de estructuras.
Este reto también exigió aplicar los conocimientos de control de flujo aprendidos previamente, pero en el contexto de un sistema modular. Como resultado, los estudiantes desarrollaron calculadoras extendidas capaces de manejar múltiples operaciones, organizadas en funciones que podían ser llamadas desde un menú central. Así, el proyecto evolucionó de un sistema lineal a un sistema estructurado, reutilizable y escalable, sentando las bases para resolver problemas reales con mayor eficiencia y claridad.
Figura 3: Estructura modular del programa con funciones Fuente: Creación de autor, D. Nicolalde. Figura 3: Estructura modular del programa con funciones Fuente: Creación de autor, D. Nicolalde.
Descripción: Muestra cómo cada operación matemática se maneja mediante funciones independientes.
Reto 4: Persistencia con Archivos de Texto e Integración TotalEl cuarto y último reto representó el cierre integrador del proyecto, donde los estudiantes debían combinar todas las habilidades adquiridas en los retos anteriores para construir un sistema completo y funcional: una calculadora avanzada con capacidad de guardar y recuperar datos persistentes desde archivos de texto. Este reto fortaleció el pensamiento sistémico al permitir que los estudiantes reflexionen sobre cómo cada componente del programa se conecta y coopera con los demás.
La novedad central de este reto fue introducir el concepto de persistencia de información mediante archivos, utilizando funciones como open(), write() y read() en combinación con el uso seguro del contexto with. Los estudiantes aprendieron a almacenar los resultados de las operaciones en un archivo de historial (por ejemplo, historial.txt), y a implementar funciones para leer registros previos, facilitando la consulta, auditoría o reutilización de cálculos pasados.
Además, se reforzó el uso del manejo de excepciones (try-except) como una buena práctica para construir programas resilientes y seguros ante errores comunes, como archivos inexistentes o problemas de permisos. Esta práctica les permitió implementar mecanismos de recuperación de errores y mejorar la experiencia del usuario final.
Los estudiantes consolidaron su proyecto en una versión final integrada, que incluía todas las operaciones básicas y avanzadas, estructura modular mediante funciones, control de flujo completo, interacción con el usuario, y persistencia de datos. Este reto permitió evaluar no solo los conocimientos técnicos adquiridos, sino también habilidades transversales como la planificación, depuración, documentación y mejora continua del código.
Figura 4: Flujo de lectura y escritura de operaciones en archivo Fuente: Creación de autor, D. Nicolalde. Figura 4: Flujo de lectura y escritura de operaciones en archivo Fuente: Creación de autor, D. Nicolalde.<
Descripción: Muestra cómo se registran los resultados y se leen operaciones pasadas desde archivos.
La Tabla 1 resume las habilidades clave desarrolladas por los estudiantes en cada reto del proyecto de la calculadora. Muestra cómo, progresivamente, se dominaron conceptos desde la entrada de datos hasta el manejo de errores. Cada reto fortaleció componentes técnicos esenciales que culminan en una solución funcional e integrada.
Reto Habilidad Principal Componentes técnicos desarrollados 1 Entrada y operaciones básicas input(), print(), operadores aritméticos 2 Control del flujo if, while, menú interactivo 3 Modularidad y funciones def, llamadas con argumentos, retorno 4 Persistencia de datos y robustez Archivos de texto, excepciones, integración total Tabla 1: Resumen de habilidades adquiridas por reto Reto 1Habilidad Principal: Entrada y operaciones básicas
Componentes: input(), print(), operadores aritméticos
Reto 2Habilidad Principal: Control del flujo
Componentes: if, while, menú interactivo
Reto 3Habilidad Principal: Modularidad y funciones
Componentes: def, llamadas con argumentos, retorno
Reto 4Habilidad Principal: Persistencia de datos y robustez
Componentes: Archivos de texto, excepciones, integración total
Figura 5: Diagrama de interacción completa del proyecto Fuente: Creación de autor, D. Nicolalde. Figura 5: Diagrama de interacción completa del proyecto Fuente: Creación de autor, D. Nicolalde.
Descripción: Resume cómo cada módulo (entrada, menú, funciones, archivo) se conecta al sistema.
-
16.2 Tipos de pruebas¿Qué son las pruebas de software?
Las pruebas de software son una actividad sistemática dentro del ciclo de vida del desarrollo de software que tiene como finalidad evaluar y verificar que un programa o sistema informático funcione correctamente de acuerdo con los requisitos especificados. Desde una perspectiva teórica, las pruebas representan un proceso de validación y verificación cuyo objetivo principal es identificar errores, fallos o desviaciones en el comportamiento del software, antes de su implementación definitiva o liberación al usuario final.
Más allá de simplemente encontrar errores, las pruebas buscan aumentar la confianza en el producto desarrollado. Esto se logra evaluando su comportamiento en distintos escenarios y asegurando que cumple con lo esperado bajo condiciones normales, límite y anómalas. En términos académicos, se considera que el proceso de pruebas es un elemento clave en la garantía de calidad del software, ya que permite asegurar que el producto sea confiable, eficiente, seguro y utilizable.
Importancia dentro del ciclo de desarrollo de softwareEn el marco del ciclo de vida del software, las pruebas actúan como un filtro de calidad que ayuda a:
- Validar que el software cumple con los requerimientos funcionales y no funcionales establecidos desde la etapa de análisis.
- Verificar que los módulos y componentes trabajen correctamente de forma aislada y en conjunto.
- Reducir los riesgos asociados a fallos en producción o fallos catastróficos en sistemas críticos.
- Optimizar el tiempo y costo de mantenimiento a largo plazo, al detectar errores en etapas tempranas.
Las pruebas no se limitan a una sola fase: están presentes desde el diseño (con pruebas de verificación tempranas), durante la codificación (pruebas estructurales) y al finalizar (pruebas de aceptación), formando así un proceso transversal e iterativo.
Realizar pruebas adecuadas es fundamental para asegurar que el sistema cumple con los requisitos y se comporta correctamente incluso en condiciones adversas. A continuación, se presentan los tipos de pruebas que los estudiantes deben aplicar al finalizar su proyecto.
16.2.1. Pruebas Unitarias
Las pruebas unitarias son una metodología fundamental en el desarrollo de software que consiste en verificar cada componente del programa de forma aislada, generalmente una función a la vez. El objetivo principal es comprobar que cada función individual realiza correctamente su tarea, sin depender de otras partes del sistema.
Este tipo de prueba ayuda a:
- Detectar errores rápidamente en etapas tempranas del desarrollo.
- Facilitar la depuración y el mantenimiento del código.
- Asegurar que los cambios en una parte del código no afecten otras funcionalidades.
Ejemplos:- Probar sumar(a, b) con diferentes combinaciones (positivos, negativos, cero).
- Probar potencia(base, exponente) y validar que funcione con valores grandes y pequeños.
- Comprobar que la función guardar_resultados() escriba el archivo en el formato correcto.
Aprende más
El video titulado explica de forma clara y didáctica el concepto de pruebas unitarias en programación. ¡Accede aquí!
16.2.2. Pruebas de Integración
Las pruebas de integración se centran en verificar cómo funcionan juntas varias partes del programa, es decir, la interacción entre los distintos módulos o funciones. Aunque cada componente individual (como sumar() o leer_archivo()) puede funcionar correctamente de forma aislada, los errores pueden surgir al conectarlos.
Este tipo de pruebas busca responder preguntas como:
- ¿Se están transfiriendo correctamente los datos entre funciones?
- ¿La salida de una función sirve como entrada adecuada para otra?
- ¿Se mantienen los resultados esperados cuando el flujo pasa por varios componentes del sistema?
Importancia de las pruebas de integración:
- Detectan fallos en la comunicación entre módulos que las pruebas unitarias no pueden encontrar.
- Aseguran que el programa completo funcione de forma fluida y coherente.
- Permiten simular escenarios reales de uso, como un usuario utilizando el sistema de principio a fin.
Ejemplos:- Leer datos desde el archivo, procesarlos con funciones y luego escribir los resultados.
- Ejecutar una operación, guardar el resultado, cerrar el programa, reabrirlo y continuar desde donde se quedó.
16.2.3. Pruebas de Manejo de Errores (Robustez)
Las pruebas de manejo de errores, también llamadas pruebas de robustez, se centran en evaluar si el programa responde de forma segura y controlada ante errores comunes. En lugar de permitir que el programa se bloquee o arroje un mensaje técnico incomprensible, estas pruebas buscan que el sistema:
- Evite fallos inesperados.
- Capture excepciones y las maneje apropiadamente.
- Informe al usuario con mensajes claros, amigables y útiles.
Estas pruebas son fundamentales para garantizar que la aplicación sea confiable en situaciones reales, especialmente cuando el usuario comete errores o el entorno presenta condiciones adversas (archivos dañados, entradas incorrectas, etc.).
Ejemplos:- Dividir por cero.
- Ingresar texto cuando se espera un número.
- Abrir un archivo inexistente.
16.2.4. Pruebas de Usabilidad
Las pruebas de usabilidad no se enfocan en encontrar errores técnicos, sino en evaluar la experiencia del usuario al interactuar con el programa. Su objetivo es asegurar que el sistema sea intuitivo, fácil de usar y agradable, incluso para personas sin experiencia técnica. Estas pruebas son clave para mejorar la accesibilidad y claridad del software.
Un programa puede ser técnicamente correcto pero frustrante de usar. Las pruebas de usabilidad permiten detectar elementos confusos, redundantes o poco claros, y guiar mejoras que hacen que el usuario comprenda y utilice el sistema sin esfuerzo ni frustración.
Ejemplos:- Verificar que los menús sean claros y las opciones estén bien organizadas.
- Comprobar que los mensajes de error guíen al usuario.
- Medir si el flujo del programa es comprensible sin instrucciones externas.
16.2.5. Verificación y Pruebas Finales
Antes de declarar el proyecto como finalizado, se enfatizó la importancia de realizar pruebas. Este proceso implica alimentar al sistema con distintos tipos de entrada y validar los resultados esperados. Se explicó también cómo capturar errores y comportamientos inesperados.
Figura 6: Flujo de validación de entradas y manejo de excepciones Fuente: Creación de autor, D. Nicolalde. Figura 6: Flujo de validación de entradas y manejo de excepciones Fuente: Creación de autor, D. Nicolalde.
Descripción: Representa cómo se interceptan errores comunes antes de causar fallos graves.
La Tabla 2 presenta los tipos de pruebas esenciales recomendadas para garantizar la calidad del proyecto final. Cada tipo aborda un aspecto diferente: desde la validación de funciones individuales hasta la interacción entre módulos, el manejo de errores y la experiencia del usuario. Esta clasificación ayuda a estructurar una verificación integral del sistema desarrollado.
Tipo de prueba Objetivo Ejemplo en el proyecto Prueba unitaria Validar que una función individual funcione Validar que multiplicar(3, 4) retorne 12; o que calcular_raiz(9) retorne 3.0 Prueba de integración Comprobar que los módulos trabajan juntos Ejecutar una operación, guardar el resultado, cargarlo nuevamente y continuar la operación Prueba de errores Evaluar el manejo de errores comunes Intentar dividir por cero, ingresar texto donde se espera un número, o abrir un archivo inexistente Pruebas de Usabilidad Evalúan la claridad de menús, mensajes, y flujo lógico del sistema Confirmar que el menú guía correctamente al usuario y que los mensajes de error son comprensibles Tabla 2: Tipos de pruebas recomendadas Prueba unitariaObjetivo: Validar que una función individual funcione
Ejemplo: Validar que multiplicar(3, 4) retorne 12; o que calcular_raiz(9) retorne 3.0Prueba de integraciónObjetivo: Comprobar que los módulos trabajan juntos
Ejemplo: Ejecutar una operación, guardar el resultado, cargarlo nuevamente y continuar la operaciónPrueba de erroresObjetivo: Evaluar el manejo de errores comunes
Ejemplo: Intentar dividir por cero, ingresar texto donde se espera un número, o abrir un archivo inexistentePruebas de UsabilidadObjetivo: Evaluar la claridad de menús, mensajes y flujo lógico del sistema
Ejemplo: Confirmar que el menú guía correctamente al usuario y que los mensajes de error son comprensibles
Aprende más
El video ofrece una guía completa para principiantes sobre cómo implementar pruebas en Python ¡Accede aquí!
Profundiza más
Este recurso te ayudará a enfatizar sobre el tema ¡Accede aquí!
-
-
-
Actividades
-
Hacer intentos: 1
-
Hacer intentos: 1
-
-
-
Resultado de aprendizaje 1
-
Ruta Académica - RDA1 - Simulador de Diagnóstico de Lenguaje y Etapa de Desarrollo TareaNo disponible hasta que: se pertenezca al grupo RDA1
-
Ruta Académica - RDA1 - Comparador de Expresiones y Tipos de Datos entre Lenguajes TareaNo disponible hasta que: se pertenezca al grupo RDA1
-
Resultado de aprendizaje 2
-
Ruta Académica - RDA2 - Sistema de Evaluación Académica con Validación y Menú Dinámico TareaNo disponible hasta que: se pertenezca al grupo RDA2
-
Ruta Académica - RDA2 - Asistente de Diagnóstico Nutricional Interactivo TareaNo disponible hasta que: se pertenezca al grupo RDA2
-
Resultado de aprendizaje 3
-
Ruta Académica - RDA3 - Simulación de Agenda Estudiantil con Historial Persistente TareaNo disponible hasta que: se pertenezca al grupo RDA3
-
Ruta Académica - RDA3 - Gestión de Inventario con Reportes Exportables TareaNo disponible hasta que: se pertenezca al grupo RDA3
-
-
-
Enlaces de Sesiones
-
Enlaces de Grabaciones
-
Material extra
-
-
-
Bienvenidos a PUCE CAFÉ: Un Espacio Abierto para la Participación y Reflexión
PUCE CAFÉ es un espacio diseñado para fomentar la conversación abierta y el intercambio de ideas entre los participantes del aula virtual. Aquí, les invitamos a reflexionar sobre los temas abordados, plantear preguntas, y compartir inquietudes sobre los contenidos trabajados.
Este es el lugar perfecto para aclarar dudas, profundizar en conceptos y mejorar la comprensión de los temas. Pueden discutir aspectos como la incorporación de multimedia en Moodle, la organización y categorización de contenidos, y las mejores prácticas para mejorar la accesibilidad y la experiencia de usuario en entornos de aprendizaje virtual.
Recuerden, no existen preguntas incorrectas; cada aporte, ya sea una pregunta o comentario, contribuye a enriquecer la experiencia de aprendizaje colectiva. Los animamos a participar activamente, ya que, además de contar con nuestro apoyo, también pueden aprender de los conocimientos y experiencias compartidas por sus compañeros.
¡Esperamos sus preguntas y comentarios para seguir construyendo juntos este proceso de aprendizaje!
-
-
-
Descargar el contenido de la Clase 1
Descargar el contenido de la Clase 2
Descargar el contenido de la Clase 3
Descargar el contenido de la Clase 4
Descargar el contenido de la Clase 5
Descargar el contenido de la Clase 6
Descargar el contenido de la Clase 7
Descargar el contenido de la Clase 8
Descargar el contenido de la Clase 9
Descargar el contenido de la Clase 10
Descargar el contenido de la Clase 11
Descargar el contenido de la Clase 12
Descargar el contenido de la Clase 13
Descargar el contenido de la Clase 14
Descargar el contenido de la Clase 15
Descargar el contenido de la Clase 16
-
-
-
CompiladorHerramienta que traduce el código fuente completo a lenguaje máquina, generando un archivo ejecutable independiente del código original.Intérprete
Herramienta que traduce y ejecuta el código fuente línea por línea en tiempo real, facilitando la depuración y la experimentación durante el desarrollo.
-
PseudocódigoEs una representación simplificada y en lenguaje natural de un algoritmo o proceso. Permite describir la lógica y los pasos necesarios para resolver un problema sin requerir la precisión sintáctica de un lenguaje de programación formal. Se utiliza para planificar, analizar y comunicar la estructura de un algoritmo de manera clara y ordenada.Diagrama de flujoEs una representación gráfica que ilustra la secuencia de pasos, decisiones y procesos de un algoritmo. Utiliza símbolos estandarizados (como óvalos para el inicio y fin, rectángulos para procesos, rombos para decisiones y paralelogramos para entradas/salidas) para facilitar la visualización y comprensión de la lógica subyacente, ayudando a identificar errores y oportunidades de mejora en el flujo del proceso.
-
VariablesSon identificadores que actúan como contenedores para almacenar datos en la memoria del sistema. En Python, las variables se asignan mediante el operador “=”, y su tipo se determina dinámicamente en tiempo de ejecución. Permiten guardar, modificar y manipular información durante la ejecución del programa.Convenciones de nombresSon un conjunto de reglas y pautas que determinan cómo deben nombrarse las variables, funciones, clases y otros elementos en el código. En Python, se recomienda utilizar el estilo snake_case—es decir, utilizar minúsculas y separar las palabras con guiones bajos—para mejorar la legibilidad y mantener la coherencia del código en entornos colaborativos.
-
Transformar y evaluar informaciónEste término hace referencia al proceso mediante el cual se toman datos de entrada (numéricos, textuales o lógicos) y se aplican operaciones (aritméticas, lógicas, de comparación, etc.) para generar nuevos resultados o conclusiones. En programación, transformar implica modificar o combinar la información (por ejemplo, sumando valores, calculando promedios o concatenando textos), mientras que evaluar consiste en analizar los datos para decidir el flujo de un programa (por ejemplo, verificar si un número excede un umbral). Este ciclo de transformación y evaluación de información es esencial para resolver problemas y diseñar algoritmos eficientes.Expresiones booleanasLas expresiones booleanas son aquellas que, al evaluarse, arrojan un resultado de True o False. Se construyen mediante operadores de comparación (por ejemplo, ==, >, <) y operadores lógicos (como and, or, not) aplicados a valores o variables. Estas expresiones permiten tomar decisiones en un programa, ya que sirven como condiciones en estructuras de control (if, while, for), determinando el curso de ejecución de un algoritmo en función de la lógica definida.
-
SecuencialidadPrincipio según el cual las instrucciones de un programa se ejecutan de manera lineal y en orden estricto, sin bifurcaciones ni saltos lógicos. Cada línea de código se ejecuta inmediatamente después de la anterior, sirviendo de base para la programación fundamental.Leer datosProceso de solicitar y recibir información ingresada por el usuario (u otra fuente) para su posterior uso en el programa. En Python, se realiza principalmente mediante la función input(), que retorna una cadena que puede convertirse a tipos numéricos o booleanos para su procesamiento.
-
La interacción con el usuarioProceso mediante el cual un programa solicita y recibe datos de la persona que lo utiliza (a través de funciones como input()) y muestra resultados o mensajes en pantalla (usando print() u otros métodos). Este intercambio influye directamente en la usabilidad y efectividad de la aplicación, ya que un programa con interacciones claras, mensajes descriptivos y validaciones adecuadas resulta más accesible y confiable para el usuario.Programa robustoSe refiere a un software capaz de manejar condiciones inesperadas, datos inválidos o escenarios anómalos sin colapsar ni producir resultados incoherentes. Un programa robusto no solo captura y gestiona los errores con mensajes claros, sino que también sigue funcionando de manera estable, ofreciendo seguridad y confiabilidad a los usuarios, incluso ante entradas equivocadas o problemas en tiempo de ejecución.
-
Tomar decisionesEn programación, tomar decisiones consiste en que el software evalúe una o varias condiciones y, según su resultado (verdadero o falso), seleccione una ruta de ejecución distinta. Esto permite que un programa abandone la linealidad, responda a múltiples escenarios y ejecute acciones específicas dependiendo de valores o situaciones, haciendo su comportamiento más dinámico y adaptable.Tiempo de ejecuciónEl tiempo de ejecución se refiere al período en el que un programa se está ejecutando en un sistema, recibiendo entradas, procesándolas y produciendo salidas. Durante este lapso, se aplican validaciones, toma de decisiones y manejo de errores, definiendo cómo el software reacciona a los datos y condiciones reales que se presentan mientras corre
-
Condicionales AnidadasEstructuras de control donde una condición está contenida dentro de otra. Son útiles para tomar decisiones más complejas en el flujo de ejecución de un programa.Operador TernarioUna forma compacta de escribir un condicional if-else, que evalúa una condición y retorna uno de dos valores posibles en una sola línea de código.
-
Anidamiento de BuclesEl anidamiento de bucles ocurre cuando un bucle está dentro de otro. En Python, esto se puede hacer colocando un bucle for dentro de otro. Este concepto es útil para trabajar con estructuras de datos bidimensionales, como matrices, o para realizar operaciones más complejas que requieren iteraciones dentro de iteraciones.IteraciónLa iteración es el proceso de repetir una acción o conjunto de acciones múltiples veces, generalmente sobre una secuencia de elementos, como una lista, tupla, o rango. En los bucles for, la iteración se refiere a la repetición del bloque de código para cada elemento de la secuencia.
-
Bucle whileEstructura de control que repite un bloque de código mientras se cumpla una condición booleana. Se evalúa la condición antes de cada iteración, y si la condición es falsa desde el principio, el bloque de código no se ejecuta.Comando continueSentencia utilizada dentro de bucles para saltarse la iteración actual y continuar con la siguiente, sin ejecutar el resto del código en esa iteración. Es útil cuando se desea omitir ciertas condiciones sin interrumpir todo el ciclo.
-
Arreglo Unidimensional (Lista)Un arreglo unidimensional es una estructura de datos que almacena una colección de elementos de manera secuencial, permitiendo el acceso a estos elementos a través de un índice. En Python, se implementa mediante listas, que son estructuras dinámicas, lo que significa que los elementos pueden ser modificados, añadidos o eliminados según sea necesario.Recorrer un ArregloSe refiere al proceso de iterar a través de todos los elementos almacenados en un arreglo (lista) para realizar alguna acción con cada uno de ellos. Esto se puede hacer fácilmente en Python utilizando un bucle for, que permite acceder y procesar cada elemento de la lista de manera secuencial.
-
MatrizUna matriz es una estructura de datos bidimensional que consta de filas y columnas. En programación, las matrices se utilizan para organizar datos en una forma tabular. Cada elemento en una matriz se puede acceder mediante dos índices: uno para la fila y otro para la columna.append()El método append() es utilizado para agregar un elemento al final de una lista en Python. Este método es útil cuando se desea modificar la lista original agregando un solo elemento al final sin necesidad de reescribir toda la lista.
-
FunciónUna función es un bloque de código que realiza una tarea específica y puede ser reutilizado en diferentes partes del programa. Las funciones en Python pueden aceptar parámetros y devolver un resultado utilizando la palabra clave
return
. Son fundamentales para organizar, modularizar y simplificar el código.ParámetroEn programación, un parámetro es una variable que se define dentro de una función o método para recibir un valor cuando la función es llamada. Los parámetros permiten que las funciones sean reutilizables con diferentes entradas, ya que pueden tomar diferentes valores en cada llamada, lo que las hace más flexibles. -
Paso de Arreglos como ParámetrosEl paso de arreglos como parámetros se refiere al proceso mediante el cual se pasa una referencia a un arreglo (o lista) en lugar de una copia de este a una función. Esto significa que cualquier modificación realizada dentro de la función afectará directamente al arreglo original. Este concepto es esencial cuando se desean realizar cambios en los datos sin duplicar memoria y de manera más eficiente, especialmente cuando se trabaja con arreglos grandes.Función RecursivaUna función recursiva es aquella que se llama a sí misma en su propio cuerpo para resolver un problema. Este tipo de función se utiliza comúnmente para dividir problemas complejos en subproblemas más simples. Una función recursiva debe tener un caso base que detenga las llamadas recursivas infinitas y evite errores de desbordamiento de pila. Es un enfoque útil en problemas matemáticos, de búsqueda y exploración, como la secuencia de Fibonacci o la resolución de laberintos.
-
Archivo de textoUn archivo de texto es un documento digital que contiene información en forma de texto plano, almacenada en el disco duro. En programación con Python, los archivos de texto se pueden abrir, leer, escribir o modificar usando funciones como open(), read() y write(). Estos archivos permiten que los programas conserven datos entre ejecuciones.ExcepciónUna excepción es un error que ocurre durante la ejecución de un programa. Cuando algo sale mal (como intentar abrir un archivo que no existe), Python lanza una excepción que, si no se maneja adecuadamente, puede hacer que el programa se detenga. Usar bloques try y except permite capturar esas excepciones y responder con acciones que eviten fallos inesperados.
-
ModularidadEs el principio de diseño que consiste en dividir un programa en partes independientes llamadas módulos o funciones, cada una encargada de realizar una tarea específica. Esto permite mayor organización, legibilidad, reutilización del código y facilita su mantenimiento.Prueba UnitariaEs un tipo de prueba que verifica el funcionamiento correcto de una función o componente individual del programa de forma aislada. Su objetivo es asegurar que cada unidad de código produzca los resultados esperados antes de integrarse con otros componentes.
-
-
-
- Ceballos Sierra, F. J. (2013). Enciclopedia de Microsoft Visual C: interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. RA-MA Editorial. Disponible en: https://elibro.puce.elogim.com/es/ereader/puce/62510?page=1
- MUÑOZ GUERRERO, L. E. (Il.) ; TREJOS BURITICÁ, O. I. Introducción a la programación con Python. 1. ed. Madrid: RA-MA Editorial, 2021. 188 p. Disponible en: https://elibro.puce.elogim.com/es/ereader/puce/230298?page=1
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO. https://puce.odilo.us/info/facil-aprendizaje-estructuras-de-datos-algoritmos-c-aprenda-facilmente-estructuras-de-datos-graficamente-03127232
- Aprende C en un fin de semana. (s.f.). ODILO. https://puce.odilo.us/info/aprende-c-en-un-fin-de-semana-03105596
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO. https://puce.odilo.us/info/c-5-y-visual-studio-2013-los-fundamentos-del-lenguaje-03126174
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO. https://puce.odilo.us/info/enciclopedia-de-microsoft-visual-c-interfaces-graficas-y-aplicaciones-para-internet-con-windows-forms-y-aspnet-03127168
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro. https://elibro.puce.elogim.com/es/ereader/puce/230298
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO. https://puce.odilo.us/info/facil-aprendizaje-estructuras-de-datos-algoritmos-c-aprenda-facilmente-estructuras-de-datos-graficamente-03127232
- Aprende C en un fin de semana. (s.f.). ODILO. https://puce.odilo.us/info/aprende-c-en-un-fin-de-semana-03105596
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO. https://puce.odilo.us/info/c-5-y-visual-studio-2013-los-fundamentos-del-lenguaje-03126174
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO. https://puce.odilo.us/info/enciclopedia-de-microsoft-visual-c-interfaces-graficas-y-aplicaciones-para-internet-con-windows-forms-y-aspnet-03127168
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro. https://elibro.puce.elogim.com/es/ereader/puce/230298
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO. https://puce.odilo.us/info/facil-aprendizaje-estructuras-de-datos-algoritmos-c-aprenda-facilmente-estructuras-de-datos-graficamente-03127232
- Aprende C en un fin de semana. (s.f.). ODILO. https://puce.odilo.us/info/aprende-c-en-un-fin-de-semana-03105596
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO. https://puce.odilo.us/info/c-5-y-visual-studio-2013-los-fundamentos-del-lenguaje-03126174
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET.(s.f.). ODILO. https://puce.odilo.us/info/enciclopedia-de-microsoft-visual-c-interfaces-graficas-y-aplicaciones-para-internet-con-windows-forms-y-aspnet-03127168
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro. https://elibro.puce.elogim.com/es/ereader/puce/230298
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO. https://puce.odilo.us/info/facil-aprendizaje-estructuras-de-datos-algoritmos-c-aprenda-facilmente-estructuras-de-datos-graficamente-03127232
- Aprende C en un fin de semana. (s.f.). ODILO. https://puce.odilo.us/info/aprende-c-en-un-fin-de-semana-03105596
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO. https://puce.odilo.us/info/c-5-y-visual-studio-2013-los-fundamentos-del-lenguaje-03126174
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO. https://puce.odilo.us/info/enciclopedia-de-microsoft-visual-c-interfaces-graficas-y-aplicaciones-para-internet-con-windows-forms-y-aspnet-03127168
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro. https://elibro.puce.elogim.com/es/ereader/puce/230298
-
- Trejos Buriticá, O. I., & Muñoz Guerrero, L. E. (s.f.). Programación en C: Curso práctico y completo. eLibro. https://elibro.puce.elogim.com/es/ereader/puce/230298
- Yang, H. (s.f.). Fácil aprendizaje de estructuras de datos y algoritmos en C: Aprenda fácilmente estructuras de datos gráficamente. Odilo. https://puce.odilo.us/info/facil-aprendizaje-estructuras-de-datos-algoritmos-c-aprenda-facilmente-estructuras-de-datos-graficamente-03127232
- Moreno Muñoz, A. (s.f.). Aprende C en un fin de semana. Odilo. https://puce.odilo.us/info/aprende-c-en-un-fin-de-semana-03105596
-
- Trejos Buriticá, O. I., & Muñoz Guerrero, L. E. (s.f.). Fundamentos de programación: algoritmos, estructuras de datos y funciones en C/C++. eLibro PUCE.
- Yang, H. (s.f.). Fácil aprendizaje de estructuras de datos y algoritmos en C. Odilo PUCE.
- Moreno Muñoz, A. (s.f.). Aprende C en un fin de semana. Odilo PUCE.
-
- Trejos Buriticá, O. I., & Muñoz Guerrero, L. E. (s.f.). Estructuras de datos y algoritmos con ilustraciones en C++. eLibro PUCE.
- Hu, Y. (s.f.). Fácil aprendizaje de estructuras de datos y algoritmos en C. Odilo PUCE.
- Moreno Muñoz, A. (s.f.). Aprende C en un fin de semana. Odilo PUCE.
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO PUCE.
- Aprende C en un fin de semana. (s.f.). ODILO PUCE.
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO PUCE.
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO PUCE.
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro PUCE.
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO PUCE.
- Aprende C en un fin de semana. (s.f.). ODILO PUCE.
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO PUCE.
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO PUCE.
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro PUCE.
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO PUCE.
- Aprende C en un fin de semana. (s.f.). ODILO PUCE.
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO PUCE.
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO PUCE.
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro PUCE.
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO PUCE.
- Aprende C en un fin de semana. (s.f.). ODILO PUCE.
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO PUCE.
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO PUCE.
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro PUCE.
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO PUCE.
- Aprende C en un fin de semana. (s.f.). ODILO PUCE.
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO PUCE.
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO PUCE.
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro PUCE.
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO PUCE.
- Aprende C en un fin de semana. (s.f.). ODILO PUCE.
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO PUCE.
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO PUCE.
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro PUCE.
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO PUCE.
- Aprende C en un fin de semana. (s.f.). ODILO PUCE.
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO PUCE.
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO PUCE.
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro PUCE.
-
- Algoritmos, estructuras de datos en C: aprenda fácilmente estructuras de datos gráficamente. (s.f.). ODILO PUCE.
- Aprende C en un fin de semana. (s.f.). ODILO PUCE.
- C# 5 y Visual Studio 2013: Los fundamentos del lenguaje. (s.f.). ODILO PUCE.
- Enciclopedia de Microsoft Visual C#: Interfaces gráficas y aplicaciones para Internet con Windows Forms y ASP.NET. (s.f.). ODILO PUCE.
- Introducción a la informática: conceptos fundamentales. (s.f.). eLibro PUCE.
-
-
-
-
Idealización y Ejecución
Coordinación del Proyecto:
Javier CarreraCoordinación Administrativa:
Ana María PeñaCoordinación de Producción:
Fernando SpirituGenerador de contenido académicoDamián Aníbal Nicolalde Rodríguez
ProducciónDiseño Multimedia
- Irvin Villavicencio
- Hans Yépez
Diseño Instruccional
- Salomé Palacios
- Christian Ñacato
Tecnología de la Información
- Juan Andrade
- Carlos Guamán
Soporte y ExperienciaSoporte en aulas
- Alex Tomarema
- Adrián Yépez
Acompañamiento
- Gabriela Yánez
Experiencia de usuario
- Katherine Ramos
Marketing y FinanzasFinanciero
- María José Maldonado
Marketing
- Camila Flor
-