Curso de introducción a la programación con Python¶

    Autor: Luis Fernando Apáez Álvarez
    -Curso PyM-
    Tarea 4: Formatos y Plantillas
    Fecha de Entrega: 13 de Agosto del 2022
    Solución

Contenido¶

  • Formatos
  • Plantillas
  • Adicionalmente

Descripción: En esta tarea abordaremos algunos temas adicionales sobre el manejo de las cadenas de texto, en particular, veremos el manejo de formatos y plantillas.

(Tiempo estimado: 60 minutos)




Formatos ¶

Python posee un sofisticado sistema de formato para las cadenas de texto, el cual nos permite tener variabilidad en los mensajes o impresiones que mostremos. Inicialmente, podemos considerar el siguiente programa para mostrar un mensaje personalizado utilizando un f string

In [2]:
# Pedimos al usuario que ingrese su nombre
nombre = input("¿Cuál es su nombre?: ")

# Creamos el mensaje
msj = "cómo estás"

# Mostramos el saludo personalizado
print(f"Hola {nombre}, {msj}")
¿Cuál es su nombre?: Luis Fernando
Hola Luis Fernando, cómo estás

Ahora bien, podemos tomar la idea del código anterior he implementar de nuevo el mismo mensaje personalizado, pero ahora utilizaremos el método format(). Para ello comenzaremos creando una cadena de texto

In [3]:
msj = "Hola {}"
print(msj)
Hola {}

Las llaves colocadas en la cadena msj siguen la misma idea que las llaves en los f strings, esto es, intuitivamente, dentro de dichas llaves podemos colocar variables o código ejecutable, así como vimos en la primer celda de código donde utilizamos el f string. Ahora, para el caso de los formatos, no colocaremos de manera directa un valor dentro de dichas llaves, es decir, para este caso la cadena msj se quedará así: "Hola {}". Lo que haremos en su lugar para asignar un valor que vaya en vez de dichas llaves, será utilizando el método format() sobre dicha cadena. Luego, como parámetro de este método colocamos lo que queremos que vaya en vez de dichas llaves:

In [4]:
# Considerando Hola {}, en vez de dichas llaves
# colocaremos la cadena "Luis Fernando"
print(msj.format("Luis Fernando"))
Hola Luis Fernando

Vemos que las llaves de "Hola {}" han sido sustituidas por la cadena "Luis Fernado". Otro ejemplo:

In [5]:
# Considerando Hola {}, en vez de dichas llaves
# colocaremos el resultado de calcular 2 * 4
print(msj.format(2 * 4))
Hola 8

De tal manera, básicamente tenemos

Capturas1.PNG

Así, podemos escribir el mismo mensaje personalizado donde utilizamos el f string, pero ahora utilizaremos el método format():

In [6]:
# Pedimos al usuario que ingrese su nombre
nombre = input("¿Cuál es su nombre?: ")

# Creamos el mensaje
msj = "Hola {} cómo estás"

# Mostramos el saludo personalizado
# En vez de las llaves de la cadena anterior, 
# colocaremos el nombre que el usuario ingreso
print(msj.format(nombre))
¿Cuál es su nombre?: Luis
Hola Luis cómo estás

Con lo cual obtenemos el mismo resultado. Luego, no nos limitamos el el número de parámetros que puede recibir el método format, es decir, podemos colocar por ejemplo

In [9]:
# En este caso colocaremos dos llaves
msj2 = "Hola {}, bienvenido. Tienes {} años"

así, el método format() recibirá ahora dos parámetros, donde el valor del primer parámetro sustituirá a las primeras llaves y el valor del segundo parámetro sustituirá a las segundas llaves, esto es:

In [10]:
print(msj2.format("Luis", 24))
Hola Luis, bienvenido. Tienes 24 años

Y así sucesivamente, podemos agregar más llaves a la cadena, y por ende agregaremos más valores a los parámetros del método format().

Ejercicio 1: Completa:

