Introducción a Python y Algoritmos
Introducción a Python y Algoritmos
Temario:
● Introducción al curso: duración, objetivos, metodología, evaluación.
● Lenguajes de programación
● Concepto de algoritmo. Entrada-Proceso-Salida.
● Estrategias para la resolución de problemas.
● Introducción a Python: Origen, características del lenguaje, campo de aplicación.
● Instalación y configuración del entorno de desarrollo (Visual Studio Code + Python).
● Interfaz de Visual Studio Code.
● "Hola Mundo" en Python.
Objetivos de la clase
El principal objetivo de esta primera clase es proporcionar a los estudiantes una
introducción al curso y al entorno de programación, sentando las bases conceptuales y
prácticas para el aprendizaje de Python. Durante la clase, se busca que las y los
estudiantes comprendan qué es la programación y su importancia en el contexto actual,
además de familiarizarse con el concepto de algoritmos y el modelo Entrada-Proceso-Salida
como herramientas fundamentales para resolver problemas.
Luis Elena
Desarrollador Senior Desarrolladora Junior
Diego Sofía
Analista de Datos Especialista en UX/UI
Mariana
Gerente de Proyectos
¡Tu primer día en TechLab!
En TechLab, recibimos un nuevo proyecto de
un cliente que requiere el desarrollo de una
aplicación en Python capaz de gestionar
información de clientes, productos y pedidos.
La solución deberá incluir funcionalidades para
registrar, consultar, actualizar y eliminar datos,
utilizando una base de datos SQLite integrada
con el programa.
¡Vamos de a poco!
Antes de encarar este nuevo proyecto debemos capacitarte con los conceptos
básicos de programación. Leé con atención lo que sigue…
¿Qué es la programación?
La programación es un proceso fascinante y esencial en el mundo de la tecnología,
definida como la práctica de escribir instrucciones para que una computadora realice tareas
específicas. Aunque a primera vista parece ser simplemente la escritura de un código, la
programación es mucho más. Representa una manera única de pensar y abordar
problemas, transformando ideas abstractas en aplicaciones concretas y funcionales. La
programación no sólo se trata de conocer lenguajes de programación y sintaxis; implica
también un enfoque lógico y creativo para solucionar problemas, optimizar procesos y crear
nuevas posibilidades dentro del mundo digital. Es un campo dinámico que requiere una
constante actualización de conocimientos y adaptación a nuevas tecnologías y paradigmas.
Lenguajes de programación
Sin embargo, las computadoras no entienden el lenguaje humano sino que debemos
redactar las instrucciones que queramos que realicen de una forma especial. ¿Cómo?
Mediante los lenguajes de programación. Estos son herramientas fundamentales en el
desarrollo de software, actuando como puente entre las y los programadores y las
computadoras. Estos lenguajes permiten escribir instrucciones de manera comprensible,
que luego son convertidas en código que la computadora puede ejecutar. Existen
numerosos lenguajes de programación, cada uno con sus propias reglas de sintaxis y
aplicaciones particulares. Estos lenguajes son diseñados para facilitar la creación de
programas eficientes y efectivos, abarcando desde operaciones básicas hasta complejas
aplicaciones.
Cada lenguaje de programación tiene sus propias fortalezas y se elige en función de las
necesidades específicas del proyecto en desarrollo.
Algoritmos
¿Cómo diseñaremos las instrucciones a seguir por la computadora? Por medio de un
algoritmo: se trata básicamente de una serie de pasos lógicos y ordenados que permiten
resolver un problema o realizar una tarea específica. Podés imaginarlo como una receta de
cocina: tenés ingredientes, seguís una secuencia de instrucciones y al final obtenés un plato
preparado.
El modelo de Entrada-Proceso-Salida nos ayuda a estructurar ese algoritmo de una
manera más clara:
1. Entrada: Son los datos o información que necesitamos para empezar. Por ejemplo,
si queremos calcular el área de un rectángulo, las entradas serían el ancho y el alto.
2. Proceso: Es donde ocurre el "trabajo". Aquí aplicamos operaciones o cálculos sobre
los datos de entrada. Siguiendo el ejemplo, multiplicarías el ancho por el alto para
obtener el área.
3. Salida: Es el resultado final después de procesar los datos. En este caso, el área
calculada del rectángulo.
Entender este modelo es fundamental porque nos permite planificar y estructurar nuestros
programas de manera lógica y eficiente. Cada vez que nos enfrentamos a un problema,
podemos descomponerlo en estas tres partes para encontrar la solución más adecuada.
En varias ocasiones en TechLab debemos generar aplicaciones que sólo deben poder
utilizar personas mayores de edad. ¿Podés imaginar cómo se vería el algoritmo de un
programa que resuelva este problema? Veamos cómo aplicamos el modelo de
Entrada-Proceso-Salida en este caso.
Entrada:
Proceso:
Este ejemplo es sencillo pero nos sirve para que veas cómo estructuramos un algoritmo.
Descomponemos el problema en pasos lógicos que el programa puede seguir para llegar a
una solución. Además, este tipo de lógica es muy común en desarrollo de software, ya que
frecuentemente necesitamos tomar decisiones basadas en la información que recibimos del
usuario o usuaria.
Representación de algoritmos.
La representación de algoritmos se puede realizar de diversas maneras: cada una
adecuada para diferentes etapas del desarrollo o para diferentes públicos. Las tres formas
más comunes son los diagramas de flujo, el pseudocódigo y el código fuente.
Diagrama de flujo.
Cada una de estas representaciones tiene su propósito y su público objetivo. Mientras que
los diagramas de flujo y el pseudocódigo son excelentes para la enseñanza y la
planificación, el código fuente es necesario para la implementación efectiva de los
algoritmos en aplicaciones reales.
Introducción a Python
Evolución y popularidad.
Python se distingue por ser un lenguaje que combina eficiencia, claridad y potencia,
ofreciendo un equilibrio ideal entre facilidad de aprendizaje y capacidad para realizar tareas
complejas. Su diseño orientado a mejorar la experiencia tanto de personas novatas como
experimentadas ha llevado a Python a ser uno de los lenguajes de programación más
enseñados en las universidades y más empleados en la industria hoy en día.
Instalación de Python
Tu primera tarea será instalar el intérprete Python desde su página oficial en tu
computadora de TechLab. ¡Veamos cómo!
● Ingresamos a Downloads y hacemos clic en el botón Download Python.
● Asegúrate de descargar la última versión (o como mínimo la versión 3.8.x).
Procedemos con la instalación realizando los pasos típicos para instalar aplicaciones en
nuestro sistema operativo.
Instalación de VSCode
Tu segunda tarea será instalar el entorno en el cual trabajarás en TechLab. ¿Sabías que
para escribir código utilizaremos un editor de texto llamado Visual Studio Code?
Lo descargamos desde su página oficial y seguimos los pasos necesarios para su
instalación, asegurándonos de crear un ícono de acceso en el escritorio o menú de nuestra
computadora. ¡Qué emoción!
Hacé clic acá para acceder a la página oficial de VSCode
El diseño de Visual Studio Code (VSCode) está dividido en cinco áreas principales:
● Editor: Esta es la parte principal donde escribís tu código. Podés abrir varios
archivos al mismo tiempo y verlos en diferentes secciones, tanto vertical como
horizontalmente. Se parece bastante a la ventana de un navegador web y su
sistema de pestañas. Podés borrarlas, moverlas, abrir nuevas, etcétera.
● Barra lateral principal: En esta sección encontrarás varias herramientas que te
ayudan a trabajar en tu proyecto, como un explorador de archivos que te permite ver
y acceder a todos los archivos de tu proyecto. Este explorador es similar al
explorador de archivos que posee tu sistema operativo, pero está integrado en el
editor.
● Barra de estado: En la parte inferior de la ventana, una barra de estado muestra
información sobre tu proyecto y los archivos que estás editando, como el nombre del
archivo y el estado de [Link] la pierdas de vista: siempre hay información útil
en esa zona de VSCode.
● Barra lateral: Está ubicada en el lado izquierdo. Te permite cambiar entre diferentes
vistas y te muestra indicadores adicionales, como el número de cambios pendientes,
si tenemos compartido algún puerto de comunicaciones, etcétera. Quizás no nos sea
demasiado útil hasta dentro de un tiempo.
● Terminal: Este panel se encuentra en la parte inferior de la ventana, debajo del
editor. Muestra información adicional como resultados de pruebas, errores y
advertencias y una terminal integrada donde podés escribir comandos y ver el
resultado de la ejecución de tus programas Python. Este panel es móvil, podés
ubicarlo a los lados izquierdo o derecho si preferís más espacio vertical en el editor.
¡Tu primer programa en TechLab! Te queremos contar que escribir una línea de código en
VSCode es muy parecido a escribir texto en un procesador de textos, como Word o Google
Docs. Primero, necesitás abrir VS Code y, dentro de él, abrir un archivo donde quieras
escribir tu código.
No te olvides guardar el archivo luego de escribir tu código, es muy importante para no
perder tu trabajo. En VSCode, puedes hacer esto haciendo clic en el icono de guardar
(parece un disquete) en la parte superior de la ventana, o usando el atajo de teclado (Ctrl+S
en Windows o Cmd+S en Mac). También puedes activar la opción “Autoguardado” que
aparece en el menú “Archivo”, y VSCode se encargará de guardar por vos cada
modificación que hagas en el código.
Una vez que tu archivo esté abierto en VS Code, empezás a escribir código en el área
principal del editor. Hacé clic en el área donde quieras escribir y comenzá a tipear.
print("¡Hola, Mundo!")
● Ejecutá el programa:
○ Abrí la terminal integrada en VS Code (podés hacerlo con la tecla Ctrl+ñ o
Ctrl+Shift+).
○ Asegurate de que la terminal esté en la carpeta correcta.
○ Ejecutá el comando:
python hola_mundo.py
¡Hola, Mundo!
Reflexión final
¡Felicitaciones por completar tu primer día! Ya lograste configurar tu entorno de desarrollo,
creado un proyecto y ejecutado tu primer programa. ¡No es poca cosa! Este es el primer
paso fundamental para el éxito de nuestro proyecto en TechLab, donde pronto
comenzaremos a construir soluciones más completas y útiles para satisfacer las
necesidades de nuestras y nuestros clientes. Clase a clase desarrollaremos más y más
herramientas que te ayuden a enfrentar los desafíos que vendrán.
¡Eso es todo por hoy!
Materiales y recursos adicionales:
UNIR Formación Profesional: Algoritmo: ¿qué es, para qué sirve, ejemplos de algoritmos y
cómo funciona
Cinco Noticias: Algoritmos cotidianos
Nate Gentile: ¿Cómo funciona una computadora y qué hace cada parte?
GCFAprendeLibre: |¿Qué es software y qué es hardware?
Sitio oficial de VSC: Visual Studio Code Online y Documentación de Visual Studio Code
[Link]: Python Online Compiler
El Blog de Aitana: Atajos de teclado en Visual Studio Code
Ejercicio práctico:
Preparar tu computadora para trabajar con Python,, asegurando que todas las herramientas
estén correctamente instaladas y configuradas.
Código ejemplo:
Próximos pasos
En la próxima capacitación de TechLab, vamos a dar un paso más en el desarrollo de
nuestras habilidades en Python. Aprenderemos cómo usar variables para almacenar
información, cómo interactuar con la usuaria o usuario mediante funciones como input() y
print() y cómo realizar operaciones aritméticas simples. Estos conceptos serán
fundamentales para empezar a construir programas más dinámicos y útiles.
Objetivos de la clase
Además, se presentarán las funciones print() e input(), esenciales para la interacción entre
el programa y quien lo utilice. A través de estas herramientas, comprenderán cómo
implementar el modelo Entrada-Proceso-Salida para crear programas simples y funcionales.
Variables en Python
Variables en Python
El concepto de variable es uno de los pilares de la programación y es común a todos los
lenguajes por lo que entenderlo será fundamental para todas las personas que deseen
iniciarse en el desarrollo de software. Las mismas son centrales ya que nos permiten que
los programas sean dinámicos y flexibles. ¡Comencemos!
Veamos un ejemplo:
En este ejemplo, “mensaje” es una variable que contiene el texto "Hola, Mundo". El
operador de asignación en Python es el símbolo =: se utiliza para asignar un valor a una
variable. La forma en que funciona es bastante sencilla pero fundamental para casi
cualquier programa. La estructura básica de una asignación es:
Formas de asignación.
Asignación única: Cada vez que usás el operador de asignación podés establecer o
cambiar el valor de una variable. Si la variable ya tiene un valor determinado, el mismo será
reemplazado por el nuevo valor asignado.
edad = 30
nombre = "Juan"
Asignaciones múltiples: Python también permite la asignación múltiple, lo que te permite
asignar valores a varias variables en una sola línea de código. Veamos cómo se vería el
código de las asignaciones múltiples de varias variables:
x, y, z = 1, 2, 3
También podés modificar el valor actual de una variable. ¿Cómo? En el ejemplo siguiente,
se establece el valor de la variable contador a “0”. En la siguiente línea de código contador
recibe un nuevo valor, 1, por lo que el valor final de la variable será 1. Esto es útil para
actualizar el contenido de una variable cuando sea necesario:
contador = 0
contador = 1 # Actualiza el valor de contador a 1
Además en Python, una variable puede comenzar almacenando un tipo de dato, como un
número, y luego cambiar para almacenar un tipo de dato diferente, como una cadena de
caracteres o una lista. Esto es posible gracias al tipado dinámico de Python. Por ejemplo:
dato = 100
dato = "Cien"
En este ejemplo, “dato” inicialmente almacena un valor numérico (100), pero luego cambia
para almacenar una cadena de caracteres ("Cien").
1. Caracteres permitidos: Los nombres de las variables pueden incluir letras
(mayúsculas y minúsculas), números y guiones bajos (_). Sin embargo, deben
comenzar con una letra o un guión bajo. Por ejemplo, _miVariable o miVariable son
válidos, pero 1miVariable no lo es.
2. Palabras reservadas: Python reserva un conjunto de palabras para su sintaxis y
estructura de lenguaje, conocidas como palabras reservadas. Estas no pueden ser
utilizadas como nombres de variables. Algunas de estas palabras incluyen if, for,
class, return, global, entre otras. Intentar usar una palabra reservada como nombre
de variable resultará en un error de sintaxis.
3. Sensibilidad a mayúsculas y minúsculas: Python diferencia entre mayúsculas y
minúsculas. Esto significa que variable, Variable y VARIABLE serían consideradas
tres variables distintas. Aunque técnicamente es posible tener variables con
nombres tan similares, esto no es recomendable ya que puede prestarse a la
confusión.
Además, en Python, el uso de un guión bajo (_) al principio del nombre de una variable,
como en _privado, tiene un significado especial. Esto refiere al alcance de la variable (o
método): significa que ésta es privada y está destinada para uso interno dentro de una
clase o módulo. Aunque Python no aplica esta privacidad de manera estricta, es una
convención ampliamente respetada entre las personas que desarrollan software.
Ejemplos:
edad = 25
numero_de_estrellas = -100
años = 2023
Estos ejemplos muestran cómo asignar un número entero a una variable.
altura = 1.75
temperatura = -20.3
precio = 19.99
Cada ejemplo asigna un número decimal a una variable. Las operaciones con flotantes
siguen las reglas de la aritmética de punto flotante.
Ejemplos:
nombre = "Juan"
mensaje = "Hola, Mundo"
letra = 'A'
Aquí, nombre, mensaje y letra son variables que almacenan cadenas de texto.
4. Booleano (bool)
Los booleanos representan dos valores: Verdadero (True) y Falso (False). Como
comprobarás dentro de poco, son muy utilizados en estructuras de control.
Ejemplos:
es_mayor_de_edad = True
examen_aprobado = False
Los tipos de datos en Python son la base sobre la cual se construyen las estructuras de
datos y se realizan operaciones. Es importante que los conozcas y recuerdes, ya que van a
facilitar la manipulación de datos y la implementación de lógica compleja en los programas.
A medida que avances, trabajaremos con tipos de datos más complejos (como las listas y
diccionarios) y sus métodos asociados, lo que te permitirá construir programas más
potentes y eficientes.
Luis te envía esta tabla, que resume lo visto sobre tipos de datos simples:
Número int Los enteros son números sin parte decimal, que
entero pueden ser positivos o negativos.
La función print()
Una función es simplemente un conjunto de instrucciones que Python ya conoce y que
puede ejecutar cuando se lo pedís. Cuando usas print(), le estas diciendo a Python que
ejecute la función print. Podés pensar en una función como si fuese una receta, una serie
de pasos que te permiten lograr un resultado, como preparar un plato de comida. En
Python, las funciones hacen eso mismo: siguen una serie de pasos para realizar una tarea
específica.
Aunque aún no conocemos todos los detalles, la idea principal es que una función es algo
que puedes usar para realizar tareas en tu programa de manera sencilla. Dentro de poco
aprenderemos a crear nuestras propias funciones, pero por ahora, pensá en print() como un
ejemplo de cómo una función puede hacer que los programas sean útiles y poderosos.
La función print() es utilizada para imprimir datos en la terminal. Acepta múltiples valores
entre los paréntesis, los cuales pueden ser variables, literales (textos directos), o una
combinación de ambos separados por comas. Podés delimitar las cadenas de texto con
comillas simples (') o dobles ("), según prefieras. Por defecto, después de imprimir, print() se
añade un salto de línea, moviendo el cursor a la línea siguiente. Si se invoca print() sin
pasarle argumentos, simplemente imprimirá una línea en blanco.
nombre = "Mundo"
print("Hola,", nombre) # “Hola” y nombre son dos argumentos.
# Salida: Hola, Mundo
La línea de código de color verde, al final del código anterior, es un comentario. En Python,
los comentarios se crean utilizando el símbolo #. Cuando escribís “#” al comienzo de una
línea o en cualquier parte de ella, todo lo que sigue a la derecha del símbolo se considerará
un comentario. Python ignora cualquier texto que esté precedido por #, lo que significa que
esos comentarios no afectarán en absoluto el funcionamiento de tu código. Los comentarios
son útiles para dejar notas, explicar lo que hace una parte del código, o para desactivar
temporalmente una línea de código sin eliminarla. Por ejemplo, si deseás explicar qué hace
una sección específica de tu programa podés agregar un comentario justo encima de esa
sección o al final de la línea de código correspondiente. Es importante usar comentarios de
manera clara para que otras personas (o vos mismo en el futuro) puedan entender
fácilmente lo que el código está haciendo y el propósito detrás de ciertas decisiones. En
este caso, estamos usando los comentarios para indicar qué se mostrará en la terminal al
ejecutar el ejemplo propuesto.
Si una cadena contiene los caracteres \n (Nueva línea), cuando print() muestre su contenido
en la pantalla insertará un salto de línea en ese punto:
print("Hola\nMundo")
# Salida:
# Hola
# Mundo
Consideraciones al usar \t
La tabulación (\t) inserta un número fijo de espacios, que puede variar según el entorno
donde se visualice el texto pero comúnmente equivale a 4 u 8 espacios. Su efectividad para
alinear texto depende de la longitud de las cadenas que lo preceden o siguen. Si las
cadenas son más largas o más cortas de lo esperado la alineación puede no ser la
deseada.
print("Producto\tPrecio")
print("Manzanas\t$ 1.00")
print("Peras\t\t$ 1.50")
# Salida:
# Producto Precio
# Manzanas $ 1.00
# Peras $ 1.50
Más adelante aprenderás otras maneras más efectivas y flexibles de dar formato a las
cadenas de texto.
La función input()
Esta función es una herramienta interactiva que permite a los programas utilizar datos
introducidos por el la persona que usa el programa a través del teclado. Cuando se
ejecuta, input() pausa la ejecución del programa y espera que la persona escriba algo,
devolviendo o “retornando” lo escrito como una cadena de caracteres (string) luego de que
se presione “enter”. Este mecanismo es indispensable para crear aplicaciones interactivas
que requieren la participación de nuestra persona usuaria. Input() tiene los siguientes
propósitos:
Sintaxis básica
La sintaxis básica de input() es:
variable = input(prompt)
Solicitar un nombre:
Este código pedirá a quien interactúe con él que introduzca su nombre y luego le saludará
personalmente. Si alguien introduce el nombre “Mariana”, se imprimirá: “Hola, Mariana”.
Pero no te olvides de algo fundamental: input() siempre devuelve cadenas de caracteres.
Si necesitamos que la persona introduzca un tipo de dato diferente, como por ejemplo un
número entero, necesitamos utilizar las funciones de conversión de tipos de datos.
entero = 10
decimal = float(entero)
print(decimal) # 10.0
En este caso float(entero) utiliza la función float para convertir el número entero 10 a un
número decimal 10.0.
decimal = 3.14
entero = int(decimal)
print(entero) # 3
edad = 25
mensaje = "Tengo " + str(edad) + " años."
print(mensaje) # Tengo 25 años.
Como podés ver, str(edad) convierte el número entero 25 a una cadena de caracteres "25",
permitiendo su concatenación con otras cadenas de caracteres. Si bien pareciera decir lo
mismo en ambos casos, recordá que lo importante es cómo interpreta Python el valor 25.
Al comenzar edad es un número entero y al finalizar es una cadena de caracteres.
cadena_numerica = "123"
numero = int(cadena_numerica)
print(numero + 7) # 130
Aquí, True se convierte a 1 y False a 0, lo cual es muy útil en cálculos que dependen de
condiciones lógicas.
numero = 0
print(bool(numero)) # False
numero = 5
print(bool(numero)) # True
La función type()
Esta función es una herramienta de desarrollo retorna el tipo de dato consultado. ¿Cómo
funciona? Veámoslo con un ejemplo: Imaginate que necesitás saber cómo está
interpretando Python un dato. Para resolverlo le solicitás que imprima el tipo de dato de la
variable “numero”, es decir que nos devuelve su “clase” (<class>), asignando su nombre
como argumento. Se imprimirá “<class ‘int’>”, detectando qué tipo de dato es el objeto
“numero”: un entero. Esto incluye tipos de datos integrados como enteros, flotantes,
cadenas de texto, listas, diccionarios, y más. Veamos algunos otros ejemplos para ilustrar
cómo se utiliza type() verificando el tipo de datos básicos.
numero = 42
print(type(numero)) # <class 'int'>
precio = 19.99
print(type(precio)) # <class 'float'>
esMayorDeEdad = True
print(type(esMayorDeEdad)) # <class 'bool'>
Cada llamada a type() te devuelve el tipo del valor asignado a la variable: int para enteros,
float para flotantes, str para cadenas de texto y bool para booleanos.
¡Epa! ¿Qué hace ese “edad + 1” dentro del print()? En realidad, es bastante intuitivo: le
suma 1 al valor que tenga la variable edad. Algo que sólo se puede hacer si “edad” es una
variable de tipo numérico. Ese “+” es un operador aritmético.
Los operadores.
Se trata de carácteres que actúan sobre una, dos o más variables y/o literales para llevar a
cabo una operación de alguna clase, devolviendo un resultado.
Operadores aritméticos
Dentro de los más comunes están los operadores aritméticos, que son los que utilizamos
habitualmente para realizar cuentas con números en nuestra vida diaria. Python posee los
mismos que encontramos en una calculadora electrónica y agrega algunos más. También
podemos encontrar los operadores lógicos y los relacionales, que analizaremos más
adelante.
Los operadores aritméticos son fundamentales para realizar cálculos en cualquier programa
de Python, y permiten sumar, restar, multiplicar, dividir y mucho más. A continuación,
analizaremos cada uno de ellos con ejemplos:
resultado = 5 + 3 # resultado = 8
resultado = 5 - 3 # resultado = 2
División entera (//): Divide el primer valor entre el segundo y redondea el resultado hacia
abajo para obtener un número entero (int).
resultado = 7 // 3 # resultado = 2
Módulo (%): Retorna o devuelve el sobrante de la división entre el primer y segundo valor.
resultado = 7 % 3 # resultado = 1
resultado = 2 ** 3 # resultado = 8
Ejercicio práctico.
Luego de haber aprendido qué son y cómo se utilizan las variables y cómo podés
interactuar con una persona a través de la terminal, ya podés resolver la tarea que
mencionaron Luis y Mariana. En su siguiente correo, ella te da detalles de lo que necesita
que hagas:
¡Hola!
Saludos,
Mariana”
Estos conceptos serán aplicados para mejorar el programa que creaste hoy, validando que
los datos ingresados sean correctos y clasificando la información según las necesidades de
los usuarios y usuarias. Este es un paso clave hacia la creación de programas más
inteligentes y prácticos. ¡Nos vemos en la próxima clase!
Clase N° 3 | Condicionales I
Temario:
● Operadores lógicos y relacionales.
● Control de flujo: estructuras condicionales if y else.
● Comentarios en el código.
Objetivos de la clase
El principal objetivo de esta clase es introducir a las y los estudiantes en el uso de
estructuras condicionales en Python, herramientas clave para tomar decisiones dentro de
un programa. A través de la implementación de los bloques if y else, los estudiantes
aprenderán a controlar el flujo de ejecución según las condiciones definidas.
Operadores relacionales
Los operadores relacionales en Python, que también se conocen como operadores de
comparación, sirven para algo clave: comparar valores. El resultado de esta comparación
siempre es un valor booleano, es decir, True (verdadero) o False (falso), dependiendo de si
la condición que estás evaluando es cierta o no.
Ahora, vayamos a lo importante: ¿qué operadores relacionales tenés a tu disposición en
Python?
Esto es súper importante, porque estos operadores son los que te permiten
tomar decisiones en tus programas. Los vas a usar un montón cuando trabajes
con estructuras como if, else y elif, o cuando necesites crear bucles con while o
controlar iteraciones con for.
Veamos unos ejemplos para que te quede más claro cómo funcionan:
Hasta acá, parece bastante sencillo, ¿no? Pero hay algo más interesante que vale la pena
mencionar: ¿cómo compara Python las cadenas de caracteres?
Acá viene lo interesante. Las cadenas de texto se comparan carácter por carácter,
siguiendo un orden basado en su codificación (ASCII o Unicode). Esto significa que Python
va a ir chequeando cada carácter de la cadena, de izquierda a derecha, hasta que
encuentra una diferencia o hasta que una de las cadenas se termine. Entonces, cuando
usás operadores relacionales con cadenas de texto, Python sigue estas reglas:
Vamos a ver un par de ejemplos para aclarar cómo se comportan las comparaciones de
cadenas:
Operadores lógicos.
Los operadores lógicos en Python son clave cuando querés trabajar con múltiples
condiciones al mismo tiempo. Imaginate que estás desarrollando una aplicación donde
necesitás verificar varias cosas a la vez, como si un usuario está logueado y además tiene
los permisos necesarios para acceder a cierta función. Es acá donde entran en juego los
operadores lógicos, que te permiten combinar distintas afirmaciones y evaluarlas juntas. Al
final, todo se reduce a si esas afirmaciones son True (verdaderas) o False (falsas).
En Python, tenés tres operadores lógicos principales: and, or y not. Cada uno tiene su
propio comportamiento, pero todos ellos trabajan sobre expresiones que resultan en valores
booleanos, es decir, True o False.
Operador “and”.
El operador and es bastante directo: sólo devuelve True si todas las condiciones que estás
evaluando son verdaderas. Basta con que una sola sea falsa para que el resultado total sea
False. Es como decir: "quiero que todo lo que estoy evaluando cumpla con la condición".
Operador “or”.
El operador or, por otro lado, es un poco más relajado. Con él, alcanza con que una sola de
las condiciones sea verdadera para que el resultado total sea True. Sólo va a devolver
False si todas las condiciones son falsas. Es como decir: "si al menos una cosa cumple,
está bien".
Operador “not”.
Finalmente, tenemos el operador not. Este es el que invierte el valor de verdad de una
expresión. Si algo es True, not lo convierte en False, y viceversa. Es como un interruptor de
luz: lo que está prendido lo apaga, y lo que está apagado lo prende.
Estos operadores lógicos son esenciales para cualquier lenguaje de programación y Python
los maneja de manera súper intuitiva. En tus futuros programas, vas a ver cómo te permiten
tomar decisiones más complejas, desde validar varias condiciones hasta hacer que tu
código responda de manera diferente dependiendo de múltiples factores.
Luis, como programador experimentado que es, te comparte unas tablas que usa para
recordar qué resultado se obtiene con cada operador en cada caso:
V V V V
V F F V
F V F V
F F F F
Condición NO (not)
V F
F V
Estructuras de control.
Imaginá que estás manejando un auto. No sólo te limitás a acelerar o frenar, sino que
también tomás decisiones según las señales de tránsito, girás cuando es necesario, y a
veces, das vueltas por el mismo lugar varias veces (¡ojo con eso!). En la programación pasa
algo parecido: las estructuras de control son esas herramientas que te permiten decidir por
dónde ir, repetir una acción o tomar un desvío según las condiciones. Son el volante y los
frenos de tu código.
Las estructuras de control en Python son clave porque te permiten tener un programa que
no simplemente corre una lista de instrucciones de manera secuencial, sino que puede
adaptarse a distintas situaciones. Dependiendo de las condiciones que se encuentren,
podés hacer que el programa ejecute una parte del código o repita una acción varias veces.
El propósito principal de estas estructuras es justamente darle esa flexibilidad a tu programa
para que pueda "tomar decisiones". En lugar de que todo el código se ejecute de forma
lineal, las estructuras de control le dicen al programa cuándo detenerse, repetir algo o saltar
a otro bloque de código dependiendo de lo que está ocurriendo en ese momento. Esto es lo
que hace que un programa pueda, por ejemplo, responder de manera diferente según la
entrada de un usuario, realizar tareas repetitivas automáticamente o procesar datos de
manera más eficiente.
Con estas herramientas, vas a poder hacer que tu programa no sólo funcione, sino que
también piense, decida y actúe por su cuenta, ajustándose a lo que necesite en cada
momento. ¡El verdadero poder de la programación está en estas estructuras!
La forma más básica de hacer esto es con la palabra clave if. Con if, podés indicarle a
Python que ejecute cierto bloque de código sólo si se cumple una condición. Si esa
condición es verdadera (o sea, True), Python va a ejecutar el código que está indentado
justo debajo del if. Si no se cumple (o sea, es False), Python va a ignorar ese bloque y
seguirá con lo que venga después.
numero = 5
if numero > 0:
print("El número es positivo.")
Acá lo que estamos haciendo es preguntarle a Python: "¿Es el número mayor que 0?" Si la
respuesta es sí (o sea, True), se va a ejecutar la línea que está indentada justo después del
if, que imprime "El número es positivo.". Si el número hubiera sido 0 o negativo, ese bloque
de código se saltaría y Python seguiría con lo que venga después.
Esa simple verificación es como el cerebro del programa, que decide qué hacer según la
información que tiene. ¡Es lo que hace que los programas sean flexibles y puedan
adaptarse!
1. Condición: Lo primero que necesita el if es una condición. Esto puede ser cualquier
expresión que Python pueda evaluar como True o False. Por ejemplo, numero > 0
es una condición que le pregunta a Python si numero es mayor que 0.
2. Dos puntos (:): Estos dos puntos que aparecen al final de la línea if son muy
importantes. Le dicen a Python que el bloque de código que sigue está relacionado
con esa condición.
3. Bloque de código indentado: Todo el código que esté indentado debajo del if se va
a ejecutar solo si la condición es True. Y ojo con esto: la indentación es obligatoria
en Python.
Esa pequeña sangría al principio de la línea no es sólo por estilo; le dice a Python que esas
líneas de código forman parte del bloque del if.
edad = 18
En este caso, estamos verificando si alguien tiene 18 años o más. Si la condición es True,
Python va a imprimir "Sos mayor de edad". Si no, simplemente va a seguir con el resto del
programa, sin hacer nada especial con esa línea.
Recordá esto. ¡Te va a servir para poder resolver el pedido que te hizo Luis en
su correo!
Y esto es solo el principio. Ahora pronto vas a ver cómo podés manejar situaciones que no
cumplen ninguna condición con else.
Estructura condicional if...else
Hasta ahora vimos cómo if le da la capacidad a tu programa de tomar decisiones cuando
una condición es verdadera. Pero, ¿qué pasa cuando esa condición no se cumple? Ahí es
donde entra en juego else. Mientras que if se encarga de ejecutar un bloque de código
solo si algo es True, else viene al rescate cuando esa condición resulta ser False,
permitiéndote hacer algo diferente en ese caso. Es como decir: "Si pasa esto, hacé tal cosa,
y si no, hacé esto otro".
El else no necesita tener una condición propia. Se ejecuta solo si el if que lo precede da
como resultado False. Imaginá que estás manejando y, si tenés combustible, seguís
adelante, pero si no tenés, vas directo a cargar nafta. Esa es la idea detrás de if...else.
numero = -5
if numero > 0:
print("El número es positivo.")
else:
print("El número no es positivo.")
Acá, lo que está pasando es que le preguntamos a Python si numero es mayor que 0. Como
en este caso numero es -5, la condición es False, entonces Python se saltea el bloque del if
y salta directo al else, que imprime "El número no es positivo". Si el número hubiera sido
positivo, el else ni siquiera se ejecutaría.
edad = 16
Acá estamos haciendo que Python verifique si alguien es mayor o igual a 18. Si la respuesta
es True, imprime "Sos mayor de edad", pero si es False, el programa no se queda sin hacer
nada: imprime "Sos menor de edad". Así, el código no solo evalúa la condición, sino que
también reacciona de manera diferente si la condición no se cumple.
Si combinás if con else, podés manejar cualquier situación que se te presente: desde validar
formularios, hasta hacer que un juego responda de manera diferente según las decisiones
del jugador. Todo depende de las condiciones que estés evaluando, y con else, tenés la
tranquilidad de que nada va a quedar sin manejar.
Veamos otro ejemplo con else. Supongamos que querés verificar si un producto tiene un
precio menor a $500. Podrías hacer algo así:
precio = 450
if precio < 500:
print("El producto es económico.")
else:
print("El producto es costoso.")
Y, por supuesto, podés construir condiciones que usen operadores lógicos. Por ejemplo, si
querés verificar si una persona puede votar en base a su edad y ciudadanía:
edad = 20
es_ciudadano = True
Este ejemplo te muestra cómo combinar condiciones para evaluar múltiples criterios al
mismo tiempo
Además de los comentarios simples que empiezan con #, Python permite usar comentarios
multilínea, que sirven para explicar procesos o ideas más complejas que no entran en una
sola línea. A continuación, repasamos ambos tipos:
Como ya vimos, los comentarios simples se escriben anteponiendo el símbolo # a una línea
o parte de una línea. Son ideales para anotar explicaciones breves o desactivar
temporalmente líneas de código.
Ejemplo:
2. Comentarios multilínea
Python no tiene un símbolo específico para comentarios multilínea, pero se pueden simular
utilizando cadenas de texto de varias líneas (tres comillas simples o dobles). Aunque estas
cadenas están diseñadas para definir textos largos dentro del código, se utilizan
comúnmente como comentarios para explicar procesos más complejos.
Ejemplo:
"""
Este programa calcula el área de un rectángulo.
Primero define la base y la altura,
luego multiplica ambos valores para obtener el área.
Finalmente, muestra el resultado en pantalla.
"""
base = 5
altura = 10
area = base * altura
print("El área es:", area)
Si bien estas cadenas no son técnicamente comentarios (ya que Python las
interpreta como texto), son ignoradas cuando no están asignadas a una
variable, por lo que se comportan como comentarios en la práctica.
Los comentarios multilínea son útiles para documentar módulos, funciones o partes
extensas del código. Y dado que estos comentarios son una cadena de texto, se pueden
reemplazar las triples comillas dobles por triples comillas simples.
Sé claro y preciso: Los comentarios deben explicar el propósito del código, no describir lo
obvio. Por ejemplo, en lugar de:
x = 5 # Asignamos 5 a x
Es mejor:
Evitá comentarios redundantes: El código debe ser lo suficientemente claro como para no
necesitar explicaciones obvias.
Los comentarios son una herramienta importante para escribir código comprensible y
mantenible. Usar comentarios de manera adecuada no sólo mejora la legibilidad del código,
sino que también facilita su mantenimiento y colaboración en proyectos.
Ejercicio práctico.
Luego de un día intenso en TalentoLab , y gracias a la ayuda inestimable de Luis, ya podés
intentar resolver la tarea que te encargó Mariana. Cómo siempre, te escribió un correo
explicando detalladamente que necesita que hagas:
¡Hola!
Saludos,
Mariana
Materiales y recursos adicionales
Artículos:
Videos:
Tutoriales sobre ciencia y tecnología: Estructura if y estructura if…else
Próximos pasos
En la próxima clase, vamos a profundizar en las estructuras condicionales, introduciendo
herramientas más avanzadas como elif y match, que nos permitirán manejar múltiples
escenarios en un solo bloque de código. Estas estructuras serán clave para tomar
decisiones más complejas y optimizar nuestros programas.
Todo esto nos ayudará a continuar desarrollando programas más dinámicos y adaptados a
las necesidades reales de posibles clientes.
Clase N° 4 | Condicionales II
Temario:
● Estructuras condicionales avanzadas: elif y match.
● Manipulación de cadenas: acceso a caracteres, concatenación, longitud.
● Métodos de cadenas: .lower(), .upper(), .title(), etc.
● Formateo de cadenas con f-Strings.
● Ruta de avance.
Objetivos de la clase
El principal objetivo de esta clase es ampliar el manejo de estructuras condicionales en
Python, introduciendo herramientas avanzadas como elif y match, que permiten gestionar
múltiples escenarios en un mismo programa de forma más clara y eficiente. Estas
estructuras son fundamentales para diseñar soluciones más completas y adaptativas.
Además, se busca que los estudiantes comprendan cómo manipular cadenas de texto,
accediendo a sus caracteres, concatenándolas, calculando su longitud y transformándolas
mediante métodos como .lower() y .upper(). Estas habilidades son esenciales para procesar
y presentar información de manera efectiva.
Por último, se trabajará en el formateo de cadenas utilizando f-Strings, una técnica que
simplifica la generación de salidas dinámicas y profesionales. Al finalizar la clase, estarán
en condiciones de combinar estas herramientas para construir programas que gestionen
datos textuales de manera avanzada, respondiendo a necesidades reales de las y los
usuarios.
TechLab: Jornada 4 ☀️
Claramente, es algo que no podés hacer con tus conocimientos actuales. Afortunadamente,
Luis está ahí para ayudarte. Buscan un despacho libre, y comienzan a ver que necesitás
saber para poder resolver este nuevo desafío.
Estructuras condicionales avanzadas: elif
Estructuras condicionales avanzadas: elif
En la clase anterior aprendimos a usar las estructuras condicionales if y if...else, que nos
permiten tomar decisiones básicas dentro de un programa. Sin embargo, en situaciones
donde necesitamos manejar múltiples condiciones, escribir varios bloques if puede volver
nuestro código repetitivo y difícil de seguir. Ahí es donde entra en juego elif.
El bloque elif (abreviatura de "else if") nos permite manejar múltiples casos
dentro de una misma estructura condicional, evitando redundancias y haciendo
que nuestro código sea más eficiente y legible.
edad = 25
En este ejemplo, el programa evalúa la edad del usuario o usuaria y muestra un mensaje
correspondiente al rango etario. Observá cómo elif simplifica el manejo de múltiples
condiciones, haciendo que el flujo del programa sea claro y directo.
1. Hay múltiples condiciones mutuamente excluyentes (es decir, sólo una puede ser
verdadera).
2. Queremos evitar escribir varios bloques if independientes que podrían complicar el
seguimiento del código.
Imaginá que estás programando un sistema para clasificar notas escolares. El programa
debería asignar una categoría según el puntaje del estudiante:
Este ejemplo muestra cómo elif permite manejar fácilmente varias categorías sin repetir
código innecesariamente.
Podemos combinar elif con operadores lógicos para evaluar condiciones más complejas.
Por ejemplo:
Este programa clasifica a las personas según su edad y nivel de ingresos, mostrando cómo
elif se combina con operadores para resolver problemas más realistas.
La estructura match fue introducida en la versión 3.10 de Python, como una alternativa más
clara y poderosa al uso de múltiples bloques if...elif...else, especialmente cuando queremos
comparar un valor específico con varias opciones posibles. Es similar a la estructura switch
de otros lenguajes de programación y se utiliza para simplificar el manejo de casos
múltiples.
La sintaxis de match
La estructura match en Python se utiliza para comparar el valor de una variable con
diferentes patrones, ejecutando el bloque de código asociado al primer patrón que coincida.
Esta herramienta es especialmente útil cuando tenés que manejar múltiples opciones de
forma clara y organizada.
match variable:
case valor1:
# Código si variable coincide con valor1
case valor2:
# Código si variable coincide con valor2
case _:
# Código si no coincide ningún caso (opcional)
● variable: Es el valor que queremos comparar. Puede ser de cualquier tipo, como
números, cadenas, tuplas, etc.
● case valor1: Define un caso específico. Si variable coincide con este valor, se
ejecuta el bloque de código asociado.
● _ (guión bajo): Representa el caso por defecto, que se ejecuta si no hay
coincidencia con ninguno de los casos anteriores. Es equivalente al else en un
bloque condicional.
Python evalúa los casos en orden, deteniéndose en el primero que coincide. Esto hace que
el flujo del programa sea eficiente y fácil de seguir. Pero veamos un ejemplo:
match fruta:
case "manzana":
print("Es una fruta roja o verde.")
case "banana":
print("Es una fruta amarilla.")
case "naranja":
print("Es una fruta anaranjada.")
case _:
print("No tengo información sobre esa fruta.")
En este ejemplo:
Ahora, veamos un ejemplo más, para comparar elif con match. Supongamos que te piden
escribir un programa que reciba el número de un día de la semana (donde 1 corresponde a
Lunes, 2 a Martes, 3 a Miércoles, y así sucesivamente) e imprima el nombre del día
correspondiente. Si el número ingresado no corresponde a un día válido, el programa debe
mostrar el mensaje: "Día no válido". Esto puede resolverse tanto usando elif, como usando
match:
Con if...elif...else:
dia = 3
if dia == 1:
print("Lunes")
elif dia == 2:
print("Martes")
elif dia == 3:
print("Miércoles")
else:
print("Día no válido")
Con match:
dia = 3
match dia:
case 1:
print("Lunes")
case 2:
print("Martes")
case 3:
print("Miércoles")
case _:
print("Día no válido")
match peso:
case p if p <= 5:
print("Paquete pequeño.")
case p if 5 < p <= 20:
print("Paquete mediano.")
case p if p > 20:
print("Paquete grande.")
case _:
print("Peso no válido.")
Queda claro que match es una herramienta poderosa que complementa y, en algunos
casos, reemplaza al uso de múltiples bloques elif. Ofrece una sintaxis más limpia y legible,
especialmente útil cuando se necesita manejar múltiples casos específicos.
Concatenación de cadenas
La concatenación es el proceso de unir dos o más cadenas de texto para formar una
nueva. En Python, podés usar el operador + para lograrlo de manera sencilla.
Cuando trabajás con datos textuales, la concatenación es una herramienta clave. Por
ejemplo, podés combinar el nombre y el apellido de una persona para mostrar su nombre
completo en pantalla.
nombre = "María"
apellido = "González"
En este ejemplo:
1. nombre y apellido son cadenas separadas que contienen diferentes partes de un
dato.
2. Usamos el operador + para unirlas, incluyendo un espacio " " entre ellas para que el
resultado sea legible.
3. La variable nombre_completo almacena la nueva cadena resultante.
Podés concatenar tantas cadenas como necesites en una sola línea. Por ejemplo:
saludo = "Hola"
nombre = "Lucía"
mensaje = saludo + ", " + nombre + ". ¿Cómo estás?"
print(mensaje) # Salida: Hola, Lucía. ¿Cómo estás?
En este caso combinamos tres cadenas: saludo, nombre y una cadena literal (el texto
dentro de comillas). Usamos comas, espacios y signos de puntuación para hacer que el
mensaje tenga sentido y sea amigable.
Si necesitás unir una cadena con otro tipo de dato, como un número o un valor booleano,
primero tenés que convertir ese dato en texto usando la función str(). Esto es necesario
porque, como sabés, Python no permite combinar distintos tipos de datos directamente.
edad = 30
mensaje = "Tenés " + str(edad) + " años."
print(mensaje) # Salida: Tenés 30 años
En este caso la variable edad es un número entero (tipo int), por lo que usamos str(edad)
para convertirlo en texto. Luego, concatenamos la cadena resultante con otras cadenas
para formar el mensaje final.
La función len() es muy útil para validar datos ingresados por la o el usuario,
analizar cadenas o asegurarte de que cumplen con ciertos requisitos, como una
cantidad mínima o máxima de caracteres.
La función len() toma como argumento una cadena y devuelve un número entero que
representa la cantidad de caracteres en esa cadena.
Podés usar len() para asegurarte que se ingresa un dato válido. Por ejemplo, evitar que un
campo como "nombre" quede vacío:
nombre = input("Ingresá tu nombre: ")
if len(nombre) == 0:
print("El nombre no puede estar vacío.")
else:
print("¡Hola, " + nombre + "!")
Al no ingresarse ningún dato, aparece el mensaje: "El nombre no puede estar vacío." Si
ingresa un nombre, el programa le saluda con un mensaje personalizado.
Algunas aplicaciones requieren que un dato, como una contraseña, tenga cierta cantidad de
caracteres. Podés validar esto con len().
if len(contraseña) < 8:
print("La contraseña debe tener al menos 8 caracteres.")
else:
print("Contraseña válida.")
Las cadenas en Python no son más que una secuencia ordenada de caracteres. Cada letra,
número, espacio o símbolo ocupa una posición específica dentro de esa cadena, y
podemos acceder a ellos de forma individual utilizando un índice. Esta característica es muy
útil cuando necesitás trabajar con partes específicas de un texto, como extraer una letra,
analizar un segmento o incluso modificar el formato de ciertas secciones.
En Python, el índice de una cadena comienza en cero. Esto significa que el primer carácter
de la cadena está en la posición 0, el segundo en la posición 1, y así sucesivamente. Podés
utilizar la notación con corchetes [] para acceder a un carácter específico. Por ejemplo, si
tenés la cadena mensaje = "Hola", podés acceder al primer carácter escribiendo mensaje[0],
que en este caso te devolvería "H". Del mismo modo, si querés obtener el cuarto carácter,
podés usar mensaje[3], que devolvería "a".
mensaje = "Hola"
Una de las grandes ventajas de esta funcionalidad es que también podés usar índices
negativos. Cuando usás un índice negativo, Python empieza a contar desde el final de la
cadena. Por ejemplo, con la misma cadena "Hola", mensaje[-1] te daría el último carácter,
"a", mientras que mensaje[-2] te devolvería "l". Mirá este ejemplo:
mensaje = "Hola"
Podés extraer una porción de la cadena utilizando slicing (rebanado). Esto se hace
indicando un rango en los corchetes [inicio:fin]. El rango incluye el carácter en la posición de
inicio, pero no el del fin. Si escribís mensaje[0:2], vas a obtener "Ho", que incluye los
caracteres en las posiciones 0 y 1, pero no el de la posición 2 (el rango es exclusivo en el
límite superior). Si omitís el inicio o el final del rango, Python asume que querés ir desde el
principio o hasta el final de la cadena, respectivamente. Por ejemplo, mensaje[:2] te
devuelve "Ho", y mensaje[1:] te da "ola".
Esta herramienta podés utilizarla para validar texto, formatearlo o analizarlo con mucha
precisión. Por ejemplo, si quisieras verificar si una cadena empieza con cierta letra, podrías
hacer algo como mensaje[0] == "H", y eso te devolvería True si el primer carácter es
efectivamente "H".
Las cadenas en Python no solo son una secuencia de caracteres, sino que también son
objetos que vienen con una variedad de métodos incorporados. Los métodos son funciones
asociadas a las cadenas que podés utilizar para realizar operaciones comunes, como
cambiar el formato del texto, buscar contenido o realizar transformaciones específicas. Lo
interesante de los métodos de cadenas es que no modifican la cadena original, sino que
generan una nueva con los cambios aplicados.
Estos métodos son fáciles de usar y te permiten trabajar con texto de manera más eficiente.
Por ejemplo, podés convertir una cadena a minúsculas, mayúsculas o formatearla
automáticamente como un título. Cada método se invoca usando la notación de punto,
como [Link](), y muchos no requieren parámetros adicionales.
A continuación, vamos a ver algunos de los métodos más comunes que podés usar con las
cadenas en Python, junto con ejemplos prácticos para que veas cómo aplicarlos.
Devuelve la posición de la
texto = "Hola Mundo" primera aparición de una
.find() print([Link]("Mundo")) subcadena dentro de la
# Salida: 5 cadena, o -1 si no la
encuentra.
Acá tenés un ejemplo práctico que utiliza varios de los métodos mencionados, con
comentarios detallados para explicar cada paso:
# Texto inicial
texto = " Python es un LENGUAJE poderoso. "
Veamos otro ejemplo práctico. El código siguiente solicita confirmar si está seguro o no, y
utiliza algunos de los métodos explicados para procesar y evaluar la respuesta:
# Evaluamos la respuesta
if respuesta == "si":
print("Confirmación recibida. Procedemos con la acción.")
elif respuesta == "no":
print("Cancelaste la acción.")
else:
print("No entendí tu respuesta. Por favor ingresá 'si' o 'no'.")
Usamos .strip() para eliminar espacios al principio o al final (en caso de que el usuario
presione la barra espaciadora antes o después de escribir). También aplicamos .lower()
para convertir todo a minúsculas, asegurándonos de que no importe si escribiste "Sí", "SÍ" o
"si".
El formateo de cadenas con f-Strings es una de las maneras más eficientes y legibles de
combinar texto con valores variables en Python. Introducidas en la versión 3.6, las f-Strings
permiten integrar directamente expresiones y variables dentro de una cadena, utilizando
llaves {} para delimitar el contenido dinámico. Esto hace que el código sea más claro y fácil
de mantener en comparación con otras técnicas de formateo. Su utilidad es enorme, ya que
podés generar mensajes personalizados, reportes dinámicos o simplemente mostrar
información formateada de manera profesional con un esfuerzo mínimo. Además, las
f-Strings soportan expresiones complejas, lo que las convierte en una herramienta poderosa
para la creación de cadenas dinámicas.
Las f-Strings permiten no solo incluir valores dinámicos en cadenas, sino también aplicar
comandos y formatos para presentar la información de manera clara y profesional. Estas
herramientas hacen que las f-Strings sean extremadamente versátiles para formatear
números, fechas y texto. Veamos los principales comandos y formatos que podés usar,
junto con algunos ejemplos:
1. Inclusión de variables
La forma básica de usar f-Strings es incluir variables directamente dentro de las llaves {}.
nombre = "María"
edad = 30
print(f"Hola, {nombre}. Tenés {edad} años.")
# Salida: Hola, María. Tenés 30 años.
Las variables se colocan dentro de las llaves y Python las reemplaza automáticamente por
su valor.
a = 5
b = 3
print(f"La suma de {a} y {b} es {a + b}.")
# Salida: La suma de 5 y 3 es 8.
Esto te permite realizar operaciones sin necesidad de calcular el valor antes de la f-String.
3. Formateo de números
Con las f-Strings, podés aplicar formatos para ajustar cómo se muestran los números.
pi = 3.14159
print(f"El valor de π con 2 decimales es {pi:.2f}.")
# Salida: El valor de π con 2 decimales es 3.14.
Números grandes: Podés agregar separadores de miles con :,. (dos puntos seguidos del
separador, que puede ser un punto o una coma):
numero = 1000000
print(f"El número es {numero:,}.")
# Salida: El número es 1,000,000.
porcentaje = 0.85
print(f"El porcentaje es {porcentaje:.0%}.")
# Salida: El porcentaje es 85%.
4. Formateo de texto
Podés usar especificadores para ajustar cómo se muestra el texto.
Alineación: Usá <, > o ^ para alinear texto a la izquierda, derecha o centro, respectivamente.
texto = "Python"
print(f"{texto:<10}") # Salida: Python (alineado a la izquierda)
print(f"{texto:>10}") # Salida: Python (alineado a la derecha)
print(f"{texto:^10}") # Salida: Python (centrado)
5. Escapando llaves
Si necesitás incluir llaves {} como texto y no como parte de una f-String, simplemente
duplicalas.
Las f-Strings no sólo son prácticas para incluir variables, sino que también te permiten
formatear números, texto y otros tipos de datos con un control increíble. Ya sea que estés
creando reportes, mensajes personalizados o (como veremos más adelante) visualizando
datos complejos, las f-Strings te ofrecen las herramientas necesarias para hacerlo de
manera clara y simple.
Ahora que llegaste a la clase 4, estás en una posición ideal para comenzar a trabajar en los
cimientos del programa que desarrollarás como parte del Trabajo Final Integrador (TFI).
Como sabés, en este proyecto, vas a crear una aplicación en Python que gestione
información sobre los productos de una tienda. Es importante que empieces a planificar
cómo integrar lo que aprendiste hasta ahora.
Con los conocimientos adquiridos en las clases anteriores, ya podés diseñar la estructura
básica del programa. Por ejemplo, podés usar cadenas de texto para almacenar nombres,
descripciones y cualquier otro dato textual. También podés aplicar los métodos de cadenas
para validar y formatear la información que se ingrese por la terminal, como convertir todo a
minúsculas o eliminar espacios en blanco innecesarios.
La validación de las entradas es otro aspecto fundamental que podés abordar con lo
aprendido en las clases 3 y 4. Las estructuras condicionales como if, elif y match te
permiten manejar diferentes escenarios. Por ejemplo, podés validar que un correo
electrónico incluya el carácter @ o que una edad ingresada sea un número positivo. Esto
hace que tu programa sea más robusto y resistente a errores de ingreso.
Aunque todavía no aprendiste a trabajar con bases de datos ni a guardar datos de manera
persistente, no te preocupes. Más adelante en el curso, vamos a integrar estas
herramientas con bases de datos para completar la funcionalidad del proyecto.
Como tarea concreta, te sugerimos que crees un programa que solicite los datos de un
producto y los muestre en formato de tarjeta o ficha, utilizando f-Strings para formatear la
salida. Aprovechá los métodos de cadenas para validar las entradas y asegurarte de que
estén en el formato correcto.
Ejercicio Práctico
Luego de haber pasado el día con Luis y aprendido a utilizar condicionales avanzados y los
métodos de las cadenas, estás en condiciones de resolver la tarea que te mencionó
Mariana y que acaba de formalizar mediante un correo electrónico:
También vas a explorar las sentencias break y continue, que te permiten salir
anticipadamente de un bucle o saltar a la siguiente iteración, adaptando el comportamiento
de tu programa a situaciones específicas. Estas herramientas, combinadas con las
estructuras condicionales que ya manejás, te darán el control necesario para construir
programas más dinámicos y robustos.
Por último, introduciremos las listas, una estructura poderosa para almacenar y manipular
múltiples valores. Esto te permitirá empezar a organizar datos de una manera más flexible,
como guardar la información de varios clientes o productos en un solo lugar, preparándote
para los desafíos más complejos del Trabajo Final Integrador.
¡Seguimos avanzando hacia programas más eficientes y completos! Llegar preparado con
una buena comprensión de las herramientas vistas hasta ahora hará que puedas
aprovechar al máximo las nuevas técnicas que vamos a desarrollar en la próxima clase.
Clase N° 5 | Bucles While
Temario:
● Control de flujo: bucles while.
● Concepto y uso de contadores y acumuladores.
● Sentencias break y continue.
● Introducción a listas como estructuras para almacenar múltiples valores.
Objetivos de la Clase
En esta clase, aprenderás a utilizar los bucles while, una herramienta fundamental para
repetir bloques de código bajo ciertas condiciones. Verás cómo relacionar las estructuras
condicionales que ya manejás con el control de flujo mediante bucles, lo que te permitirá
crear programas más dinámicos y eficientes.
Finalmente, comenzarás a trabajar con listas, una estructura poderosa para almacenar
múltiples valores en un solo lugar. Aprenderás a crearlas, asignarles valores y recuperarlos,
preparando el camino para gestionar datos más complejos en tus futuros proyectos.
Otra mañana en TechLab 🚀
La primera reunión del día en TalentoLab te deja claro que todavía tenés un largo camino
por delante. Hasta ahora, hiciste un gran trabajo con los datos de una persona. Pero en el
mundo real, se necesitan procesar datos de muchas personas o incluso durante varios
períodos. Por eso, en la reunión de equipo Mariana te explica que necesitamos un software
que ayude a registrar y calcular información financiera básica para nuestras y nuestros
clientes.
Un bucle while permite repetir un bloque de código mientras se cumpla una condición
específica. Esto significa que el programa va a evaluar esa condición antes de ejecutar cada
iteración del bucle. Si la condición es True, el código dentro del bucle se ejecuta; si es
False, el bucle termina y el programa continúa con las instrucciones que siguen.
while condición:
# Código que se ejecuta mientras la condición sea True
Es importante que dentro del bucle haya algo que eventualmente haga que la
condición sea False, porque si no, el programa entraría en lo que llamamos un
"bucle infinito". Un bucle infinito sigue ejecutándose sin detenerse y puede
hacer que tu programa deje de responder.
contador = 1
print("Bucle terminado.")
En este ejemplo:
Un bucle while es ideal cuando no sabés de antemano cuántas veces se debe repetir una
acción. Por ejemplo:
En este ejemplo, vamos a pedirle a la persona que ingrese su nombre. Sin embargo,
queremos asegurarnos de que no deje el campo vacío. Usaremos un bucle while para
repetir la solicitud hasta que el usuario ingrese un nombre válido:
Este programa comienza inicializando la variable nombre con una cadena vacía. Luego,
establece un bucle while que seguirá ejecutándose mientras nombre esté vacío. Dentro del
bucle, se solicita a la persona que ingrese su nombre. La función .strip() se usa para
eliminar cualquier espacio en blanco al principio o al final de la entrada, asegurando que
incluso si se ingresaron śolo espacios, la validación detecte que no es un dato válido.
Si la entrada está vacía, el programa muestra un mensaje indicando que vuelva a intentarlo.
Una vez que se ingresa un nombre válido, el bucle se detiene y el programa muestra un
saludo personalizado. Esto garantiza que el flujo del programa continúe solo cuando los
datos ingresados sean adecuados.
Por lo general, un contador se inicializa antes del bucle, se actualiza en cada iteración
(normalmente sumándole 1) y se utiliza como parte de la condición del bucle o para tomar
decisiones dentro de él. Vamos a analizar un par de ejemplos prácticos para entender cómo
funcionan.
# Inicializamos el contador en 1
contador = 1
# Incrementamos el contador en 1
contador += 1
Número: 1
Número: 2
Número: 3
Número: 4
Número: 5
Bucle terminado.
Este tipo de bucle es ideal para ejecutar una acción un número fijo de veces.
# Inicializamos el contador en 0
intentos = 0
En este programa, la variable intentos actúa como contador y se incrementa cada vez que
se ingresa un nombre no válido. Si se ingresa un nombre válido antes de alcanzar el
máximo de intentos (max_intentos), el programa muestra un mensaje de bienvenida y sale
del bucle con break. Si se alcanzan los 3 intentos y no se ingresó un nombre válido, el
programa finaliza mostrando un mensaje de error. Esta es una salida posible del programa:
Es especialmente útil cuando querés salir de un bucle antes de que su condición se vuelva
False, por ejemplo, al encontrar un resultado deseado o al detectar una situación específica
que hace innecesario continuar.
# Inicializamos el contador en 0
intentos = 0
La sentencia continue.
La sentencia continue se utiliza dentro de bucles para omitir el resto del código en la
iteración actual y pasar directamente a la siguiente iteración. A diferencia de break, que
termina el bucle por completo, continue sólo salta la ejecución restante en la iteración
actual, permitiendo que el bucle continúe funcionando como está diseñado.
Esto es útil cuando querés evitar ciertas condiciones específicas dentro del
bucle, pero sin detener todo el proceso.
En este ejemplo, vamos a pedirle al usuario que ingrese un número positivo. Si el número
ingresado es negativo, utilizaremos la sentencia continue para saltar el resto del código de
esa iteración y pedir otro número.
El programa solicita que ingrese números positivos para sumarlos. Si se ingresa un número
negativo, el programa utiliza la sentencia continue para saltar el resto del código en esa
iteración, evitando que el número negativo se sume al total. Si se ingresa 0, el programa
utiliza break para salir del bucle, ya que ese es el indicador de que se terminó de ingresar
datos.
Acumulador.
En el ejemplo anterior, la variable suma cumple el rol de un acumulador. Un acumulador es
una variable que se utiliza para almacenar un valor que va aumentando (o disminuyendo)
de manera progresiva a lo largo de las iteraciones de un bucle. Generalmente, se inicializa
con un valor base (por ejemplo, 0 para una suma o 1 para una multiplicación), y luego se le
van agregando o combinando valores durante cada iteración del bucle.
El propósito de un acumulador es mantener un registro de un cálculo o un
resultado parcial que depende de los datos procesados en el bucle.
Las listas en Python se definen utilizando corchetes [], y los elementos se separan por
comas. Podés agregar, modificar o eliminar elementos de una lista, lo que las convierte en
una herramienta muy flexible para manejar datos en tus programas, y que pronto
aprenderemos a utilizar a fondo. Por ahora, veremos cómo se crean y cómo podemos
utilizarlas con while.
Antes de usar listas dentro de un bucle while, es fundamental entender cómo se crean y
cómo acceder a los valores que contienen utilizando índices. Una lista es simplemente una
colección ordenada de elementos que podés manipular fácilmente. Los elementos de una
lista están numerados por su posición, empezando desde el índice 0.
Creación de listas
Para crear una lista en Python, usás corchetes [] y separás los elementos con comas. Una
lista puede contener cualquier tipo de dato, como números, cadenas o incluso otras listas.
# Lista vacía
lista_vacia = []
Acceso a los elementos de una lista
Podés acceder a los elementos de una lista utilizando su índice. El primer elemento tiene el
índice 0, el segundo el índice 1, y así sucesivamente.
# Lista de ejemplo
frutas = ["manzana", "banana", "cereza"]
Si intentás acceder a un índice que no existe, Python genera un error. Por ejemplo, frutas[3]
daría error porque la lista tiene solo tres elementos (0, 1, y 2).
Índices negativos
Python también permite usar índices negativos para acceder a los elementos desde el final
hacia el principio. Por ejemplo, el índice -1 representa el último elemento de la lista.
# Lista de ejemplo
frutas = ["manzana", "banana", "cereza"]
Con este conocimiento, podés entender cómo manipular y trabajar con los elementos de
una lista. Ahora, veamos cómo integrar las listas con los bucles. Por ejemplo, podemos
usarlos para procesar valores de una lista en un bucle while:
# Lista de números
numeros = [10, 20, 30, 40, 50]
En el código proporcionado, primero creamos una lista llamada números que contiene los
datos que queremos procesar. A continuación, inicializamos un índice que usaremos para
llevar el control de la posición actual dentro de la lista que estamos procesando.
El bucle while comienza con la condición indice < len(numeros), lo que significa que
seguirá ejecutándose mientras el valor de indice sea menor que la longitud de la lista
numeros.
Dentro del bucle, en cada iteración, accedemos al elemento de la lista que corresponde al
índice actual utilizando numeros[indice]. Luego, mostramos en pantalla el valor de ese
elemento junto con su índice correspondiente mediante la función print().
Videos:
Tutoriales sobre Ciencia y Tecnología: Bucles while en Python y Acumulador en bucles while
Próximos pasos:
En la siguiente clase, ampliarás tu conocimiento sobre cómo manejar algunas tareas
repetitivas de manera más directa y eficiente con el bucle for. Esta herramienta te permitirá
recorrer estructuras como cadenas o listas sin necesidad de controlar manualmente cada
iteración, simplificando el código y haciéndolo más legible.
Objetivos de la Clase
Incorporar el uso del bucle for, una herramienta clave para recorrer estructuras de datos
como cadenas y listas de manera eficiente. Aprender cómo este tipo de bucle permite
simplificar y agilizar tareas repetitivas.
Llegás a TalentoLab con entusiasmo y, mientras disfrutás de tu café matutino, te reunís con
Mariana, la Gerente de Proyectos. Mariana, satisfecha con tu progreso, te motiva a
enfrentar un nuevo desafío que te ayudará a manejar mejor la validación y procesamiento
de datos.
“Necesitamos crear una lista con los nombres de los clientes que vamos
a procesar. Además, es necesario detectar si alguno de los nombres
está en blanco y mostrar una alerta en esos casos. Luego, para los
nombres válidos, nos aseguraremos que uno comience con una letra
mayúscula y el resto en minúsculas.”
Más tarde, te reunís con Luis, el desarrollador senior. Junto a él, revisan los conceptos
básicos que necesitarás para completar esta misión. Luis te muestra ejemplos prácticos de
cómo detectar cadenas vacías y aplicar métodos para formatear los nombres
adecuadamente.
Control de flujo: bucles for
Imaginemos que estás gestionando una pequeña tienda y creaste una lista con todos los
productos que posee el inventario. Cada vez que quieras ver los productos o procesar los
datos, sería tedioso hacerlo manualmente uno por uno. Aquí es donde el bucle for se
convierte en una herramienta fundamental. Nos permite recorrer automáticamente esa lista
y trabajar con cada elemento de manera rápida y eficiente.
A diferencia del bucle while, que sigue ejecutándose hasta que una condición se vuelva
falsa, el bucle for es ideal cuando ya sabés exactamente cuántas veces necesitás repetir
una acción. En el caso del inventario de productos, por ejemplo, podemos recorrer todos los
elementos de la lista de productos con for, mostrándolos uno a uno sin importar cuántos
productos haya.
El bucle for toma una secuencia (una lista, una cadena de texto, un rango numérico) y la
recorre de principio a fin, ejecutando un bloque de código para cada elemento en la
secuencia. Es como una cadena de montaje: cada elemento de la secuencia pasa por el
mismo proceso, uno tras otro. Esta es la sintaxis básica del bucle:
Supongamos que tenés una lista de productos en tu tienda, y querés mostrar cada uno de
ellos.
Este ejemplo es súper simple, pero te permite ver el concepto en acción. En cada repetición
del bucle, la variable producto toma uno de los elementos de la lista y lo muestra en
pantalla.
Producto disponible: manzanas
Producto disponible: naranjas
Producto disponible: bananas
Producto disponible: peras
Por supuesto, podrías haber logrado lo mismo usando un bucle while, pero como se ve en
el código siguiente, se requieren algunas líneas más, y el uso de un contador para poder
hacer lo mismo:
i = 0
while i < len(productos):
print("Producto disponible:", productos[i])
i += 1
Letra: P
Letra: y
Letra: t
Letra: h
Letra: o
Letra: n
Pero ¿cómo funciona esto? Es muy simple: cada vez que el bucle for itera toma el siguiente
elemento de la secuencia. En este caso, la secuencia es la cadena de texto "Python". El
bucle continúa hasta que no quedan más elementos (letras) para procesar. Este concepto
de "iteración" es central en el bucle for: siempre recorrerá un objeto secuencial elemento por
elemento.
Break
El uso de break en un bucle for, tal como ocurre cuando lo usamos con while, permite
interrumpir la ejecución del bucle antes de que haya terminado su recorrido completo. Esto
es útil cuando querés detener el bucle en el momento en que una condición específica se
cumple, evitando que siga iterando innecesariamente.
Por ejemplo, imaginate que estás buscando un producto específico en una lista de
productos. Una vez que encontrás ese producto, no tiene sentido seguir buscando, por lo
que podrías utilizar break para detener el bucle.
Ejemplo:
# Lista de productos
productos = ["P001", "P002", "P003", "P004", "P005"]
print("Fin de la búsqueda.")
En este ejemplo, primero creamos una lista llamada ‘productos’, que contiene varios
códigos de productos. Luego, utilizamos un bucle for para recorrer cada uno de estos
códigos dentro de la lista. Mientras recorremos los productos, se verifica con una condición
‘if’ si el producto actual es igual al que estamos buscando, almacenado en la variable
‘producto_a_buscar’. Si esta condición se cumple, el programa imprime que el producto ha
sido encontrado y usa la instrucción ‘break’ para detener la ejecución del bucle
inmediatamente, evitando que siga buscando entre los demás productos.
Buscando...
Buscando...
Producto encontrado: P003
Fin de la búsqueda.
¿Qué es range()?
La función range() es muy útil para generar secuencias de números, lo que nos permite
controlar cuántas veces queremos que un bucle se repita tanto como recorrer listas
utilizando índices numéricos. Se utiliza principalmente con bucles for para ejecutar un
bloque de código un número determinado de veces.
● inicio: Es el número donde comienza la secuencia (es opcional, por defecto es 0).
● fin: Es el número donde termina la secuencia (no incluye este valor).
● paso: Es el intervalo entre cada número de la secuencia (opcional, por defecto es su
valor es 1).
La función range() es útil para controlar cuántas veces se repite un bucle for. Nos permite:
Ahora vamos a ver varios ejemplos para que te quede claro cómo funciona.
Ejemplo 1: Uso básico de range().
En este primer ejemplo, generamos una secuencia de números desde 0 hasta 4. Notá que
el número de "fin" (5) no está incluido.
for i in range(5):
print(i)
0
1
2
3
4
Acá range(5) genera los números del 0 al 4. Python ejecuta el bucle for una vez por cada
número en esa secuencia.
3
4
5
6
En este caso, range(3, 7) genera los números del 3 al 6, porque 7 es el límite superior, pero
no está incluido.
Ejemplo 3: El parámetro paso.
Podemos controlar el intervalo entre cada número de la secuencia con el parámetro paso.
Esto es útil si queremos saltar números.
0
2
4
6
8
10
8
6
4
2
Fruta 1: manzana
Fruta 2: banana
Fruta 3: naranja
Acá estamos utilizando range(len(frutas)) para generar índices del 0 al 2, y con esos
índices accedemos a los elementos de la lista frutas.
range() es muy versátil, pero es posible que te dé un poco de trabajo recordar todas sus
opciones. Para ayudarte, Luis te proporciona el siguiente resumen:
Uso de
Ejemplo Descripción
range()
Cuando usás un bucle while, generalmente tenés que controlar variables como contadores
o índices de forma manual. Esto significa que necesitás inicializarlos, actualizarlos en cada
iteración y asegurarte de que la condición del bucle sea correcta. Sin embargo, con un bucle
for, podés recorrer directamente los elementos de una lista o una secuencia sin preocuparte
por gestionar esas variables, ya que Python lo hace automáticamente por vos.
Esta simplicidad no solo reduce posibles errores, sino que también hace que tu
código sea más fácil de leer y mantener. Aprender a identificar cuándo usar for
en lugar de while es clave para optimizar tus programas y trabajar de manera
más eficiente.
La sentencia continue en los bucles for funciona de la misma manera que en los bucles
while. Cuando Python encuentra un continue dentro de un bucle for, salta inmediatamente al
siguiente elemento de la lista o secuencia, ignorando cualquier código que quede por
ejecutar en la iteración actual. Esto es útil cuando querés omitir ciertos elementos que no
cumplen con una condición específica, pero querés que el bucle siga procesando el resto de
los elementos normalmente.
Por ejemplo, imaginá que necesitás calcular el promedio de una serie de valores. Usando
un bucle for, podés recorrer una lista de números y sumar los valores de forma automática,
mientras simplificás el código y reducís posibles errores.
# Definimos un umbral
umbral = 50000
contador_superiores = 0
# Mostramos el resultado
print(f"Cantidad de ingresos superiores a ${umbral}:
{contador_superiores}")
Otro caso interesante donde el bucle for puede simplificar tareas es cuando necesitás
realizar un seguimiento de ciertos elementos que cumplen con una condición específica.
Por ejemplo, imaginá que estás trabajando con un sistema que procesa nombres de
usuarios y usuarias registrados, y querés identificar cuáles comienzan con una letra en
particular. Supongamos que querés encontrar todos los nombres que empiezan con la letra
"A" y veamos cómo aplicar esta lógica:
Este código utiliza el método .startswith() para comprobar si cada nombre en la lista
comienza con la letra especificada. La variable letra_buscada define qué letra estás
buscando, y el bucle for se encarga de recorrer la lista usuarios. Si el nombre cumple la
condición, se imprime en pantalla.
Este enfoque no solo simplifica el manejo de datos, sino que también demuestra cómo el
bucle for puede combinarse con otros métodos de cadenas para realizar tareas específicas,
junto a listas y condiciones,para resolver problemas más complejos en tus proyectos.
Ejercicio Práctico.
Luis está haciendo un excelente trabajo. Al finalizar la jornada, lograste entender la sintaxis
y utilidad de los bucles for, y lo súper útil que son para recorrer estructuras de datos. Con
estas herramientas estás listo para resolver el pedido de Mariana:
¡Buenas tardes!
Espero que estés bien. Tu tarea es la siguiente:
Videos:
Tutoriales sobre Ciencia y Tecnología: Bucles for en Python y una Tabla de multiplicar con
bucle for
Preguntas para reflexionar:
1. ¿Qué diferencias encontrás entre el bucle while y el bucle for? Pensá en situaciones
específicas sean de programación o de la vida cotidiana en las que elegirías uno
sobre el otro y por qué.
2. Al recorrer listas con un bucle for, ¿qué ventajas encontrás frente a la gestión
manual de índices en un bucle while? ¿Cómo influye esto en la legibilidad y
mantenibilidad del código?
3. ¿Cómo podés aplicar lo aprendido en esta clase al desarrollo de sistemas más
complejos, como el Trabajo Final Integrador? Pensá en validaciones, normalización
de datos y la eficiencia que aportan los bucles.
Próximos pasos:
En la próxima clase, profundizaremos en el manejo de listas y exploraremos una nueva
estructura de datos: las tuplas. Aunque ya conocés cómo crear y recorrer listas, vamos a
enfocarnos en las operaciones más comunes que podés realizar con ellas, como agregar,
eliminar y modificar elementos utilizando métodos específicos.
Además, aprenderás qué son las tuplas y cómo se diferencian de las listas. Las tuplas
tienen usos específicos que las hacen ideales para ciertos escenarios donde los datos no
deben cambiar.
Asegurate de repasar lo aprendido sobre bucles y listas, ya que estos conceptos serán
indispensables para sacar el máximo provecho de las nuevas herramientas que veremos.
¡Seguimos avanzando!
Clase N° 7 | Listas y Tuplas
Temario:
● Listas y tuplas: diferencias y similitudes.
● Uso de índices y slices.
● Métodos comunes de listas (append(), remove(), etc.) y tuplas.
● Iteración y manipulación de listas y tuplas.
Objetivos de la Clase.
En esta clase vas a profundizar tus conocimientos sobre listas, aprendiendo cómo usarlas
para almacenar, modificar y organizar datos de manera eficiente. También vas a conocer las
tuplas, una estructura similar a las listas pero con una característica clave: su contenido no
se puede modificar después de ser creado.
Por último, vas a explorar los métodos más comunes para trabajar con listas, como
append(), remove() y otros que te permitirán realizar operaciones de manera práctica y
rápida. También practicaremos cómo recorrer y procesar listas y tuplas utilizando bucles,
integrando lo aprendido en las clases anteriores.
Otra mañana en TechLab 🚀
Método append()
El método append() te permite agregar un nuevo elemento al final de una lista. Es muy útil
cuando no conocés de antemano cuántos datos vas a manejar, ya que podés ir
añadiéndolos uno a uno según sea necesario.
A continuación, vamos a ver un ejemplo práctico. Vamos a pedir al usuario que ingrese los
montos de ventas realizadas, y vamos a almacenarlos en una lista utilizando append().
Cuando el usuario ingrese un "0", el programa terminará de recopilar datos y mostrará la
lista completa.
# Creamos una lista vacía para almacenar los montos de las ventas
ventas = []
Después de recopilar todos los datos, un bucle for recorre la lista para mostrar cada monto
de manera ordenada y clara. Esto muestra cómo append() puede ser combinado con
bucles para manejar datos de forma dinámica.
Método remove()
El método remove() se utiliza para eliminar el primer elemento de una lista que coincida con
un valor específico. Es importante destacar que este método solo elimina la primera
aparición del valor, por lo que, si el elemento se repite en la lista, las demás ocurrencias
permanecerán intactas. Si el valor no se encuentra en la lista, Python generará un error.
Para entender cómo funciona remove(), vamos a analizar con un ejemplo. En este caso,
crearemos una lista de productos vendidos y permitiremos al usuario eliminar productos
específicos de la lista, uno por uno, hasta que decida terminar.
Este ejemplo demuestra cómo remove() puede ser útil para gestionar
dinámicamente los elementos de una lista, permitiendo modificar contenido
según sea necesario.
# Creamos una lista inicial con productos vendidos
productos = ["pan", "leche", "queso", "pan", "yogur"]
Primero, definimos una lista inicial llamada productos que contiene algunos artículos
repetidos. Luego, el programa muestra esta lista al usuario y le da la opción de eliminar
elementos uno por uno.
Usamos un bucle while para solicitar el nombre del producto a eliminar. Si la usuaria escribe
"fin", el programa termina. Si el producto está en la lista, utilizamos remove() para eliminar la
primera aparición de ese producto. Finalmente, mostramos la lista actualizada después de
cada eliminación. Si el producto no está en la lista, se muestra un mensaje de advertencia.
Lista de productos actuales:
['pan', 'leche', 'queso', 'pan', 'yogur']
ventas = []
[Link](100) Agrega un elemento al final de
append()
print(ventas) la lista.
# Salida: [100]
lista1 = [1, 2]
lista2 = [3, 4] Extiende la lista añadiendo los
extend() [Link](lista2) elementos de otra lista o
print(lista1) iterable al final.
# Salida: [1, 2, 3, 4]
numeros = [1, 2, 2, 3]
ocurrencias = [Link](2) Cuenta cuántas veces
count()
print(ocurrencias) aparece un valor en la lista.
# Salida: 2
datos = [1, 2, 3]
[Link]() Elimina todos los elementos
clear()
print(datos) de la lista, dejándola vacía.
# Salida: []
El siguiente ejemplo muestra cómo un método como sort() puede integrarse fácilmente con
estructuras de control como for, permitiendo gestionar y presentar información de manera
eficiente:
# Lista inicial con nombres de productos
productos = ["yogur", "pan", "queso", "leche", "manteca"]
Primero definimos una lista llamada productos que contiene nombres desordenados.
Luego, utilizamos el método sort() para ordenar los elementos alfabéticamente. Una vez
ordenada, recorremos la lista con un bucle for para mostrar cada producto en la terminal,
presentándolo de forma organizada.
Ambas estructuras permiten almacenar múltiples valores, acceder a ellos mediante índices
y ser recorridas con bucles, pero la elección entre listas y tuplas depende del contexto. Si
necesitás manipular los datos, una lista es la mejor opción. Si buscás garantizar que los
datos permanezcan inalterados, una tupla será más adecuada.
Las tuplas son estructuras de datos similares a las listas, pero con una característica
principal que las diferencia: son inmutables. Esto significa que, una vez creada, una tupla
no se puede modificar. No podés agregar, eliminar ni cambiar los elementos que contiene.
Esta inmutabilidad las hace ideales para representar datos constantes o que no
deberían alterarse durante la ejecución de un programa, como coordenadas,
configuraciones o valores que necesitan mantenerse seguros.
Creación de tuplas
Las tuplas se definen utilizando paréntesis ( ), aunque también se pueden crear sin
paréntesis explícitos, separando los elementos por comas. Por ejemplo:
# Creación de una tupla
mi_tupla = (10, 20, 30)
Acceso a elementos
Al igual que las listas, los elementos de una tupla se acceden mediante índices,
comenzando en 0. También podés utilizar índices negativos para acceder desde el final:
Tuplas y métodos
Aunque las tuplas son inmutables, algunas operaciones y métodos aún se pueden aplicar.
Por ejemplo:
numeros = (1, 2, 2, 3)
print([Link](2)) # Salida: 2
Por otro lado, si necesitás agregar, eliminar o actualizar elementos, una lista será más
adecuada.
Los métodos de las tuplas están limitados comparados con las listas, lo que refleja su
naturaleza estática. Como siempre, Luis está atento a tus avances, y te proporciona una
tabla que contiene los métodos más comunes y si aplica o no a estos tipos de datos.
pop()
✔️ Se aplica. Elimina y devuelve un ❌ No se aplica. Las tuplas no
elemento de una posición específica. permiten eliminar elementos.
index()
✔️ Se aplica. Devuelve el índice de ✔️ Se aplica. Las tuplas permiten
la primera aparición de un elemento. buscar el índice de un elemento.
✔️ Se aplica. Cuenta cuántas veces ✔️ Se aplica. Las tuplas permiten
count() aparece un elemento. contar la cantidad de veces que
aparece un elemento.
Las tuplas son una herramienta útil para cuando se requiere proteger la integridad de los
datos. Su inmutabilidad aporta seguridad y claridad en muchos escenarios, como definir
configuraciones o datos que no deben cambiar. A medida que avancemos, veremos cómo
combinarlas con listas y otros conceptos para manejar información de manera más
eficiente.
Slices en listas y yuplas
El concepto de slices (ya utilizado con las cadenas de caracteres) permite acceder a
porciones específicas de listas o tuplas, seleccionando un rango de elementos. Esto es útil
cuando necesitás trabajar con subconjuntos de datos, como extraer valores específicos
para un análisis o realizar operaciones sobre una parte de la estructura.
Sintaxis de slicing
La sintaxis básica para crear un slice es:
estructura[inicio:fin:paso]
En estos ejemplos, podés ver cómo los slices permiten acceder fácilmente a diferentes
partes de la lista sin necesidad de recorrerla manualmente con bucles.
Ejemplo con tuplas
El slicing funciona de la misma manera en las tuplas, ya que comparten la misma lógica de
indexación:
● Dividir datos: Podés dividir listas grandes en partes más pequeñas, como separar
los datos de ventas en trimestres.
● Invertir datos: Usar slices con pasos negativos ([::-1]) es una forma eficiente de
invertir una lista o tupla.
● Extraer valores específicos: Seleccionar subconjuntos de datos con una lógica
clara, cómo extraer los valores impares de una lista.
Los slices son una herramienta fundamental para manejar listas y tuplas,
evitando bucles innecesarios y haciendo el código más limpio y legible, que
amplían significativamente las posibilidades de manipulación de datos en
Python.
Veamos que ocurre en este código. Primero, creamos una lista llamada ventas_semanales
que contiene los montos de ventas diarias de una semana. Utilizamos slices para dividir
esta lista en partes específicas según las necesidades:
1. Para obtener las ventas de los primeros tres días, usamos [:3], que selecciona desde
el inicio hasta el índice 2 (excluyendo el índice 3). Este resultado se almacena en
primeros_dias y se muestra en la pantalla.
2. Las ventas de los últimos dos días se extraen utilizando [-2:], que selecciona desde
el penúltimo hasta el último elemento de la lista. Este resultado se guarda en
ultimos_dias y se imprime.
3. Finalmente, para analizar los días intermedios, usamos el slice [3:-2], que selecciona
los elementos entre el índice 3 (inclusive) y el índice -2 (excluido). Luego,
calculamos la suma de estos valores utilizando la función sum() y mostramos tanto
la lista de días intermedios como el total calculado.
Ejercicio práctico.
Mariana te ha escrito un correo donde te explica claramente la tarea que debe resolver el
programa a desarrollar:
¡Hola!
En TalentoLab necesitamos llevar un registro ordenado de los
nombres de los nuevos clientes y clientas que se van incorporando.
Queremos asegurarnos de que los datos ingresados sean válidos y
estén bien organizados. Tu tarea es escribir un programa en Python
que haga lo siguiente:
1. Solicite al usuario o usuaria los nombres de los clientes y clientas uno por uno y
valide que cada nombre no esté vacío. Si se deja el campo vacío, mostrale un
mensaje de advertencia y volvé a pedir el nombre.
2. Guarde cada nombre válido en una lista, asegurándote de agregarlo con el
método .append().
3. Permití que la persona finalice la carga de nombres escribiendo la palabra "fin".
4. Una vez finalizada la carga, ordená alfabéticamente los nombres en la lista y
mostrá la lista ordenada de nombres utilizando un bucle for.
Videos:
Próximos pasos:
En la próxima clase, vas a descubrir una estructura de datos fundamental que lleva el
manejo de información a otro nivel: los diccionarios. Aprenderás cómo crearlos y
manipularlos, cómo acceder a sus elementos mediante claves específicas y utilizar métodos
esenciales para agregar, modificar y eliminar datos.
Objetivos de la Clase
En esta clase, aprenderás a utilizar los diccionarios, una estructura de datos esencial en
Python que permite almacenar información de una manera más organizada y eficiente. Vas
a descubrir cómo funcionan los pares clave-valor y cómo esta característica facilita el
acceso rápido a los datos sin necesidad de recurrir a posiciones específicas como en las
listas.
Explorarás cómo recorrer diccionarios con bucles y cómo estos recorridos pueden aplicarse
en situaciones prácticas, preparándote para desafíos más complejos. Este nuevo
conocimiento te permitirá gestionar datos de manera más clara y efectiva, una habilidad que
será clave para tu Trabajo Final Integrador (TFI).
Octava jornada en TechLab 🚀
Te cuenta que la mejor opción es usar diccionarios en Python, una herramienta que
permite asociar claves con valores.
¡Veamos cómo funcionan!
Introducción a diccionarios
En Python, los diccionarios son una estructura de datos que permite almacenar
información en forma de pares clave-valor. A diferencia de las listas y las tuplas, donde los
elementos se acceden mediante un índice numérico, en los diccionarios cada elemento se
accede a través de una clave única que está asociada a un valor específico.
Para entender mejor los diccionarios en Python, podemos hacer una analogía con los
diccionarios del mundo real, como los diccionarios de idiomas.
● Claves (Keys): En un diccionario de idiomas, las claves serían las palabras. Cada
palabra (clave) debe ser única para evitar confusiones y garantizar que se puede
encontrar rápidamente.
● Valores (Values): Los valores serían las definiciones o traducciones asociadas a
cada palabra. Estos valores proporcionan la información o el significado
correspondiente a cada clave.
Un diccionario en Python se define utilizando llaves {} y cada par clave-valor se separa con
dos puntos :. Por ejemplo:
productos = {
"manzana": 150,
"banana": 120,
"naranja": 180
}
En este diccionario, "manzana", "banana" y "naranja" son las claves, mientras que 150, 120
y 180 son los valores asociados a cada clave. Esta estructura permite acceder rápidamente
al precio de un producto a través de su nombre, sin tener que recorrer toda la colección.
Para acceder a los valores de un diccionario, utilizamos las claves, de manera similar a
como usamos los índices en las listas. La diferencia es que, mientras en una lista los
índices son números enteros que representan la posición de cada elemento, en un
diccionario las claves pueden ser palabras u otros tipos de datos. Esta flexibilidad hace que
los diccionarios sean más intuitivos para ciertas tareas.
productos = {
"manzana": 150,
"banana": 120,
"naranja": 180
}
print(productos["manzana"]) # Salida: 150
Esta tabla resume de manera clara las diferencias entre listas, tuplas y diccionarios,
ayudándote a elegir la estructura adecuada según el tipo de datos que necesites manejar.
Característic
Descripción Ejemplo
a
# Usamos get() para acceder a una clave existente y a una que no existe
print([Link]("nombre")) # Salida: Lucía
print([Link]("telefono")) # Salida: None
Luis toma un sorbo de su café y sigue dando cuenta de lo trabajado: además le pediste a
Python que te muestre todas las claves con keys(), los valores con values(), y los pares
clave-valor con items(). Eso es re útil cuando necesitás ver qué hay en el diccionario sin
recorrerlo manualmente. También agregaste una nueva clave "telefono" usando
setdefault(), que solo la creó si no existía ya. Finalmente, eliminaste la clave "edad" con
pop(), lo que te permitió modificar el diccionario sin problemas. Todo esto te da flexibilidad
para manejar la información sin importar cuán compleja sea.
Este ejemplo es una excelente manera de recordar que las listas pueden
contener cualquier tipo de dato, incluidos diccionarios.
Al ejecutarlo e interactuar con el programa, ves que una salida posible es la siguiente:
Ingresá los datos del cliente. Para finalizar, dejá el código vacío.
Código del cliente: 1
Nombre del cliente: Ana
Ciudad del cliente: CABA
Ingresá los datos del cliente. Para finalizar, dejá el código vacío.
Código del cliente: 3
Nombre del cliente: Juan
Ciudad del cliente: Rosario
Ingresá los datos del cliente. Para finalizar, dejá el código vacío.
Código del cliente: 8
Nombre del cliente: Luis
Ciudad del cliente: Quilmes
Ingresá los datos del cliente. Para finalizar, dejá el código vacío.
Código del cliente:
Luego, utilizamos un bucle while para permitir que la persona ingrese los datos de varios
clientes. En cada iteración, se le pide el código, el nombre, y la ciudad del cliente. Si se deja
el campo del código vacío y presiona Enter, el bucle se interrumpe gracias a la sentencia
break.
Una vez que se obtienen los datos, se crea un diccionario llamado cliente con las claves
"código", "nombre" y "ciudad", y se asignan los valores ingresados por el usuario a cada
una de estas claves. Este diccionario se agrega a la lista clientes usando el método
append().
Al final del programa, recorremos la lista de diccionarios con un bucle for. Para cada cliente
en la lista, mostramos la información usando una f-string para formatear la salida de
manera ordenada. Este ejemplo, dice Luis, te muestra cómo combinar listas y diccionarios
para gestionar datos más complejos. Es una técnica muy útil para tu Trabajo Final
Integrador (TFI) o cualquier proyecto donde necesites manejar múltiples registros de
información organizada.
El programa comienza con un diccionario llamado productos, que contiene algunos artículos
junto con sus precios. Utilizamos un bucle for para mostrar todos los productos disponibles
al inicio del programa.
Luego, entramos en un bucle while donde le pedimos al usuario que ingrese el nombre del
producto que quiere eliminar. La entrada se convierte a minúsculas con .lower() para evitar
problemas de mayúsculas o minúsculas. Si el usuario presiona Enter sin escribir nada, el
bucle termina gracias a la sentencia break.
Ruta de avance
Llegaste a un punto muy importante en tu aprendizaje dentro de TalentoLab. A lo largo de
las clases anteriores, adquiriste conocimientos fundamentales que te permiten gestionar
datos de manera más eficiente y estructurada. En esta clase, aprendiste a utilizar
diccionarios, una herramienta poderosa para asociar claves con valores, lo que facilita el
almacenamiento y la recuperación de información sin tener que depender de índices
numéricos.
Con lo que ya sabés, podés empezar a combinar listas y diccionarios para manejar
conjuntos más complejos de datos. Por ejemplo, podrías almacenar una lista de diccionarios
donde cada diccionario contenga información detallada de un producto, como su nombre,
precio y cantidad disponible. Esta estructura te permitirá llevar un registro más
organizado y fácilmente accesible de los datos que necesites en tu Trabajo Final
Integrador (TFI).
Para tu TFI, podrías pensar en una aplicación que permita registrar clientes, productos o
cualquier otro conjunto de datos relevante. Algunas tareas que podrías implementar con lo
que aprendiste hasta ahora son:
Por ejemplo, podrías crear un programa que permita registrar una lista de productos con sus
precios, mostrar el inventario actual y permitir eliminar un producto si ya no está disponible.
Esta es una aplicación realista y práctica que te prepara para el desafío final.
Consejo de Luis: Recordá siempre pensar en cómo organizar tus datos para que sean
fáciles de acceder y modificar. Los diccionarios son ideales cuando necesitás buscar
elementos específicos sin recorrer toda la lista, mientras que las listas son útiles para
manejar conjuntos ordenados de datos.
🚀
Cada clase te acerca más al desarrollo de una aplicación completa. ¡Seguís por el camino
correcto y estás construyendo una base sólida para el Trabajo Final Integrador!
Ejercicio práctico.
Has aprendido y conocido todo sobre los diccionarios y su enorme importancia en el mundo
de la programación. Mariana te escribió una nota donde te explica claramente la tarea que
debe resolver el programa que deberás escribir el día de hoy:
¡Hola!
● Crear un diccionario llamado productos donde las claves sean los nombres
de los productos y los valores sean sus precios.
● Permitir agregar productos y sus precios hasta que se decida finalizar.
● Mostrar el contenido del diccionario después de cada operación.
Consejo de Luis: Recordá que los diccionarios te permiten acceder a los datos
rápidamente usando claves y que podés modificar sus valores sin problemas. Aprovechá
esto para hacer que tu programa sea eficiente y fácil de usar.
Materiales y Recursos Adicionales:
Artículos:
El libro de Python: Diccionarios
Platzi: Cómo agregar, modificar y eliminar elementos de listas y diccionarios
Medium: Dominando los Diccionarios en Python
Videos:
La Geekipedia de Ernesto: Diccionarios en Python
Píldoras Informáticas: ¿Qué son los diccionarios?
Próximos pasos:
Llegaste al final de esta clase con una herramienta poderosa en tu haber: los diccionarios.
Ahora sabés cómo almacenar, acceder y manipular datos utilizando claves y valores, lo que
te permite gestionar información de una manera más eficiente y estructurada. Con estas
habilidades, estás mucho más cerca de construir una aplicación completa para el Trabajo
Final Integrador (TFI).
🚀
¡Estás avanzando a pasos firmes y cada vez más cerca de dominar el desarrollo en Python!
Clase N° 9 | Funciones definidas
por el usuario I
Temario:
● Definición y uso de funciones.
● Funciones con y sin parámetros.
● Alcance de variables (variables locales y globales).
Objetivos de la Clase
En esta clase, vas a dar tus primeros pasos en el uso de funciones definidas por el usuario
en Python. Aprenderás a crear funciones que te permitirán dividir tu código en bloques más
organizados y fáciles de entender. Esto facilitará que tus programas sean más claros,
mantenibles evitando repetir el mismo código varias veces.
Vas a entender cómo se definen y utilizan funciones, tanto aquellas que no requieren
parámetros como aquellas que los utilizan para personalizar su comportamiento. Además,
explorarás el concepto de alcance de variables, comprendiendo la diferencia entre variables
locales y globales. Esta distinción es fundamental para controlar dónde y cómo se pueden
usar las variables en tu programa, ayudándote a evitar errores y conflictos de nombres.
Estás avanzando muy bien con las tareas del proyecto. Hasta ahora,
aprendiste a manejar datos con listas y diccionarios. Sin embargo, a
medida que tus programas crecen, se vuelven más largos y difíciles de
mantener.
Para que tu código sea más claro y fácil de manejar, es hora de que
aprendas a dividirlo en bloques más organizados. Necesitás utilizar
funciones, una herramienta esencial para cualquier programador o
programadora.
Sonreís mientras terminás de leer. En ese momento, Luis, el desarrollador senior, se asoma
por tu escritorio con una taza de café en la mano.
Con la expectativa de un nuevo desafío por delante, cerrás el correo y te preparás para
sumergirte en el mundo de las funciones.
Funciónes.
En programación, una función es un bloque de código que se agrupa para realizar una
tarea específica. Las funciones permiten encapsular una serie de instrucciones que pueden
ejecutarse cuando se las necesita. En otras palabras, son como pequeñas unidades de
trabajo que se encargan de hacer algo en particular, como sumar dos números, mostrar un
mensaje por pantalla o realizar una operación más compleja.
Una función puede recibir datos de entrada y también puede devolver un resultado. Sin
embargo, no todas las funciones requieren parámetros (los datos de entrada mencionados
previamente) o devuelven un valor; algunas simplemente ejecutan una acción específica. Lo
importante es que las funciones ayudan a dividir un programa en partes más pequeñas y
manejables, facilitando la organización y el mantenimiento del código.
Definir una función implica darle un nombre y especificar qué acciones debe realizar.
También podés decidir si querés que la función reciba datos para trabajar con ellos.
Por ejemplo, si necesitás calcular el total de una compra con impuestos varias veces en un
programa, en lugar de escribir el cálculo cada vez, podés definir una función y llamarla -por
ejemplo- calcular_total() que realice esa tarea. Luego, cada vez que necesites ese cálculo,
simplemente llamás a la función con los datos que corresponden.
Las funciones definidas por la usuaria o usuario permiten personalizar y modularizar el
código, haciéndolo más eficiente y adaptado a los requerimientos de cada proyecto. Al
usarlas, estás aplicando una de las mejores prácticas en programación, facilitando el
desarrollo de soluciones más claras y profesionales.
Además, las funciones promueven la reutilización del código. Cuando definís una función
para resolver un problema específico, podés llamarla tantas veces como necesites sin tener
que volver a escribir las mismas instrucciones. Esto no solo ahorra tiempo, sino que también
reduce el riesgo de cometer errores, ya que si necesitás hacer una corrección, solo tenés
que modificar la función una vez y el cambio se aplicará en todas partes donde la función se
utilice.
Descomposición y abstracción.
Al profundizar en las ventajas del enfoque funcional, dos conceptos clave emergen como
pilares fundamentales: la descomposición y la abstracción. Estos conceptos son
esenciales para entender por qué las funciones son tan poderosas y útiles en la
programación.
Por otro lado, la abstracción implica ocultar los detalles internos de cómo funciona una
operación, mostrando solo lo necesario para utilizarla. En el contexto de las funciones, esto
significa que podés usar una función sin tener que saber exactamente cómo está
implementada por dentro. Lo único que necesitás conocer es su nombre, qué datos recibe
(los parámetros) y qué devuelve (el resultado). Esta capacidad de abstraer detalles hace
que el código sea más fácil de entender y reduce la cantidad de información que quien
desarrolla el software necesita manejar a la vez. Por ejemplo, si definís una función llamada
calcular_total() para sumar precios con impuestos, podés usar esa función sin preocuparte
por las fórmulas específicas que contiene.
def saludo():
print("¡Hola, mundo!")
# Llamada a la función
saludo()
En este ejemplo, saludo es una función que no acepta argumentos y su única acción es
imprimir el mensaje "¡Hola, mundo!" en la consola. Para llamar o ejecutar esta función,
simplemente usas su nombre seguido de paréntesis.
# Llamada a la función
saludo()
def mostrar_mensaje():
mensaje = "Este es un mensaje predefinido."
print(mensaje)
# Llamada a la función
mostrar_mensaje()
En este caso, mostrar_mensaje es otra función que no recibe datos externos. Dentro de su
cuerpo, se define una variable llamada mensaje con un texto predefinido y luego se muestra
ese mensaje en la consola. Al llamar a esta función, se ejecuta el código contenido en ella.
Estas funciones son una buena manera de empezar a organizar tu código en bloques
reutilizables, incluso si todavía no necesitás trabajar con datos externos ni devolver
resultados.
Funciones que reciben valores.
En Python, una función puede definirse para recibir datos externos. Estos datos se
especifican entre los paréntesis al definir la función y se llaman parámetros. Cuando llamás
a la función, debés pasarle valores específicos, conocidos como argumentos, que serán
utilizados dentro de la función para realizar alguna tarea.
Para definir una función que recibe datos, se escribe el nombre de la función seguido de
paréntesis que contienen los parámetros. Estos parámetros se comportan como variables
dentro de la función. Veamos un ejemplo:
def saludar(nombre):
print(f"¡Hola, {nombre}!")
¡Hola, Lucía!
¡Hola, Ana!
¡Hola, Martín!
Luis, que está viendo tus avances, te propone un ejemplo más interesante:
En este caso, la función que te muestra Luis tiene dos parámetros: numero1 y numero2.
Acá tenés una tabla comparativa que muestra las diferencias entre funciones con
parámetros y funciones sin parámetros, destacando su utilidad en distintos contextos:
Parámetros predeterminados.
Las funciones en muchos lenguajes de programación, incluido Python, pueden diseñarse
para aceptar parámetros opcionales, también conocidos como parámetros
predeterminados u opcionales. Estos permiten que una función sea llamada con menos
argumentos de los que se especifican en su definición. Además, les podes pasar los
parámetros por su nombre, lo que aumenta la claridad y flexibilidad del código.
Veamos un ejemplo:
saludar("Ana")
saludar("Luis", "Buenos días")
En este ejemplo, el parámetro mensaje tiene un valor predeterminado de "Hola". Esto
significa que si al llamar a saludar() no se proporciona un argumento para mensaje, se
usará "Hola" por defecto. La salida del código anterior es la siguiente:
Hola, Ana!
Buenos días, Luis!
En este otro ejemplo, vamos a definir una función que construya una dirección completa a
partir de diferentes partes de una dirección, como la calle, el número, la ciudad, y el código
postal. Haremos opcionales el número y el código postal, proporcionándoles valores
predeterminados.
Estos ejemplos te muestran cómo podés utilizar parámetros con valores por defecto para
flexibilizar las llamadas a funciones, facilitando su uso en diferentes situaciones sin
necesidad de proporcionar todos los datos cada vez.
Algunas de las ventajas que tiene el uso de parámetros pasados por nombre incluyen:
Los nombres de las funciones tienen que ser claros y descriptivos, reflejando de manera
precisa lo que hace la función. Por ejemplo, calcular_area() es mucho más entendible que
func1(). Elegir nombres que describan bien la acción de la función evita confusiones y hace
que el código sea más intuitivo.
En Python, lo más común es usar letras minúsculas y separar las palabras con guiones
bajos (underscores). Este estilo se llama snake_case. Por ejemplo, calcular_area_circulo()
es preferible a CalcularAreaCirculo o calcularAreaCirculo.
Es una buena idea empezar los nombres de las funciones con un verbo que
indique claramente qué acción realiza. Ejemplos de verbos comunes son:
obtener, calcular, mostrar, crear o imprimir. Por ejemplo,
obtener_nombre_completo() deja claro que la función se encarga de obtener
un nombre completo.
Tratemos de evitar abreviaturas y acrónimos que puedan ser confusos. Aunque a veces
los acrónimos son aceptables si son muy conocidos (como IMC para "Índice de Masa
Corporal"), siempre es mejor priorizar la claridad. Por ejemplo, calcular_imc() puede ser
entendible, pero calcular_indice_masa_corporal() es aún más claro. Pero si bien es
importante que los nombres sean descriptivos, no te excedas con la longitud. Nombres
excesivamente largos pueden dificultar la lectura. Encontrá un equilibrio entre ser claro y ser
breve.
Los nombres deben ser lo más específicos posible. En lugar de usar algo genérico como
procesar_datos(), un nombre más preciso sería filtrar_usuarios_activos(). Esto ayuda a
entender rápidamente qué hace exactamente la función sin necesidad de revisar su código.
Variables locales
Las variables locales son aquellas que se definen dentro de una función. Su alcance se
limita exclusivamente a esa función, lo que significa que sólo pueden ser usadas dentro de
ella. No se puede acceder a una variable local desde fuera de la función en la que fue
declarada. Estas variables se crean cuando se llama a la función y se eliminan
automáticamente cuando la función termina de ejecutarse.
def saludar():
mensaje = "¡Hola, mundo!" # 'mensaje' es una variable local
print(mensaje)
saludar()
print(mensaje)
# Esto da un error porque 'mensaje' no existe fuera de la función
En este caso, la variable mensaje sólo existe dentro de la función saludar(). Si intentás
acceder a mensaje fuera de esa función, obtenés un error porque su alcance es local.
Variables globales
Por otro lado, una variable global es aquella que se declara fuera de cualquier función.
Esto significa que puede ser utilizada tanto dentro como fuera de las funciones. Sin
embargo, si queremos modificar una variable global desde dentro de una función, debemos
declararla explícitamente como global usando la palabra clave global. De lo contrario,
Python interpretará que estamos creando una nueva variable local dentro de esa función.
def saludar():
# Declaramos que queremos usar la variable global 'nombre'
global nombre
nombre = "María"
print(f"Hola, {nombre}")
saludar()
print(nombre)
# Esto imprime 'María' porque modificamos la variable global
En este caso, la variable nombre se define fuera de la función y puede ser accedida y
modificada dentro de saludar() gracias a la declaración global nombre. Si no hubiéramos
usado la declaración global, se hubiese creado una variable local dentro de la función, su
nombre fuera de la función, donde está el print(nombre), mostraria el mensaje “Ana”.
¡Probalo!
Cuando pasamos una lista o un diccionario a una función como parámetro, lo que realmente
se pasa es una referencia al objeto. Esto significa que si modificas el contenido de esa
lista o diccionario dentro de la función, esos cambios se reflejarán fuera de la función
porque estamos operando sobre el mismo objeto en memoria.
def agregar_item(lista):
[Link]("nuevo elemento")
La cláusula global permite declarar una variable global dentro de una función, lo que
significa que cualquier asignación hecha a esa variable dentro de la función afectará a la
variable global, no a una copia local.
1. Modificar el contenido del objeto (mutación): Esto no requiere global porque la
función está trabajando con la referencia al objeto.
2. Reasignar una lista o diccionario completo: Esto sí requiere global si se quiere
afectar la variable global.
def reemplazar_lista():
# Declaramos que queremos modificar la variable global
global frutas
frutas = ["naranja", "kiwi"]
reemplazar_lista()
print(frutas) # Salida: ['naranja', 'kiwi']
En este caso, sin global, se crearía una nueva variable local frutas dentro de la función y la
lista global no se vería afectada.
def agregar_item():
# Modifica el contenido sin necesidad de 'global'
[Link]("naranja")
agregar_item()
print(frutas) # Salida: ['manzana', 'banana', 'naranja']
Aquí no es necesario declarar global porque sólo estamos modificando el contenido de la
lista global, no reasignándola.
Tuplas.
Las tuplas son estructuras inmutables, es decir, no se pueden modificar una vez creadas.
Si intentás cambiar una tupla dentro de una función, Python generará un error. Sin embargo,
si reasignás una tupla dentro de una función, la reasignación no afectará a la tupla original
fuera de la función.
# Tupla original
numeros = (1, 2, 3)
def cambiar_tupla():
# Creamos una nueva tupla, pero no modificamos la original
nueva_tupla = (4, 5, 6)
return nueva_tupla
En este caso, la tupla numeros no cambia fuera de la función porque, aunque se crea una
nueva tupla dentro de la función, no se modifica la original.
Recomendación
Cuando trabajes con funciones y necesites pasar una lista o un diccionario, recordá que
las modificaciones dentro de la función afectarán al objeto original. Si no querés que esto
ocurra, podés crear una copia del objeto antes de pasarlo a la función:
def agregar_elemento(lista):
[Link]("nuevo elemento")
De esta manera, preservás el estado original de la lista. En cambio, con las tuplas, como
son inmutables, no hace falta preocuparse por este tipo de efectos secundarios.
Entender el alcance de las variables ayuda a evitar errores y a escribir código más
organizado y eficiente. Las variables locales permiten encapsular datos dentro de funciones
sin interferir con otras partes del programa. Por otro lado, las variables globales pueden ser
útiles para datos que necesitan ser compartidos en varias funciones, pero deben usarse con
cuidado para no generar confusión o errores inesperados.
Siempre que sea posible, usá variables locales dentro de tus funciones. Las variables
locales ayudan a que el código sea más modular, fácil de entender y mantener. Al limitar el
alcance de una variable a una función específica, evitás interferencias con otras partes del
programa y reducís la posibilidad de errores inesperados.
Además, el uso de variables locales facilita el proceso de depuración y hace que tus
funciones sean más reutilizables, ya que no dependen del estado global del programa. Si
necesitás que una función devuelva datos, es mejor hacerlo a través de un valor de
retorno en lugar de modificar variables globales. ¡Aprenderemos a hacer eso pronto!
De esta manera, combinando el uso de funciones con una buena gestión del alcance de las
variables, podrás desarrollar programas más organizados, claros y fáciles de mantener.
En primer lugar, definimos una lista vacía llamada frutas que almacenará los nombres de
las frutas. Luego, crearemos tres funciones: una para agregar frutas, otra para consultar
la lista de frutas, y una más para borrar una fruta específica. Finalmente,
implementaremos una función para mostrar el menú y permitir que se seleccione una
opción.
Aquí está el código completo con los comentarios necesarios para entender cada parte:
if opcion == "1":
agregar_fruta()
elif opcion == "2":
consultar_frutas()
elif opcion == "3":
borrar_fruta()
elif opcion == "4":
print("¡Gracias por usar el programa! ¡Chau!")
break
else:
print("Opción no válida. Por favor, ingresá un número
del 1 al 4.\n")
“El programa comienza definiendo una lista vacía llamada frutas que servirá para
almacenar los nombres de las frutas ingresadas por quién usa el programa.
1. Función agregar_fruta: Esta función pide que se ingrese el nombre de una fruta, lo
convierte a mayúscula inicial con .capitalize() y la agrega a la lista con el método
.append(). Luego, muestra un mensaje confirmando que la fruta fue agregada.
2. Función consultar_frutas: Muestra todas las frutas almacenadas en la lista. Si la
lista está vacía, informa que no hay frutas para mostrar. Utiliza un bucle for con
enumerate para mostrar cada fruta con un número de posición.
3. Función borrar_fruta: Pide el nombre de una fruta para eliminarla. Si la fruta está
en la lista, la elimina con el método .remove(). Si no se encuentra en la lista, muestra
un mensaje indicando que la fruta no existe. Si la lista está vacía, avisa que no hay
nada para borrar.
4. Función mostrar_menu: Muestra un menú con opciones numeradas del 1 al 4.
Dependiendo de la opción ingresada, llama a la función correspondiente. La opción
4 permite salir del programa, mientras que cualquier otra entrada no válida muestra
un mensaje de error.”
Ejercicio práctico:
Mariana te ha asignado una tarea clave para el proyecto de TalentoLab: desarrollar un
pequeño programa que permita gestionar una lista de productos utilizando funciones. El
objetivo es que la usuaria o usuario pueda agregar, consultar y eliminar productos,
aplicando lo que aprendiste sobre funciones y listas. Este ejercicio te ayudará a modularizar
el código y a practicar la interacción con el usuario. Así te lo ha comunicado Mariana:
¡Hola!
● Consultar productos: Muestra todos los productos en la lista junto con sus
precios.
● Eliminar productos: Elimina un producto de la lista a partir de su nombre.
● Menú interactivo: El programa debe ofrecer un menú para que el usuario o
usuaria pueda elegir qué acción realizar. Debe incluirse una opción para
salir del programa.
Videos:
Tutoriales sobre Ciencia y Tecnología: Funciones en Python
Píldoras informáticas: Funciones en Python (I) y Funciones en Python (II)
Además, explorarás cómo las funciones pueden devolver múltiples valores utilizando
tuplas, lo que te permitirá manejar varios datos de manera sencilla y eficiente. También
incorporarás buenas prácticas de programación con docstrings, una manera de
documentar tus funciones para que sean más fáciles de entender y mantener, tanto para
vos como para otros miembros del equipo de TechLab.
Clase N° 10 | Funciones definidas
por el usuario II
Temario:
● Uso de la sentencia return.
● Funciones que devuelven valores.
● Funciones que devuelven múltiples valores (tuplas).
● Documentación de funciones (docstrings).
Objetivos de la clase
En esta clase vas a explorar cómo las funciones pueden devolver resultados que se utilicen
en otras partes de tu programa. Aprenderás a emplear la sentencia return, una herramienta
fundamental para hacer que tus funciones sean más flexibles y útiles. Además, vamos a
introducir el concepto de funciones que devuelven múltiples valores, utilizando tuplas para
facilitar este tipo de operaciones.
🚀
Al término de esta clase, podrás aplicar funciones en escenarios más complejos,
integrándolas con todo lo que ya aprendiste previamente en el curso.
Hermosa mañana en TalentoLab 🚀
Con esa introducción, sabés que el día será un desafío interesante, y te entusiasma pensar
en cómo estas herramientas te van a ayudar en el desarrollo del Trabajo Final Integrador.
Cuando llamamos a la función, el valor devuelto se asigna a la variable cuadrado, que luego
utilizamos para mostrar el resultado a la usuaria o usuario”, finaliza Luis.
Este enfoque te permite reutilizar la lógica de calcular el cuadrado en diferentes partes de tu
programa, simplemente llamando a la función con un nuevo número como argumento.
while True:
opcion = input("Ingresá el número de la operación que querés
realizar: ")
if opcion == "5":
print("Gracias por usar la calculadora. ¡Hasta luego!")
break
if opcion == "1":
print(f"Resultado: {sumar(num1, num2)}")
elif opcion == "2":
print(f"Resultado: {restar(num1, num2)}")
elif opcion == "3":
print(f"Resultado: {multiplicar(num1, num2)}")
elif opcion == "4":
print(f"Resultado: {dividir(num1, num2)}")
else:
print("Opción no válida. Por favor, elegí una opción entre 1
y 5.")
Luis te explica que "el corazón de esta calculadora son las funciones
que definimos para cada operación matemática. Cada función toma dos
argumentos (a y b) y devuelve el resultado correspondiente. Por
ejemplo, la función sumar simplemente retorna la suma de sus dos
parámetros.
Lo interesante acá es cómo integramos estas funciones dentro de un bucle para crear una
experiencia interactiva. En el menú principal, otorgamos la opción de elegir qué operación
realizar o salir del programa. Cuando se elige una operación válida (del 1 al 4), pedimos los
dos números necesarios, llamamos a la función correspondiente y mostramos el resultado.
El manejo de la división tiene una validación extra para evitar dividir por cero, que es un
caso común de error en programación. Este tipo de detalle demuestra la importancia de
anticiparse a posibles problemas y solucionarlos de antemano.
Por último, el uso del bucle while nos permite que la calculadora siga funcionando hasta que
se seleccione la opción salir. Este enfoque modular y reutilizable no solo hace el código más
legible, sino que también sienta una base sólida para futuras mejoras (¡y para implementar
en el TFI!), como agregar nuevas operaciones o implementar funciones más avanzadas.
Ejemplo práctico:
Veamos cómo en este caso podemos crear una función que calcule el precio total de un
producto en base a su precio unitario y cantidad, pero con un parámetro opcional que
permita aplicar un descuento.
Cuando una función necesita devolver varios resultados, Python agrupa automáticamente
esos valores en una tupla únicamente si separás por comas en la sentencia return.
Luego, al llamar a la función, podés asignar esos valores a variables individuales o
procesarlos directamente como una tupla.
Cuando llamamos a la función, los valores devueltos se asignan a las variables area y
perimetro.
Esto es posible gracias a que Python empaqueta los valores en una tupla y
luego los descomprime al asignarlos. Este enfoque te permite manejar
múltiples resultados de manera clara y sencilla.
El uso de tuplas es especialmente útil en aplicaciones más complejas, donde una función
necesita devolver un conjunto de resultados relacionados sin requerir estructuras más
avanzadas o personalizadas como clases o diccionarios.
Parámetros:
base (float): La base del rectángulo.
altura (float): La altura del rectángulo.
Retorna:
tuple: Una tupla que contiene el área y el perímetro del
rectángulo.
"""
area = base * altura
perimetro = 2 * (base + altura)
return area, perimetro
help(calcular_area_y_perimetro)
Parámetros:
base (float): La base del rectángulo.
altura (float): La altura del rectángulo.
Retorna:
tuple: Una tupla que contiene el área y el perímetro del
rectángulo.
(END)
Las funciones con return aportan modularidad y flexibilidad, ya que pueden integrarse en
flujos más complejos de lógica. Por otro lado, las funciones sin return son útiles para
ejecutar acciones específicas, como imprimir datos o modificar estructuras existentes, sin
necesidad de devolver un valor. Estas últimas son más adecuadas para tareas donde no se
espera que la función entregue un resultado para su reutilización.
Por ejemplo, una función sin return podría ser usada para mostrar un mensaje a quien usa
el programa:
def mostrar_bienvenida(nombre):
print(f"¡Bienvenido, {nombre}!")
Sin embargo, este tipo de funciones no permite que el resultado sea almacenado o
procesado más adelante, limitando su flexibilidad en flujos complejos.
Ejemplo práctico:
Como parte del proyecto de TalentoLab, parece que necesitamos hacer una mejora:
queremos que este código no sólo ejecute las acciones, sino que también devuelva
resultados que puedan ser utilizados en otras partes del programa.
Aquí está el código mejorado, adaptado para que las funciones devuelvan valores:
Con este diseño, no sólo estás aplicando buenas prácticas de programación, sino que
también estás construyendo un código más robusto, escalable y reutilizable. Estas mejoras
son muy importantes para que tu Trabajo Final Integrador sea un éxito.
Ejercicio práctico:
El día finaliza con otra reunión en la oficina de Mariana. Con su energía habitual, te felicita
por el progreso que estás logrando. "Luis me mostró el programa de gestión de frutas que
desarrollaste, y estoy muy impresionada con lo bien que aplicaste las funciones para
organizar el código. Sin embargo, quiero proponerte un desafío adicional:
● Consultar productos: Muestra todos los productos en la lista junto con sus
precios.
● Eliminar productos: A partir de su nombre.
● Menú interactivo: Debe ofrecer un menú para que se pueda elegir qué
acción realizar.
Videos:
Tutoriales sobre Ciencia y Tecnología: Funciones en Python
Píldoras informáticas: Funciones en Python (I) y Funciones en Python (II)
Próximos pasos
En la próxima clase, vas a dar un paso clave en la organización y ampliación de tus
proyectos de programación. Exploraremos cómo dividir el código en módulos para hacerlo
más ordenado, fácil de mantener y reutilizar en diferentes aplicaciones. Aprenderás a
importar módulos propios y externos, lo que te permitirá trabajar de manera más eficiente y
profesional.
Además, vamos a conocer algunos de los módulos estándar más útiles de Python, como
random y datetime, para resolver problemas comunes de manera práctica. También
haremos una introducción a módulos de terceros, como colorama, que aportan
herramientas interesantes para mejorar la experiencia del usuario en tus programas.
Programación con
Python
Clase 11
Clase N° 11 | Módulos
Temario:
● Organización del código en módulos.
● Importación de módulos propios y externos.
● Uso de módulos estándar (random, datetime).
● Introducción a módulos de terceros (colorama).
Objetivos de la Clase
En esta clase, aprenderás a organizar y estructurar tu código mediante el uso de módulos
en Python. Aprenderás a dividir tu código en archivos y componentes reutilizables,
mejorando la mantenibilidad y facilitando la colaboración en proyectos.
Este conocimiento te brindará una base sólida para construir soluciones modulares y
escalables, preparándote para enfrentar nuevos desafíos en el desarrollo de software.
Bienvenido a tu jornada en TalentoLab 🎉
Para empezar el día, te asignan una tarea sencilla: explorar cómo importar y usar módulos
ya disponibles en Python, como random y datetime. Además, te adelantan que vas a tener
la oportunidad de probar un módulo de terceros, colorama, para darle un toque de color a
tus aplicaciones de consola. "Es una herramienta genial para que tus programas sean más
atractivos visualmente", comenta Luis. Hoy, el enfoque está en aprender a organizar,
Por ejemplo, cuando escribís un programa que necesita realizar cálculos matemáticos
avanzados, podés importar el módulo math en lugar de escribir todas las funciones
matemáticas desde cero. Si tu programa requiere generar números aleatorios, el módulo
random ofrece una solución rápida y eficiente.
Los módulos sirven para dividir un programa en partes más pequeñas y manejables,
mejorando la estructura del código. Además, permiten reutilizar funcionalidades en múltiples
proyectos sin necesidad de reescribirlas. Por ejemplo, un módulo creado para calcular
impuestos puede ser usado en diferentes aplicaciones relacionadas con contabilidad o
ventas.
Además, los módulos ayudan a evitar problemas con nombres de variables y funciones al
encapsularlos en su propio espacio de nombres. Esto es especialmente útil en proyectos
grandes, donde diferentes partes del código podrían necesitar definiciones similares.
1. Reutilización de código: Podés escribir funciones y clases una vez en un módulo y
usarlas en múltiples programas, ahorrando tiempo y esfuerzo.
2. Organización: Los módulos dividen el código en bloques lógicos, haciendo que sea
más fácil entender qué hace cada parte de tu programa.
3. Mantenibilidad: Es más sencillo actualizar o corregir errores en un módulo
específico sin afectar otras partes del código.
4. Escalabilidad: En proyectos grandes, los módulos permiten trabajar en equipo de
manera más eficiente, ya que cada integrante puede enfocarse en una parte del
proyecto.
5. Acceso a herramientas listas para usar: Python ofrece una amplia biblioteca
estándar con módulos que resuelven problemas comunes, y también podés instalar
módulos de terceros para ampliar las capacidades de tu proyecto.
Por ejemplo, si tu aplicación necesita calcular fechas futuras basadas en datos ingresados
por usuarios, podés usar el módulo datetime. Esto no solo te ahorra escribir el código
desde cero, sino que también asegura que estés usando herramientas probadas y
optimizadas.
1. Identificá las partes del código que pueden agruparse: Analizá tu programa y
determiná qué funcionalidades o secciones podrían organizarse en módulos. Por
ejemplo, podrías tener un módulo para funciones matemáticas, otro para manejo de
bases de datos y uno más para la interfaz de usuario.
2. Creá archivos .py para cada módulo: Guardá las funciones, clases o variables
relacionadas en un archivo separado con un nombre que describa claramente su
contenido. Por ejemplo, un archivo llamado [Link] podría contener
funciones para sumar, restar, multiplicar y dividir.
3. Importá el módulo en tu programa principal: Usá la palabra clave import para
incluir el módulo en el archivo principal de tu programa. Esto te permitirá acceder a
las funciones y variables definidas en otros archivos.
Por ejemplo, supongamos que tenés un archivo principal [Link] y querés dividir una
sección del código en un módulo llamado [Link]. En el archivo [Link],
podrías definir una función como esta:
# [Link]
def saludar(nombre):
print(f"Hola, {nombre}. ¡Bienvenido!")
# [Link]
import utilidades
[Link]("Mariana")
import nombre_modulo
En este caso, nombre_modulo es el nombre del archivo .py que querés importar, sin incluir
la extensión .py. Una vez importado, podés acceder a las funciones, clases o variables del
módulo utilizando la notación nombre_modulo.elemento.
Por ejemplo:
# [Link]
def saludar(nombre):
print(f"Hola, {nombre}. ¡Bienvenido!")
# [Link]
import utilidades
[Link]("Luis")
Por ejemplo:
import utilidades as ut
[Link]("Diego")
Esto es útil cuando el nombre del módulo es largo o si querés estandarizar los nombres en
un equipo de desarrollo.
Con la orden import, estás desbloqueando una de las herramientas más poderosas de
Python para trabajar de manera modular, eficiente y escalable.
Módulos estándar.
Los módulos estándar son una parte esencial del ecosistema de Python. Estos módulos
vienen incluidos por defecto en cada instalación del lenguaje y están diseñados para ofrecer
una amplia variedad de herramientas que facilitan la resolución de problemas comunes y
optimizan el desarrollo de aplicaciones. Gracias a su disponibilidad inmediata, los módulos
estándar se convierten en aliados fundamentales para cualquier programador que utilice
Python, ya que no requieren instalación adicional y están listos para usarse mediante la
orden import.
A diferencia de los módulos creados por el usuario, que son específicos para un proyecto o
aplicación, los módulos estándar están diseñados para ser universales y aplicables en una
variedad de contextos. Por ejemplo, un módulo estándar como random permite generar
números aleatorios de manera sencilla, mientras que un módulo que creas vos podría
contener funciones personalizadas para resolver un problema específico de tu aplicación.
Ambos tipos de módulos son útiles, pero su alcance y propósito son diferentes: los estándar
son herramientas generalizadas, mientras que los módulos propios están orientados a
necesidades puntuales.
Por otro lado, los módulos estándar también se distinguen de los módulos creados por
terceros, como colorama. Estos últimos son desarrollados por la comunidad o empresas
externas y suelen resolver problemas más específicos que los módulos estándar no
abordan. A diferencia de los módulos estándar, los de terceros necesitan instalarse por
separado mediante herramientas como pip. Sin embargo, al igual que los módulos
estándar, amplían las capacidades de Python y se integran perfectamente con el lenguaje.
Por ejemplo, mientras el módulo estándar math ofrece operaciones matemáticas
avanzadas, un módulo de terceros como numpy lleva el cálculo numérico a otro nivel.
Característica Módulos Estándar Módulos Propios Módulos de Terceros
# Ejecutamos el juego
lanzar_dados()
En este ejemplo, [Link](1, 6) genera un número entero aleatorio entre 1 y 6,
simulando el resultado de un dado. La suma de los valores muestra el resultado del
lanzamiento.
Un ejemplo típico de uso del módulo math es calcular la raíz cuadrada de un número,
encontrar el valor del seno o coseno de un ángulo, o trabajar con constantes matemáticas
como π (pi) o e (la base del logaritmo natural).
Imaginá que querés calcular el área de un círculo dado su radio. Usando el módulo math,
podés hacer lo siguiente:
# Mostramos el resultado
print(f"El área del círculo con radio {radio} es: {area:.2f}")
Este código comienza importando el módulo math, lo que permite acceder a sus funciones
y constantes, como el valor de π. Luego, se solicita el ingreso del radio del círculo para
proceder con el cálculo del área. Para ello, se utiliza la fórmula matemática del área del
círculo: π multiplicado por el radio elevado al cuadrado. En el código, esto se implementa
utilizando [Link] para obtener el valor de π y [Link]() para calcular el cuadrado del
radio. Finalmente, se muestra el área calculada en pantalla, formateada con dos decimales
para una presentación más clara.
El siguiente código muestra cómo se puede usar datetime para obtener la fecha y hora
actual y presentarlas en diferentes formatos:
import datetime
Instalación de colorama
Para instalar colorama, necesitás usar el gestor de paquetes de Python, pip. Asegurate de
tener una conexión a internet y seguí estos pasos:
Para empezar a darle color a tus textos en la terminal con Colorama, el primer paso es
inicializar la biblioteca. Esto se logra mediante una llamada a la función init(). Al hacerlo,
colorama prepara tu entorno para que pueda interpretar y mostrar los colores
correctamente. Veamos cómo hacerlo:
Una vez que colorama está inicializado, cambiar el color del texto es tan simple como
utilizar una de las constantes de [Link].*. Por ejemplo, si deseas imprimir el texto
"Hola Mundo" en color verde, podés hacerlo de la siguiente manera:
Este código agrega el color verde al texto, resultando en una salida colorida y llamativa en
tu terminal.
Hola Mundo
Personalización avanzada con colorama.
Cambiar el fondo del texto
Al igual que modificamos el color del texto con [Link].*, cambiar el color de fondo
es igual de sencillo usando [Link].*. Por ejemplo, para establecer un fondo rojo,
harías lo siguiente:
Salida:
Hola Mundo
Colorama también te permite combinar colores de texto y fondo en una misma impresión:
Salida:
Hola Mundo
Ejercicio Práctico
Cómo es habitual, finalizas el día con una reunión de trabajo en la oficina de Mariana, que
te felicita por tu progreso. "Luis me mostró el programa de gestión de frutas que
desarrollaste, y estoy muy impresionada con lo bien que aplicaste las funciones para
organizar el código. Sin embargo, es hora de mejorarlo:
Videos:
Byspel: Cómo crear un módulo propio
Cosas de Informatica: Descubre cómo crear y utilizar módulos en Python
Preguntas para Reflexionar:
1. ¿Cómo creés que el uso de módulos puede ayudarte a mejorar la organización de
tus proyectos? Pensá en ejemplos concretos donde dividir el código en módulos
podría simplificar su mantenimiento.
2. Los módulos estándar como random y datetime ofrecen muchas funcionalidades
predefinidas. ¿Qué ventajas encontrás al usar estas herramientas en lugar de
desarrollar todo desde cero? ¿Podrías pensar en aplicaciones prácticas para estos
módulos en tus proyectos?
3. La biblioteca colorama permite personalizar la interacción en la consola con colores.
¿Cómo podría mejorar la experiencia del usuario en programas que diseñes? ¿Qué
otras aplicaciones creativas podrías imaginar para este módulo?
4. Ahora que entendiste cómo crear tus propios módulos, ¿cómo los usarías para
estructurar un proyecto más grande? ¿Qué partes del código podrías separar en
diferentes archivos para facilitar el trabajo en equipo?
Próximos Pasos:
En la próxima clase, vas a explorar un concepto fundamental en el desarrollo de software: la
persistencia de datos. Aprenderás cómo hacer que tu programa guarde información de
forma permanente, permitiendo que los datos ingresados se conserven incluso después de
cerrar la aplicación. Esta habilidad es indispensable para desarrollar aplicaciones que
gestionen información de manera útil y práctica.
Programación con
Python
Clase 12
Clase N° 12 | Persistencia de
datos
Temario:
● Lectura y escritura de archivos de texto.
● Uso de archivos para almacenar datos de forma persistente.
● Introducción al manejo de excepciones (try-except).
● Conceptos fundamentales de bases de datos y SQL (visión general).
Objetivos de la Clase
En esta clase, aprenderás a gestionar datos de manera persistente utilizando archivos de
texto. Esto te permitirá guardar información generada por tu programa para que pueda ser
recuperada en ejecuciones futuras, una habilidad necesaria para construir sistemas más
prácticos y funcionales.
Explorarás cómo leer y escribir en archivos, aplicando estas herramientas para almacenar
información de manera eficiente. También introducirás el manejo de excepciones mediante
try-except, una técnica que te permitirá prever errores comunes, como archivos
inexistentes o datos corruptos, y asegurarte de que el programa siga funcionando de
manera adecuada.
Con estos conocimientos, estarás más cerca de desarrollar aplicaciones completas y listas
para el mundo real, cumpliendo con las demandas actuales del manejo de datos.
Bienvenido a tu jornada en TalentoLab 🎉
El día comienza en TechLab con una reunión de equipo liderada por Diego, el desarrollador
senior. Te recibe con entusiasmo y comienza a explicar el nuevo desafío que el cliente ha
planteado.
Diego continúa: "Hoy vamos a ver cómo leer y escribir en archivos de texto para guardar
información como nombres, precios y cualquier dato que consideremos importante. También
quiero que aprendan a manejar errores comunes, como intentar abrir un archivo que no
existe, usando una herramienta fundamental: try-except. Además, les voy a dar una
introducción al concepto de bases de datos y SQL, que son técnicas más avanzadas para
manejar grandes cantidades de datos de manera eficiente."
Persistencia de datos.
En el desarrollo de software, una de las necesidades más comunes es la capacidad de
guardar información que pueda ser utilizada nuevamente, incluso después de cerrar el
programa. Esto es lo que conocemos como persistencia de datos. Sin persistencia, toda la
información ingresada o procesada durante la ejecución del programa desaparece al
finalizarlo, lo que limita enormemente su utilidad.
Imaginemos un sistema de gestión de clientes o productos: sería poco práctico que los
datos se perdieran cada vez que se cierra la aplicación. La persistencia de datos permite
que los programas guarden información en archivos o bases de datos, para luego
recuperarla cuando sea necesario. Esto hace que las aplicaciones sean más funcionales en
escenarios del mundo real, donde la continuidad de la información es indispensable.
Archivos de texto.
Un archivo de texto es un tipo de archivo que almacena información en formato de texto
plano. Esto significa que su contenido está compuesto únicamente por caracteres, como
letras, números, símbolos y espacios, organizados en líneas. Estos archivos son legibles
tanto por humanos como por programas de computadora. A diferencia de otros tipos de
archivos, como imágenes o videos, que contienen datos binarios codificados para
representar píxeles, colores, sonido o movimiento, los archivos de texto no requieren ningún
software especializado para interpretarlos. Por ejemplo, un archivo de texto se puede abrir
con un bloc de notas o cualquier editor de texto básico, mientras que un archivo de imagen
necesita un visor gráfico.
En el contexto de la programación, los archivos de texto son muy útiles para guardar datos
simples como configuraciones, registros de actividad, listas o resultados procesados por un
programa. Al ser más livianos y fáciles de manejar, se utilizan ampliamente en proyectos
iniciales o en situaciones donde no se requiere almacenar grandes volúmenes de datos
estructurados.
Un archivo de texto suele tener extensiones como .txt, .csv o .log, dependiendo de su
contenido y propósito. Por ejemplo, un archivo .csv (Comma-Separated Values) es un
archivo de texto donde los datos están organizados en líneas y separados por comas, ideal
para manejar tablas o listas.
En Python, interactuar con archivos de texto es una habilidad indispensable para agregar
persistencia a los programas, permitiendo guardar información que luego se puede
recuperar. Esto incluye acciones como abrir un archivo para lectura o escritura, agregar
nuevos datos o procesar líneas específicas. A través de esta interacción, podemos extender
un montón las capacidades de cualquier programa, haciendo que la información sea
accesible más allá de la ejecución en tiempo real.
Por ejemplo, si queremos abrir un archivo llamado "[Link]" para lectura, escribiríamos:
La línea anterior es una instrucción en Python que abre un archivo llamado [Link] para
interactuar con él. La función open() crea un objeto que nos permite realizar operaciones
como leer, escribir o modificar su contenido.
En este caso, "[Link]" es el nombre del archivo que queremos abrir. Python buscará
este archivo en la misma carpeta donde se encuentra el script que estamos ejecutando. Si
el archivo no existe y estamos intentando abrirlo en modo de lectura, el programa generará
un error. El argumento "r" indica el modo en el que se abre el archivo, en este caso, solo
lectura. Esto significa que podremos leer su contenido, pero no modificarlo.
La variable archivo almacena el objeto de archivo que crea la función open(). Este objeto
es la necesario para interactuar con el contenido del archivo, ya que nos permite realizar
operaciones como leer líneas o recorrer su contenido. Sin embargo, si el archivo no está
disponible en la ubicación especificada, Python generará un error, lo que resalta la
importancia de manejar excepciones -como veremos en breve- para evitar que el programa
falle.
Para leer el contenido de un archivo, Python ofrece varios métodos. Uno de los más
comunes es read(), que devuelve todo el contenido del archivo como una cadena. Por
ejemplo:
[Link]()
Este código abre el archivo de texto llamado [Link] en modo lectura. La función open() ,
como antes, crea un objeto de archivo que se asigna a la variable archivo, permitiendo
interactuar con el contenido del archivo. Luego, con [Link](), se leen todas las
líneas del archivo y se almacenan en una lista llamada lineas, donde cada elemento de la
lista representa una línea del archivo.
A continuación, se utiliza un bucle for para recorrer cada línea almacenada en la lista.
Dentro del bucle, se usa el método .strip() para eliminar los saltos de línea o espacios
adicionales al principio y al final de cada línea antes de imprimir su contenido en pantalla.
Este método asegura que el texto se muestre limpio, sin caracteres de formato
innecesarios.
Finalmente, el archivo se cierra con [Link](), para liberar los recursos asociados al
archivo y garantizar que no queden archivos abiertos en el sistema. Este cierre explícito es
una buena práctica de programación cuando se trabaja con archivos.
Para escribir en un archivo, debemos abrirlo en modo escritura ("w") o agregar ("a"). El
método más usado para escribir es write(). Por ejemplo:
Este último ejemplo agrega una nueva linea con el contenido “Tercera línea del archivo.” al
archivo creado en el ejemplo anterior. El contenido final del archivo “[Link]” es el
siguiente:
Ejemplo práctico:
Ahora que hemos analizado estos conceptos, veamos un ejemplo práctico. Supongamos
que queremos registrar una lista de nombres en un archivo y luego leerlos para mostrarlos.
En la segunda parte, el mismo archivo se abre nuevamente, esta vez en modo lectura
utilizando el parámetro "r". Se imprime un encabezado para indicar que se mostrará el
contenido del archivo. A continuación, se recorre cada línea del archivo con un bucle for.
Para evitar mostrar los saltos de línea adicionales, se aplica el método .strip() a cada línea .
Finalmente, el archivo se cierra otra vez con close().
El bloque try-except funciona como un sistema de seguridad: dentro del bloque try se
coloca el código que puede generar una excepción, y dentro del bloque except se define
cómo responder a esa excepción si ocurre. Esto permite que el programa continúe
ejecutándose o tome acciones específicas frente a un error, como registrar el problema,
pedir nuevamente una entrada válida o usar un valor por defecto.
try:
# Código que puede generar una excepción
# Por ejemplo: abrir un archivo, realizar
# una operación matemática, convertir un dato, etc.
operación_riesgosa()
except TipoDeExcepción:
# Cómo manejar la excepción si ocurre
# Mostrar un mensaje de error, registrar el problema,
# usar un valor predeterminado, etc.
manejar_error()
Por ejemplo, al trabajar con archivos, podríamos encontrarnos con situaciones como
intentar abrir un archivo que no existe o carecer de permisos para escribir en él. Usar
try-except en estos casos no solo hace que el código sea más robusto, sino que también
mejora la experiencia del usuario al manejar los errores de forma clara para construir
programas confiables, capaces de operar en entornos reales, donde los errores son
inevitables. Nos permite anticiparnos a las fallas, mantener el control y mejorar la calidad
general del software.
Resumiendo:
Bloque try: Aquí colocás el código que puede generar un error. Python
intentará ejecutarlo. Si no hay errores, el bloque except no se ejecutará.
Bloque except: Si ocurre un error en el bloque try, Python "salta" al bloque
except correspondiente. Allí definís cómo manejar el error (por ejemplo,
mostrando un mensaje o tomando alguna acción correctiva).
Ejemplo práctico:
Acá tenés un ejemplo práctico que utiliza try-except para manejar posibles errores al
intentar abrir y leer un archivo en Python. Vamos a suponer que el archivo que queremos
abrir tal vez no exista.
try:
# Intentamos abrir un archivo para lectura
archivo = open("[Link]", "r")
# Cerramos el archivo
[Link]()
except FileNotFoundError:
print("Error: El archivo '[Link]' no existe.")
print("Verificá el nombre o la ubicación del archivo.")
¿Cómo funciona esto? Bien, en Python, cuando intentás abrir un archivo que no existe con
el modo de lectura ("r"), se genera una excepción llamada FileNotFoundError. Este error
es una subclase de las excepciones integradas en Python, y su función principal es indicar
que el archivo solicitado no se pudo encontrar en la ubicación especificada. Si no
manejamos esta excepción, el programa se detendría abruptamente, mostrando un mensaje
de error.
El bloque except del ejemplonos permite "atrapar" este tipo específico de error y definir
cómo debe responder el programa cuando ocurre. Al especificar except
FileNotFoundError:, estamos indicando que queremos manejar exclusivamente este tipo
de error. Esto es útil cuando trabajamos con archivos, ya que el error puede ser común y
predecible, pero no queremos que detenga el funcionamiento del resto del programa.
Para evitar estos problemas, podemos usar el bloque try-except de Python. En lugar de
detenerse, el programa puede mostrar un mensaje claro al usuario indicando el problema,
pedir nuevamente la entrada correcta o incluso tomar una acción predeterminada. Veamos
un ejemplo:
print("=== Calculadora de División ===")
try:
numerador = float(input("Ingresá el numerador: "))
denominador = float(input("Ingresá el denominador: "))
except ValueError:
# Manejo de error si el usuario ingresa algo que no es
# un número
print("[ERROR] Debés ingresar valores numéricos válidos.")
except ZeroDivisionError:
# Manejo de error si el usuario intenta dividir por cero
print("[ERROR] El denominador no puede ser cero.")
print(" Intentá nuevamente.")
El programa del ejemplo es una calculadora sencilla que permite al usuario realizar
divisiones. Primero, se imprime un título para informar al usuario qué hace el programa.
Luego, se utiliza un bloque try para encapsular el código que podría generar errores.
Las bases de datos y SQL son muy importantes en el desarrollo de software porque
permiten a los programas gestionar datos de manera eficiente. Estas herramientas ofrecen
varias ventajas importantes. Por un lado, los datos se almacenan de manera estructurada,
lo que facilita su acceso y manipulación. Además, la información persiste incluso después
de cerrar el programa, asegurando su disponibilidad a largo plazo. Tanto SQL como las
bases de datos son altamente escalables, lo que significa que siguen siendo prácticas
incluso cuando la cantidad de datos crece significativamente.
En Python, es posible trabajar con bases de datos utilizando módulos como sqlite3, que
permite conectar el lenguaje con una base de datos y ejecutar operaciones en ella. Aunque
abordaremos ese módulo en la clase siguiente, presentaremos una visión general para que
comprendas cómo SQL y Python se complementan y cómo esta integración es una base
importante para desarrollar tus aplicaciones.
Python ofrece una variedad de herramientas para interactuar con bases de datos, y una de
las más accesibles y versátiles es SQLite. SQLite es una biblioteca que implementa una
base de datos relacional de alto rendimiento, ligera y autónoma, ideal para aplicaciones
pequeñas y medianas. Una de sus principales ventajas es que no requiere configuración
previa ni un servidor externo, lo que la hace perfecta para aprender los fundamentos de
bases de datos y SQL.
Ruta de avance.
Ahora que entendiste los conceptos básicos de persistencia de datos y comenzaste a
trabajar con archivos en Python, estás un paso más cerca de dominar una habilidad clave
para el desarrollo del Trabajo Final Integrador. Incorporar la posibilidad de guardar y
recuperar información entre sesiones hará que tu proyecto sea más funcional y relevante.
Pensá en cómo podés aplicar estas herramientas a tu proyecto actual. Por ejemplo, si tu TFI
incluye un sistema de gestión de clientes o productos, podrías usar archivos para almacenar
los datos que el usuario ingrese y recuperarlos al reiniciar la aplicación. Esto permitirá que
el sistema mantenga su utilidad en el tiempo y no pierda información al cerrarse.
● Practicá leer y escribir archivos con distintos formatos de datos y estructuras. Por
ejemplo, probá registrar listas de productos o nombres de clientes en un archivo y
luego recuperarlos para mostrarlos en pantalla.
● Aplicá el manejo de excepciones que aprendiste con try-except para manejar
posibles errores en la interacción con archivos, como la falta de permisos o la
ausencia de un archivo.
● Reflexioná sobre cómo podés mejorar la experiencia del usuario en tu programa al
agregar mensajes claros cuando ocurran errores o confirmaciones al guardar datos
correctamente.
Esta práctica no sólo te ayudará a consolidar lo aprendido en esta clase, sino que también
te preparará para integrar bases de datos en tus proyectos, una habilidad que explorarás en
la próxima clase. ¡Seguí adelante, estás haciendo un gran trabajo!
Ejercicio Práctico:
Como parte del proyecto de TalentoLab, el cliente necesita un sistema que permita registrar
los datos de los usuarios en un archivo de texto, para que puedan ser recuperados y
utilizados en futuras sesiones. Diego te asignó la tarea de desarrollar este sistema básico
de persistencia de datos, aplicando todo lo que aprendiste. Tu tarea consiste en:
Videos:
Codigofacilito: Excepciones
Dimas: Manejo de archivos en Python
Además, vamos a trabajar con consultas SQL básicas como SELECT, INSERT, UPDATE y
DELETE, para que puedas manipular los datos de manera eficiente. Este conocimiento te
abrirá la puerta a desarrollar aplicaciones que requieran manejar grandes volúmenes de
información de forma estructurada y persistente.
Programación con
Python
Clase 13
Clase N° 13 | Módulo SQLite 3
Temario:
● Instalación y uso del módulo sqlite3.
● Conexión a una base de datos SQLite.
● Creación de tablas y definición de campos.
● Consultas SQL básicas desde Python: SELECT, INSERT, UPDATE, DELETE.
Objetivos de la Clase
En esta clase, aprenderás a trabajar con bases de datos SQLite directamente desde
Python, un paso esencial para desarrollar aplicaciones que manejen grandes volúmenes de
datos de manera organizada y eficiente. Descubrirás cómo instalar y utilizar el módulo
sqlite3 para conectar tus programas con una base de datos SQLite, lo que permitirá
almacenar y recuperar información de forma persistente.
Además, explorarás cómo crear bases de datos y definir tablas con campos específicos,
entendiendo la importancia de estructurar los datos de manera lógica para facilitar su
manipulación. También aprenderás a ejecutar consultas SQL básicas, como SELECT,
INSERT, UPDATE y DELETE, que te permitirán gestionar y modificar la información
almacenada según las necesidades de tu aplicación.
La integración de consultas SQL en tus programas será otro aspecto clave que abordarás,
lo que te preparará para diseñar aplicaciones más avanzadas y robustas. Con estas
herramientas, darás un gran paso hacia la creación de proyectos con una gestión
profesional de la información.
Bienvenido a tu jornada en TalentoLab 🎉
Más tarde, en una reunión con Diego, el desarrollador senior, te da más detalles. "Vamos a
trabajar con SQLite, que es ideal para este tipo de proyectos porque no requiere
configuración compleja. Es una base de datos ligera, pero poderosa, y Python tiene todo lo
necesario para conectarse y trabajar con ella. Hoy vas a aprender cómo instalarla, crear
tablas y ejecutar consultas básicas desde tu programa. Te va a sorprender lo que podés
lograr."
Con este nuevo desafío en puerta, te sentís motivado para aprender una de las
herramientas más importantes en el desarrollo de software profesional.
Estructura de la base de datos
En una base de datos, la información se organiza en tablas. Podemos imaginar una tabla
como una hoja de cálculo donde cada fila representa un registro (como un producto del
inventario) y cada columna representa un campo (por ejemplo, el nombre del producto, el
precio o la cantidad disponible). Esta estructura es muy práctica porque facilita la búsqueda,
el filtrado y la modificación de datos.
Los tipos de datos que podemos almacenar en los campos de una tabla son importantes
porque determinan qué clase de información puede guardarse en ese campo. Al definir una
tabla, tenemos que indicar qué tipo de dato se acepta en cada campo para asegurarnos de
que la información se almacene correctamente.
Estos son algunos de los tipos de datos más comunes y útiles para un proyecto de gestión
de inventario:
● Texto: Este tipo de dato se utiliza para almacenar cadenas de texto. Es útil cuando
queremos guardar nombres de productos, descripciones o categorías. Por ejemplo,
podríamos tener un campo llamado "nombre" para guardar el nombre del producto
("Manzana", "Leche", etc.) y otro llamado "descripción" para una breve descripción
del producto.
● Números enteros: Este tipo de dato se utiliza para almacenar números enteros. Es
ideal para cantidades de productos o para campos que necesiten valores numéricos
sin decimales, como el código de un producto (por ejemplo, un ID único que
identifique cada producto). Un campo de tipo entero sería perfecto para registrar
cuántas unidades de cada producto tenemos en el inventario.
● Fechas y horas: A veces es necesario registrar cuándo ocurrió algo, como la fecha
en que un producto fue agregado al inventario o la última vez que se actualizó su
cantidad. Para esto, usamos un tipo de dato que pueda manejar fechas y horas.
Estos campos son útiles para llevar un control de las acciones que realizamos en la
base de datos.
Al crear una tabla, decidimos qué tipo de datos vamos a almacenar en cada campo según el
tipo de información que necesitamos guardar. De esta forma nos aseguramos de que la
base de datos esté organizada y opere con normalidad.
Campos clave.
Ahora vamos a hablar sobre un concepto clave en las bases de datos: el campo clave, o
también conocido como clave primaria. Este campo es uno de los elementos más
importantes cuando diseñamos una tabla en nuestra base de datos.
Un campo clave es un campo especial dentro de una tabla que se utiliza para identificar de
manera única cada registro. Imaginemos que tenemos una tabla donde guardamos todos
los productos del inventario. Cada producto tiene su propio nombre, precio, cantidad, etc.,
pero necesitamos un dato que permita diferenciar cada producto de manera única. Para
esto, usamos una clave primaria.
La clave primaria tiene dos características principales:
Unicidad: No puede haber dos registros en la tabla que tengan el mismo valor en el campo
clave. Esto es lo que permite identificar de manera única cada producto en el inventario. Por
ejemplo, en nuestra tabla de productos, podríamos usar un campo llamado "ID Producto",
que asigna un número único a cada producto. Así, aunque tengamos dos productos
llamados "Pan", cada uno tendría un número de ID diferente, lo que nos permite
diferenciarlos.
No puede ser nulo: El campo clave debe tener siempre un valor. No puede quedar vacío.
Si no existiera una clave para un registro, no tendríamos manera de identificarlo claramente
dentro de la tabla, lo que generaría problemas al momento de buscar o actualizar
información.
Por ejemplo, en nuestra tabla de productos, podemos tener un campo llamado "ID
Producto" que actúe como clave primaria. Supongamos que tenemos estos productos.
En este ejemplo, el campo ”ID Producto” es la clave primaria. Cada producto tiene un
número único que lo diferencia de los demás, incluso si otros datos, como el nombre,
llegaran a repetirse. El hecho de que sea único y obligatorio nos asegura que podemos
identificar cualquier producto en la tabla sin confusión.
Una de las mayores ventajas de utilizar una clave primaria es que nos permite realizar
búsquedas de manera rápida. Al tener un identificador único para cada registro, podemos
encontrar lo que buscamos sin tener que comparar otros campos. Además, nos brinda
seguridad al momento de actualizar datos. Si necesitamos cambiar la cantidad de un
producto o modificar su precio, podemos hacerlo con la tranquilidad de que estamos
editando el registro correcto, ya que está identificado de forma única. Por otro lado, la clave
primaria también garantiza la integridad de los datos. Al no permitir valores repetidos o
vacíos, ayuda a mantener la tabla organizada y libre de errores. Esto hace que sea una
herramienta casi indispensable para la correcta gestión de los datos, sobre todo cuando
trabajamos con grandes volúmenes de información, como en el caso de un sistema de
inventario.
Una de las grandes ventajas de SQLite es que los datos se almacenan en un archivo único
que puede ser fácilmente transferido o respaldado. Además, al ser una base de datos
relacional, organiza la información en tablas, tal como explicamos antes. Esto facilita la
consulta y manipulación de datos.
Al trabajar con sqlite3, podés crear, leer, actualizar y eliminar datos en una base de datos
utilizando comandos SQL directamente desde Python. Este enfoque no solo mejora la
persistencia de los datos, sino que también permite gestionar grandes volúmenes de
información de manera más eficiente que utilizando archivos de texto.
import sqlite3
# Cerrar la conexión
[Link]()
import sqlite3
# Cerrar la conexión
[Link]()
En este ejemplo, se establece una conexión con la base de datos llamada [Link]. Si
el archivo no existe, será creado en el mismo directorio donde se ejecuta el programa. El
mensaje en pantalla confirma que la conexión se realizó correctamente, y al final, se cierra
la conexión para evitar problemas futuros.
Cerrar la conexión no solo es una buena práctica, sino que también previene
errores relacionados con bloqueos de archivo o recursos no liberados.
Creación de tablas y definición de campos
Una vez establecida la conexión con una base de datos SQLite, el siguiente paso es definir
su estructura creando tablas. Una tabla es el componente principal de una base de datos,
donde los datos se organizan en filas y columnas. Cada columna representa un campo con
un tipo de dato específico, como texto, números o fechas, mientras que cada fila almacena
un registro individual.
Para crear una tabla en SQLite desde Python, utilizamos sentencias SQL con el método
execute() proporcionado por el objeto cursor. El cursor es una herramienta que nos permite
interactuar con la base de datos, ejecutar consultas y recuperar resultados.
A continuación, un ejemplo donde se crea una tabla llamada productos con tres campos: id
(clave primaria), nombre (nombre del producto) y precio (precio del producto):
import sqlite3
La sentencia CREATE TABLE IF NOT EXISTS asegura que la tabla se cree solo si no
existe ya en la base de datos, evitando errores por duplicados. Dentro de los paréntesis se
define la estructura de la tabla:
● nombre TEXT NOT NULL: El campo nombre almacena texto y no puede quedar
vacío.
● precio REAL NOT NULL: El campo precio almacena números reales y tampoco
puede quedar vacío.
Finalmente, se utiliza commit() para guardar los cambios realizados en la base de datos y
close() para cerrar la conexión.
import sqlite3
[Link]('''
INSERT INTO productos (nombre, precio)
VALUES (?, ?)
''', ("Cuaderno", 120.00))
[Link]('''
INSERT INTO productos (nombre, precio)
VALUES (?, ?)
''', ("Mochila", 890.99))
Finalmente, usamos el método commit() para guardar los cambios en la base de datos,
asegurándose de que los datos se conserven. La conexión se cierra al final con close().
Consulta de datos con SELECT
La sentencia SELECT en SQL se utiliza para recuperar información almacenada en una
tabla. Es una de las operaciones más comunes en el manejo de bases de datos y permite
obtener datos específicos o todos los registros según los criterios definidos.
import sqlite3
# Cerrar la conexión
[Link]()
El comando SELECT * FROM productos indica que queremos obtener todos los registros de
la tabla productos. El asterisco (*) significa "todas las columnas". El método fetchall()
recupera todos los resultados de la consulta en forma de lista de tuplas, donde cada tupla
representa un registro de la tabla.
En el bucle for, se itera sobre los resultados para mostrar el ID, nombre y precio de cada
producto. Esto facilita una visualización clara de los datos.
Recuperar registros con filtros
La cláusula WHERE permite definir condiciones para filtrar los resultados. En este caso,
precio > ? selecciona solo los productos cuyo precio sea mayor a 100. El marcador ? es
reemplazado por el valor proporcionado en la tupla (100,), asegurando que la consulta sea
segura.
Se puede ordenar los resultados utilizando la cláusula ORDER BY. Por ejemplo, para
mostrar los productos en orden ascendente por precio:
Si solo queremos recuperar ciertos campos, podemos especificar los nombres de las
columnas en lugar de usar *. Por ejemplo, obtener solo los nombres de los productos:
La sentencia SELECT es casi indispensable para trabajar con bases de datos, y como
hemos visto, su flexibilidad permite extraer la información de diferentes formas según las
necesidades de cada aplicación.
En Python, se puede usar el método execute() para implementar UPDATE. Veamos como
utilizarlo:
# Confirmar cambios
[Link]()
# Cerrar la conexión
[Link]()
También es posible modificar varios registros en una sola operación. Por ejemplo,
supongamos que queremos aumentar un 10% al precio de todos los productos que cuestan
menos de $100:
# Confirmar cambios
[Link]()
Este código utiliza la sentencia UPDATE para modificar los precios de los productos en una
base de datos que cumplan con una condición específica. En este caso, se busca
incrementar un 10% el precio de todos los productos cuyo valor sea menor a $100. La
sentencia SQL define la tabla (productos), el campo a modificar (precio) y la operación que
debe realizarse (precio * 1.10), además de incluir la condición WHERE precio < ?, donde el
marcador ? se reemplaza por el valor 100.
Además, siempre es buena práctica verificar el impacto de la operación con una consulta
previa o posterior que muestre los registros afectados, asegurando así la integridad de los
datos.
Supongamos que tenemos una tabla llamada productos y queremos eliminar un producto
basándonos en su nombre.
# Confirmar cambios
[Link]()
# Cerrar la conexión
[Link]()
En algunos casos, podemos querer eliminar varios registros que cumplan con una
condición, como todos los productos con un precio inferior a cierto valor.
# Confirmar cambios
[Link]()
Ejercicio Práctico
Al finalizar el día, Diego se acerca con una solicitud concreta:
Videos:
Auribox Training: SQLite con Python
Dimas: ¿Cómo usar SQLite3 en PYTHON?
Repasá los conceptos de esta clase y asegurate de comprender cómo estructurar y realizar
consultas en SQLite, ya que serán fundamentales para continuar avanzando en el curso.
Iniciación a la
Programación con
Python
Clase 14
Clase N° 14 | Operaciones CRUD
con Bases de Datos
Temario:
● Profundización en operaciones CRUD.
● Uso de parámetros en consultas para prevenir inyecciones SQL.
● Manejo de transacciones y control de errores.
Objetivos de la Clase
En esta clase, te adentrarás en la implementación completa de las operaciones CRUD en
bases de datos SQLite desde Python. Aprenderás a estructurar un sistema capaz de crear,
leer, actualizar y eliminar registros de manera eficiente, lo que te permitirá gestionar
información de forma organizada y persistente.
"Hola!
El sistema ya almacena información en SQLite, pero necesitamos que
los usuarios puedan modificar y eliminar registros de manera segura. Tu
tarea es implementar correctamente el CRUD (Crear, Leer, Actualizar y
Eliminar), asegurando que las operaciones sean confiables y
protegiendo el sistema contra posibles errores o ataques de inyección
SQL.
Diego está listo para explicarte cómo manejar transacciones y controlar errores en consultas
SQL. Esto garantizará que los datos no se corrompan y que, en caso de fallos, podamos
revertir cambios sin afectar la integridad del sistema.
"Bienvenido al siguiente nivel. Hoy vas a aprender cómo hacer que nuestro sistema sea
más robusto, ejecutando operaciones CRUD de manera segura. También te voy a mostrar
cómo las transacciones ayudan a mantener la integridad de los datos. Cuando terminemos,
vas a estar listo para poder aplicar todo esto en tu Trabajo Final Integrador."
Tomás asiento, listo para profundizar en la gestión avanzada de bases de datos en Python.
CRUD y su importancia en bases de datos
En cualquier aplicación que maneje información estructurada, es fundamental poder crear,
leer, actualizar y eliminar registros dentro de una base de datos. Estas cuatro operaciones
conforman lo que se conoce como CRUD (por sus siglas en inglés: Create, Read, Update,
Delete), y son la base de cualquier sistema de gestión de datos.
Implementar correctamente CRUD no solo permite manipular datos, sino que también
garantiza que la información esté organizada, accesible y actualizada. Sin un sistema
CRUD correcto, los datos serían estáticos o estarían desorganizados, dificultando su
administración.
Vamos a aplicar lo que ya sabemos sobre consultas SQL y la interacción con bases de
datos, pero ahora estructurándolo en un sistema funcional que permita realizar las cuatro
operaciones de CRUD de manera segura y eficiente.
1. Conexión a la base de datos: Se establece una conexión con un archivo SQLite
para almacenar los datos.
2. Creación de una tabla si no existe: Se define la estructura de los datos (nombre,
precio, stock, etc.).
3. Funciones para cada operación: Se programan las funciones para agregar, leer,
actualizar y eliminar registros.
4. Menú interactivo: Se permite al usuario seleccionar qué acción desea realizar.
Veamos un ejemplo concreto, escribiendo el código básico de un CRUD para manejar datos
de alumnos.
import sqlite3
def mostrar_alumnos():
"""Muestra todos los alumnos en la base de datos"""
[Link]("SELECT * FROM alumnos")
alumnos = [Link]()
print("\nLista de alumnos:")
for alumno in alumnos:
print(f"ID: {alumno[0]}, Nombre: {alumno[1]}, Edad: {alumno[2]},
Curso: {alumno[3]}")
def eliminar_alumno(id_alumno):
"""Elimina un alumno de la base de datos"""
[Link]("DELETE FROM alumnos WHERE id = ?", (id_alumno,))
[Link]()
print("Alumno eliminado correctamente.")
# Menú interactivo
while True:
print("\nGestión de Alumnos")
print("1. Agregar alumno")
print("2. Mostrar alumnos")
print("3. Actualizar curso de un alumno")
print("4. Eliminar alumno")
print("5. Salir")
if opcion == "1":
nombre = input("Ingresá el nombre del alumno: ").strip()
edad = input("Ingresá la edad del alumno: ").strip()
curso = input("Ingresá el curso del alumno: ").strip()
if id_alumno.isdigit():
actualizar_curso(int(id_alumno), nuevo_curso)
else:
print("El ID debe ser un número válido.")
if id_alumno.isdigit():
eliminar_alumno(int(id_alumno))
else:
print("El ID debe ser un número válido.")
else:
print("Opción inválida. Intentá nuevamente.")
Para realizar las operaciones de gestión, se han definido distintas funciones que encapsulan
las acciones necesarias para interactuar con la base de datos. La función
agregar_alumno() permite insertar un nuevo registro en la tabla, asegurándose de recibir el
nombre, la edad y el curso del estudiante. La función mostrar_alumnos() recupera todos
los registros de la base de datos y los muestra en pantalla. Cada fila obtenida a través de la
consulta SQL se presenta con el ID, el nombre, la edad y el curso de una persona.
El código principal ejecuta un menú interactivo que le permite al usuario seleccionar qué
acción desea realizar. Cada opción está asociada a una función específica que ejecuta la
operación correspondiente. Si el usuario elige agregar un nuevo alumno, se le solicitan los
datos y se verifica que la edad ingresada sea un número válido antes de insertarlo en la
base de datos. Si elige mostrar la lista de alumnos, se ejecuta la consulta para recuperar
todos los registros existentes y mostrarlos en la pantalla.
Para modificar el curso de un alumno, el sistema solicita el ID del alumno y el nuevo curso
a asignar. Antes de ejecutar la actualización, verifica que el ID ingresado sea numérico. Lo
mismo ocurre en la opción de eliminación: el sistema solicita el ID del alumno, lo valida y, si
es correcto, procede a eliminarlo de la base de datos.
Cuando el usuario decide salir del sistema, la conexión con la base de datos se cierra
correctamente. Esto es fundamental para garantizar que los cambios realizados se guarden
y evitar problemas de acceso a la base de datos en futuras ejecuciones del programa.
Este código permite gestionar alumnos en una base de datos de manera eficiente,
aplicando las operaciones CRUD de una forma estructurada y organizada. Más adelante
veremos cómo mejorar la seguridad de estas consultas para prevenir errores y
vulnerabilidades, asegurando que la base de datos sea robusta y segura.
¿Qué es una inyección SQL y por qué es un problema?
Cuando trabajamos con bases de datos en Python o en cualquier otro lenguaje, es
fundamental asegurarnos de que nuestras consultas sean seguras. Una de las principales
amenazas que enfrentamos al interactuar con bases de datos es la inyección SQL. Este
tipo de ataque ocurre cuando un usuario malintencionado introduce código SQL en los
campos de entrada de un formulario, manipulando la consulta para acceder, modificar o
incluso eliminar datos de la base de datos.
' OR 1=1 --
Y el sistema ejecuta la consulta sin validar la entrada, se podría generar una instrucción
como esta:
La condición 1=1 siempre es verdadera, por lo que la consulta devolverá todos los registros
de la tabla. En algunos casos, una inyección SQL maliciosa podría incluso eliminar toda la
base de datos o exponer información sensible.
Para evitar este problema, nunca debemos construir las consultas SQL concatenando
variables directamente en la consulta. En su lugar, se deben utilizar parámetros en
consultas preparadas, lo que evita que el contenido ingresado por el usuario se interprete
como código SQL.
[Link]()
[Link]()
En este caso, los signos de interrogación (?) actúan como marcadores de posición en la
consulta, y los valores que proporciona el usuario se pasan como una tupla aparte. De esta
manera, SQLite maneja los datos de manera segura y evita que sean interpretados
como código SQL malicioso.
def buscar_alumno(nombre):
conexion = [Link]("[Link]")
cursor = [Link]()
resultados = [Link]()
[Link]()
return resultados
Para que quede claro cómo mejorar la seguridad de nuestras consultas, comparemos dos
versiones de una consulta de eliminación de alumnos:
❌ Consulta insegura (vulnerable a inyección SQL):
def eliminar_alumno_inseguro(nombre):
conexion = [Link]("[Link]")
cursor = [Link]()
[Link]()
[Link]()
[Link]()
[Link]()
Este código evita el problema porque el valor ingresado se trata como un dato, no como
parte de la consulta SQL. Este enfoque basado en parámetros de consulta no sólo
protege nuestras bases de datos de ataques, sino que también mejora la eficiencia y
seguridad del sistema. En la siguiente sección, veremos cómo el uso de transacciones y
manejo de errores nos ayuda a garantizar la integridad de la información en la base de
datos.
Hasta ahora, hemos aprendido a realizar operaciones sobre bases de datos utilizando
consultas SQL seguras con SQLite. Sin embargo, para garantizar la integridad de los
datos, es importante entender el concepto de transacciones y cómo manejar posibles
errores al interactuar con la base de datos.
Supongamos que tenemos una base de datos con una tabla de alumnos y queremos
registrar a un estudiante asegurándonos de que se agregue correctamente a la base de
datos antes de confirmar los cambios.
import sqlite3
try:
# Iniciar la transacción
[Link]("BEGIN TRANSACTION")
except [Link] as e:
# Si ocurre un error, revertimos los cambios
[Link]()
print(f"Error al registrar al alumno: {e}")
finally:
[Link]()
Primero, se establece la conexión con la base de datos y se obtiene un cursor para ejecutar
consultas. Luego, se inicia una transacción con BEGIN TRANSACTION, lo que indica que
cualquier operación SQL posterior será parte de la transacción.
Dentro del bloque try, se ejecuta una consulta INSERT INTO para agregar el alumno a la
base de datos. Si la operación se realiza con éxito, el programa ejecuta commit(), lo que
confirma los cambios. Sin embargo, si ocurre un error en cualquier punto del proceso (por
ejemplo, si la tabla alumnos no existe o los datos ingresados son incorrectos), el programa
captura la excepción en el bloque except. En este caso, se ejecuta rollback(), lo que anula
cualquier modificación hecha durante la transacción y deja la base de datos en su estado
original.
El bloque finally es una parte opcional de la estructura try-except que se ejecuta siempre,
sin importar si ocurrió un error o no dentro del bloque try. Esto lo hace ideal para tareas que
deben realizarse sin excepción, como cerrar una conexión con la base de datos.
Cuando trabajamos con bases de datos, es muy importante cerrar la conexión después de
realizar una operación. Si no lo hacemos, podríamos dejar la base de datos en un estado
inconsistente o consumir recursos innecesariamente. El bloque finally garantiza que la
conexión se cierre incluso si ocurre un error en el proceso.
Por ejemplo, si intentamos insertar datos en la base y ocurre un problema con los valores
ingresados, el bloque except manejará el error, pero el finally se ejecutará de todas formas
para cerrar la conexión, asegurando que no queden conexiones abiertas.
import sqlite3
except [Link] as e:
# Si hay un error, revertimos ambas operaciones
[Link]()
print(f"Error al inscribir al alumno: {e}")
finally:
[Link]()
El bloque try comienza con BEGIN TRANSACTION, lo que indica que cualquier cambio
realizado en la base de datos después de esa línea quedará pendiente hasta que se
confirme con commit(). Si ambas inserciones (INSERT INTO alumnos y INSERT INTO
inscripciones) se ejecutan correctamente, la transacción se confirma y los datos quedan
almacenados en ambas tablas.
Sin embargo, si ocurre un error en cualquiera de las dos operaciones, el bloque except
entra en acción y ejecuta rollback(). Esto revierte todas las modificaciones realizadas
desde el inicio de la transacción, asegurando que la base de datos no quede en un estado
inconsistente.
El bloque finally se mantiene igual que en el ejemplo anterior, asegurando que la conexión
con la base de datos se cierre siempre, sin importar si la operación fue exitosa o no.
Este enfoque es casi indispensable cuando trabajamos con datos que dependen unos de
otros. Si solo se insertase al alumno pero fallara la inserción del código de inscripción,
tendríamos información incompleta en la base de datos. Gracias al uso de transacciones,
evitamos este problema garantizando que ambas inserciones ocurran juntas o ninguna de
ellas se registre.
Ejercicio Práctico
La jornada en TalentoLab transcurre con el habitual ritmo de trabajo cuando Mariana se
acerca a tu escritorio con su tablet en la mano.
Videos:
DayiTecnologia: Creando un CRUD con SQLite3 y Python
LuisDev: Manejo de errores en Python
Será una oportunidad para desarrollar un sistema completo, aplicando desde estructuras
básicas hasta bases de datos y manejo de errores. También veremos buenas prácticas de
programación y cómo documentar tu código de manera profesional para que sea claro y
comprensible para cualquier persona que lo lea.
Durante este proceso, no solo consolidarás lo aprendido, sino que también te prepararás
para presentar tu trabajo de manera ordenada y efectiva, tal como lo harías en un entorno
profesional. ¡Este es el momento de demostrar todo lo que has aprendido!
Para aprovechar al máximo la próxima clase, repasá el código de tus proyectos anteriores,
asegurate de comprender cómo funcionan las operaciones CRUD con SQLite y pensá en
cómo podrías mejorar y optimizar tu código con lo que aprendiste hasta ahora.
Iniciación a la
Programación con
Python
Clase 15
Clase N° 15 | Trabajo Final
Integrador y repaso general
Temario:
● Integración de todos los conceptos aprendidos.
● Desarrollo de un proyecto completo.
● Mejores prácticas de programación.
● Documentación y presentación del proyecto.
Objetivos de la Clase
En esta última clase del curso, integrarás todo lo aprendido en un proyecto funcional que
servirá como modelo para tu Trabajo Final Integrador (TFI). Aplicarás los conocimientos
adquiridos sobre bases de datos SQLite3, funciones en Python, manejo de
excepciones, validaciones, seguridad, estructuras de datos y optimización del
código.
Para esta aplicación, crearemos una base de datos llamada [Link], que almacenará
la información de los alumnos. La base de datos contará con una tabla principal llamada
alumnos, con los siguientes campos:
nombre TEXT NOT NULL Nombre del alumno. No puede estar vacío.
apellido TEXT NOT NULL Apellido del alumno. No puede estar vacío.
Ahora que definimos la estructura, vamos a crear la base de datos y la tabla utilizando
Python y SQLite3. Este código primero establece una conexión con [Link] y luego
crea la tabla alumnos con las restricciones que definimos previamente. La línea IF NOT
EXISTS en la sentencia CREATE TABLE evita errores si la tabla ya existe.
import sqlite3
from colorama import Fore, Style, init
# Inicializar colorama
init(autoreset=True)
def agregar_alumno():
"""
Solicita los datos del alumno y los guarda en la base de datos,
validando la entrada.
"""
try:
print([Link] + "\n=== Registrar Nuevo Alumno ===")
# Solicitar datos con validaciones básicas
nombre = input("Ingresá el nombre del alumno:
").strip().capitalize()
apellido = input("Ingresá el apellido del alumno:
").strip().capitalize()
edad = input("Ingresá la edad del alumno: ").strip()
curso = input("Ingresá el curso del alumno: ").strip().upper()
email = input("Ingresá el email del alumno: ").strip().lower()
# Validaciones
if not nombre or not apellido or not curso:
print([Link] + "[ERROR] El nombre, apellido y curso no
pueden estar vacíos.")
return
# Confirmar la transacción
[Link]()
print([Link] + f"[ÉXITO] Alumno {nombre} {apellido}
registrado correctamente.")
except [Link]:
print([Link] + "[ERROR] El email ingresado ya está
registrado.")
except [Link] as e:
print([Link] + f"[ERROR] Error en la base de datos: {e}")
finally:
[Link]()
El código que acabás de ver permite registrar alumnos en la base de datos, asegurando que
los datos sean válidos y manejando posibles errores. Vamos a recorrerlo en detalle para
que puedas entender cada parte y cómo se conecta con lo que ya aprendiste.
El primer paso es la importación de los módulos necesarios. Se usa sqlite3 para interactuar
con la base de datos y Colorama para mejorar la visualización de mensajes en la terminal,
destacando los errores en rojo, mostrar información en cian y confirmar operaciones
exitosas en verde.
Una vez obtenidos los datos, el código realiza varias validaciones antes de insertarlos.
Primero, verifica que ni el nombre, ni el apellido, ni el curso estén vacíos, ya que son datos
obligatorios. Si alguno está vacío, se muestra un mensaje de error y se corta la ejecución
con un return. Luego, revisa que la edad sea un número entero entre 5 y 120 años, ya que
no tendría sentido registrar un alumno con una edad fuera de esos rangos. También valida
que el email contenga un @ y que no tenga espacios en blanco, asegurando que el formato
sea correcto. Si alguna de estas validaciones falla, el programa no intenta guardar los datos
y muestra un mensaje de error al usuario.
Cuando todos los datos son correctos, se ejecuta la consulta SQL INSERT INTO alumnos
para agregar el nuevo registro a la base de datos. Acá es importante notar que se usa una
consulta parametrizada, representando los valores con signos de interrogación (?). Esto es
clave porque previene ataques de inyección SQL y asegura que los datos sean insertados
de manera segura.
Después de ejecutar la consulta, se usa commit() para confirmar los cambios y guardar el
nuevo registro en la base de datos. Si todo sale bien, se muestra un mensaje en verde
confirmando que el alumno fue agregado con éxito.
En el bloque except, se manejan posibles errores que pueden surgir durante la ejecución.
Si se intenta registrar un email que ya está en uso, el programa detecta la violación de una
restricción de unicidad y muestra un mensaje de error específico. Si ocurre otro problema
con SQLite, el mensaje de error de la base de datos se captura y se muestra al usuario,
para que pueda entender qué sucedió.
Por último, en el bloque finally, el código se asegura de cerrar la conexión con la base
de datos, independientemente de si la operación fue exitosa o falló. Esto es importante
porque mantener conexiones abiertas innecesariamente puede generar problemas en el
sistema.
Comenzaremos con la consulta. Esta funcionalidad permitirá ver los datos almacenados y
realizar búsquedas específicas. Implementaremos una opción que muestre todos los
alumnos y otra que permita filtrar por nombre. Además, aplicaremos formato con
Colorama para mejorar la experiencia visual.
Comencemos por la función consultar_alumno(), que nos permite listar todos los alumnos
o buscar por nombre.
def consultar_alumnos():
"""
Permite consultar la lista de alumnos registrados en la base de
datos.
Ofrece la opción de ver todos los alumnos o buscar por nombre.
"""
try:
print([Link] + "\n=== Consultar Alumnos ===")
print("1. Mostrar todos los alumnos")
print("2. Buscar alumno por nombre")
opcion = input("Seleccioná una opción: ").strip()
if opcion == "1":
# Mostrar todos los alumnos
[Link]("SELECT id, nombre, apellido, edad, curso,
email FROM alumnos")
alumnos = [Link]()
if not alumnos:
print([Link] + "[INFO] No hay alumnos registrados
en la base de datos.")
return
print([Link] + "\n=== Lista de Alumnos ===")
for alumno in alumnos:
print([Link] + f"ID: {alumno[0]}, Nombre:
{alumno[1]} {alumno[2]}, Edad: {alumno[3]}, Curso: {alumno[4]}, Email:
{alumno[5]}")
if not nombre_busqueda:
print([Link] + "[ERROR] El nombre no puede estar
vacío.")
return
if not alumnos:
print([Link] + "[INFO] No se encontraron alumnos
con ese nombre.")
return
else:
print([Link] + "[ERROR] Opción no válida.")
except [Link] as e:
print([Link] + f"[ERROR] Ocurrió un problema al consultar la
base de datos: {e}")
finally:
[Link]()
Esta función permite consultar alumnos en la base de datos mediante dos opciones: listar
todos los alumnos registrados o buscar uno en particular por su nombre.
Si se opta por la segunda opción, se solicita que se ingrese un nombre para buscar. Antes
de realizar la consulta, el programa verifica que el nombre no esté vacío. Luego, se ejecuta
una consulta parametrizada SELECT * FROM alumnos WHERE nombre = ? para
recuperar sólo aquellos registros que coincidan con el nombre ingresado.
def eliminar_alumno():
"""
Permite eliminar un alumno de la base de datos, asegurando que el
usuario confirme la acción antes de proceder.
"""
try:
print([Link] + "\n=== Eliminar Alumno ===")
if not alumnos:
print([Link] + "[INFO] No hay alumnos registrados en la
base de datos.")
return
if not id_alumno.isdigit():
print([Link] + "[ERROR] El ID ingresado no es válido.")
return
id_alumno = int(id_alumno)
if not alumno:
print([Link] + "[INFO] No se encontró un alumno con ese
ID.")
return
if confirmacion != "s":
print([Link] + "[CANCELADO] La eliminación ha sido
cancelada.")
return
# Eliminar al alumno
[Link]("DELETE FROM alumnos WHERE id = ?", (id_alumno,))
[Link]()
print([Link] + f"[ÉXITO] Alumno {alumno[0]} {alumno[1]}
eliminado correctamente.")
except [Link] as e:
print([Link] + f"[ERROR] Ocurrió un problema al eliminar el
alumno: {e}")
finally:
[Link]()
La función comienza estableciendo una conexión con la base de datos [Link]. Luego,
recupera y muestra todos los alumnos registrados para que el usuario pueda identificar cuál
desea eliminar. Se muestran los ID, nombres y cursos de los alumnos disponibles.
A continuación, el usuario debe ingresar el ID del alumno a eliminar. Se verifica que el ID
sea un número válido y que exista en la base de datos. Si el alumno no es encontrado, se
muestra un mensaje informativo.
Menú principal
Ahora, vamos a escribir el código del menú principal. Este menú permite elegir entre
agregar, consultar y eliminar alumnos, asegurando una interacción intuitiva y clara con las
funciones que escribimos antes.
def menu():
"""
Muestra el menú principal y permite seleccionar las acciones a
realizar en la base de datos.
"""
while True:
print([Link] + "\n=== Menú de Gestión de Alumnos ===")
print([Link] + "1. Registrar nuevo alumno")
print([Link] + "2. Consultar alumnos")
print([Link] + "3. Eliminar un alumno")
print([Link] + "4. Salir")
if opcion == "1":
agregar_alumno()
elif opcion == "2":
consultar_alumnos()
elif opcion == "3":
eliminar_alumno()
elif opcion == "4":
print([Link] + "\nGracias por usar el sistema. ¡Hasta
luego!")
break
else:
print([Link] + "[ERROR] Opción no válida. Intentá
nuevamente.")
# Ejecutar el menú
menu()
Este es la última pieza de nuestro proyecto. El menú principal es el punto de entrada del
programa y permite al usuario navegar entre las diferentes opciones disponibles. Desde
esta interfaz, podés registrar nuevos alumnos, consultar la base de datos, eliminar registros
o salir del programa.
Podes probarlo poniendo en un mismo archivo .py todo el código que hemos
visto, cuidando que las funciones estén al principio, y que se importen los
módulos antes de usarlas. La última función a incluir es menu().
El uso de try-except garantiza que los errores en la base de datos sean manejados
adecuadamente, evitando fallos inesperados y proporcionando mensajes informativos en
caso de problemas. Colorama se emplea para mejorar la visualización de los mensajes en
la terminal, destacando errores en rojo, información en amarillo y confirmaciones en verde,
lo que facilita la comprensión de las operaciones realizadas.
Buenas prácticas y estructura del código
Cuando desarrollás un proyecto en Python, especialmente uno que involucra bases de
datos y múltiples funciones, es fundamental que estructures el código de manera clara y
ordenada. Un código bien organizado no sólo facilita su comprensión y mantenimiento, sino
que también te permite realizar mejoras y agregar nuevas funcionalidades sin dificultad.
Una de las mejores prácticas es dividir el código en archivos según su función. En lugar de
tener todo en un solo archivo, puedes separar la lógica del programa en módulos
específicos. Por ejemplo, un archivo puede contener las funciones relacionadas con la base
de datos, otro las funciones de interacción con el usuario y un tercero el menú principal.
Esto ayuda a mantener cada parte del sistema bien delimitada, facilitando la depuración y el
trabajo en equipo.
Otro aspecto clave es la legibilidad del código. Elegir nombres de variables y funciones
descriptivos permite que tu código sea comprensible incluso para los demás. Usar
convenciones como snake_case para los nombres de funciones y variables, así como
mantener una correcta indentación, hace que el código sea más intuitivo. También es
recomendable que evites redundancias y reutilices funciones en lugar de repetir líneas de
código similares en diferentes partes del programa.
El manejo adecuado de errores es otro punto importante. Utilizar try-except para gestionar
posibles fallos, como errores en la conexión a la base de datos o entradas incorrectas del
usuario, mejora la estabilidad del sistema. Incluir mensajes de error claros y útiles evita que
el usuario se frustre y proporciona información útil para corregir problemas.
Un código bien estructurado es fácil de leer, mantener y modificar. Para lograr esto, es
recomendable dividir el código en funciones que realicen tareas específicas, evitando
redundancias y asegurando una lógica clara. Además, la utilización de nombres descriptivos
en variables y funciones mejora la comprensión del programa.
En el caso del TFI, tu aplicación podría estar organizada en módulos que se encarguen de
la conexión con la base de datos, la manipulación de los datos y la interfaz con el usuario.
Esto facilitaría su mantenimiento y -eventualmente- permite reutilizar funciones en distintos
puntos del programa.
Un código sin comentarios es como un libro sin índice: difícil de entender y navegar. Es
importante incluir comentarios explicativos en las secciones importantes del código,
indicando la finalidad de cada función y los pasos más relevantes dentro de ellas. Sin
embargo, los comentarios deben ser concisos y aportar valor, evitando redundancias.
Siguiendo estos principios, el proyecto no solo cumplirá con los requisitos técnicos, sino que
también será más robusto, fácil de entender y con un nivel de calidad que refleje el esfuerzo
y aprendizaje adquirido a lo largo del curso.
Ejercicio Práctico
El día en TalentoLab está lleno de actividad. Mariana te llama a su oficina para una reunión
breve.
Con el objetivo claro en mente, te dirigís a tu computadora, listo para escribir el primer
código que dará vida a tu TFI.
Próximos Pasos:
Después de todo el camino recorrido, llegamos a la etapa final del curso. Ya tenés todas las
herramientas necesarias para desarrollar tu Trabajo Final Integrador, aplicando todo lo
aprendido sobre estructuras de datos, bases de datos, validaciones, manejo de errores y
buenas prácticas de programación.
También haremos un repaso de los objetivos del curso, destacando los conceptos
fundamentales que adquiriste y su aplicación en proyectos reales. Además, te brindaremos
orientación sobre cómo seguir aprendiendo y qué recursos adicionales podés explorar para
profundizar tus conocimientos en Python y desarrollo de software.
Esta última clase no sólo marcará el cierre del curso, sino que será una instancia clave
para consolidar lo aprendido y proyectar tus próximos pasos como programador. ¡Nos
🚀
vemos en la próxima clase para celebrar tu progreso y compartir experiencias con el resto
del equipo!
Clase N° 16 | Presentación del TFI
y cierre del curso
Temario:
● Presentación de los proyectos realizados.
● Retroalimentación y discusión.
● Repaso de los objetivos del curso.
● Orientación sobre próximos pasos y recursos adicionales.
Objetivos de la Clase
Llegamos a la última clase del curso, un espacio dedicado a cerrar el ciclo de aprendizaje,
reflexionar sobre lo que hemos aprendido y compartir los proyectos que cada estudiante ha
desarrollado.
El objetivo principal de esta clase es que los participantes que lo deseen puedan presentar
su Trabajo Final Integrador, demostrando cómo aplicaron los conceptos y herramientas
vistas a lo largo del curso. A través de esta presentación, se fomentará la comunicación
técnica, el pensamiento crítico y la capacidad de explicar decisiones de diseño y desarrollo.
También se generará un espacio de retroalimentación constructiva, donde tanto los
docentes como los compañeros podrán aportar comentarios y sugerencias sobre los
proyectos. Esto permitirá identificar oportunidades de mejora y reconocer logros individuales
y grupales.
Uno de los primeros desafíos fue aprender a interactuar con el usuario mediante la entrada
y salida de datos. Se trabajó con la función input() para recibir información y con print()
para mostrar resultados en pantalla, incorporando desde el inicio la importancia de escribir
código comprensible y funcional.
Luego se incorporaron las tuplas, similares a las listas pero con la diferencia clave de que
son inmutables. Este concepto ayudó a entender cuándo es conveniente utilizar estructuras
de datos que no se pueden modificar, asegurando la integridad de la información en ciertos
contextos.
Modularización y funciones
A medida que los programas fueron creciendo en complejidad, se hizo evidente la
necesidad de organizar mejor el código para hacerlo más claro, reutilizable y fácil de
mantener. En este contexto, se introdujeron las funciones definidas por el usuario,
permitiendo encapsular bloques de código en unidades independientes que pueden ser
llamadas en distintos momentos sin necesidad de reescribirlas.
Otro concepto fundamental fue el alcance de las variables dentro y fuera de las funciones.
Se explicó la diferencia entre variables locales y globales, destacando las mejores prácticas
para evitar conflictos y mejorar la legibilidad del código. Además, se trabajó en la
documentación de funciones mediante docstrings, asegurando que cada fragmento de
código estuviera correctamente explicado y pudiera ser comprendido tanto por su autor
como por otras personas que lo utilizaran en el futuro.
Primero, se trabajó con archivos de texto, aprendiendo a leer y escribir datos en archivos
mediante el uso de open(), read(), write() y close(). Se explicó cómo abrir archivos en
diferentes modos, como lectura ("r"), escritura ("w") y adición ("a"), permitiendo a los
programas conservar información entre distintas ejecuciones. Se enfatizó la importancia de
cerrar los archivos correctamente y se mostró el uso de with open(), una alternativa más
segura para gestionar archivos sin riesgo de errores por omisión de cierre.
El manejo de excepciones fue otro tema clave dentro de esta unidad. Se introdujo la
estructura try-except como una herramienta fundamental para prevenir fallos inesperados
en la ejecución de un programa. Se trabajó con distintos tipos de errores, como
FileNotFoundError, ValueError y ZeroDivisionError, comprendiendo cómo capturar y
manejar cada uno para mejorar la estabilidad del código. Además, se exploró el uso de
finally, que garantiza la ejecución de ciertos bloques de código, como el cierre de archivos
o la desconexión de bases de datos, independientemente de si ocurrió o no un error.
A medida que el curso avanzó, se presentaron bases de datos como una solución más
eficiente y estructurada para almacenar grandes volúmenes de información. Se realizó una
introducción a SQLite, un sistema de gestión de bases de datos ligero y de fácil integración
con Python. Se aprendió a crear bases de datos y tablas, definir estructuras de datos y
realizar operaciones básicas con SQL, como SELECT, INSERT, UPDATE y DELETE.
El primer paso fue aprender a establecer una conexión con la base de datos y definir una
estructura de almacenamiento mediante la creación de tablas. Se exploró el uso de la
sentencia CREATE TABLE, permitiendo definir los distintos tipos de datos y restricciones
para cada campo, como claves primarias (PRIMARY KEY), valores únicos (UNIQUE) y
restricciones de no nulo (NOT NULL).
Con estos conocimientos, los alumnos pudieron aplicar bases de datos en sus proyectos,
estructurando la información de manera eficiente y asegurando la integridad de los datos
almacenados. Este aprendizaje resultó fundamental para la preparación del Trabajo Final
Integrador, en el que cada estudiante desarrolló su propia aplicación completa.
La última etapa del TFI consistió en la presentación del proyecto, brindando a cada
estudiante la oportunidad de evaluar su trabajo y compartir su experiencia de desarrollo. Se
ofreció una instancia de retroalimentación, permitiendo recibir sugerencias y comentarios
que pudieran contribuir a mejorar futuras implementaciones. Esta instancia también sirvió
para reforzar la confianza en las habilidades adquiridas, demostrando la capacidad de cada
alumno para abordar proyectos de programación completos.
El Trabajo Final Integrador no solo fue un ejercicio de evaluación, sino también un primer
paso hacia la aplicación real de Python en la resolución de problemas cotidianos. Con este
proyecto, los alumnos adquirieron una base sólida para seguir explorando el desarrollo de
software y continuar su aprendizaje en áreas más avanzadas.
El Trabajo Final Integrador marcó el punto culminante del curso, permitiendo a cada
estudiante demostrar su capacidad para aplicar lo aprendido en un proyecto real. Más allá
de la implementación técnica, el proceso de desarrollo les permitió enfrentar desafíos, tomar
decisiones de diseño y experimentar el ciclo completo de construcción de una aplicación. La
presentación del proyecto y la retroalimentación recibida fueron parte fundamental de la
experiencia, reforzando la importancia de la documentación, la organización del código y la
comunicación efectiva de los resultados.
Este curso no solo ha sido una introducción a Python, sino también una invitación a
continuar explorando el mundo de la programación. Cada herramienta aprendida puede ser
la base para seguir avanzando en áreas como el desarrollo web, la automatización, la
inteligencia artificial o la ciencia de datos. El aprendizaje no se detiene aquí, y con una base
sólida, cada estudiante tiene la posibilidad de seguir perfeccionando sus habilidades y
aplicarlas en nuevos desafíos.
Con esta última clase, cerramos una etapa, pero dejamos abierta la puerta a nuevas
oportunidades de aprendizaje y crecimiento en la programación. ¡Felicitaciones a cada
estudiante por haber llegado hasta aquí y por todo el esfuerzo invertido en su desarrollo
como programadores y programadoras!
Próximos Pasos:
El curso ha llegado a su fin, pero el camino en la programación y el desarrollo de software
apenas comienza. A lo largo de estas clases, aprendiste los fundamentos de Python, bases
de datos, manipulación de archivos, estructuras de datos y muchos otros conceptos que te
permitirán abordar proyectos cada vez más desafiantes. Sin embargo, la programación es
un campo en constante evolución, y seguir capacitándote es fundamental para consolidar lo
aprendido y expandir tus habilidades.
Por otro lado, si tu objetivo es mejorar la calidad del software, el área de Testing QA y
Tester Engineer ofrece la posibilidad de especializarte en la detección y automatización de
pruebas para garantizar el funcionamiento óptimo de las aplicaciones. Este camino incluye
formación en Testing QA manual y automatizado, complementado con conocimientos en
Python para desarrollar herramientas que faciliten la validación de software.
Cada uno de estos caminos representa una oportunidad para seguir creciendo y
consolidando tus habilidades en programación. Independientemente de la especialización
que elijas, lo más importante es seguir practicando, construyendo proyectos propios y
aplicando lo aprendido en situaciones reales. La tecnología avanza rápidamente, y quienes
se capacitan y se mantienen actualizados tienen la posibilidad de acceder a nuevas
oportunidades y desafíos profesionales.
🚀
Este curso fue solo el primer paso en tu recorrido. Ahora, la decisión está en tus manos:
¿qué camino vas a seguir?