Ejercicios con Clases y Objetos en Python

Aquí dejo una propuesta de ejercicios con Clases y Objetos en python, para practicar lo aprendido en el post de Clases y Objetos.

Ejercicio 1: Clase Dispositivos e hijas

Define una clase Dispositivo con los atributos: marca, modelo y precio. Luego, crea las clases hijas: Smartphone, Tablet y Portatil, que hereden de Dispositivo y añade al menos un atributo específico a cada una de ellas.

Crea un objeto de cada clase hija (3 objetos en total) y pinta por pantalla todos los parámetros de uno de ellos.

Solución propuesta:

class Dispositivo:
    def __init__(self, marca, modelo, precio):
        self.marca = marca
        self.modelo = modelo
        self.precio = precio

class Smartphone(Dispositivo):
    def __init__(self, marca, modelo, precio, sistema_operativo):
        super().__init__(marca, modelo, precio)
        self.sistema_operativo = sistema_operativo

class Tablet(Dispositivo):
    def __init__(self, marca, modelo, precio, tamano_pantalla):
        super().__init__(marca, modelo, precio)
        self.tamano_pantalla = tamano_pantalla

class Portatil(Dispositivo):
    def __init__(self, marca, modelo, precio, capacidad_almacenamiento):
        super().__init__(marca, modelo, precio)
        self.capacidad_almacenamiento = capacidad_almacenamiento

# Crear objetos de cada clase hija
smartphone = Smartphone("Samsung", "Galaxy S20", 999, "Android")
tablet = Tablet("Apple", "iPad Pro", 799, "12.9 pulgadas")
portatil = Portatil("Dell", "XPS 13", 1299, "512 GB SSD")

# Imprimir todos los parámetros de uno de los objetos
print("Marca:", smartphone.marca)
print("Modelo:", smartphone.modelo)
print("Precio:", smartphone.precio)
print("Sistema Operativo:", smartphone.sistema_operativo)

Ejercicio 2: Clase Rectángulo y Clase Punto

Crea una clase llamada «Punto» que tenga los atributos «x» e «y». Crea otra clase llamada «Rectangulo», que tiene como parámetros dos objetos de tipo Punto.

La clase Rectangulo debe implementar un método que calcule el área del rectángulo a partir de sus dos parámetros Punto.

El programa, empleando las clases anteriores, debe crear dos objetos punto y presentar por pantalla el área del rectángulo formado por los dos puntos.

NOTA: Lógicamente el área se calcula multiplicando las diferencias entre las coordenadas x e y de ambos puntos.

Por ejemplo:

  • Punto 1: (3,5)  y Punto 2: (1,1)
  • Diferencias coordenadas x = 2, diferencias coordenadas y = 4
  • Area = 8

Si alguna de las diferencias de coordenadas fuera igual a cero, se indica por pantalla que no puede calcularse el área.

Solución propuesta:

class Punto:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Rectangulo:
    def __init__(self, punto1, punto2):
        self.punto1 = punto1
        self.punto2 = punto2
    
    def calcular_area(self):
        diferencia_x = abs(self.punto1.x - self.punto2.x)
        diferencia_y = abs(self.punto1.y - self.punto2.y)
        
        if diferencia_x == 0 or diferencia_y == 0:
            print("No se puede calcular el área, una de las diferencias de coordenadas es igual a cero.")
        else:
            area = diferencia_x * diferencia_y
            print("El área del rectángulo formado por los puntos es:", area)

# Crear dos objetos de tipo Punto
punto1 = Punto(3, 5)
punto2 = Punto(1, 1)

# Crear objeto de tipo Rectangulo con los dos puntos
rectangulo = Rectangulo(punto1, punto2)

# Calcular y mostrar el área del rectángulo
rectangulo.calcular_area()

Ejercicio 3: Clase Usuario de Red Social

Crea una clase UsuarioRedSocial para representar a los usuarios de una red social. La clase tiene los siguientes atributos: el nombre del usuario, una lista de amigos y una lista de publicaciones (llámalos con los nombres de variables que quieras).  La clase debe incluir un método que pinte por pantalla todos los parámetros del objeto UsuarioRedSocial, incluyendo los amigos que tiene y las publicaciones que ha hecho.

El programa pide al usuario que introduzca su nombre, los nombres de 3 amigos y los títulos de 3 publicaciones que haya hecho en la red Social. A continuación, con los datos introducidos crea un objeto UsuarioRedSocial y pinta por pantalla los parámetros del objeto, empleando el método de la clase UsuarioRedSocial.

Solución propuesta:

class UsuarioRedSocial:
    def __init__(self, nombre, amigos, publicaciones):
        self.nombre = nombre
        self.amigos = amigos
        self.publicaciones = publicaciones
    
    def mostrar_info(self):
        print("Nombre:", self.nombre)
        print("Amigos:", ', '.join(self.amigos))
        print("Publicaciones:")
        for publicacion in self.publicaciones:
            print("- ", publicacion)

# Solicitar al usuario que introduzca sus datos
nombre = input("Introduce tu nombre: ")
amigos = [input("Introduce el nombre de un amigo: ") for _ in range(3)]
publicaciones = [input("Introduce el título de una publicación: ") for _ in range(3)]

# Crear un objeto UsuarioRedSocial con los datos introducidos
usuario = UsuarioRedSocial(nombre, amigos, publicaciones)

# Mostrar la información del usuario
usuario.mostrar_info()

Ejercicio 4: Personajes de un juego

Define una clase Personaje para representar a los personajes de un juego. La clase tiene los atributos: nombre del personaje, nivel alcanzado y puntos de vida (llámalos con los nombres de variables que quieras).  Luego, crea las clases hijas: Guerrero y Mago con al menos un parámetro específico para cada una de ellas.

El programa pregunta al usuario si quiere crear un Personaje Guerrero o Mago. En función de lo que indique el usuario, el programa pide al usuario los datos necesarios para crear el objeto y lo crea. Finalmente, indica por pantalla que el objeto ha sido creado y pinta los parámetros del objeto.

Solución propuesta:

class Personaje:
    def __init__(self, nombre, nivel, puntos_vida):
        self.nombre = nombre
        self.nivel = nivel
        self.puntos_vida = puntos_vida
    
    def mostrar_info(self):
        print("Nombre del personaje:", self.nombre)
        print("Nivel alcanzado:", self.nivel)
        print("Puntos de vida:", self.puntos_vida)

class Guerrero(Personaje):
    def __init__(self, nombre, nivel, puntos_vida, arma):
        super().__init__(nombre, nivel, puntos_vida)
        self.arma = arma

class Mago(Personaje):
    def __init__(self, nombre, nivel, puntos_vida, hechizo):
        super().__init__(nombre, nivel, puntos_vida)
        self.hechizo = hechizo

# Solicitar al usuario qué tipo de personaje quiere crear
tipo_personaje = input("¿Quieres crear un Personaje Guerrero o Mago? ").lower()

# Solicitar al usuario los datos necesarios para crear el personaje
nombre = input("Introduce el nombre del personaje: ")
nivel = int(input("Introduce el nivel alcanzado del personaje: "))
puntos_vida = int(input("Introduce los puntos de vida del personaje: "))

# Crear el objeto correspondiente al tipo de personaje elegido por el usuario
if tipo_personaje == "guerrero":
    arma = input("Introduce el arma del guerrero: ")
    personaje = Guerrero(nombre, nivel, puntos_vida, arma)
elif tipo_personaje == "mago":
    hechizo = input("Introduce el hechizo del mago: ")
    personaje = Mago(nombre, nivel, puntos_vida, hechizo)
else:
    print("Tipo de personaje no válido.")
# Mostrar que el objeto ha sido creado y pintar los parámetros del objeto
if tipo_personaje in ["guerrero", "mago"]:
    print("El personaje {} ha sido creado:".format(tipo_personaje.capitalize()))
    personaje.mostrar_info()

Ejercicio 5: Clases Barco y Velero

Define una clase llamada Barco con los parámetros: eslora y manga. Define además otra clase llamada Velero que herede de la clase Barco y que tenga un parámetro: el número de velas. La clase Velero tiene que tener un método que calcule el precio del atraque que será igual a: ((eslora x manga) + (número de velas x 10))

El programa tiene que crear dos objetos Veleros y presentar por pantalla los datos de ambos veleros. Además, indicar para que velero es más barato el precio del atraque.

Solución propuesta:

class Barco:
    def __init__(self, eslora, manga):
        self.eslora = eslora
        self.manga = manga

class Velero(Barco):
    def __init__(self, eslora, manga, num_velas):
        super().__init__(eslora, manga)
        self.num_velas = num_velas
    
    def calcular_precio_atraque(self):
        return (self.eslora * self.manga) + (self.num_velas * 10)

# Crear dos objetos Velero
velero1 = Velero(10, 5, 3)
velero2 = Velero(8, 4, 4)

# Mostrar los datos de ambos veleros
print("Datos del Velero 1:")
print("Eslora:", velero1.eslora)
print("Manga:", velero1.manga)
print("Número de velas:", velero1.num_velas)
print("Precio del atraque:", velero1.calcular_precio_atraque())

print("\nDatos del Velero 2:")
print("Eslora:", velero2.eslora)
print("Manga:", velero2.manga)
print("Número de velas:", velero2.num_velas)
print("Precio del atraque:", velero2.calcular_precio_atraque())

# Comparar precios de atraque
if velero1.calcular_precio_atraque() < velero2.calcular_precio_atraque():
    print("\nEl Velero 1 tiene un precio de atraque más barato.")
elif velero1.calcular_precio_atraque() > velero2.calcular_precio_atraque():
    print("\nEl Velero 2 tiene un precio de atraque más barato.")
else:
    print("\nAmbos veleros tienen el mismo precio de atraque.")

Ejercicio 6: Clases Vuelo y Avión

Crea una clase Vuelo para representar los vuelos de una aerolínea. La clase tendrá los atributos: número de vuelo, número de pasajeros y destino. Implementa otra clase llamada Avion que tenga los parámetros: número de asientos y lista de destinos.

El programa pide al usuario que introduzca la información de un Vuelo y de un Avion. Con la información introducida, crea un objeto Vuelo y otro objeto Avion. Y empleando los parámetros de ambos objetos, indica si se puede asignar el avión al vuelo. Lógicamente, para que se pueda asignar un avión a un vuelo, el número de asientos del avión tiene que ser igual o superior al número de pasajeros y el destino del vuelo tiene que estar en la lista de destinos del avión.

Solución propuesta:

class Vuelo:
    def __init__(self, numero_vuelo, num_pasajeros, destino):
        self.numero_vuelo = numero_vuelo
        self.num_pasajeros = num_pasajeros
        self.destino = destino

class Avion:
    def __init__(self, num_asientos, destinos):
        self.num_asientos = num_asientos
        self.destinos = destinos