In [1]:
# Utiliza el concepto de f string para mostrar
# el mismo mensaje que se mostro en la anterior celda de codigo,
# donde el nombre y la edad deben ser ingresados por el
# usuario
nombre = input("¿Cuál es tu nombre?: ")
edad = int(input("¿Cuál es tu edad?: "))

# Escribe el mismo mensaje que el dado en la celda de 
# codigo anterior, pero utiliza un f string
print(f"Hola {nombre}, bienvenido. Tienes {edad} años")
¿Cuál es tu nombre?: Luis
¿Cuál es tu edad?: 24
Hola Luis, bienvenido. Tienes 24 años

Luego, es natural ver que las llaves que colocamos en las cadenas para utilizar el método format() son un tanto ambiguas. Pues, por ejemplo, también podemos escribir

In [11]:
msj2 = "Hola {}, bienvenido. Tienes {} años"
print(msj2.format(24, "Luis"))
Hola 24, bienvenido. Tienes Luis años

Dado que, explícitamente, no estamos indicando que las primeras llaves deben ser para colocar algún nombre y que las segundas deben ser para colocar un número referente a la edad

De tal manera, requerimos mayor precisión o realizar mejores especificaciones. Por ejemplo, de


msj2 = "Hola {}, bienvenido. Tienes {} años"

nos gustaría especificar que las primeras llaves corresponderán a un nombre y que las segundas corresponderán a la edad. Para ello, podemos colocar una etiqueta (sin comillas) dentro de las llaves, la cual servirá para indicarnos el tipo de información que debemos ingresar en dichas llaves, por ejemplo:

In [12]:
msj3 = "Hola {Nombre}, bienvenido. Tienes {Edad} años"

Luego, para la implementación del format() escribimos

In [15]:
# Recordemos que:
# Primeras llaves --> Nombre
# Segundas llaves --> Edad

# Por ello:
# Primer parametro del format corresponde a Nombre
# Segundo parametro del format corresponde a Edad
print(msj3.format(Nombre = "Luis", Edad = 24))
Hola Luis, bienvenido. Tienes 24 años

Lo cual es una manera más visual y especifica de la información que estamos ingresando en nuestra cadena msj3.

Ejercicio 2: Crearemos un formulario para generar un ticket de venta en una librería. Para ello

  1. El usuario en este caso será el cajero de la librería. Le pediremos al usuario que ingrese cierta información:
In [3]:
# Nombre del libro
nombre_libro = input("Nombre del libro: ")
# Precio
precio_libro = float(input("Precio del libro: "))
# Codigo
codigo_libro = int(input("Código: "))
# En ultima_edicion debera ingresar True o False
ultima_edicion = eval(input("Ingresa True o False si es (o no) la última edición "))
Nombre del libro: La Vuelta al Mundo en 80 Días
Precio del libro: 350.00
Código: 123
Ingresa True o False si es (o no) la última edición True

Crearemos un mensaje dependiendo de si el libro es última edición o no, para ello

In [4]:
# Variable auxiliar 
edicion = ""
# Caso en que codigo tiene asignado el valor de True
if ultima_edicion :
    edicion = "si es la última edición"
else:
    edicion = "no es la última edición" 
    
# Crearemos una variable total en la cual calcularemos
# el precio + el iva del 16%:
# Completa
total = precio_libro +  precio_libro * 0.16
  1. Mostraremos el ticket generado, para lo cual mostraremos un mensaje con la información que ingresó el usuario, donde utilizaremos el método format():
In [5]:
# Mensaje a mostrar:

# \ nos permite continuar escribiendo la cadena de texto
# en la siguiente linea de codigo
# \n es un salto de linea pero a la hora de la impresion
# de la cadena
msj_ticket = "Nombre del libro: {Nombre}\nPrecio: {Precio}\n\
Código del libro {Codigo}\nÚltima edición: {Edicion}\n\
Total a pagar: {Total}"

