Clase 9: TP3 - Parcial domiciliario

Viernes 26 de junio

Ver consigna del TP

Fecha de entrega: lunes 6 de julio


Clase 8: Avance en el TP "Anotador"

Lunes 8 de junio

Les dejo un pequeño avance en el Trabajo Práctico, como para dar una pista a quienes puedan estar un poco "perdidos". Por supuesto, los que prefieran avanzar sin verlo, no hay problema.

Concretamente, se implementa el método para agregar una nueva nota en la clase Anotador y también en el menú.


Clase 7: Solución ejercicio anterior - Consigna TP2

Viernes 29 de mayo

Importante: Publiqué hoy la solución al ejercicio anterior, pero, por una cuestión de orden, aparece en la clase anterior.

TPNº 2: "Mini-proyecto: anotador"

Les propongo construir un mini-proyecto consistente en un "anotador" para tomar notas rápidas, con interfaz de consola. La idea es que descarguen y completen este código. Fíjense que puse unos comentarios que dicen #TODO ("por hacer" en inglés, es una costumbre escribirlo así), esas son las partes que tendrían que completar ustedes.

El código contiene tres clases Python, que les recomiendo abordar en este orden:

  1. Una clase llamada "Nota".
    Sus variables de instancia son:
    • id: Un número secuencial automático
    • texto: El texto de la nota
    • etiquetas: una serie de palabras-clave separadas por espacios
    • fecha_creacion: la fecha de creación de la nota
    Además del método iniciador (__init__) debe tener un método llamado "coincide", que reciba como parámetro una cadena, y que retorne True si la cadena forma parte del texto o de las etiquetas, y False de lo contrario.
  2. Una clase llamada "Anotador". Su única variable de instancia es "notas", una lista de objetos Nota.
    Sus métodos son:
    • nueva_nota: Recibe un texto y agrega a la lista una nueva nota con ese texto.
    • _buscar_por_id: Recibe un id, y retorna la el objeto Nota correspondiente, o None si no existiera.
    • modificar_nota: Recibe un id y un nuevo texto, y actualiza el texto de la nota.
    • modificar_etiquetas: Recibe un id y las nuevas etiquetas, y actualiza las etiquetas de la nota.
    • buscar: Recibe un "filtro" (cadena de búsqueda) y retorna una lista compuesta por las notas cuyo texto o etiquetas coincidan con el filtro recibido.
  3. Una clase llamada Menu, que contiene una interfaz de usuario básica en línea de comandos.

Fecha y modo de entrega

Fecha de entrega: viernes 12 19 de junio de 2020, 23:59hs

Formato de entrega: Carpeta comprimida en un archivo .zip, conteniendo solamente el código completo.

Nombre del archivo: GS2-TP2-ApellidoNombre.zip.

Adjuntar el archivo por mail a gs2@juansemarquez.com.

Importante: Modificar únicamente aquella parte del código que se indica, para facilitar la corrección. En caso de que se considere necesario modificar algo más, consultar con el docente.

Descargar código para hacer el TP

Fuente: Este proyecto está inspirado en el que se propone en el capítulo 2 del libro "Python 3 Object-Oriented Programming", de Dusty Philips, Ed. Packt, 2ª edición, 2015.

Clase 6: El paradigma Orientado a Objetos

Viernes 22 de mayo

Comenzaremos hoy a trabajar con Programación Orientada a Objetos en Python 3.

En el video, además de resolver un ejercicio, hay una breve introducción a los principales conceptos de este paradigma.

Ejercicio resuelto

Hacer una clase rectángulo, definiendo a cada uno de sus objetos con una base y una altura. La clase debe tener 4 métodos:

  • el método iniciador
  • un método para calcular su área.
  • otro para calcular su perímetro
  • otro más que indique si el rectángulo es un cuadrado o no

Solución en video (en 2 partes):


Mostrar código cliente