# Solicitar al usuario la información del vuelo
numero_vuelo = input("Introduce el número de vuelo: ")
num_pasajeros = int(input("Introduce el número de pasajeros: "))
destino_vuelo = input("Introduce el destino del vuelo: ")

# Solicitar al usuario la información del avión
num_asientos = int(input("Introduce el número de asientos del avión: "))
destinos_avion = input("Introduce la lista de destinos del avión separados por comas: ").split(',')

# Crear objetos Vuelo y Avion
vuelo = Vuelo(numero_vuelo, num_pasajeros, destino_vuelo)
avion = Avion(num_asientos, destinos_avion)

# Comprobar si se puede asignar el avión al vuelo
if vuelo.num_pasajeros <= avion.num_asientos and vuelo.destino in avion.destinos:
    print("El avión puede ser asignado al vuelo.")
else:
    print("El avión no puede ser asignado al vuelo.")

Ejercicio 7: Clase Vivienda y clase Chalet

Crea una clase llamada Vivienda con los parámetros: año de construcción, metros cuadrados habitables y precio. Crea otra clase llamada Chalet que herede de Vivienda y que tenga un único parámetro: piscina (un booleano que indica si el chalet tiene piscina).

La clase Chalet tiene un método para calcular el máximo de hipoteca que se le puede conceder. Este método sigue la lógica siguiente: Si el chalet tiene piscina, el máximo de hipoteca que se puede conceder es cero, si no la tiene, el máximo de hipoteca es el precio por metro cuadrado multiplicado por 100 (el precio por metro cuadrado se obtiene dividiendo los metros cuadrados habitables entre el precio).

El programa pide al usuario que introduzca los datos de un Chalet, crea un objeto Chalet con los datos introducidos, y empleando la función de la clase Chalet presenta por pantalla el máximo de hipoteca para ese Chalet.

Solución propuesta

class Vivienda:
    def __init__(self, ano_construccion, metros_cuadrados, precio):
        self.ano_construccion = ano_construccion
        self.metros_cuadrados = metros_cuadrados
        self.precio = precio

class Chalet(Vivienda):
    def __init__(self, ano_construccion, metros_cuadrados, precio, piscina):
        super().__init__(ano_construccion, metros_cuadrados, precio)
        self.piscina = piscina
    
    def calcular_max_hipoteca(self):
        if self.piscina:
            return 0
        else:
            return (self.precio / self.metros_cuadrados) * 100

# Solicitar al usuario que introduzca los datos del Chalet
ano_construccion = int(input("Introduce el año de construcción del chalet: "))
metros_cuadrados = float(input("Introduce los metros cuadrados habitables del chalet: "))
precio = float(input("Introduce el precio del chalet: "))
piscina = input("El chalet tiene piscina (si/no): ").lower() == "si"

# Crear objeto Chalet con los datos introducidos
chalet = Chalet(ano_construccion, metros_cuadrados, precio, piscina)

# Calcular y mostrar el máximo de hipoteca para el Chalet
max_hipoteca = chalet.calcular_max_hipoteca()
print("El máximo de hipoteca para este chalet es:", max_hipoteca)

Ejercicio 8: Clase Coche e hijas

Define una clase llamada Coche con los parámetros marca y modelo. Luego, define otra clase llamada Deportivo que herede de la clase Coche y que tenga un parámetro adicional: potencia. La clase Deportivo debe tener un método que calcule el precio del seguro, el cual será igual a la potencia del coche multiplicada por 20 más un extra de 1000 euros.

El programa debe crear dos objetos Deportivo y mostrar por pantalla los datos de ambos coches. Además, debe indicar cuál de los dos coches tiene un seguro más barato.

Solución propuesta:

class Coche:
    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo

class Deportivo(Coche):
    def __init__(self, marca, modelo, potencia):
        super().__init__(marca, modelo)
        self.potencia = potencia
    
    def calcular_precio_seguro(self):
        return (self.potencia * 20) + 1000

# Crear dos objetos Deportivo
deportivo1 = Deportivo("Ferrari", "Testarossa", 500)
deportivo2 = Deportivo("Porsche", "911", 400)

# Mostrar los datos de ambos coches deportivos
print("Datos del Deportivo 1:")
print("Marca:", deportivo1.marca)
print("Modelo:", deportivo1.modelo)
print("Potencia:", deportivo1.potencia)
print("Precio del seguro:", deportivo1.calcular_precio_seguro())

print("\nDatos del Deportivo 2:")
print("Marca:", deportivo2.marca)
print("Modelo:", deportivo2.modelo)
print("Potencia:", deportivo2.potencia)
print("Precio del seguro:", deportivo2.calcular_precio_seguro())

# Indicar cuál de los dos coches tiene un seguro más barato
if deportivo1.calcular_precio_seguro() < deportivo2.calcular_precio_seguro():
    print("\nEl Deportivo 1 tiene un seguro más barato.")
elif deportivo1.calcular_precio_seguro() > deportivo2.calcular_precio_seguro():
    print("\nEl Deportivo 2 tiene un seguro más barato.")
else:
    print("\nAmbos coches tienen el mismo precio de seguro.")

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Clases y Objetos en Python

En este post voy a explicar las Clases y los Objetos en Python, que son dos conceptos básicos de la programación orientada a objetos, que tenemos que entender muy bien.

Una Clase es un molde definido por el usuario que empleamos para crear objetos. Este molde incluye una serie de propiedades y métodos que son comunes a todos los objetos creados con una clase.

La clase puede ser vista como un molde y el objeto como una implementación concreta sacada de ese molde. Por lo que con una clase podemos generar muchos objetos que tendrán las mismas características.

La programación orientada a objetos basa toda la codificación en objetos. Los objetos intentan replicar objetos reales, para de esta forma poder solucionar problemas que se nos presenten en el mundo real, con nuestros programas. Cuando creamos un objeto a partir de una Clase, decimos que hemos creado una instancia de la Clase.

Python es un lenguaje de programación orientado a objetos, de forma que es posible crear clases a medida a parte de las ya existentes. Una clase tiene una serie de atributos (variables) y métodos (funciones) asociados.

Definir una clase

Cuando instanciemos un objeto mediante una Clase, este se compondrá de parámetros y métodos. Los parámetros son las características del objeto y los métodos vienen a definir el comportamiento.

Para definir una clase empleamos la sentencia class, seguida del nombre que demos a la clase, dos puntos y el código que constituye la clase. En este código, como siempre en Python, irá indexado y en él, definiremos los distintos métodos y parámetros.

La sintaxis básica sería:

class nombre_clase:
       def __init__(self, n):
	instrucciones creación de la clase 
	(aquí asignamos los valores de inicio a los parámetros)
       def nombre_metodo(self):
              instrucciones método

Veámoslo con un ejemplo. Imaginemos que queremos trabajar con planetas, una definición de la clase Planeta podría ser:

# vamos a modelar el objeto planeta
class Planeta:
    def __init__(self,nombre,tamaño,distancia,atmosfera):
 #con init instanciamos un objeto con los valores que se le pasan"""
        self.nombre=nombre
        self.tamaño=tamaño
        self.distancia=distancia
        self.atmosfera=atmosfera

En este ejemplo sólo he definido el constructor, que es el método que sirve para crear un objeto, el método __init__( ).

Este método tiene siempre el nombre init con dos barras bajas antes y después. A continuación, entre paréntesis, se pasan los parámetros. La sintaxis es la siguiente:

def __init__(self, &lt;parámetros> ):

__init__ permite instanciar un objeto de la clase. Es un método obligatorio en la definición.

El parámetro self es obligatorio y debe ir el primero. Con self estamos pasando una referencia a la instancia que estamos creando, y Python lo hace automáticamente, por lo que cuando creemos el objeto, sólo tenemos que pasarle los valores de los parámetros.

Vamos a dotar a la clase de un método, el método visitable que indica si un planeta es visitable o no. Será visitable si tiene atmosfera y la distancia a la tierra es menor de 3000 billones de Km.

La clase Planeta con el método, quedaría:

class Planeta:
    def __init__(self,nombre,tamaño,distancia,atmosfera):
        self.nombre=nombre
        self.tamaño=tamaño
        self.distancia=distancia
        self.atmosfera=atmosfera
    def visitable(self):
        if(self.atmosfera and self.distancia<3000):
            return True
        else:
            return False

Todo método, debe al menos tener el parámetro self para que pueda trabajar con la instancia.

Crear un objeto

Para crear una instancia de la clase, sencillamente utilizamos el nombre de la clase como método al que le pasamos los parámetros requeridos por el método __init__

Cuando creamos un objeto, instancia de la clase, no es necesario pasar el parámetro self, Python lo añade forma automática para pasar la instancia al método, pero en la definición del método es obligatorio incluirlo.

Por ejemplo, una posible instancia de Planeta podría ser planet_1:

planeta_1 = Planeta("Jupiter","Muy grande",3456,True)

En este caso estaríamos pasando los valores de los parámetros por posición, pero también podríamos hacerlo por clave, como en el ejemplo de planet_2:

planeta_2 = Planeta(distancia=324,nombre="Venus",atmosfera=False, tamaño="Pequeñito")

Acceder a los parámetros y métodos de un objeto

Para acceder a los parámetros y métodos de un objeto, sencillamente empleamos el nombre del objeto, seguido de un punto y el parámetro o el método, depende de a que queramos acceder. Si es un parámetro, después del punto se mostrará únicamente el nombre del parámetro. Si es un método, después del punto tendremos el nombre del método con los parámetros que queramos pasar al método. Si no se le pasa ningún parámetro, aparecerán los paréntesis sin nada en su interior.

Ejemplos de llamadas a los parámetros nombre y distancia del objeto planet_1

print("El planeta",planeta_1.nombre,"se encuentra a",planeta_1.distancia,"billones de Km de la tierra")
print(f"El planeta {planeta_1.nombre} se encuentra a {planeta_1.distancia} billones de Km de la tierra")

En el ejemplo anterior podemos ver dos sentencias print que llaman a los parámetros indicados. La segunda empleando una cadena de caracteres formateada. El resultado es el mismo para ambos casos:

El planeta Jupiter se encuentra a 3456 billones de Km de la tierra
El planeta Jupiter se encuentra a 3456 billones de Km de la tierra

Ahora accedemos al método visitable:

if planeta_1.visitable():
    print(f"El planeta {planeta_1.nombre} es visitable ")
else:
    print(f"El planeta {planeta_1.nombre} NO es visitable ")

Puede apreciarse que se trata de un método por los parentesis después del nombre. El resultado sería:

El planeta Jupiter NO es visitable

Podemos programar métodos especificos para actualizar los valores de los parámetros, con idea de tener parte del control. Ejemplo:

def actualizar_distancia(self,valor):
     if (valor<2):
         print("No es posible, un planeta tan cerca de la tierra")
     else:
         self.distancia=valor
         print(f"Registrada distancia del planeta {self.nombre} a la tierra: {self.distancia} billones de Km")