print(msj_ticket)
Nombre del libro: {Nombre}
Precio: {Precio}
Código del libro {Codigo}
Última edición: {Edicion}
Total a pagar: {Total}

Procedemos a utilizar el método format() con la información que ingresó el usuario:

In [7]:
# Termina de escribir el siguiente codigo
# no olvides utilizar la variable edicion que generamos
# en el condicional.
print(msj_ticket.format(Nombre = nombre_libro, Precio = precio_libro,
                        Codigo = codigo_libro, Edicion = edicion,
                        Total = total))
Nombre del libro: La Vuelta al Mundo en 80 Días
Precio: 350.0
Código del libro 123
Última edición: si es la última edición
Total a pagar: 406.0

Plantillas ¶

Para crear una plantilla deberemos importar la librería string, de la cual utilizaremos el método Template() para crear nuestra plantilla. Así, comenzamos con

In [19]:
# importacion necesaria y le damos el alias de s
import string as s

La idea detrás de las plantillas es muy similar a la idea de los formatos. De esta manera, crearemos una cadena de texto que sirva como plantilla y en vez de escribir, por ejemplo "Hola {Nombre}", escribiremos "Hola $Nombre"

Luego, para crear la plantilla, en este caso debemos utilizar el método Template() como sigue

In [20]:
# Creamos una variable para almacenar la plantilla
plantilla1 = s.Template("Hola $Nombre")

Después, para utilizar dicha plantilla con valores en especifico, utilizaremos el método substitute() sobre la plantilla creada:

In [23]:
print(plantilla1.substitute(Nombre = "Luis"))
print("-" * 30)
print(plantilla1.substitute(Nombre = "Lola"))
print("-" * 30)
print(plantilla1.substitute(Nombre = "Mundo"))
Hola Luis
------------------------------
Hola Lola
------------------------------
Hola Mundo

Podemos agregar más valores a nuestras plantillas:

In [28]:
# Creamos una segunda plantilla
plantilla2 = s.Template("Hola $Nombre, de la ciudad $Ciudad, de edad $Edad años")

# Utilizamos dicha plantilla
print(plantilla2.substitute(Nombre = "Luis", Ciudad = "CDMX", Edad = 24))
print("-" * 60)
print(plantilla2.substitute(Nombre = "Lola", Ciudad = "CDMX", Edad = 84))
Hola Luis, de la ciudad CDMX, de edad 24 años
------------------------------------------------------------
Hola Lola, de la ciudad CDMX, de edad 84 años

Ejercicio 3: Considerando la plantilla que hicimos sobre un ticket de venta utilizando el método format(). Esta vez, lo que deberás hacer es generar el mismo ticket de venta pero ahora utilizarás el método Template() para crear la plantilla, y el método substitute() para crear un ticket en particular.

In [24]:
# ESCRIBE TU CODIGO AQUI:
import string as s

# Creamos la pantilla
plantilla1 = s.Template("Nombre del libro: $Nombre\nPrecio: $Precio\n\
Código del libro $Codigo\nÚltima edición: $Edicion\n\
Total a pagar: $Total")

# Informacion a ingresar, copiamos y pegamos
# el codigo que ya utilizamos antes.

nombre_libro = input("Nombre del libro: ")
precio_libro = float(input("Precio del libro: "))
codigo_libro = int(input("Código: "))
ultima_edicion = eval(input("Ingresa True o False si es (o no) la última edición "))

if ultima_edicion:
    edicion = "si es la última edición"
else:
    edicion = "no es la última edición" 

total = precio_libro +  precio_libro * 0.16

print("-" * 30)

# utilizamos el metodo substitute() para utilizar la plantilla
print(plantilla1.substitute(Nombre = nombre_libro, Precio = precio_libro,
                        Codigo = codigo_libro, Edicion = edicion,
                        Total = total))
Nombre del libro: Álgebra I
Precio del libro: 100.0
Código: 124
Ingresa True o False si es (o no) la última edición False
------------------------------
Nombre del libro: Álgebra I
Precio: 100.0
Código del libro 124
Última edición: no es la última edición
Total a pagar: 116.0