#! /usr/bin/python3 from rectangulo import Rectangulo base = int(input("Ingrese la base: ")) altura = int(input("Ingrese la altura: ")) r = Rectangulo(base,altura) p = r.calcular_perimetro() a = r.calcular_area() print(f"El rectángulo tiene un perímetro {p} y un área {a}") if r.es_cuadrado(): print("El rectángulo es un cuadrado") else: print("El rectángulo no es un cuadrado")

Mostrar código de la clase

#! /usr/bin/python3 class Rectangulo: ''' Genera un rectángulo, con base y altura. Permite calcular su perímetro, área y determinar si es un cuadrado o no ''' def __init__(self, base, altura): '''Agregamos los parámetros recibidos (base y altura) a las variables de instancia self.base y self.altura. Los parámetros son locales (no existen fuera de __init__), pero las variables de instancia permanecen y son "recordadas" por el objeto''' self.base = base self.altura = altura def calcular_perimetro(self): '''Retorna (a quien haya invocado el método) el perímetro del rectángulo''' perimetro = self.base * 2 + self.altura * 2 return perimetro def calcular_area(self): '''Retorna el área del rectángulo''' return self.base * self.altura def es_cuadrado(self): '''Retorna True si es un cuadrado, False de lo contrario''' return (self.base == self.altura)

Ejercicio propuesto

Hacer una clase triángulo, definiendo a cada uno de sus objetos con tres ángulos. La clase debe tener 4 métodos:

  • un método iniciador, que defina los 3 ángulos del triángulo,
  • uno que indique si se trata de un triángulo o no (recordar que los ángulos de un triángulo suman 180º).
  • otro que calcule si es un triángulo equilátero (los tres ángulos iguales), escaleno (los tres ángulos distintos) o isósceles (dos ángulos iguales y otro distinto).
  • otro que calcule si es un triángulo rectángulo (un ángulo recto, 90º), obtusángulo (un ángulo de más de 90º) o acutángulo (los tres ángulos menores a 90º).

Hacer un programa cliente que instancie un objeto triángulo y ejecute sus métodos

Solución propuesta (agregado 29/5)


Descargar código


Soluciones a los ejercicios del 8 de mayo

Lunes 18 de mayo