Si llamamos al método:

planeta_1.actualizar_distancia(123)

Obtenemos el resultado:

Registrada distancia del planeta Jupiter a la tierra: 123 billones de Km

El programa completo quedaría:

class Planeta:
    def __init__(self,nombre,tamaño,distancia,atmosfera):
        self.nombre=nombre
        self.tamaño=tamaño
        self.distancia=distancia
        self.atmosfera=atmosfera
    def visitable(self):
        if(self.atmosfera and self.distancia<3000):
            return True
        else:
            return False
    def actualizar_distancia(self,valor):
        if (valor<2):
            print("No es posible, un planeta tan cerca de la tierra")
        else:
            self.distancia=valor
            print(f"Registrada distancia del planeta {self.nombre} a la tierra: {self.distancia} billones de Km")

planeta_1 = Planeta("Jupiter","Muy grande",3456,True)
print("El planeta",planeta_1.nombre,"se encuentra a",planeta_1.distancia,"billones de Km de la tierra")
print(f"El planeta {planeta_1.nombre} se encuentra a {planeta_1.distancia} billones de Km de la tierra")
if planeta_1.visitable():
    print(f"El planeta {planeta_1.nombre} es visitable ")
else:
    print(f"El planeta {planeta_1.nombre} NO es visitable ")
planeta_1.actualizar_distancia(123)

Métodos especiales

Generalmente en una clase definimos una estructura de datos que contiene una serie de métodos para operar con esta estructura. Existen algunos métodos especiales para definir como realizar operaciones comunes con la clase definida. Algunos ejemplos:

__add__: operación de suma. Se define cómo se suman dos objetos de esta clase.  Objeto 1 + Objeto 2. Similares con __sub__, __mul__, __div__, __mod__

__str__: representación orientada al usuario final del objeto

__len__: métodos para definir la longitud de un objeto

__iter__: para implementar funcionalidades de iteración

Por ejemplo, si partimos de la clase Curso:

class Curso:
    def __init__(self, nombre, duracion): 
        self.nombre_curso = nombre
        self.duracion = duracion
    def obtener_descripcion(self):
        print("Curso de " + self.nombre_curso + " con duracion " + str(self.duracion))

E instanciamos dos objetos curso:

curso1 = Curso('Phyton', 20)
curso1.obtener_descripcion() 
curso2 = Curso('SQL', 10)
curso2.obtener_descripcion()

Y ejecutamos el programa. Obtenemos:

Curso de Phyton con duracion 20
Curso de SQL con duracion 10

Hasta aquí todo normal, pero supongamos que queremos definir un método para sumar cursos, en el que se creara un nuevo curso con los nombres de ambos cursos y la duración la suma de las duraciones de ambos cursos. El método podría ser:

def __add__(self, new):
       return Curso(self.nombre_curso + " y " + new.nombre_curso,
                                               self.duracion + new.duracion)

La manera normal de usar el método __add__() sería:

curso1 = Curso('Phyton', 20)
curso2 = Curso('SQL', 10)
curso_total=curso1.__add__(curso2)
curso_total.obtener_descripcion()

Lo que daría el siguiente resultado:

Curso de Phyton y SQL con duracion 30

Ahora bien, como este es un método especial (con las dos barras bajas delante y las dos barras bajas detrás) y representa la suma, podemos llamar al método sencillamente usando el operador suma. La instrucción:

curso_total = curso1 + curso2

Produce el mismo resultado que:

curso_total=curso1.__add__(curso2)

Nuestro programa completo:

class Curso:
    def __init__(self, nombre, duracion): 
        self.nombre_curso = nombre
        self.duracion = duracion
    def obtener_descripcion(self): 
   		print("Curso de " + self.nombre_curso + " con duracion " + str(self.duracion))
    def __add__(self, new):
   		return Curso(self.nombre_curso + " y " + new.nombre_curso, self.duracion + new.duracion)
curso1 = Curso('Phyton', 20)
curso1.obtener_descripcion() 
curso2 = Curso('SQL', 10)
curso2.obtener_descripcion()
curso_total = curso1 + curso2
curso_total.obtener_descripcion()
curso_total=curso1.__add__(curso2)
curso_total.obtener_descripcion()

Genera el resultado:

Curso de Phyton con duracion 20
Curso de SQL con duracion 10
Curso de Phyton y SQL con duracion 30
Curso de Phyton y SQL con duracion 30

Herencia

La herencia es un proceso mediante el cual heredamos una serie de características de nuestros antecesores. Podemos entenderla como un mecanismo para definir una clase nueva a partir de otra ya existente. La clase nueva hereda de la existente sus parámetros y métodos, que no hace falta definirlos de nuevo, sencillamente los hereda. Además, dicha clase nueva puede incluir nuevos parámetros y métodos propios, extendiendo la clase ya existente.

Se denomina clase base o superclass a la clase existente de la que hereda la nueva clase que es conocida como clase hija o derivada.

Por ejemplo, definimos la clase Persona de la siguiente forma:

class Persona:
    def __init__(self, nombre, apellidos, genero):
        self.nombre=nombre
        self.apellidos=apellidos
        self.genero=genero
        
    def nombreCompleto(self):
        nombreCompleto=self.nombre+" "+self.apellidos
        return nombreCompleto

A continuación, definimos la clase empleado, que heredará de la clase Persona. Para indicar la herencia, en la definición de la clase derivada, tras indicar su nombre, entre paréntesis se indica la superclase:

class Empleado(Persona):

Y si definimos esta nueva clase al completo:

class Empleado(Persona):
    def __init__(self, nombre, apellidos, genero, idEmpleado):
        super().__init__(nombre, apellidos, genero)
        self.idEmpleado=idEmpleado
    def identificadorEmp(self):
         print("El empleado ",self.nombreCompleto()," tiene el identificador: ", self.idEmpleado)

Donde puede apreciarse que hemos añadido un parámetro nuevo: idEmpleado, y un método nuevo: identificadorEmp

Recordemos que el método __init__( ) era el método de la clase que empleabamos para instanciar un objeto de la Clase. En el caso de la clase derivada, su método __init__( ) llama al de la superclase: super().__init__() , para instanciar así los parámetros y métodos de la superclase, que hereda la clase derivada.

Cuando creamos una clase derivada, la superclase debe estar definida antes en el código del programa

Ejemplo de creación de objetos que heredan de la clase base:

Persona_1=Persona("José","Martinez","Varon")
print(Persona_1.nombreCompleto())
Empleado_1=Empleado("Ana","Rodriguez","Mujer",57)
print(Empleado_1.nombreCompleto())
Empleado_1.identificadorEmp()

Si ejecutamos el programa, el resultado sería:

José Martinez
Ana Rodriguez
El empleado  Ana Rodriguez  tiene el identificador:  57

Objetos atributos

En ocasiones, cuando definamos una clase, es posible que necesitemos mucho nivel de detalle para uno de los parámetros y nos interese llevárnoslo a otra clase. En la clase original definiríamos un parámetro del tipo de la clase nueva.

Por ejemplo, imaginemos que definimos en la clase Empleado varios parámetros relacionados con el perfil del empleado: nivel_estudios, años_experiencia y posición

Y además definimos un método que trabaje con estos nuevos parámetros, el método salario_estimado

Las clases Persona y Empleado, serían:

class Persona:
    def __init__(self, nombre, apellidos, genero):
        self.nombre=nombre
        self.apellidos=apellidos
        self.genero=genero
        
    def nombreCompleto(self):
        nombreCompleto=self.nombre+" "+self.apellidos
        return nombreCompleto

class Empleado(Persona):
    def __init__(self, nombre, apellidos, genero, idEmpleado, nivel_estudios, años_experiencia, posicion):
        super().__init__(nombre, apellidos, genero)
        self.idEmpleado=idEmpleado
        self.nivel_estudios=nivel_estudios
        self.años_experiencia=años_experiencia
        self.posicion=posicion
    def identificadorEmp(self):
         print("El empleado ",self.nombreCompleto()," tiene el identificador: ", self.idEmpleado)
    def salario_estimado(self):
        if (self.nivel_estudios=="licenciado"):
            complemento=100
        elif (self.nivel_estudios=="bachiller"):
            complemento=50
        else:
            complemento=0
        calculo_salario=self.años_experiencia*(1000+complemento)
        return calculo_salario

Si ahora creamos un objeto empleado y utilizamos el método heredado “nombreCompleto( )”  y el método “salario_estimado”

Empleado_57=Empleado("Ana","Rodriguez","Mujer",57,"bachiller",10,"Directora de Marketing")
print(f"El salario estimado para {Empleado_57.nombreCompleto()} es {Empleado_57.salario_estimado()}")

Si ejecutamos el programa, obtenemos el resultado:

El salario estimado para Ana Rodriguez es 10500

Estos parámetros y el último método que estima el salario tendrían sentido llevárnoslo a otra clase que podríamos llamar Perfil. Esta clase no hereda de ninguna otra, es una clase base. La nueva clase Perfil quedaría:

class Perfil:
    def __init__(self, nivel_estudios, años_experiencia, posicion):
        self.nivel_estudios=nivel_estudios
        self.años_experiencia=años_experiencia
        self.posicion=posicion
    def salario_estimado(self):
        if (self.nivel_estudios=="licenciado"):
            complemento=100
        elif (self.nivel_estudios=="bachiller"):
            complemento=50
        else:
            complemento=0
        calculo_salario=self.años_experiencia*(1000+complemento)
        return calculo_salario

Nos hemos traído a esta nueva clase los parámetros y método de empleado que estaban relacionados con el perfil del Empleado. Es una clase base, independiente, que no hereda de empleado

Y la clase Empleado, actualizada sería:

class Empleado(Persona):
    def __init__(self, nombre, apellidos, genero, idEmpleado,nivel_estudios, años_experiencia, posicion):
        super().__init__(nombre, apellidos, genero)
        self.idEmpleado=idEmpleado
        self.perfil=Perfil(nivel_estudios, años_experiencia, posicion)
    def identificadorEmp(self):
         print("El empleado ",self.nombreCompleto()," tiene el identificador: ", self.idEmpleado)

Puede observarse que hemos definido un parámetro llamado perfil que es un objeto de la clase Perfil. Lo instanciamos en el método __init( )__ de Empleado cuando instanciamos un objeto Empleado. Por ello hay que pasar al método __init( )__ de empleado los valores necesarios para instanciar un objeto Perfil.

Ahora, las llamadas del programa principal serían:

Empleado_57=Empleado("Ana","Rodriguez","Mujer",57,"bachiller",10,"Director MKT")
print(f"El salario estimado para {Empleado_57.nombreCompleto()} es {Empleado_57.perfil.salario_estimado()}")

Puede apreciarse como se accede ahora al método salario_estimado, a través del parámetro perfil que en realidad es una instancia de la clase Perfil

El resultado es el mismo:

El salario estimado para Ana Rodriguez es 10500

Y el programa completo quedaría:

class Perfil:
    def __init__(self, nivel_estudios, años_experiencia, posicion):
        self.nivel_estudios=nivel_estudios
        self.años_experiencia=años_experiencia
        self.posicion=posicion
    def salario_estimado(self):
        if (self.nivel_estudios=="licenciado"):
            complemento=100
        elif (self.nivel_estudios=="bachiller"):
            complemento=50
        else:
            complemento=0
        calculo_salario=self.años_experiencia*(1000+complemento)
        return calculo_salario

class Persona:
    def __init__(self, nombre, apellidos, genero):
        self.nombre=nombre
        self.apellidos=apellidos
        self.genero=genero
        
    def nombreCompleto(self):
        nombreCompleto=self.nombre+" "+self.apellidos
        return nombreCompleto
    
class Empleado(Persona):
    def __init__(self, nombre, apellidos, genero, idEmpleado,nivel_estudios, años_experiencia, posicion):
        super().__init__(nombre, apellidos, genero)
        self.idEmpleado=idEmpleado
        self.perfil=Perfil(nivel_estudios, años_experiencia, posicion)
    def identificadorEmp(self):
         print("El empleado ",self.nombreCompleto()," tiene el identificador: ", self.idEmpleado)

Empleado_57=Empleado("Ana","Rodriguez","Mujer",57,"bachiller",10,"Director MKT")
print(f"El salario estimado para {Empleado_57.nombreCompleto()} es {Empleado_57.perfil.salario_estimado()}")

Módulos

Hemos visto como definir clases en Python. Una vez definida una clase la podemos emplear en el mismo script en la que la hemos definido, para poder emplearla en otros scripts (archivos .py) empleamos los módulos. Un módulo es un archivo .py que contiene definiciones y declaraciones de Python como puede ser funciones o clases, que son susceptibles de ser utilizadas por varios programas, con lo que en lugar de definirlas en todos ellos, las definimos una única vez en un módulo. Para utilizar las funciones definidas en un módulo desde un script este módulo debe ser importado, utilizando lasentencia import

Por ejemplo, si las clases definidas anteriormente: Persona, Empleado y Perfil, prevemos que las vamos a utilizar en varios programas, nos las llevamos a un modulo. Por ejemplo al modulo clases_de_RRHH

De esta forma, mi programa principal quedaría:

import clases_de_RRHH as rrhh

Empleado_57=rrhh.Empleado("Ana","Rodriguez","Mujer",57,"bachiller",10,"Director MKT")
print(f"El salario estimado para {Empleado_57.nombreCompleto()} es {Empleado_57.perfil.salario_estimado()}")

Puede apreciarse que lo primero que hay que hacer es importar el modulo:

import clases_de_RRHH

después, con la instrucción as, defino un alias para hacer referencia al modulo en mi código.

Y finalmente, en el programa principal, cuando tengo que llamar al método Empleado para instanciar el objeto Empleado_57, lo llamo a través del modulo: rrhh.Empleado

El resultado de ejecución es el mismo que obteníamos antes:

El salario estimado para Ana Rodriguez es 10500

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Pseudocódigo

Última actualización: Agosto 2025

El pseudocódigo es un lenguaje sencillo que se asemeja a un lenguaje de programación, pero sin la rigidez de una sintaxis y semántica formales, de manera que estas reglas son flexibles. Normalmente se usa el lenguaje natural para escribir las sentencias.

Características:

  • Es un lenguaje informal que permite a los programadores expresar los pasos de un algoritmo de manera concisa.
  • No requiere una sintaxis estricta, lo que facilita su escritura y compresión, asemejándose al lenguaje humano.
  • Se utiliza para aprender y planificar la lógica y las estructuras de un programa antes de escribir el código en un lenguaje de programación específico.
  • Es fácil de convertir a un lenguaje de programación para crear un programa.

No existe una sintaxis estandarizada para la escritura de pseudocódigo, con lo que es posible encontrar diferencias entre dos pseudocódigos escritos por diferentes programadores.

También podemos expresar un algoritmo mediante un pseudocódigo, que no es otra cosa que expresar las instrucciones de este en un lenguaje natural, fácil de entender para un ser humano. Secuenciando las instrucciones como se llevarían a cabo en la ejecución del proceso.

Los seudocódigos para los dos ejemplos del post de Diagramas de flujo podrían ser:

Ejemplo 1: Determinar si una persona es mayor de edad

Inicio
     Leemos la edad del sujeto
     Si la edad es >= 18:
          Mostramos el mensaje: “Mayor”.
     Si la edad no es >=18:
          Mostramos el mensaje: “Menor”
Fin

Ejemplo 2: Coche no arranca

Inicio
     Comprobar que hemos introducido la llave en el contacto.
          Si no la hemos introducido, introducidla.
     Comprobar que hemos arrancado (hacer contacto)
          Si no hemos hecho contacto, arrancar.
     Comprobar si hay gasolina.
          Si no hay gasolina llenar el tanque y comenzar el proceso de nuevo.
     Si no arranca, llamar a la grúa y llevar el coche al taller.
Fin

Usamos instrucciones sencillas como Leer, Escribir, Si, Sino para representar la lógica. No dependemos de ningún lenguaje de programación específico. Es casi como escribir una receta en español con estructura lógica.

Existen herramientas para probar el pseudocódigo. Una de las más comunes puedes descargarla en PSeint.

NOTA: Este post es parte de la colección “Conceptos básicos de programación”. Puedes ver el índice de esta colección aquí.

Diagramas de flujo

Última actualización: Agosto 2025

Los diagramas de flujo son representaciones gráficas que muestran el flujo de un proceso o algoritmo mediante símbolos conectados por flechas. Cada símbolo representa una acción, decisión, inicio, fin u operación específica, y las flechas indican el orden en que se ejecutan.

Permite que personas sin conocimientos técnicos participen en la creación del algoritmo que soluciona el problema. No se necesita saber programar. Hay programas para el desarrollo de diagramas de flujo, aunque no es extraño hacer un primer boceto a papel y lápiz.

Ejemplo 1: Determinar si una persona es mayor de edad

El proceso seguido para solucionar el problema ha sido:

  1. Se empieza leyendo un valor (edad).
  2. Se toma una decisión: ¿edad ≥ 18?
  3. Si es verdadero, se muestra «Mayor de edad».
  4. Si es falso, se muestra «Menor de edad».
  5. Luego el programa termina.

Y su implementación en el diagrama de flujo sería:

Flujograma para determinar si una persona es mayor de edad

En su implementación he utilizado los siguientes símbolos:

Simbolo de inicio - finalInicio/ final: Representa el punto de inicio y el punto final del proceso que se esté describiendo.
Símbolo de procesoProceso: Indicamos la operación a realizar.
Símbolo de decisiónDecisión: Se evalúa si una condición es verdadera o falsa, tomando el proceso uno u otro camino en función del resultado de dicha evaluación.
línea de flujoLínea de flujo: Marca el orden en que vamos ejecutando las distintas operaciones y comprobaciones de nuestro diagrama. La flecha apunta hacia la siguiente acción.
Símbolos básicos empleados en los diagramas de flujo

Existe todo un conjunto de símbolos para definir en detalle los procesos, aunque para el propósito de estas notas, nos vale con entender y manejar los cuatro símbolos mostrados arriba.

Las notaciones más conocidas son la ANSI (American National Standards Institute) y la ISO (International Organization for Standardization). También es muy empleada la notación BPMN (Business Process Model and Notation), que está más orientada a modelar procesos de negocio.

Para este curso empezaremos empleando papel y lápiz para realizar los diagramas de flujo y plantear la solución. Cuando desarrollemos cierta habilidad en el trazado de flujogramas, podemos pasar a utilizar powerpoint o herramientas específicas. Entre las herramientas específicas, una de las más empleadas es Draw . Es gratuita e intuitiva, muy fácil de usar. En cualquier caso, aquí puedes encontrar el manual oficial

Ejemplo 2: Coche no arranca

El proceso para solucionar este problema sería:

  1. Comprobar que se ha introducido la llave en el contacto.
  2. Asegurarnos de que se ha hecho contacto: se ha arrancado.
  3. Comprobar que el coche tiene Gasolina.
  4. Tras las anteriores comprobaciones, si el coche ha arrancado todo va bien. Si por el contrario, no ha arrancado, llamamos a la grúa y lo llevaríamos al taller.

Este proceso dibujado en un diagrama de flujo, podría tener el siguiente aspecto:

Ejemplo de diagrama de Flujo
Ejemplo de diagrama de flujo

NOTA: Este post es parte de la colección “Conceptos básicos de programación”. Puedes ver el índice de esta colección aquí.

Ejercicios con funciones en Python

Aquí dejo una propuesta para practicar con algunos ejercicios con funciones en python.

Ejercicio 1: Número de palabras en un texto

Realiza un programa que pida al usuario que introduzca un texto y pinte por pantalla el número de palabras que hay en el texto introducido por el usuario.

Solución propuesta:

def contar_palabras(texto):
    palabras = texto.split()
    return len(palabras)

texto_usuario = input("Introduce un texto: ")

numero_palabras = contar_palabras(texto_usuario)
print("Número de palabras en el texto:", numero_palabras)

Ejercicio 2: Suma de los dígitos de un número

Realiza un programa que pida al usuario que introduzca un número entero positivo y presente por pantalla la suma de todos sus dígitos.

Ejemplo:

  • Número introducido: 10002
  • Resultado = 3

Solución propuesta:

def suma_digitos(numero):
    suma = 0
    for digito in str(numero):
        suma += int(digito)
    return suma

numero = int(input("Introduce un número entero positivo: "))

resultado = suma_digitos(numero)
print("Resultado =", resultado)

Ejercicio 3: Crear palabra con iniciales de palabras en texto

Realiza un programa que pida al usuario que introduzca un texto y cree una palabra con las iniciales de las palabras del texto introducido.

Por ejemplo: texto introducido = “Con años sin apetito”, la palabra que tendría que pintar el programa por pantalla sería: “Casa”

Solución propuesta:

def crear_palabra_iniciales(texto):
    # Dividir el texto en palabras
    palabras = texto.split()
    # Inicializar la palabra de iniciales
    palabra_iniciales = ""
    # Obtener la inicial de cada palabra y agregarla a la palabra de iniciales
    for palabra in palabras:
        if palabra:  # Asegurarse de que la palabra no esté vacía
            palabra_iniciales += palabra[0]
    return palabra_iniciales
# Solicitar al usuario que ingrese el texto
texto_usuario = input("Introduce un texto: ")
# Crear la palabra con las iniciales del texto ingresado
palabra_iniciales = crear_palabra_iniciales(texto_usuario)
# Imprimir el resultado
print("Palabra con iniciales:", palabra_iniciales)

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Ejercicios con estructuras de control en python

