Autor: Luis Fernando Apáez Álvarez
-Curso PyM-
Tarea 4: Formatos y Plantillas
Fecha de Entrega: 13 de Agosto del 2022
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)
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
# 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
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:
# 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:
# 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
Así, podemos escribir el mismo mensaje personalizado donde utilizamos el f string
, pero ahora utilizaremos el método format()
:
# 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
# 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:
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:
# 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(_ _ _ )
# Escribe el mismo mensaje que el dado en la celda de
# codigo anterior, pero utiliza un f string
print(_ _ _ )
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
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:
msj3 = "Hola {Nombre}, bienvenido. Tienes {Edad} años"
Luego, para la implementación del format()
escribimos
# 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
# Nombre del libro
nombre_libro = input("Nombre del libro: ")
# Precio
precio_libro = _ _ _
# Codigo
codigo_libro = int(input("Código: "))
# En ultima_edicion debera ingresar True o False
# la funcion eval() convierte cadenas a booleanos
ultima_edicion = eval(input("Ingresa True o False si es (o no) la última edición "))
Crearemos un mensaje dependiendo de si el libro es última edición o no, para ello
# 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 + _ _ _
format()
:# 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:
# 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, _ _ _ _))
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
# 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
# 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:
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:
# 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.
# ESCRIBE TU CODIGO AQUI:
# .
# .
# .
# .
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
# 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:
print(len("Estos son 33 espacios disponibles"))
33
De tal manera, podemos mostrar algo como
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
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
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
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()
:
# 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:
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:
# 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
# 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
# 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
# probamos la funcion
print(mensaje_format3("Luis Fernado", 24))
|********** Hola Luis Fernado, tienes 24 años **********|
# 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 **********|