Les dejo la solución propuesta a los ejercicios del día 8 de mayo. (Vuelvo a copiar las consignas, para que sea más fácil de leer.)

  1. Solicitar al usuario que ingrese tres números. Cargar dichos números en una lista. Ordenar la lista de mayor a menor y mostrarla.
  2. Mostrar solución

    #! /usr/bin/python3 #Creamos una lista vacía lista = [] #Creo una lista vacía # Cada uno de los números solicitados, los agregamos # a la lista con el método append: lista.append(int(input("Ingrese un número"))) lista.append(int(input("Ingrese otro número"))) lista.append(int(input("Ingrese otro número más"))) print ("La lista original es: ", lista) lista.sort(reverse=True) #Ordenamos la lista print ("La lista de mayor a menor es: ", lista)
  3. Cargar una lista con números. Recorrer la lista, eliminando los números impares que haya en ella. Cada vez que se elimina un número impar, se debe mostrar cuál es el número eliminado. Mostrar al final cómo quedó la lista con todos los números pares
  4. Mostrar solución

    #! /usr/bin/python3 import random # Creamos una lista cualquiera, de 20 elementos al azar lista = [] for i in range(20): # Lista de 20 elementos lista.append(random.randint(0,100)) print("Lista original", lista) # El [:] indica que el for iterará sobre una COPIA de lista, ya que la lista # original será modificada al interior del bucle. for n in lista[:]: # Si el número es impar, lo mostramos y lo eliminamos: if n % 2 != 0: print ("El número", n , "es impar, eliminando...") lista.remove(n) print("Lista modificada: ", lista)
  5. Solicitar al usuario que ingrese un número "n" mayor o igual a 3 (validar). Luego, cargar en una lista los "n" primeros términos de la sucesión de Fibonacci. Mostrar al final la lista generada.
    Recordatorio: Los dos primeros números de la sucesión de Fibonacci son 0 y 1. Luego, cada número es la suma de los dos anteriores: 0 1 1 2 3 5 8 13 21 34 55...
  6. Mostrar solución

    #! /usr/bin/python3 fibonacci = [0, 1] #Creamos una lista con los dos primeros elementos n = int(input("Ingrese cuántos elementos desea ver (3 ó más)")) # Validamos que el usuario haya solicitado ver al menos 3 números: if n < 3: print("Error: El número ingresado es menor que 3") exit() # Sale del programa. # Generamos el nuevo elemento, sumando el último (-1) más el penúltimo (-2) # y lo agregamos al final de la lista con append. for i in range(2,n): fibonacci.append(fibonacci[-1] + fibonacci[-2]) # Mostramos la lista completa. print (fibonacci)
  7. Rehacer el ejercicio del supermercado de la clase anterior, pero usando una lista y el bucle for
  8. Mostrar solución

    #! /usr/bin/python3 precio = 1 #Esto es solamente para que ingrese al bucle la primera vez #Carga de datos: lista = [] while precio != 0: precio = eval(input("Ingrese el precio, 0 para finalizar")) lista.append(precio) #Sumatoria de total: total = 0 for i in lista: total += i #Cálculo de descuento y precio final: if total > 1000: descuento = total * 0.1 else: descuento = 0 precioFinal = total - descuento # Salida: print("Total: $", total, "Descuento: $", descuento, "Precio final: $", precioFinal)
  9. Crear una lista con 10 números del 1 al 100. Solicitar al usuario que ingrese un número. Indicar si el número ingresado está en la lista.
  10. Mostrar solución

    #! /usr/bin/python3 import random # La línea anterior importa el módulo "random", para que esté # disponible en este programa n = int(input("Ingrese un número del 1 al 100:" )) lista = [] #Creamos una lista vacía # El bucle iterará 10 veces, la variable i tomará valores del 0 al 9. for i in range(10): # El método randrange del módulo random, genera un número aleatorio entre # el primero y el segundo argumento (1 y 100 en este caso). # Cada uno de los números generados es agregado a la lista. lista.append(random.randrange(1,100)) # Preguntamos si el nro "n" (ingresado por el usuario) forma parte de la lista: if n in lista: print("Adivinaste el número") else: print("No adivinaste") print("La lista generada fue: ", lista)

Código de los ejercicios de la clase anterior

Lunes 11 de mayo

Por sugerencia de un compañero, publico acá el código de los ejercicios que se ve en los videos de la clase pasada.

Ejercicio 1:

Mostrar código

# Imprimir los números pares positivos menores que 100. Utilizar el bucle for for i in range(2, 100, 2): print(i)

Ejercicio 2:

Mostrar código

import random # Importamos el número random para generar nros al azar # Cargar una lista con números. Luego hacer un programa en Python que genere # dos nuevas listas a partir de la original: una con los números pares, y otra # con los impares. Mostrar las tres listas al final. lista = [] for i in range(20): lista.append(random.randint(0,100)) pares = [] impares = [] for numero in lista: if numero % 2 == 0: # Es par pares.append(numero) else: # Es impar impares.append(numero) print("Lista original") print(lista) print("Lista de pares") print(pares) print("Lista de impares") print(impares)

Ejercicio 3:

Mostrar código