En este post aprovecho para proponer algunos ejercicios con estructuras de control en python, para practicar con lo explicado en Estructuras de Control.

Ejercicio 1: Suma de los primeros N números naturales

Escribe un programa que solicite al usuario un número entero positivo N y calcule la suma de los primeros N números naturales.

Por ejemplo:

  • Número introducido: 6
  • Resultado = 21

Solución propuesta:

# Solicitar al usuario un número entero positivo N
n = int(input("Introduce un número entero positivo N: "))
# Inicializar la variable para almacenar la suma
suma = 0
# Calcular la suma de los primeros N números naturales
for i in range(1, n + 1):
    suma += i
# Imprimir el resultado
print("Resultado =", suma)

Ejercicio 2: Suma de números pares en rango

Realiza un programa que pida al usuario que introduzca dos números enteros y muestre la suma de todos los números pares en ese rango, incluidos los números introducidos.

El programa debe funcionar con independencia de si se introduce primero el número mayor o el menor.

Por ejemplo:

  • números introducidos = 2 y 8
  • Resultado = 20

Solución propuesa:

# Solicitar al usuario que introduzca dos números enteros
numero1 = int(input("Introduce el primer número entero: "))
numero2 = int(input("Introduce el segundo número entero: "))
# Asegurarse de que num1 es el menor y num2 es el mayor
num1 = min(numero1, numero2)
num2 = max(numero1, numero2)
# Inicializar la suma de los números pares en el rango
suma_pares = 0
# Iterar sobre el rango desde num1 hasta num2 (incluyendo num2)
for numero in range(num1, num2 + 1):
    if numero % 2 == 0:  # Verificar si el número es par
        suma_pares += numero
# Imprimir el resultado
print("Resultado =", suma_pares)

Ejercicio 3: Cifrado Cesar

Crea un programa que implemente el cifrado César, donde cada letra en el texto original se desplaza un número fijo de posiciones en el alfabeto.

El usuario tiene que introducir las posiciones que quiere que se desplace cada letra y el texto a cifrar con el cifrado Cesar.

Finalmente, el programa presenta por pantalla el texto cifrado.

Ejemplo:

  • Posiciones a desplazar: 2
  • Texto introducido: “La casa de Maria”
  • Texto cifrado: “Nc ecuc fg ñctkc”

NOTA: El método index aplicado a una cadena de texto devuelve el índice del primer carácter que coincida con el argumento que se le pasa como parámetro.

Ejemplo:

abecedario = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’

indice= abecedario.index(d)  ->  resultado: indice = 3

Solución propuesta 1:

def cifrado_cesar(texto, desplazamiento):
    texto_cifrado = ""
    for caracter in texto:
        # Comprobar si el caracter es una letra del alfabeto
        if caracter.isalpha():
            # Obtener el código ASCII del caracter
            codigo = ord(caracter)
            # Aplicar el desplazamiento al código ASCII
            if caracter.islower():
                codigo_cifrado = (codigo - ord('a') + desplazamiento) % 26 + ord('a')
            elif caracter.isupper():
                codigo_cifrado = (codigo - ord('A') + desplazamiento) % 26 + ord('A')
            # Convertir el código ASCII cifrado de nuevo a caracter
            caracter_cifrado = chr(codigo_cifrado)
            texto_cifrado += caracter_cifrado
        else:
            texto_cifrado += caracter
    return texto_cifrado

# Solicitar al usuario las posiciones a desplazar y el texto a cifrar
desplazamiento = int(input("Posiciones a desplazar: "))
texto = input("Texto introducido: ")

# Aplicar el cifrado César al texto
texto_cifrado = cifrado_cesar(texto, desplazamiento)
# Presentar el texto cifrado por pantalla
print("Texto cifrado:", texto_cifrado)

Solución propuesta 2:

def cifrado_cesar(texto, desplazamiento):
    abecedario = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    texto_cifrado = "" 
    for caracter in texto:
        if caracter in abecedario:
            indice_original = abecedario.index(caracter)
            indice_cifrado = indice_original + desplazamiento
            if indice_cifrado >= len(abecedario):
                indice_cifrado -= len(abecedario)
            caracter_cifrado = abecedario[indice_cifrado]
            texto_cifrado += caracter_cifrado
        else:
            texto_cifrado += caracter           
    return texto_cifrado
# Solicitar al usuario las posiciones a desplazar y el texto a cifrar
desplazamiento = int(input("Posiciones a desplazar: "))
texto = input("Texto introducido: ")
# Aplicar el cifrado César al texto
texto_cifrado = cifrado_cesar(texto, desplazamiento)
# Presentar el texto cifrado por pantalla
print("Texto cifrado:", texto_cifrado)

Ejercicio 4: Acertar nombre

Realiza un programa para acertar el nombre de una persona. Dicho nombre estará hardcodeado (no hay que pedir al usuario que introduzca los datos, sino que los escribimos directamente en el código).

El programa pide al usuario repetidamente que introduzca un nombre hasta que acierte. A cada fallo, el programa da una pista que consiste en mostrar por pantalla las letras del nombre hasta la posición igual al número de fallos que se lleven.

Ejemplo: Nombre = “Eustaquio”

1ª Introducción: “ Elena”  -> fallo -> 1ª pista: “E”

2ª Introducción: “Enrique” ->  fallo -> 2ª pista: “Eu”

3ª Introducción: “Eulalia” -> fallo -> 3ª pista: “Eus”

4ª Introducción: “Eusebio” -> fallo -> 4ª pista: “Eust”

5ª Introducción: “Eustaquio” -> acierto – > fin del programa

Solución propuesta:

# Nombre a adivinar
nombre_correcto = "Eustaquio"

# Inicializar el número de intentos fallidos y la pista
intentos_fallidos = 0
pista = ""

# Bucle para solicitar al usuario que introduzca un nombre hasta que lo adivine
while True:
    # Solicitar al usuario que introduzca un nombre
    nombre = input("Introduce un nombre: ")
    
    # Verificar si el nombre es correcto
    if nombre == nombre_correcto:
        print("¡Felicidades! Has adivinado el nombre correctamente.")
        break
    
    # Incrementar el número de intentos fallidos y actualizar la pista
    intentos_fallidos += 1
    pista = nombre_correcto[:intentos_fallidos]
    
    # Mostrar la pista al usuario
    print(f"Fallo {intentos_fallidos}. Pista: {pista}")

Ejercicio 5: Tablas de multiplicar

Dibujar por pantalla las tablas de multiplicar:

Solución propuesta:

for i in range(1,11):
    print(" ")
    print("TABLA DEL ",i)
    print("-------------")
    for j in range(1,11):
        print(i,"x",j," =",i*j)

Ejercicio 6: Soluciones de la ecuación de segundo grado

Calcular los resultados de una ecuación de segundo grado. El programa pide los coeficientes al usuario y muestra sus soluciones reales. Si no existen, debe indicarlo

Solución propuesta:

import math

entrada=input("Introduce el coeficiente de segundo grado:")
a=float(entrada)
entrada=input("Introduce el coeficiente de primer grado:")
b=float(entrada)
entrada=input("Introduce el termino independiente:")
c=float(entrada)
d=(b*b)-(4*a*c)
if d<0:
    print('No hay soluciones reales')
else:
    solucion1=-(b+math.sqrt(d))/(2*a);
    solucion2=-(b-math.sqrt(d))/(2*a);
    print('la primera solucion es: ',solucion1)
    print('la segunda solucion es: ',solucion2)

Ejercicio 7: Cuadrado compacto de lado N

Dibujar por pantalla un cuadrado compacto de caracteres de lado n, siendo n un número entero introducido por el usuario. Como carácter podemos escoger el que queramos.

Solución propuesta 1:

lon=input("Introduce la longitud del lado\n")
n=int(lon)

for i in range(1,n+1):
    print("")
    for j in range(1,n+1):
        print("X",end="")

Solución propuesta 2:

lon=int(input("Introduce la longitud del lado\n"))
for i in range(1,n+1):
    print("X"*n)

Ejercicio 8: Cuadrado hueco de lado N

Dibujar por pantalla los lados de un cuadrado de caracteres de lado n, siendo n un número entero introducido por el usuario. Como carácter podemos escoger el que queramos

Solución propuesta:

def dibujar_lineaCompacta(a):
    for j in range(1,a+1):
       print("X",end="")
       if j==a:
           print("")
    
def dibujar_lineaHueca(a):
    for j in range(1,a+1):
        if j==1:
            print("X",end="")
        elif j==n:
            print("X")
        else:
            print(" ",end="")          

lon=input("Introduce la longitud del lado\n")
n=int(lon)

for i in range(1,n+1):
    if (i==1)|(i==n):
        dibujar_lineaCompacta(n)
    else:
        dibujar_lineaHueca(n)

Ejercicio 9: Traducir Nota

Pedir una nota de 0 a 10 y mostrarla de la forma: Insuficiente, Suficiente, Bien, Notable, Sobresaliente

Solución propuesta:

a=input("Introduce tu nota\n")
nota=float(a)
if (nota<0.0)|(nota>10.0):
    print("la nota introducida no esta dentro de los limites posibles (0-10)")
    exit()
if nota<5:
    texto="Insuficiente"
elif nota<6:
    texto="Suficiente"
elif nota<7:
    texto="Bien"
elif nota<9:
    texto="Notable"
else:
    texto="Sobresaliente"
print("La nota obtenida es ",texto)

Ejercicio 10: Acertar número

El usuario tiene que acertar un número entero entre 0 y 1.000 que está hardcodeado. Tras cada introducción del usuario, el programa indicará si el número introducido es mayor o menor que el número a acertar.

No hay límite de intentos y el programa seguira pidiendo al usuario que introduzca un número hasta que lo acierte.

El programa termina cuando el usuario acierta el número y tiene que presentar por pantalla un mensaje de éxito y el número de intentos que ha empleado el usuario para acertar el número

Solución propuesta:

numero=567
intentos=0
acertado=False
print("Tu objetivo es acertar un número entre 0 y 1.000")
print("Tienes un número ilimitado de intentos")
print("Después de cada introducción se te indicara si el número buscado es mayor o menor que el que introduciste")
  
while not acertado:
    a=input("Introduce el número: ")
    a=int(a)
    intentos=intentos+1
    if a ==numero:
        print("Has acertado. Has necesitado ",intentos," intentos")
        acertado=True
    elif a<numero:
        print("El número que has introducido es menor que el numero buscado") 
        print("Prueba con un número mayor")
    else:
        print("El número que has introducido es mayor que el numero buscado")
        print("Prueba con un número menor")

Ejercicio 11: Número primo

El programa pinta por pantalla todos los números primos iguales o menor a un número introducido por el usuario.

Solución propuesta:

print("Este programa calcula los números primos menores al número introducido")
numero=input("Por favor, introduce un número:")
numero=int(numero)
for i in range(1,numero+1):
    contador=0
    for j in range(1,i+1):
        if i%j==0:
            contador=contador+1
    if contador==2:
        print(i)

