Podcast sobre Programación en Python: Conceptos Fundamentales
Programación en Python: Conceptos Fundamentales para Estudiantes
Podcast
Programación: Conceptos y estructuras
Délka: 19 minut
Kapitoly
¿Qué es realmente una función?
El súper poder de las funciones
Ideas avanzadas: Composición y Recursividad
De Números a Datos
Un Poco de Azar
El Juego de Adivinar
El Módulo Datetime
Formateando Fechas
Aritmética con Fechas
El Módulo Random
Funciones Clave de Random
La Semilla de la Aleatoriedad
Tablas como Listas de Listas
Operando con Tablas
Diccionarios: La Clave es la Clave
Resumen Final y Despedida
Přepis
Pablo: Esto es lo que confunde al 80% de los estudiantes en programación: las funciones. Creen que son complicadas, pero es el único concepto que, si lo dominas, te pone por delante de todos los demás. Y hoy te vamos a enseñar a que nunca más te equivoques.
Marta: Exacto. Es más simple de lo que parece. Estás escuchando Studyfi Podcast.
Pablo: Vale Marta, vamos al grano. ¿Qué es una función en programación? Sáltate la definición de libro de texto, por favor.
Marta: Claro. Piensa en una función como una mini-receta dentro de tu programa principal. Es un bloque de código con un nombre que hace una tarea específica. Por ejemplo, una función para sumar dos números.
Pablo: Ok, una receta... me gusta. ¿Y qué son esos términos que siempre oímos, como “argumentos” y “retorno”?
Marta: ¡Fácil! Los argumentos son los ingredientes que le das a tu receta. Para la función de sumar, tus argumentos serían los dos números que quieres sumar.
Pablo: ¿Y el retorno?
Marta: El retorno es el plato terminado. Es el resultado que la función te devuelve. En nuestro caso, la suma de esos dos números. Das ingredientes, y te devuelve un resultado. Simple.
Pablo: Entendido. Pero, ¿por qué son tan importantes? ¿No podría simplemente escribir todo el código de corrido?
Marta: Podrías, pero sería un caos. Usar funciones tiene súper poderes. Primero, hace tu código más fácil de leer. Le das un nombre a un grupo de instrucciones, como calcular_impuesto().
Pablo: Tiene sentido, es más claro que un montón de operaciones matemáticas sin nombre.
Marta: Exacto. Segundo, elimina el código repetitivo. Si necesitas hacer el mismo cálculo diez veces, no escribes el código diez veces. Solo llamas a la función diez veces.
Pablo: Como un atajo. ¡Me gusta eso!
Marta: Totalmente. Y por último, te permite depurar más fácil. Si algo falla, buscas el error en la función específica, no en un programa de mil líneas. Además, ¡puedes reutilizar esa función en otros programas!
Pablo: Vale, lo básico está claro. Pero a veces oigo hablar de “composición” y “recursividad”. Suena a película de ciencia ficción.
Marta: No tanto. Composición es simplemente una función que llama a otra. Imagina que tienes una función calcular_area() y otra calcular_volumen(). La de volumen podría usar el resultado de la de área para hacer su trabajo. Es como anidar cajas.
Pablo: Ok, una se apoya en la otra. ¿Y la recursividad?
Marta: Esa es divertida. Una función recursiva es una que se llama a sí misma. Es como un espejo frente a otro espejo. Se usa para problemas que se pueden dividir en versiones más pequeñas del mismo problema.
Pablo: Wow. Eso sí que es un concepto para procesar. Entonces, si aplicamos esto, podríamos resolver problemas como el del taxímetro, ¿verdad? Calculando una tarifa base más un coste por distancia.
Marta: ¡Exactamente! Crearías una función que toma la distancia como argumento y devuelve la tarifa total. Con lo que hemos visto hoy, ese problema está prácticamente resuelto. Ahora, pasemos al siguiente gran concepto que debes dominar...
Pablo: Okay, Marta, entiendo la teoría... pero ahora viene lo bueno. ¿Cómo pasamos de saber los conceptos a realmente construir algo que funcione?
Marta: ¡La pregunta del millón, Pablo! La respuesta es simple: practicar, practicar y practicar. Es como aprender un instrumento, la única forma de mejorar es tocando.
Pablo: Vale, ¿y por dónde empezamos a practicar? ¿Algún ejercicio clásico?
Marta: Un buen inicio es con funciones que manipulan datos. Por ejemplo, una función que recibe una lista de números y te devuelve el mínimo, la mediana y el máximo, todo a la vez.
Pablo: Ah, claro. Ordenar y encontrar los valores clave. Suena útil.
Marta: Exacto. Y luego puedes subir el nivel. Imagina que tienes un archivo con datos de estudiantes: nombre, edad, promedio...
Pablo: Okay, eso ya es más complejo. Datos del mundo real.
Marta: ¡Sí! Pero el principio es el mismo. Podrías ordenarlos por promedio para ver el top de la clase, o filtrar para encontrar cuántas chicas miden más de 1.80 para el equipo de baloncesto.
Pablo: Entiendo. Es usar la lógica de programación para sacar conclusiones de un montón de datos. Eso es potente.
Marta: Exactamente. Ahora, ¿quieres hacer tus programas más interesantes e impredecibles? Añádeles un poco de azar.
Pablo: ¿Azar? ¿Cómo que mi código se ponga a jugar a los dados?
Marta: No exactamente. Me refiero a usar librerías como 'random'. Te permite generar números pseudoaleatorios para que cada ejecución del programa sea diferente.
Pablo: Suena a... magia. ¿Para qué sirve eso en la práctica?
Marta: ¡Para crear juegos, por ejemplo! Piensa en un programa que elige un número secreto y tú tienes que adivinarlo en pocos intentos.
Pablo: ¡El clásico 'adivina el número'! Me encanta la idea. ¿Cómo funcionaría?
Marta: Sencillo. El programa genera un número aleatorio, digamos entre 0 y 20. Tú ingresas tu intento, y el programa solo te dice si tu número es mayor o menor que el secreto.
Pablo: Y tienes, no sé, ¿tres intentos para acertar? ¡Es un reto! Ya me veo programando eso esta tarde.
Marta: Esa es la actitud. Son estos pequeños proyectos los que construyen tu confianza y tus habilidades. Así que ya sabes, la práctica con datos y el uso de librerías son claves.
Pablo: Ok, eso de manejar archivos de texto es increíblemente útil. Pero, ¿qué más trae Python en su “caja de herramientas” estándar que nos pueda volar la cabeza?
Marta: Me encanta tu entusiasmo, Pablo. Pues prepárate, porque vamos a hablar de cómo controlar el tiempo. O bueno, al menos cómo manejarlo en nuestros programas con el módulo datetime.
Pablo: ¿El tiempo? Suena a ciencia ficción. ¿Para qué usaríamos eso?
Marta: Para todo. Desde registrar cuándo se creó un usuario, calcular la duración de un proceso, hasta para saber cuánto tiempo ha pasado desde el alunizaje. Es fundamental.
Pablo: Vale, me has convencido. ¿Cómo funciona?
Marta: El módulo datetime nos da clases para manipular fechas y horas. La idea principal es poder sacar cada parte de una fecha —el año, el mes, el día, la hora— y trabajar con ella fácilmente.
Pablo: Entiendo. ¿Como si desarmaras un reloj para ver sus piezas?
Marta: ¡Exacto! Puedes crear un objeto de fecha y hora muy específico. Por ejemplo, para la fecha de nacimiento de Newton, escribiríamos datetime(1642, 12, 25).
Pablo: ¡Justo el día de Navidad! Fácil.
Marta: O para un momento súper preciso, como el último segundo del año 1999, el famoso Y2K... sería datetime(1999, 12, 31, 23, 59, 59, 999999). ¡Hasta el último microsegundo!
Pablo: ¡Qué específico! Y una vez que tienes ese objeto, ¿puedes pedirle solo el día, por ejemplo?
Marta: Justamente. Si a nuestra variable newton le pedimos newton.day, nos devolverá 25. Así de sencillo.
Pablo: Ok, pero... a los humanos no nos gusta leer las fechas en formato de programación. ¿Podemos hacer que se vean bonitas?
Marta: Por supuesto. Para eso tenemos el método strftime. Piensa en la 'f' como 'formatear'. Transforma un objeto datetime en una cadena de texto con el formato que tú quieras.
Pablo: A ver, un ejemplo.
Marta: Claro. Imagina la fecha del alunizaje, 20 de julio de 1969 a las 20:17. Con strftime podemos decirle que lo muestre como “Sunday, July 20 1969 at 08:17 PM”.
Pablo: ¡Wow! Eso es súper profesional. ¿Y al revés? ¿Si tengo el texto “5 de Noviembre, 1605” y quiero convertirlo en un objeto datetime?
Marta: ¡Gran pregunta! Para eso usamos strptime. La 'p' es de 'parsear' o analizar. Le das la cadena de texto y una plantilla de cómo está formateada, y Python la convierte en un objeto datetime.
Pablo: O sea, strftime es para *crear* texto bonito, y strptime es para *leer* texto y entenderlo. ¿Correcto?
Marta: ¡Lo tienes! Es el dúo perfecto para manejar fechas en cualquier formato.
Pablo: Vale, y antes mencionaste calcular cuánto tiempo pasó entre dos eventos. ¿Puedo simplemente restar fechas?
Marta: Así de simple. Si restas la fecha de nacimiento de Newton a la del alunizaje, Python no te da un número, te da un objeto especial llamado timedelta.
Pablo: ¿timedelta? ¿Qué es eso?
Marta: Es un objeto que representa una duración. Contiene tres datos: días, segundos y microsegundos. A partir de ahí, ya puedes calcular los años, horas o minutos que quieras.
Pablo: Increíble. O sea que podría calcular cuántos días he vivido.
Marta: ¡Claro! Con la función datetime.now() obtienes la fecha y hora actuales. Simplemente la restas a tu fecha de nacimiento y... ¡listo! Tienes tu vida en días, segundos y microsegundos.
Pablo: ¡Qué peligro! No sé si quiero saber ese número. Pero es súper potente para medir, por ejemplo, cuánto tarda en ejecutarse un trozo de código, ¿no?
Marta: Exacto. Guardas el tiempo de inicio, ejecutas tu código, guardas el tiempo de finalización, los restas y ya tienes una medida precisa del rendimiento. Es una técnica súper común.
Pablo: Muy bien, el tiempo dominado. ¿Qué otro módulo esencial deberíamos conocer?
Marta: Hablemos de algo totalmente opuesto: el azar. Con el módulo random.
Pablo: Ah, para generar números aleatorios. Lo he oído. Para juegos, sorteos...
Marta: Sí, pero es mucho más. Python usa un generador muy sofisticado llamado Mersenne Twister. Es fantástico para simulaciones y estadísticas, pero ojo, un dato clave: no es para criptografía o seguridad. Es predecible si sabes cómo.
Pablo: Entendido. Para mis juegos de dados está bien, pero para generar contraseñas seguras, mejor no.
Marta: ¡Exactamente esa es la idea! Es determinístico, no verdaderamente aleatorio.
Pablo: Entonces, ¿qué podemos hacer con random?
Marta: Lo más básico es randint(a, b), que te da un entero al azar entre a y b. O random(), que te da un número decimal entre 0 y 1.
Pablo: Perfecto para tirar un dado o una moneda.
Marta: Luego tienes funciones para listas. choice(L) elige un elemento al azar de una lista L.
Pablo: ¡Genial! Puedo hacer un programa que decida por mí qué cenar.
Marta: ¡Totalmente! Y si quieres varios elementos, tienes choices(L, k=3) que te da 3 elementos, pudiendo repetir. O sample(L, k=3) que también te da 3, pero sin repetir ninguno.
Pablo: Ah, sample es como sacar tres cartas de una baraja, y choices es como tirar un dado tres veces. Buena distinción.
Marta: Exacto. Y finalmente, una muy divertida: shuffle(L), que simplemente desordena la lista. ¡Baraja las cartas por ti!
Pablo: Una última cosa, he oído hablar de la “semilla” o seed. ¿Qué es eso?
Marta: Es un concepto crucial. ¿Recuerdas que dije que el generador es determinístico? La función seed() te permite inicializar el generador con un número específico.
Pablo: ¿Y por qué querría hacer eso? ¿No le quita la gracia de ser “aleatorio”?
Marta: Piensa en esto: estás haciendo un experimento científico o tratando de depurar un error que solo aparece a veces. Si fijas la semilla con seed(5), por ejemplo, la secuencia de números “aleatorios” que obtengas será siempre la misma cada vez que ejecutes el programa.
Pablo: ¡Ah, claro! Para que los resultados sean reproducibles. Si le paso mi código a un compañero, obtendrá exactamente el mismo resultado “aleatorio” que yo. Eso es oro.
Marta: El truco está ahí. La semilla garantiza la reproducibilidad, que es fundamental para la ciencia y para encontrar bugs. Si no le pones semilla, Python usa la hora del sistema, y por eso cada vez es diferente.
Pablo: Entendido. Tiempo y azar, dos módulos estándar que parecen simples pero que abren un mundo de posibilidades. Me siento más poderoso.
Marta: ¡Ese es el espíritu! Y ahora que controlamos estos conceptos, estamos listos para organizar la información de formas mucho más complejas y eficientes.
Pablo: Y con eso, creo que el tema de las funciones quedó súper claro. Pero, Marta, nos queda una última cosa por hoy... y suena importante: estructuras de datos.
Marta: Así es, Pablo. Y es el broche de oro. Vamos a hablar de cómo organizar la información de maneras más complejas. Empecemos con las tablas.
Pablo: ¿Tablas? ¿Como en una hoja de cálculo?
Marta: ¡Exactamente esa es la idea! Piénsalo así: una tabla en Python es simplemente... una lista que contiene otras listas. Es una lista de listas.
Pablo: Ok, una lista de listas. Suena un poco a trabalenguas.
Marta: Un poco. Imagina que tenemos datos de estudiantes. Podríamos crear una lista llamada estudiantes, donde cada elemento es otra lista con el nombre, el documento y la nota de un alumno.
Pablo: Entiendo. O sea, estudiantes = , ] y así sucesivamente.
Marta: ¡Exacto! Y acceder a los datos es muy intuitivo. Si haces print(estudiantes), ¿qué obtienes?
Pablo: Pues... la primera lista completa, la de Pedro Pérez.
Marta: Perfecto. Y si quisieras solo el nombre de María Martínez, que está en la segunda lista... sería estudiantes.
Pablo: ¡Claro! El para la lista de María y el para el primer elemento de *esa* lista. ¡Tiene sentido!
Marta: Y lo mejor es que las operaciones que ya conoces funcionan de forma similar. Puedes sumar dos listas de estudiantes para unirlas, o usar len() para saber cuántos estudiantes tienes.
Pablo: ¿Y recorrerlas también es fácil? ¿Para ver las notas de todos, por ejemplo?
Marta: Facilísimo. Puedes usar un bucle for para pasar por cada 'fila' o lista de estudiante. Por ejemplo, for e in estudiantes: print(e) te mostraría todos los números de documento.
Pablo: Ok, eso es útil. ¿Y para buscar a alguien? ¿Cómo sé si un estudiante con un documento específico está en mi lista?
Marta: Buena pregunta. La forma más directa es recorrer la lista con un for y comprobar con un if si el documento coincide. Si lo encuentras, ¡listo! Sino, pues no estaba.
Pablo: Tiene lógica. ¿Y ordenarlos? Digamos, por orden alfabético.
Marta: Simplemente usas estudiantes.sort(). ¡Y Python lo hace por ti! Si quieres ordenar por otro criterio, como el documento, se lo especificas con un pequeño truco llamado 'lambda', pero la idea es la misma: le dices a Python *cómo* ordenar.
Pablo: Vale, las tablas parecen geniales para datos ordenados. ¿Hay algo más?
Marta: ¡Oh, sí! Ahora viene mi estructura de datos favorita: los diccionarios. Son una colección asociativa. Olvídate de los índices numéricos.
Pablo: ¿Sin índices? ¿Cómo accedes a algo entonces?
Marta: ¡Con una clave! Cada elemento en un diccionario es un par: una clave y un valor. Por ejemplo: puntuacion = {'Pedro':3080, 'Maria':4130}. La clave es el nombre, el valor es la puntuación.
Pablo: Ah... entonces para ver la puntuación de María, ¿no uso puntuacion?
Marta: Exacto. Usas la clave. Escribirías puntuacion y te devolvería 4130. Es súper directo.
Pablo: ¡Wow! Eso es mucho más legible. Pero, ¿qué pasa si intento buscar una clave que no existe, como 'Juan'?
Marta: Ahí Python te dará un KeyError. Te dice, literalmente, 'oye, esa llave no está en mi llavero'.
Pablo: Me gusta esa analogía. Entonces, para recapitular: las tablas son listas de listas, geniales para datos estructurados en filas y columnas, y usamos índices numéricos.
Marta: Correcto. Y los diccionarios usan pares de clave-valor, sin un orden fijo, pero son increíblemente rápidos para buscar datos por su clave. Son perfectos cuando tienes un identificador único para cada dato.
Pablo: Como un número de documento para un estudiante. ¡Ya lo veo!
Marta: ¡Esa es la idea! Entender cuándo usar una lista, una tabla o un diccionario es lo que te da el verdadero poder en la programación. Te permite resolver problemas de forma mucho más eficiente.
Pablo: Fantástico. Ha sido una sesión increíble, Marta. Desde las variables hasta estas estructuras tan potentes. Creo que tenemos una base sólida para empezar a construir lo que sea.
Marta: Totalmente. Recuerden que la práctica hace al maestro. No tengan miedo de experimentar con estas estructuras. Y con esto, cerramos por hoy. ¡Gracias por acompañarnos en Studyfi Podcast!
Pablo: ¡Hasta la próxima, y a programar se ha dicho!