# 1) Generar una lista de 10 números al azar, de 0 a 100. # Preguntarle al usuario cuál es el mayor número de la lista. # Si el usuario acierta, se le otorgan 100 puntos. Si no acierta, se le otorgan # (100 - la respuesta correcta - la diferencia a la respuesta correcta). En caso # de ser negativo el resultado anterior, se obtienen 0 puntos. # Ej: Si el máximo número era 90, y acierta; se otorgan 100 puntos. # Si dice que el máximo era 92, se le otorgan 100 - 90 - 2 = 8 puntos. # Si dice que el máximo era 60, se le otorgan 100 - 90 - 40 = -30 --> 0 puntos. # Si el máximo era 30 y el usuario responde 40, se le otorgan 100 - 30 - 40 = 30 puntos. # Repetir el juego 5 veces, e indicar cuántos puntos obtuvo al final. import random suma = 0 for j in range(5): lista = [] for i in range(10): lista.append(random.randint(0,100)) print("Se generó una lista al azar de 10 nros de 0 a 100") respuesta = int(input("¿Cuál es el número mayor de la lista? ")) maximo_hasta_ahora = -1 for n in lista: if n > maximo_hasta_ahora: maximo_hasta_ahora = n if respuesta == maximo_hasta_ahora: print("¡Acertaste!") puntaje = 100 else: print("No acertaste. El máximo era ", maximo_hasta_ahora) diferencia = abs( maximo_hasta_ahora - respuesta ) puntaje = 100 - maximo_hasta_ahora - diferencia if puntaje < 0: puntaje = 0 print("Tu puntaje es ", puntaje) suma = suma + puntaje print("Puntaje total: ", suma)

Ejercicio 4:

Mostrar código

# 2) Crear un lista, compuesta por diccionarios, cada uno de los cuales debe # contener: año, sede y campeón para todos los mundiales de fútbol. Hacer una # trivia "¿Cuántos sabés de mundiales?" import random mundiales = ( { 'anio': 1930, 'sede': 'Uruguay', 'campeon': 'Uruguay'}, { 'anio': 1934, 'sede': 'Italia', 'campeon': 'Italia'}, { 'anio': 1938, 'sede': 'Francia', 'campeon': 'Italia'}, { 'anio': 1950, 'sede': 'Brasil', 'campeon': 'Uruguay'}, { 'anio': 1954, 'sede': 'Suiza', 'campeon': 'Alemania'}, { 'anio': 1958, 'sede': 'Suecia', 'campeon': 'Brasil'}, { 'anio': 1962, 'sede': 'Chile', 'campeon': 'Brasil'}, { 'anio': 1966, 'sede': 'Inglaterra', 'campeon': 'Inglaterra'}, { 'anio': 1970, 'sede': 'México', 'campeon': 'Brasil'}, { 'anio': 1974, 'sede': 'Alemania', 'campeon': 'Alemania'}, { 'anio': 1978, 'sede': 'Argentina', 'campeon': 'Argentina'}, { 'anio': 1982, 'sede': 'España', 'campeon': 'Italia'}, { 'anio': 1986, 'sede': 'México', 'campeon': 'Argentina'}, { 'anio': 1990, 'sede': 'Italia', 'campeon': 'Alemania'}, { 'anio': 1994, 'sede': 'Estados Unidos', 'campeon': 'Brasil'}, { 'anio': 1998, 'sede': 'Francia', 'campeon': 'Francia'}, { 'anio': 2002, 'sede': 'Corea / Japón', 'campeon': 'Brasil'}, { 'anio': 2006, 'sede': 'Alemania', 'campeon': 'Italia'}, { 'anio': 2010, 'sede': 'Sudáfrica', 'campeon': 'España'}, { 'anio': 2014, 'sede': 'Brasil', 'campeon': 'Alemania'}, { 'anio': 2018, 'sede': 'Rusia', 'campeon': 'Francia'}, ) preguntas = ('anio', 'sede', 'campeon') # Elegimos un elemento al azar de la tupla preguntas: pregunta = random.choice(preguntas) # Elegimos un diccionario al azar de los que componen tupla mundiales: m = random.choice(mundiales) if pregunta == 'anio': print(f"¿Cuándo fue el mundial en {m['sede']} que ganó {m['campeon']}?") elif pregunta == 'campeon': print(f"¿Quién salió campeón del mundo en {m['sede']} en {m['anio']}?") else: print(f"¿Dónde se jungó el mundial de {m['anio']} que ganó {m['campeon']}?") respuesta = input("Ingrese la respuesta: ") if respuesta == str(m[pregunta]): print("¡Correcto!") else: print("Incorrecto.") print(f"Mundial de {m['sede']} ({m['anio']}). Campeón: {m['campeon']}")