Ejercicio 12: Factorial de un número

Pedir un número entero y calcular su factorial

Solución propuesta (usando recursividad):

a=int(input("Introduce un número entero y calculo su factorial \n"))
factorial=1
for i in range(2,a+1):
    factorial=factorial*i
print("el factorial del numero ",a," es ",factorial)

Ejercicio 13: Media de números enteros

Realiza un programa que pida al usuario que introduzca varios números enteros. Cuando el usuario introduzca un 0 (cero), finaliza la introducción de números y el programa pinta por pantalla la media de los números introducidos

Solución propuesta:

contador=0
suma=0
num=int(input("introduce un numero entero\n"))
while (num !=0):
    	contador=contador+1
    	suma=suma+num
    	num=int(input("introduce un numero entero\n"))
print("la media de los numeros introducidos es: ",suma/contador)

Ejercicio 14: Cuadrados de números enteros

Realiza un programa que pida de manera ininterrumpida al usuario que introduzca un número entero positivo. El programa dejará de pedir al usuario que introduzca un número cuando el número introducido sea el cero.

Pintar por pantalla los números introducidos y sus cuadrados.

Solución propuesta:

while True:
    numero = int(input("Introduce un número entero positivo (0 para salir): "))
    if numero == 0:
        break
    elif numero < 0:
        print("Por favor, introduce un número entero positivo.")
        continue

    cuadrado = numero ** 2
    print(f"El cuadrado de {numero} es {cuadrado}")

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Funciones en Python

Las funciones en Python, de forma similar a como sucede en otros lenguajes, nos permiten “empaquetar” un conjunto de instrucciones que realizan una funcionalidad concreta y poder llamarlas desde otras partes del código o desde otros scripts.

Definición de una función

Una función puede tener argumentos de entrada, aunque no es necesario indicar los tipos. El bloque de código se determina por el sangrado de las instrucciones de forma similar a las estructuras de control. Puede haber un valor de retorno o no y esto se indica con la sentencia return

La sintaxis para definir una función es la siguiente:

def nombre_funcion(argumentos): 
			bloque de operaciones de la función 
			return valor

Empleamos la palabra clave def, seguida del nombre de la función, y entre paréntesis se pasan los argumentos. Estos son variables con las que trabaja la función y cuando la llamamos le pasamos los valores de estos argumentos.

A continuación, viene el bloque de instrucciones, que tiene que ir indexado y finalmente la instrucción return que devuelve uno o varios valores.

Por ejemplo, la función validar_par, definida a continuación, admite el parámetro a y devuelve el valor True si a es par y False si a no es par.

#definición de la función
def validar_par(a):
    if a % 2 == 0:
        par = True
    else:
        par=False
    return par
#llamada a la función
num=5
print(f"¿es par el número: {num}?")
print(f"Respuesta: {validar_par(num)}")

Los argumentos de una función puede ser cualquier tipo de datos válido en Python.

Para llamar a la función, sencillamente usamos su nombre y le pasamos los parámetros.

Argumentos por posición y por clave

Cuando llamamos a un método, es posible que tengamos que pasarle unos parámetros para que trabaje con ellos. También puede pasar que el método no admita parámetros, en cuyo caso no hay que pasarle nada.

Para pasarle parámetros a un método, tenemos dos opciones: argumentos posicionales y argumentos de palabra clave.

  • Argumentos posicionales: No hay que indicar el nombre de los parámetros, y el método sabe cual es cual en función del orden en el que se le pasen.
  • Argumentos de palabra clave: al pasar el parámetro indicamos su nombre y le damos un valor, de esta forma el orden en el que pasemos los parámetros puede ser cualquiera.

Ejemplo: función operaciones

#definición de la función
def operaciones (operando1, operando2, operacion):
    resultado = 0
    if operacion=="suma":
        resultado = operando1+operando2
    elif operacion=="resta":
        resultado = operando1-operando2
    elif operacion=="multiplicacion":
        resultado = operando1*operando2
    elif operacion=="division":
        resultado=operando1*operando2
    elif operacion=="potencia":
        resultado=operando1**operando2
    else:
        print("operación no registrada")
    return resultado
#llamada a la función por argumentos posicionales
res=operaciones(2,3,"multiplicacion")
print(res)
#llamada a la función por argumentos de palabra clave
res=operaciones(operacion="suma",operando2=4,operando1=10)
print(res)

En el ejemplo anterior, la primera llamada es por posición, y el orden en el que pasamos los parámetros es igual al orden en el que están definidos en la función.

res=operaciones(2,3,"multiplicacion")

No es necesario indicar que valor corresponde a cada parámetro, ya que esto lo marca la posición en la que están. En el ejemplo anterior, 2 corresponde a operando1, 3 a operando2 y “multiplicación” a operación.

Sin embargo, la segunda llamada al método es por palabra clave, es decir, indicamos el nombre del parámetro y le damos un valor.

res=operaciones(operacion="suma",operando2=4,operando1=10)

En este último caso, el orden no tiene importancia, puede ser cualquiera.

No podemos mezclar los dos: usamos uno u el otro.

Cuando usemos argumentos por palabra clave, tenemos que asegurarnos que escribimos los nombres exactos de los parámetros, tal y como aparecen en la definición de la función.

Valores por defecto para los argumentos

Para indicar un valor por defecto para un parámetro en la definición de una función, sencillamente asignamos dicho valor por defecto al citado parámetro.

Ejemplo: función alquilarCoche:

def alquilarCoche (edad, pagado, carnet=True):
    if edad>=18 and pagado and carnet:
        return True
    else:
        return False

En el ejemplo de arriba, asumimos que normalmente quien viene a alquilar coche tienen carnet de conducir. De esta forma, las siguientes llamadas a la función alquilarCoche son correctas:

print(alquilarCoche(21,True))
print(alquilarCoche(20,True,False))
print(alquilarCoche(edad=20,pagado=True))
print(alquilarCoche(edad=20,pagado=True, carnet=False))

Como sigue existiendo la posibilidad de llamar a la función por argumentos posicionales, los argumentos que tengan valores por defecto tienen que ir al final. La siguiente definición de la función alquilarCoche daría error:

def alquilarCoche (edad, pagado=True, carnet):
    if edad>=18 and pagado and carnet:
        return True
    else:
        return False

El mensaje de error es explicativo del error cometido: “Non-default argument follows default argument”

Non-default argument follows default argument

Número indefinido de argumentos

El número de argumentos puede ser especificado en la definición o bien emplear el carácter * antes del nombre del argumento, lo cual indica que no se conoce el número de argumentos. En tal caso, la función considera los argumentos pasados en la llamada como una tupla de argumentos.

Ejemplo de función con número variable de argumentos:

def sumatorio(*parametros):
    resultado=0
    for parametro in parametros:
        resultado=resultado+parametro
    return resultado

A esta función, podemos llamarla con distinto número de parámetros y nos devolverá la suma de todos los parámetros que le pasemos. Por ejemplo, las dos llamadas siguientes:

print(sumatorio(1,3,5))
print(sumatorio(1,5,7,9,11))

Pintan por pantalla los valores 9 y 33 respectivamente.

Una opción similar a la anterior es **parametros que permite trabajar con un numero de argumentos variable de tipo clave-valor que se reciben en la función en una tupla de diccionarios.

def datos_curso(**parametros):
    for clave, valor in parametros.items():
        print(f"{clave}: {valor}")
        
datos_curso(curso="Python",horas=30)
print("-----------------------------")
datos_curso(curso="Java y SQL",horas=40,creditos=4.5,
            alumnos=["Juan","Maria","Elena"])

Lo que da como resultado:

curso: Python
horas: 30
-----------------------------
curso: Java y SQL
horas: 40
creditos: 4.5
alumnos: ['Juan', 'Maria', 'Elena']

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Entradas y salidas standard en python

Para poder interactuar con el usuario, todo programa necesita una entrada para que los usuarios puedan introducir datos y una salida para que el programa pueda presentar los resultados. En este post vamos a ver las entradas y salidas standard en Python, que con en la mayoría de los lenguajes de programación, son el teclado y la pantalla respectivamente.

Entrada por teclado

Para registrar las entradas de usuario por teclado, usaremos la función input. Como argumento pasamos el texto que queremos mostrar al usuario y la función nos devuelve el texto introducido.

entrada=input("Introduce un número")
print(entrada)

El programa anterior, guarda en la variable entrada el número que introduzca el usuario y lo pinta por pantalla con la instrucción print.

Casting de retorno de input: La función input devuelve un tipo str (texto). Si quisiéramos realizar operaciones numéricas con los datos introducidos tendríamos que traducirlos antes al tipo numérico correspondiente.

num_1=input("introduce un numero")
num_2=input("introduce otro numero")
suma=int(num_1)+int(num_2)
print(type(suma))
print(suma)

El programa anterior pide al usuario que introduzca dos números: num_1 y num_2. La función input los devuelve como tipo str, y para poder sumarlos en la variable suma, los transformamos antes a tipo int. Luego pinta por pantalla el tipo de la variable suma y el valor de la variable.

Un posible resultado de ejecución sería:

introduce un numero3

introduce otro numero3
&lt;class 'int'>
6

Si no transformamos a int alguno de los dos valores introducidos por el usuario, el programa arrojaría el error:

Salida por pantalla

Para la presentación de datos por pantalla empleamos la función print. Por defecto, añade el retorno de carro al final de la impresión. Es decir, pasa a una línea nueva.

texto1="Hola"
texto2="amigo"
print(texto1)
print(texto2)

El programa anterior da como resultado:

Hola
amigo

El parámetro end de print

Se puede incluir el parámetro end y darle un valor para que la función print termine con dicho valor en lugar de con el retorno de carro.

texto1="Hola"
texto2="amigo"
print(texto1,end="")
print(texto2)

En este caso, al finalizar la primera instrucción print, no se incluye el retorno de carro por defecto, con lo que no salta a la siguiente línea. El resultado es:

Holaamigo

Empleando cadenas de texto formateadas

Es muy habitual emplear cadenas de textos formateadas con la función print. Recuerda que una cadena de texto formateada va precedida por la letra f y colocamos las variable entre llaves, para que la función print las identifique como variables y pinte sus valores por pantalla

texto1="Hola"
texto2="amigo"
print(f"{texto1}, {texto2}")

El resultado presentado en pantalla sería:

Hola, amigo

Podemos emplear las cadenas de texto formateadas para pasar a la función varios valores a imprimir, o podemos también separar por comas los fragmentos de texto y valores que queramos imprimir. El siguiente programa arroja el mismo resultado que el anterior:

texto1="Hola"
texto2="amigo"
print(texto1,", ",texto2)

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Estructuras de Control en Python

En este apartado vamos a conocer las diferentes estructuras de control que nos van a permitir dirigir el flujo de nuestros programas.