Adicionalmente ¶

Lo siguiente sólo representa un poco de teoría extra. Así, si llegaste hasta aquí significa que has acabado ya tu tarea.

Con el método format() podemos crear espacios disponibles para mostrar nuestras cadenas de texto, por ejemplo

In [44]:
# Para mostrar visualmente los espacios que se crean
# podemos colocar | al inicio y fin de los espacios
# creados
# Creamos en total 33 espacios disponibles entre los | |
# para lo cual utilizamos {:33}
print("|{:33}|".format("Hola Mundo"))
print("|{:33}|".format("  :D"))
print("|{:33}|".format(" "))
print("|{:33}|".format("Estos son 33 espacios disponibles"))

# en cambio, utilizamos -
print("-{:33}-".format("Hola Mundo"))

# en cambio, utilizamos *
print("*{:33}*".format("Hola Mundo"))

# o no utilizamos ningun caracter
print("{:33}".format("Hola Mundo"))
|Hola Mundo                       |
|  :D                             |
|                                 |
|Estos son 33 espacios disponibles|
-Hola Mundo                       -
*Hola Mundo                       *
Hola Mundo                       

Y podemos comprobar que, en efecto, se han creado los 33 espacios:

In [40]:
print(len("Estos son 33 espacios disponibles"))
Out[40]:
33

De tal manera, podemos mostrar algo como

In [50]:
nombre = input("Ingrese su nombre: ")
edad = int(input("Ingrese su edad: "))
msj = "Hola {Nombre}, tienes {Edad} años"

# Damos el formato y guardamos dicho mensaje en una
# variable denominada msj_format
msj_format = msj.format(Nombre = nombre, Edad = edad)

# Luego, a dicho mensaje le daremos un contorno
# utilizando | |
print("|{:50}|".format(msj_format))
Ingrese su nombre: Luis Fernado 
Ingrese su edad: 24
|Hola Luis Fernado , tienes 24 años                |

Dado que no podemos saber de manera directa el número de espacios generados, pues los nombres tienen distintas longitudes, entonces simplemente podemos utilizar {:} sin especificar un número de espacios a crear. El escribir dicha instrucción, en automático, se hará la adaptación de los espacios pertinentes. Por ejemplo

In [51]:
nombre = input("Ingrese su nombre: ")
edad = int(input("Ingrese su edad: "))
msj = "Hola {Nombre}, tienes {Edad} años"

msj_format = msj.format(Nombre = nombre, Edad = edad)

print("|{:}|".format(msj_format))
Ingrese su nombre: Luis Fernado
Ingrese su edad: 24
|Hola Luis Fernado, tienes 24 años|

O también, considerando por ejemplo

In [52]:
nombre = "Luis Fernado"
edad = 24
msj = "Hola {Nombre}, tienes {Edad} años"
msj_format = msj.format(Nombre = nombre, Edad = edad)

print("|{:50}|".format(msj_format))
|Hola Luis Fernado, tienes 24 años                 |

que nos sobran espacios hasta llegar al último |, podemos implementar una alineación de nuestro texto. Para ello ocuparemos:

  • ^: Alinea nuestro texto al centro.
  • <: Alinea nuestro texto a la izquierda.
  • >: Alinea nuestro texto a la derecha.

Así, logramos conseguir

In [59]:
nombre = "Luis Fernado"
edad = 24
msj = "Hola {Nombre}, tienes {Edad} años"
msj_format = msj.format(Nombre = nombre, Edad = edad)

# implementamos una alineacion al centro (^):
print("|{:^50}|".format(msj_format))

# implementamos una alineacion a la derecha (>):
print("|{:>50}|".format(msj_format))

# implementamos una alineacion a la izquierda (<):
print("|{:<50}|".format(msj_format))
|        Hola Luis Fernado, tienes 24 años         |
|                 Hola Luis Fernado, tienes 24 años|
|Hola Luis Fernado, tienes 24 años                 |

