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, <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í.

Diccionarios en Python

Última actualización: Noviembre 2024

Los diccionarios en Python son fundamentales porque nos permiten almacenar y gestionar datos de manera eficiente mediante pares clave-valor. A diferencia de las listas, que están indexadas por posición, los diccionarios permiten acceder a los datos de manera directa utilizando claves descriptivas, lo que mejora la legibilidad y el mantenimiento del código. Además, tienen una correspondencia directa con el formato json que usaremos habitualmente.

Los diccionarios se representan entre llaves { } , almacenando las parejas clave-valor separadas por comas. Para definir cada pareja, primero se indica la clave entre comillas (simples o dobles), seguida de dos puntos y el valor que se asocia a la clave.

diccionario={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
print(type(diccionario))

Si ejecutamos el programa comprobamos que nuestra colección es del tipo diccionario:

&lt;class 'dict'>

Los valores del diccionario pueden ser diferentes tipos de objetos (cadenas, números, colecciones..).

Acceder a los valores de un diccionario

Los corchetes sirven para acceder a un valor del diccionario mediante la clave.

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
nombre=cliente_1["nombre"]
print(nombre)

Resultado:

Juan

Modificar valores de un diccionario

Los diccionarios son mutables y puedo modificar el valor de una clave, accediendo a través de la citada clave:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
cliente_1["nombre"]="Antonio"
nombre=cliente_1["nombre"]
print(nombre)

Resultado:

Antonio

Añadir elementos a un diccionario

En un diccionario ya existente podemos añadir un nuevo elemento (“clave”:valor), sencillamente dándole un valor a la nueva clave

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
cliente_1["tfno"]=620185477
print(cliente_1)

Resultado:

{'id_Cliente': 1, 'nombre': 'Juan', 'Apelllidos': 'Garcia Perez', 'eda': 37, 'dirección': 'Calle Rue del Percebe, nº4', 'tfno': 620185477}

Para cambiar un valor de un diccionario y para añadir un par “clave”:valor, la sintaxis es prácticamente la misma. Únicamente se añade el par si la clave no existe.

Podemos empezar con un diccionario vacío e ir añadiendo elementos. Para definir un diccionario vacío no incluimos ningún elemento: diccionario={ }

cliente_2={}
cliente_2["id_Cliente"]=2
cliente_2["nombre"]="Veronica"
cliente_2["apellidos"]="Martinez Pelaez"
print(cliente_2)

Resultado:

{'id_Cliente': 2, 'nombre': 'Veronica', 'apellidos': 'Martinez Pelaez'}

Eliminar elementos de un diccionario

Podemos eliminar una pareja “clave”:valor con la instrucción del. Indicando la clave

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
del cliente_1["dirección"]
print(cliente_1)

Resultado:

{'id_Cliente': 1, 'nombre': 'Juan', 'Apelllidos': 'Garcia Perez', 'eda': 37}

Recorrer diccionarios

Podemos recorrer los diccionarios de distintas maneras, empleando las claves, los valores o los elementos.

  • keys( ): método empleado para recorrer el diccionario empleando las claves
cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
for clave in cliente_1.keys():
    print(f"para la clave: {clave}, tenemos el valor: {cliente_1[clave]}")

Resultado:

para la clave: id_Cliente, tenemos el valor: 1
para la clave: nombre, tenemos el valor: Juan
para la clave: Apelllidos, tenemos el valor: Garcia Perez
para la clave: eda, tenemos el valor: 37
para la clave: dirección, tenemos el valor: Calle Rue del Percebe, nº4
para la clave: tfno, tenemos el valor: 620185477
  • values( ): método empleado para recorrer el diccionario por los valores
cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
for valor in cliente_1.values():
    print(f"el valor es: {valor}")

Resultado:

el valor es: 1
el valor es: Juan
el valor es: Garcia Perez
el valor es: 37
el valor es: Calle Rue del Percebe, nº4
el valor es: 620185477

items( ): con este método, podemos recorrer el diccionario elemento a elemento, recuperando la clave y el valor

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
for clave,valor in cliente_1.items():
    print(f"para la clave: {clave}, tenemos el valor: {valor}")

Resultado:

para la clave: id_Cliente, tenemos el valor: 1
para la clave: nombre, tenemos el valor: Juan
para la clave: Apelllidos, tenemos el valor: Garcia Perez
para la clave: eda, tenemos el valor: 37
para la clave: dirección, tenemos el valor: Calle Rue del Percebe, nº4
para la clave: tfno, tenemos el valor: 620185477

Métodos asociados a los diccionarios

Los diccionarios tienen métodos asociados. En este apartado veremos algunos ejemplos de los más empleado:

  • get( ): Tiene dos argumentos: el primero obligatorio y el segundo opcional. El primero es la clave y el segundo el valor que se devuelve en el caso de que no exista la clave.

Si intentamos acceder a un elemento del diccionario a través de una clave que no existe, obtendremos un error:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
telefono=cliente_1["telefono"]

Resultado:

    telefono=cliente_1["telefono"]
KeyError: 'telefono'

Podemos emplear la función get(), y en el caso de que no exista la clave evitamos que se produzca un error. En el caso de que no empleáramos el segundo argumento opcional:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
telefono=cliente_1.get("telefono")
print(telefono)

Resultado:

None

Y empleando el segundo argumento, obtendríamos ese argumento como valor cuando no exista la clave:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
telefono=cliente_1.get("telefono","Clave no encontrada")
print(telefono)

Resultado:

Clave no encontrada
  • pop( ): Elimina la clave del diccionario pero devuelve el valor
cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
telefono=cliente_1.pop("tfno")
print(telefono)
print(cliente_1)

Resultado:

620185477
{'id_Cliente': 1, 'nombre': 'Juan', 'Apelllidos': 'Garcia Perez', 'eda': 37, 'dirección': 'Calle Rue del Percebe, nº4'}
  • keys( ): Recupera las claves del diccionario en una colección:
  • values( ): Recupera las claves del diccionario en una colección:
  • items( ): Recupera las claves y valores del diccionario en una colección:
cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","edad":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
print("---------------------------------CLAVES-------------------------")
claves=cliente_1.keys()
print(type(claves))
print(claves)
print("---------------------------------VALORES-----------------------")
valores=cliente_1.values()
print(type(valores))
print(valores)
print("-------------------------------ELEMENTOS--------------------------")
elementos=cliente_1.items()
print(type(elementos))
print(elementos)

Resultado:

---------------------------------CLAVES-------------------------
&lt;class 'dict_keys'>
dict_keys(['id_Cliente', 'nombre', 'Apelllidos', 'edad', 'dirección', 'tfno'])
---------------------------------VALORES-----------------------
&lt;class 'dict_values'>
dict_values([1, 'Juan', 'Garcia Perez', 37, 'Calle Rue del Percebe, nº4', 620185477])
-------------------------------ELEMENTOS--------------------------
&lt;class 'dict_items'>
dict_items([('id_Cliente', 1), ('nombre', 'Juan'), ('Apelllidos', 'Garcia Perez'), ('edad', 37), ('dirección', 'Calle Rue del Percebe, nº4'), ('tfno', 620185477)])

Anidación de diccionarios

Podemos incluir diccionarios en diccionarios, o lo que es lo mismo, un diccionario puede ser un elemento de otro diccionario. En el ejemplo de diccionario de cliente que vengo usando podríamos agrupar nombre y apellidos en un diccionario, ya que normalmente usaremos sus valores juntos. Además, también tendría sentido usar un diccionario para los distintos medios de contacto que tenemos con el cliente.

cliente_1={"id_Cliente":1,
           "nomCompleto":{"nombre":"Juan","Apelllidos":"Garcia Perez"},
           "edad":37,"dirección":"Calle Rue del Percebe, nº4",
           "contactos":{'tfno': 620185477,"email":"juangarpe@gmail.com"}}
for clave,valor in cliente_1.items():
    print(f"para la clave: {clave}, tenemos el valor: {valor}")

Resultado:

para la clave: id_Cliente, tenemos el valor: 1
para la clave: nomCompleto, tenemos el valor: {'nombre': 'Juan', 'Apelllidos': 'Garcia Perez'}
para la clave: edad, tenemos el valor: 37
para la clave: dirección, tenemos el valor: Calle Rue del Percebe, nº4
para la clave: contactos, tenemos el valor: {'tfno': 620185477, 'email': 'juangarpe@gmail.com'}

Combinación de diccionarios con colecciones

La combinación de los diferentes tipos de variables permite generar diferentes tipos de estructuras de datos. Por ejemplo, listas de diccionarios:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
           "edad":37,"dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
cliente_2={"id_Cliente":2,"nombre":"Pedro","Apelllidos":"Rodriguez Martinez",
           "edad":27,"dirección":"Avenida de Europa, nº4",'tfno': 610281473}
cliente_3={"id_Cliente":3,"nombre":"Fabiola","Apelllidos":"Ruiz Suarez",
           "edad":22,"dirección":"Via ancha es Castilla, nº7",'tfno': 720136189}
lista_clientes=[cliente_1,cliente_2,cliente_3]
for cliente in lista_clientes:
    print(cliente)       

Resultado:

{'id_Cliente': 1, 'nombre': 'Juan', 'Apelllidos': 'Garcia Perez', 'edad': 37, 'dirección': 'Calle Rue del Percebe, nº4', 'tfno': 620185477}
{'id_Cliente': 2, 'nombre': 'Pedro', 'Apelllidos': 'Rodriguez Martinez', 'edad': 27, 'dirección': 'Avenida de Europa, nº4', 'tfno': 610281473}
{'id_Cliente': 3, 'nombre': 'Fabiola', 'Apelllidos': 'Ruiz Suarez', 'edad': 22, 'dirección': 'Via ancha es Castilla, nº7', 'tfno': 720136189}

En estructuras como la anterior, accedemos de forma jerárquica a los elementos. Es decir, primero indicaríamos el elemento de la lista por su índice y luego el elemento del diccionario por su clave

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
           "edad":37,"dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
cliente_2={"id_Cliente":2,"nombre":"Pedro","Apelllidos":"Rodriguez Martinez",
           "edad":27,"dirección":"Avenida de Europa, nº4",'tfno': 610281473}
cliente_3={"id_Cliente":3,"nombre":"Fabiola","Apelllidos":"Ruiz Suarez",
           "edad":22,"dirección":"Via ancha es Castilla, nº7",'tfno': 720136189}
lista_clientes=[cliente_1,cliente_2,cliente_3]
nombre_client_2=lista_clientes[1]["nombre"]    
print(nombre_client_2)

Resultado:

Pedro

Conversión de tipos

Para realizar conversiones de tipos entre colecciones, usamos el mismo procedimiento que con las variables simples. Empleamos funciones de nombre igual al tipo al que queremos convertir. Por ejemplo, para convertir a lista, emplearemos la función list( ).

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","edad":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
coleccion=cliente_1.keys()
print(type(coleccion))
print(coleccion)
colec=list(cliente_1.keys())
print(type(colec))
print(colec)

Resultado:

&lt;class 'dict_keys'>
dict_keys(['id_Cliente', 'nombre', 'Apelllidos', 'edad', 'dirección', 'tfno'])
&lt;class 'list'>
['id_Cliente', 'nombre', 'Apelllidos', 'edad', 'dirección', 'tfno']

NOTA:

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