El flujo de un programa es el orden en el que se van ejecutando las instrucciones de este. Estas instrucciones se ejecutan de arriba abajo, y de izquierda a derecha, según el orden en que aparezcan las mismas.

Sin embargo, existen ocasiones en las que necesitemos romper este flujo secuencial. Estas pueden ser de muy diverso tipo, puede que necesitemos tomar una decisión entre una o varias opciones posibles, o a lo mejor necesitamos realizar algunas instrucciones varias veces. Por tanto, necesitamos instrucciones que nos permitan interrumpir el flujo secuencial del programa, y pasar a ejecutar otros bloques de código.

Podemos identificar dos tipos de estructuras de control:

Condicionales: Nos permiten determinar el flujo que sigue el programa en función del resultado de la evaluación de ciertas condiciones.

Iterativas: Para realizar un conjunto de instrucciones de forma repetitiva.

Estructuras condicionales

Las estructuras condicionales nos permiten evaluar condiciones en Python y modificar el flujo del programa, en función del resultado de la evaluación de la condición.

Sentencia if

La sentencia if, evalúa una condición y ejecuta un bloque de instrucciones en el caso de que la condición sea verdadera.

Flujo de la sentencia If
Flujo de la sentencia if

Su estructura general es la siguiente:

 if condición:
      instrucciones si se cumple la condición
numero=5
if numero>0:
    print(f"{numero} es mayor que cero")

Para evaluar estas condiciones, disponemos de los siguientes operadores:

OperadorSignificado
==Igualdad
!=Desigualdad
> Mayor que
<Menos que
>=Mayor o igual que
<=Menor o igual que
inEstá en la lista
Operadores de comparación

En el siguiente código puede apreciarse el uso de algunos de estos operadores:

lista=[1,3,5,7,9,11]
numero=5
if lista[0]==1:
    print("el primer elemento es igual a 1")
if lista[1]>0:
    print(f"{lista[1]} es mayor que cero")
if lista[2]!=lista[1]:
    print("los elementos segundo y tercero son distintos")
if numero in lista:
    print(f"el numero {numero} esta en la lista")
otro_numero=4
if otro_numero not in lista:
    print("el otro numero no está en la lista")

Este código arroja el siguiente resultado:

el primer elemento es igual a 1
3 es mayor que cero
los elementos segundo y tercero son distintos
el numero 5 esta en la lista
el otro numero no está en la lista

¡¡OJO!! -> No confundir el operador de asignación: “=” , con el de igualdad: “==”. El primero es un único signo: “=” y se emplea para asignar un valor a una variable. El segundo son dos signos: “=” seguidos y se emplea para la comparación de igual, arrojando un valor de verdadero cuando ambos operandos sean iguales.

Combinando condiciones

La comprobación a realizar puede combinar varias condiciones, empleando los operadores lógicos: and, or y not

lista=[1,3,5,7,9,11]
numero=5
if lista[0]==1 and numero==5:
    print("se cumplen ambas condiciones")
if lista[1]>0 or numero<4:
    print("Se cumple al menos una de las dos condiciones")

Al ejecutar el programa obtenemos el resultado:

se cumplen ambas condiciones
Se cumple al menos una de las dos condiciones

Instrucción else

La instrucción “else” provee un camino adicional en el caso de que la condición se evalué como falsa. Es decir, si es falsa, pasamos a ejecutar otro bloque de instrucciones.

Flujo del bloque if-else

Un ejemplo de utilización de esta estructura sería:

numero=3
if numero>5:
    print(f"{numero} es mayor que cinco")
else:
    print(f"{numero} NO es mayor que cinco")

Cuya ejecución arroja el siguiente resultado

3 NO es mayor que cinco

También podemos emplearlo para saber si una lista está vacía. Si empleamos el nombre de una lista como condición, Python devolverá falso si no tiene elementos.

numeros=[]
if numeros:
    print("hay elementos en la lista")
else:
    print ("la lista está vacia")

Instrucción elif

En ocasiones, cuando no se cumpla la condición, querremos comprobar otra cosa y así, varias veces seguidas, concatenando varias comprobaciones. En estos casos empleamos la instrucción elif, que puede verse como una conjunción de las instrucciones else y if.

La sintaxis de la estructura sería:

if condición 1:
     instrucciones si se cumple la condición 1 
elif condición 2: 
     instrucciones si se cumple la condición 2 y no la 1 
elif condición N: 
     instrucciones si se cumple la condición N y no todas las anteriores
else: 
     rama por defecto: instrucciones si no se cumplen ninguna de las condiciones

Aquí tienes un ejemplo de código:

dia="martes"
if dia=="lunes":
    print("Que la fuerza te acompañe")
elif dia=="jueves":
    print("ya queda menos")
elif dia=="viernes":
    print("no queda nada")
elif dia=="sabado" or dia=="domingo":
    print("Buen finde")
else:
    print("Buenos dias")

El resultado de ejecución sería:

Buenos dias

Estructuras iterativas

Las estructuras iterativas permiten ejecutar de forma repetida un conjunto de operaciones un número de veces determinado.  Fundamentalmente vamos a trabajar con dos estructuras iterativas: for y while

Bucle for

El bucle for lo emplearemos para recorrer una estructura iterable, como puede lista, tupla, diccionario o rango de números, y para cada elemento se ejecuta un bloque de código.

La sintaxis es:

for elemento in iterable: 
     operaciones para elemento realizadas en cada iteración

Ejemplo de código:

lista=[1,3,5,7,9,11]
for item in lista:
    print(item)

Cuyo resultado es:

1
3
5
7
9
11

La función range

Genera secuencias de valores desde un valor inicial hasta uno final, indicando el incremento de un valor con respecto al anterior.

La sintaxis es:

Range(valor inicial, valor final, incremento)

Si no se indica incremento se toma por defecto el valor 1. Y el valor final no está incluido en el rango.

Por ejemplo: range(1,9,2) , generará la secuencia de números: 1, 3, 5 y 7

for item in range(1,9,2):
    print(item)

Y si utilizamos un único argumento, toma como valor inicial 0 y como incremento 1.

for item in range(3):
    print(item)

El resultado sería:

0
1
2