Por otro lado, podemos crear una función para recabar la información (nombre y edad) de un usuario y crear un mensaje con formato, como la variable msj_format. Y además, hacemos que esta función regrese dicho mensaje alineado al centro, para lo cual utilizaremos de nuevo format():

In [70]:
# Definimos la funcion para regresar la informacion
# que el usuario ingresa dandole un formato
# y alineandolo al centro:

def mensaje_format():
    # Informacion del usuario
    nombre = input("Ingrese su nombre: ")
    edad = int(input("Ingrese su edad: "))
    # Mensaje
    msj = "Hola {Nombre}, tienes {Edad} años"
    # Mensaje con formato
    msj_format = msj.format(Nombre = nombre, Edad = edad)
    # Mensaje con formato alineado al centro
    msj_format_alin = "|{:^50}|".format(msj_format)
    # Retornamos esta ultima cadena de texto
    return msj_format_alin

Probamos la función anterior:

In [71]:
print(mensaje_format())
Ingrese su nombre: Luis Fernando
Ingrese su edad: 24
|        Hola Luis Fernando, tienes 24 años        |

Podemos jugar con los formatos, por ejemplo, haremos que el mensaje que regresa la función sea vea como

|***** Hola Luis Fernando, tienes 24 años *****|

Para ello:

In [72]:
# Definimos la funcion para regresar la informacion
# que el usuario ingresa dandole un formato
# y alineandolo al centro y con algunas mas cosas

def mensaje_format2():
    # Informacion del usuario
    nombre = input("Ingrese su nombre: ")
    edad = int(input("Ingrese su edad: "))
    # Mensaje
    msj = "Hola {Nombre}, tienes {Edad} años"
    # Mensaje con formato
    msj_format = msj.format(Nombre = nombre, Edad = edad)
    # Mensaje con formato alineado al centro
    # quitamos el 50 para que los espacios se adapten
    # al tamagno del mensaje
    # agregamos los asteriscos
    msj_format_alin = "|{} {:^} {}|".format("*" * 10, msj_format, "*" * 10)
    # Retornamos esta ultima cadena de texto
    return msj_format_alin
In [73]:
# Probamos la funcion
print(mensaje_format2())
Ingrese su nombre: Luis Fernando
Ingrese su edad: 24
|********** Hola Luis Fernando, tienes 24 años **********|

De manera similar, podemos cambiar los input() de las variables, y a su vez utilizar parámetros en nuestra función

In [74]:
# Definimos la funcion para regresar la informacion
# que el usuario ingresa dandole un formato
# y alineandolo al centro y con algunas mas cosas
# ahora la funcion tiene dos parametros,
# el primero es para ingresar el nombre y el
# segundo es para ingresar la edad

# El resto del codigo permanecera igual
def mensaje_format3(nom, ed):
    # Informacion del usuario
    nombre = nom
    edad = ed
    # Mensaje
    msj = "Hola {Nombre}, tienes {Edad} años"
    # Mensaje con formato
    msj_format = msj.format(Nombre = nombre, Edad = edad)
    # Mensaje con formato alineado al centro
    # quitamos el 50 para que los espacios se adapten
    # al tamagno del mensaje
    # agregamos los asteriscos
    msj_format_alin = "|{} {:^} {}|".format("*" * 10, msj_format, "*" * 10)
    # Retornamos esta ultima cadena de texto
    return msj_format_alin
In [75]:
# probamos la funcion
print(mensaje_format3("Luis Fernado", 24))
|********** Hola Luis Fernado, tienes 24 años **********|
In [76]:
# o tambien
print(mensaje_format3("Luis Fernado", 24))
print(mensaje_format3("Carla", 17))
print(mensaje_format3("Lola", 84))
|********** Hola Luis Fernado, tienes 24 años **********|
|********** Hola Carla, tienes 17 años **********|
|********** Hola Lola, tienes 84 años **********|