Destinaremos la clase de hoy para consultas acerca del tema que comenzamos a trabajar el viernes.

Clase 3: Bucle for, listas, tuplas y diccionarios

Viernes 8 de mayo

Ejercicios resueltos:

  1. Imprimir los números pares positivos menores que 100. Utilizar el bucle for
  2. Cargar una lista con números al azar. Luego, hacer un programa en Python que genere dos nuevas listas a partir de la original: una con los números pares, y otra con los impares. Mostrar las tres listas al final.
  1. Generar una lista de 10 números al azar, de 0 a 100. Preguntarle al usuario cuál es el mayor número de la lista. Si el usuario acierta, se le otorgan 100 puntos. Si no acierta, se le otorgan (100 - la respuesta correcta - la diferencia a la respuesta correcta). En ningún caso el puntaje puede ser negativo.
    Ej: Si el máximo número era 90, y acierta; se otorgan 100 puntos.
    Si dice que el máximo era 92, se le otorgan 100 - 90 - 2 = 8 puntos.
    Si dice que el máximo era 60, se le otorgan 100 - 90 - 40 = -30 puntos. Pero como no puede ser negativo, se otorgan 0 puntos.
    Si el máximo era 30 y el usuario responde 40, se le otorgan 100 - 30 - 40 = 30 puntos.
    Repetir el juego 5 veces, e indicar cuántos puntos obtuvo al final.
  1. Crear una tupla, compuesta por diccionarios, cada uno de los cuales debe contener: año, sede y campeón para todos los mundiales de fútbol. Hacer una trivia: "¿Cuántos sabés de mundiales?"

Ejercicios para resolver

  1. Solicitar al usuario que ingrese tres números. Cargar dichos números en una lista. Ordenar la lista de mayor a menor y mostrarla.
  2. Cargar una lista con números. Recorrer la lista, eliminando los números impares que haya en ella. Cada vez que se elimina un número impar, se debe mostrar cuál es el número eliminado. Mostrar al final cómo quedó la lista con todos los números pares
  3. Solicitar al usuario que ingrese un número "n" mayor o igual a 3 (validar). Luego, cargar en una lista los "n" primeros términos de la sucesión de Fibonacci. Mostrar al final la lista generada.
    Recordatorio: Los dos primeros números de la sucesión de Fibonacci son 0 y 1. Luego, cada número es la suma de los dos anteriores: 0 1 1 2 3 5 8 13 21 34 55...
  4. Rehacer el ejercicio del supermercado de la clase anterior, pero usando una lista y el bucle for
  5. Crear una lista con 10 números del 1 al 100. Solicitar al usuario que ingrese un número. Indicar si el número ingresado está en la lista.

IMPORTANTE: Estos ejercicios no se entregan, es para que practiquen ustedes. Por supuesto, ante cualquier duda que surja, pueden consultar lo que necesiten. Subrayo la importancia de que hagan la práctica, aunque no haya que entregarla... (no se puede aprender a programar mirando cómo otra persona programa).


Clase 1: Diagnóstico

Viernes 17 de abril

Trabajo práctico realizado en la plataforma Edmodo.

Ejercicio "0" (resuelto): Video

Consigna del ejercicio

Apunte básico

Se solicita:

  • Entregar (o re-entregar) el trabajo a través del correo electrónico: gs2@juansemarquez.com. Nombre de archivo: ApellidoNombre-Actividad1.odt. Ejemplo: MarquezJuan-Actividad1.odt
  • Ingresar a la plataforma Edmodo (cuando vuelva a funcionar), y escribir "Entregado por mail" (como texto, sin adjuntar archivos).