Para las estructuras iterativas, como las listas, podemos emplear los dos puntos para indicar un rango a recorrer de dicha lista. Por ejemplo, si queremos recorrer los tres primeros elementos de la lista, utilizaríamos: [:3] (recuerda que los índices empiezan en cero y que el extremo superior no está incluido.

lista=[1,3,5,7,9,11]
for num in lista[:3]:
    print(num)

Y el resultado es:

1
3

Bucles anidados

Podemos incluir bucles dentro de bucles. El ejemplo siguiente imprime las tablas de multiplicar.

for x in range(1,10):
    print(f"TABLA DE MULTIPLICAR DEL {x}")
    for y in range(1,10):
        print(f"{x} x {y} = {x*y}")

Cuya ejecución da como resultado:

TABLA DE MULTIPLICAR DEL 1
1 x 1 = 1
1 x 2 = 2
…….

Iterando con dos variables

En ocasiones nos va a resultar muy útil ser capaz de iterar con dos variables, es decir, recuperar pares de valores. El ejemplo clásico de este uso sería iterar los elementos de un diccionario (nos los devuelve la función ítems( ) ), donde recobraríamos la clave y el valor a la vez.

diccionario={"nombre":"Elena","apellidos":"García Hernández",
             "edad":27,"telefono":613454312}
for c , v in diccionario.items():
    print(f"clave: {c} -> valor {v}")

Que da como resultado:

clave: nombre -> valor Elena
clave: apellidos -> valor García Hernández
clave: edad -> valor 27
clave: telefono -> valor 613454312

Bucle while

La instrucción while también nos permite construir estructuras iterativas. En este caso, se ejecutan las instrucciones del bloque mientras se cumpla la condición del while. 

La sintaxis de esta instrucción es:

while condición: 
     operaciones mientras se cumple la condición

Ejemplo bucle while:

num = 5
while num>0:
    print("numero",num)
    num=num-1

Que arroja el resultado:

numero 5
numero 4
numero 3
numero 2
numero 1

Terminando el bucle

Es fundamental definir correctamente la condición del bucle while. Esta debe de dejar de cumplirse en algún momento de la ejecución del programa, de otra forma estaríamos corriendo un bucle infinito y el programa no terminaría nunca.

Ejemplo de bucle infinito:

num = 5
while num>0:
    print("numero",num)

Lo más inmediato es colocar en el bucle alguna instrucción que modifique la condición del bucle, asegurándonos de que se llegue a una situación en la que la condición será falsa y se saldrá del bucle.

También podemos dar la opción al usuario de que termine el bucle. Para ello será necesario que este introduzca un dato durante cada interacción. Cuando este dato coincida con el mensaje para salir, terminaríamos el bucle.

Ejemplo: siendo el mensaje para salir igual a “salir”

nombre=""
while nombre!="salir":
    nombre=input("introduce un nombre\n")
    if (nombre!="salir"):
        print("Hola ",nombre)

También se puede emplear una variable booleana para terminar un bucle, lo que se denomina una bandera:

terminar=False
while not terminar:
    nombre=input("introduce un nombre\n")
    if (nombre=="salir"):
        terminar=True
    else:
        print("Hola ",nombre)

Y también podríamos introducir la bandera en el sentido contrario, haciendo que mientras fuera verdadera el bucle estuviera funcionando:

trabajando=True
while trabajando:
    nombre=input("introduce un nombre\n")
    if (nombre=="salir"):
        trabajando=False
    else:
        print("Hola ",nombre)

Sentencias continue y break

Dentro de una estructura iterativa existen algunas sentencias útiles para su manejo:

  • continue: pasa a la siguiente iteración del bucle sin completar las instrucciones restantes del bloque de código del bucle
print("Saludos por la mañana")
nombres=["Pepe","Maria","Ana","Lucrecia","Juan"]
print("excluye a alguien de los saludos")
excluido=input("introduce el nombre de la persona a quien no vas a saludar\n")
for persona in nombres:
    if persona==excluido:
        continue
    else:
        print("Buenos días, ",persona)
  • break: termina el bucle sin completar las iteraciones restantes
while True:
    nombre=input("introduce un nombre\n")
    if (nombre=="salir"):
        break
    else:
        print("Hola ",nombre)

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Ejercicios con diccionarios en python

En este caso, os dejo una propuesta de ejercicios con diccionarios para practicar lo explicado cuando hablamos de diccionarios.

Ejercicio 1: Frecuencia de palabras en un texto

Escribe un programa que cuente la frecuencia de cada palabra en un texto ingresado por el usuario.

Una posible solución sería:

def contar_frecuencia_palabras(texto):
    # Convertir el texto a minúsculas y dividirlo en palabras
    palabras = texto.lower().split()
    # Crear un diccionario para almacenar la frecuencia de cada palabra
    frecuencia_palabras = {}
    # Contar la frecuencia de cada palabra
    for palabra in palabras:
        if palabra in frecuencia_palabras:
            frecuencia_palabras[palabra] += 1
        else:
            frecuencia_palabras[palabra] = 1
    return frecuencia_palabras

# Solicitar al usuario que ingrese el texto
texto_usuario = input("Introduce un texto: ")
# Contar la frecuencia de cada palabra en el texto
frecuencia = contar_frecuencia_palabras(texto_usuario)
# Imprimir el resultado
print("Frecuencia de palabras:")
for palabra, frecuencia in frecuencia.items():
    print(palabra + ":", frecuencia)

Ejercicio 2: Búsqueda de nombres y teléfonos en un diccionario

Escribe un programa que tenga un diccionario de contactos hardcodeado (no hay que pedir al usuario que introduzca los datos, sino que los escribimos directamente en el código). Las claves del diccionario son nombres de personas y los valores son sus números de teléfono.

El programa da la opción al usuario de introducir un texto de búsqueda y realiza la búsqueda para ese texto tanto en los nombres como en los números de teléfono. Si se encuentra una coincidencia por nombre, el programa devuelve por pantalla el número de teléfono asociado. Si se encuentra una coincidencia por teléfono, el programa devuelve por pantalla el nombre del usuario. Si no se encuentra ninguna coincidencia se indica por pantalla.

El programa continúa ofreciendo una búsqueda al usuario hasta que este introduce la palabra “salir”.

Una solución sería:

# Diccionario de contactos hardcodeado
contactos = {
    "Juan": "123456789",
    "María": "987654321",
    "Pedro": "654987321",
    "Ana": "789123456",
    "Luisa": "456321987"
}
# Bucle para realizar búsquedas
while True:
    # Solicitar al usuario que introduzca una búsqueda
    busqueda = input("Introduce un nombre o un número de teléfono (o 'salir' para finalizar): ")
    # Comprobar si el usuario desea salir del programa
    if busqueda.lower() == "salir":
        break
    # Buscar por nombre
    if busqueda in contactos:
        print("El número de teléfono de", busqueda, "es:", contactos[busqueda])
    # Buscar por número de teléfono
    elif busqueda in contactos.values():
        nombre = [nombre for nombre, telefono in contactos.items() if telefono == busqueda][0]
        print("El nombre de la persona con el número de teléfono", busqueda, "es:", nombre)
    else:
        print("No se encontró ninguna coincidencia.")

Ejercicio 3: Creamos Diccionario y realizamos operaciones

Crear el siguiente diccionario:

clientes = [{'id_cliente':100, 'edad': 28, 'productos':['P1', 'P2']},
                {'id_cliente':101, 'edad': 33, 'productos':['P3']},
                {'id_cliente':102, 'edad': 37, 'productos':['P1', 'P2', 'P5']},
                {'id_cliente':103, 'edad': 41, 'productos':['P3', 'P6']}
               ]

Con el diccionario hay que realizar las siguientes operaciones y mostrar el resultado de las mismas por pantalla:

  1. Obtener la edad del segundo cliente de la lista
  2. Crear un bucle que recorra todos los identificadores de cliente
  3. Crear un bucle que permita calcular la edad media de los clientes
  4. Crear una lista que guarde todos productos de los clientes
  5. Obtener los elementos únicos de la lista anterior
  6. Añadir dos campos adicionales a cada diccionario:
    • num_prod: número de productos de cada cliente
    • tipo_cliente: vale ‘S’ si el cliente tiene 2 o más productos, ‘N’ en caso contrario
  7. Realizar un cálculo a elegir por el alumno sobre el campo ‘num_prod’. (sumatorios, valores medios, etc…)

Solución:

# Diccionario inicial de clientes
clientes = [
    {'id_cliente': 100, 'edad': 28, 'productos': ['P1', 'P2']},
    {'id_cliente': 101, 'edad': 33, 'productos': ['P3']},
    {'id_cliente': 102, 'edad': 37, 'productos': ['P1', 'P2', 'P5']},
    {'id_cliente': 103, 'edad': 41, 'productos': ['P3', 'P6']}
]
# 1. 
print("1.-Obtener la edad del segundo cliente de la lista")
print("---------------------------------------------------")
edad_segundo_cliente = clientes[1]['edad']
print(f"Edad del segundo cliente: {edad_segundo_cliente}")
# 2. 
print("\n2.-Crear un bucle que recorra todos los identificadores de cliente")
print("---------------------------------------------------")
print("Identificadores de los clientes:")
for cliente in clientes:
    print(cliente['id_cliente'])
# 3. 
print("\n3.-Crear un bucle que permita calcular la edad media de los clientes")
print("---------------------------------------------------")
total_edad = 0
for cliente in clientes:
    total_edad += cliente['edad']
edad_media = total_edad / len(clientes)
print(f"Edad media de los clientes: {edad_media:.2f}")
# 4. 
print("\n4.-Crear una lista que guarde todos los productos de los clientes")
print("---------------------------------------------------")
productos = []
for cliente in clientes:
    productos.extend(cliente['productos'])
print(f"Lista de productos de todos los clientes: {productos}")
# 5. 
print("\n5.-Obtener los elementos únicos de la lista de productos")
print("---------------------------------------------------")
productos_unicos = list(set(productos))
print(f"\nProductos únicos: {productos_unicos}")
# 6. 
print("\n6.-Añadir dos campos adicionales a cada diccionario: 'num_prod' y 'tipo_cliente'")
print("---------------------------------------------------")
for cliente in clientes:
    cliente['num_prod'] = len(cliente['productos'])  # Número de productos
    cliente['tipo_cliente'] = 'S' if cliente['num_prod'] >= 2 else 'N'  # Tipo de cliente
print("Clientes con los nuevos campos 'num_prod' y 'tipo_cliente':")
for cliente in clientes:
    print(cliente)
# 7. 
print("\n7.-Suma total de productos de todos los clientes")
print("---------------------------------------------------")
total_productos = 0
for cliente in clientes:
    total_productos += cliente['num_prod']

print(f"Suma total de productos entre todos los clientes: {total_productos}")

Ejercicio 4: Cálculo del beneficio del mes

Trabajas en el departamento financiero y tienes que calcular el beneficio del mes a partir de los datos de las ventas y los gastos. Obviamente, el beneficio será la resta del total de ventas menos el total de gastos.

La información de ventas y gastos se te proporciona en dos diccionarios de idéntica estructura. Una clave que indica el producto y un valor que es otro diccionario que contiene las claves cantidad y precio unitario (los valores de estas claves son el numero de unidades del producto y el precio unitario del producto, respectivamente).

Ambos diccionarios están hardcodeados. Un ejemplo de los mismos sería:

ventas = {"Producto A": {"cantidad": 10, "precio_unitario": 20},
          "Producto B": {"cantidad": 5, "precio_unitario": 15},
          "Producto C": {"cantidad": 8, "precio_unitario": 25}}
gastos = {"Producto A": {"cantidad": 5, "precio_unitario": 15},
          "Producto B": {"cantidad": 3, "precio_unitario": 10},
          "Producto D": {"cantidad": 2, "precio_unitario": 30}}

El programa tiene que funcionar para cualquier modificación de los diccionarios.

Por ejemplo: para los diccionarios puestos de ejemplo en el ejercicio, el resultado sería:

Ventas = 10 x 20 + 5 x 15 + 8 x 25 = 475
Gastos = 5 x 15 + 3 x 10 + 2 x 30 =165
beneficio = 310

Una posible solución sería la siguiente:

# Diccionarios de ventas y gastos
ventas = {"Producto A": {"cantidad": 10, "precio_unitario": 20},
          "Producto B": {"cantidad": 5, "precio_unitario": 15},
          "Producto C": {"cantidad": 8, "precio_unitario": 25}}
gastos = {"Producto A": {"cantidad": 5, "precio_unitario": 15},
          "Producto B": {"cantidad": 3, "precio_unitario": 10},
          "Producto D": {"cantidad": 2, "precio_unitario": 30}}
# Calcular el total de ventas
total_ventas = sum(producto["cantidad"] * producto["precio_unitario"] for producto in ventas.values())
# Calcular el total de gastos
total_gastos = sum(producto["cantidad"] * producto["precio_unitario"] for producto in gastos.values())
# Calcular el beneficio
beneficio = total_ventas - total_gastos
# Presentar por pantalla los resultados
print("Ventas =", total_ventas)
print("Gastos =", total_gastos)
print("Beneficio =", beneficio)

Ejercicio 5: Cargar productos a la cesta de la compra

Realiza un programa que vaya añadiendo a la cesta de la compra los productos que el usuario vaya comprando.

El programa pide al usuario que introduzca su presupuesto y a continuación le permite realizar sus pedidos. Para cada pedido tiene que introducir el nombre del producto y las unidades que quiere comprar. Se termina de realizar pedidos cuando el usuario introduzca en producto la palabra: “salir”.

Los productos que puede comprar el usuario son los del siguiente diccionario que tienes que copiar en tu código: 

Productos={“Lampara”:7, “Mesa”: 5, “Silla”:4, “Papelera”:2}

La clave es el nombre del producto y el valor es el precio de una unidad de producto.

Si se excede el presupuesto, no se permite realizar la compra y se indica que con dicha compra el usuario excede su presupuesto.

Al final, el programa presenta por pantalla el listado de los productos en la cesta de la compra y el total del coste.

Solución:

# Diccionario de productos con sus precios
productos = {"Lampara": 7, "Mesa": 5, "Silla": 4, "Papelera": 2}
# Solicitar al usuario que introduzca su presupuesto
presupuesto = float(input("Introduce tu presupuesto: "))
total_coste = 0
cesta_de_compra = {}
# Bucle para realizar pedidos
while True:
    # Solicitar al usuario que introduzca el nombre del producto
    nombre_producto = input("Introduce el nombre del producto (o 'salir' para finalizar): ")
    # Comprobar si el usuario desea salir del programa
    if nombre_producto.lower() == "salir":
        break  
    # Verificar si el producto está en la lista
    if nombre_producto in productos:
        # Solicitar al usuario que introduzca las unidades del producto
        unidades = int(input(f"Introduce las unidades de '{nombre_producto}': ")) 
        # Calcular el coste del producto
        coste_producto = productos[nombre_producto] * unidades   
        # Comprobar si el coste del producto excede el presupuesto
        if total_coste + coste_producto > presupuesto:
            print("Con esta compra excedes tu presupuesto.")
        else:
            # Agregar el producto a la cesta de compra
            cesta_de_compra[nombre_producto] = unidades
            total_coste += coste_producto
    else:
        print("Producto no disponible.")
# Imprimir la cesta de la compra y el total del coste
print("\nCesta de la compra:")
for producto, unidades in cesta_de_compra.items():
    print(f"{producto}: {unidades} unidades")
print("Total del coste:", total_coste)

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.