Saltar al contenido
Editor

Formato de cadenas en Python: f-strings, format() y operador %

Principiante20 min5 ejercicios75 XP

Esta lección es una traducción del original en inglés.Read in EnglishAvisar de un error de traducción

0/5 ejercicios

Imagina que estás haciendo el recibo de una cafetería. Tienes que combinar el nombre de un producto, un precio y una cantidad en una sola línea limpia. Podrías pegar cadenas con +, pero enseguida se vuelve un lío.

Dar formato a una cadena es como rellenar una plantilla con huecos. Escribes la estructura de la frase una vez y luego colocas los valores donde corresponde. Es más limpio, más rápido y mucho más fácil de leer.

Python te ofrece tres formas de dar formato a las cadenas: las f-strings, el método `.format()` y el operador `%`. En este tutorial aprenderás las tres y descubrirás cuándo usar cada una.

Por qué dar formato es mejor que concatenar

Cuando alguien que empieza combina variables con texto por primera vez, suele recurrir al operador +. Funciona, pero te obliga a convertir los números en cadenas a mano y a llenarlo todo de signos +.

Concatenación (desordenada)
name = "Latte"
price = 4.5
qty = 2
print("Item: " + name + " | Price: $" + str(price) + " | Qty: " + str(qty))
f-string (limpia)
name = "Latte"
price = 4.5
qty = 2
print(f"Item: {name} | Price: ${price} | Qty: {qty}")

Las dos líneas producen la misma salida. Pero la versión con f-string es más corta, se lee mejor y nunca tienes que llamar a str() tú mismo. Python hace la conversión de forma automática.

Cómo usar las f-strings en Python

Una f-string (literal de cadena con formato) empieza con la letra f antes de la comilla de apertura. Dentro de la cadena, pones variables o expresiones entre llaves {}.

Python evalúa lo que haya dentro de las llaves e inserta el resultado en la cadena. Las f-strings llegaron en Python 3.6 y hoy son la forma recomendada de dar formato a las cadenas.

Uso básico de las f-strings
name = "Alice"
age = 30
city = "Seattle"
print(f"My name is {name}.")
print(f"I am {age} years old.")
print(f"I live in {city}.")
Salida
My name is Alice.
I am 30 years old.
I live in Seattle.

La f antes de las comillas es lo que la hace especial. Sin ella, Python imprimiría el texto literal {name} en lugar del valor de la variable.

Qué pasa sin el prefijo f
# Without the f prefix - curly braces are printed literally
name = "Alice"
print("Hello, {name}!") # No f prefix
print(f"Hello, {name}!") # With f prefix
Salida
Hello, {name}!
Hello, Alice!

¿Qué expresiones puedes poner dentro de una f-string?

Las f-strings no se limitan a variables sueltas. Puedes poner cualquier expresión válida de Python entre las llaves: operaciones matemáticas, llamadas a funciones, llamadas a métodos e incluso condicionales.

Expresiones dentro de f-strings
# Math expressions
width = 10
height = 5
print(f"Area: {width * height} square units")
# Function calls
name = "python"
print(f"Uppercase: {name.upper()}")
# Conditional expressions
score = 85
print(f"Result: {'Pass' if score >= 60 else 'Fail'}")
Salida
Area: 50 square units
Uppercase: PYTHON
Result: Pass

Piensa en cada {} como en una pequeña calculadora. Python evalúa la expresión, convierte el resultado en cadena y lo coloca en su sitio.


Cómo dar formato a números en las f-strings de Python

Aquí es donde las f-strings brillan de verdad. Después del nombre de una variable, añades dos puntos : seguidos de un especificador de formato que controla el aspecto del número.

Decimales con .Nf

Usa :.Nf para mostrar exactamente N decimales. La f viene de "fixed-point" (notación de punto fijo). Es imprescindible para mostrar precios, medidas y puntuaciones.

Controlar los decimales
price = 4.5
pi = 3.14159265
print(f"Price: ${price:.2f}") # 2 decimal places
print(f"Pi: {pi:.4f}") # 4 decimal places
print(f"Rounded: {pi:.1f}") # 1 decimal place
Salida
Price: $4.50
Pi: 3.1416
Rounded: 3.1

Comas como separador de miles en números grandes

Usa :, para añadir comas como separador de miles en números grandes. Así, un número como 1000000 se lee de un vistazo.

Añadir separadores de miles
population = 8900000
salary = 75000.50
print(f"Population: {population:,}")
print(f"Salary: ${salary:,.2f}")
Salida
Population: 8,900,000
Salary: $75,000.50

Porcentajes con %

Usa :.N% para mostrar un número decimal como porcentaje. Python multiplica el valor por 100 y añade el signo % automáticamente.

Dar formato a porcentajes
completion = 0.756
tax_rate = 0.0825
print(f"Progress: {completion:.1%}") # 75.6%
print(f"Tax rate: {tax_rate:.2%}") # 8.25%
Salida
Progress: 75.6%
Tax rate: 8.25%

Relleno y alineación

Puedes fijar un ancho mínimo para un valor y elegir si se alinea a la izquierda, a la derecha o al centro. Es perfecto para crear salidas limpias y alineadas, como tablas.

Relleno y alineación
# Width and alignment
print(f"|{'Left':<15}|") # Left-aligned, 15 chars wide
print(f"|{'Center':^15}|") # Center-aligned
print(f"|{'Right':>15}|") # Right-aligned
# Numbers default to right-aligned
print(f"|{42:>10}|") # Right-aligned number
print(f"|{42:010}|") # Zero-padded to 10 digits
Salida
|Left           |
|    Center     |
|          Right|
|        42|
|0000000042|

Cómo usar el método .format()

Antes de que existieran las f-strings, los programadores de Python usaban el método .format(). Funciona poniendo marcadores {} vacíos en una cadena y llamando después a .format() con los valores que van en ellos.

Usar .format()
name = "Bob"
age = 25
# Positional arguments
print("Hello, {}! You are {} years old.".format(name, age))
# Numbered positions
print("Hello, {0}! You are {1} years old. Nice to meet you, {0}!".format(name, age))
# Named arguments
print("Hello, {n}! You are {a} years old.".format(n=name, a=age))
Salida
Hello, Bob! You are 25 years old.
Hello, Bob! You are 25 years old. Nice to meet you, Bob!
Hello, Bob! You are 25 years old.

El método .format() admite los mismos especificadores de formato que las f-strings. Todo lo que va después de los dos puntos funciona igual.

Formato de números con .format()
price = 19.99
print("Price: ${:.2f}".format(price))
print("Big number: {:,}".format(1000000))
Salida
Price: $19.99
Big number: 1,000,000

Las posiciones numeradas son útiles cuando necesitas repetir un valor varias veces en la misma cadena. Puedes hacer referencia al mismo índice tantas veces como quieras.


El operador % para dar formato a cadenas (estilo antiguo)

El operador % es la forma más antigua de dar formato a cadenas en Python. Viene de la función printf de C. Lo verás en código antiguo y conviene que lo reconozcas, pero no necesitas usarlo en código nuevo.

Formato con % al estilo antiguo
name = "Charlie"
age = 35
price = 9.99
print("Hello, %s! You are %d years old." % (name, age))
print("Price: $%.2f" % price)
Salida
Hello, Charlie! You are 35 years old.
Price: $9.99

%s significa "inserta aquí una cadena", %d significa "inserta un entero" y %f significa "inserta un float". Los valores van al final, después del operador %.


f-strings, format() o el operador %: ¿cuál deberías usar?

Los tres enfoques producen el mismo resultado. La diferencia está en la legibilidad y la comodidad. Aquí tienes la misma salida escrita de tres formas:

Tres formas de dar formato a la misma cadena
item = "Coffee"
price = 4.50
# f-string (Python 3.6+) - recommended
print(f"{item}: ${price:.2f}")
# .format() method (Python 2.6+)
print("{}: ${:.2f}".format(item, price))
# % operator (oldest style)
print("%s: $%.2f" % (item, price))
Salida
Coffee: $4.50
Coffee: $4.50
Coffee: $4.50

f-strings de varias líneas y casos reales

Para cadenas con formato más largas, puedes usar comillas triples con el prefijo f. Es útil para mensajes de varias líneas, informes y plantillas de correo.

f-string de varias líneas
name = "Alice"
order_id = 4821
total = 37.50
message = f"""Hi {name},
Your order #{order_id} has been confirmed.
Total: ${total:.2f}
Thank you for shopping with us!"""
print(message)
Salida
Hi Alice,

Your order #4821 has been confirmed.
Total: $37.50

Thank you for shopping with us!

Un ejemplo práctico: crear una tabla con formato. Los especificadores de alineación hacen que cada columna quede bien alineada.

Crear una tabla con formato
# Simple formatted table
products = [
("Laptop", 999.99, 1),
("Mouse", 29.50, 3),
("Keyboard", 74.00, 2),
]
print(f"{'Product':<12} {'Price':>8} {'Qty':>5} {'Total':>10}")
print("-" * 37)
for name, price, qty in products:
total = price * qty
print(f"{name:<12} {price:>8.2f} {qty:>5} {total:>10.2f}")
Salida
Product         Price   Qty      Total
-------------------------------------
Laptop         999.99     1     999.99
Mouse           29.50     3      88.50
Keyboard        74.00     2     148.00
El atajo = para depurar
# Debug trick (Python 3.8+)
x = 42
y = 17
print(f"{x=}")
print(f"{y=}")
print(f"{x + y=}")
Salida
x=42
y=17
x + y=59

Ejercicios de práctica

Da formato a una línea de recibo
Escribe el código

Crea las variables item con el valor "Cappuccino" y price con el valor 4.5. Después, usa una f-string para imprimir una línea de recibo exactamente con este formato:

Cappuccino .......... $4.50

El nombre del producto debe ir alineado a la izquierda y el precio debe mostrar exactamente 2 decimales. Usa la cadena " .......... $" entre el nombre y el precio.

# Create the variables and print the formatted receipt line
Da formato a un número grande con comas
Escribe el código

Crea una variable population con el valor 7900000000. Imprímela con una f-string que use comas como separador de miles para que la salida sea:

World population: 7,900,000,000
# Format the population with commas
Crea una fila de tabla con formato
Escribe el código

Crea tres variables: name = "Alice", score = 95.8 y grade = "A+". Imprime una fila de tabla con formato en la que:

  • El nombre esté alineado a la izquierda en un campo de 10 caracteres de ancho
  • La puntuación esté alineada a la derecha en un campo de 8 caracteres de ancho, con 1 decimal
  • La nota esté centrada en un campo de 6 caracteres de ancho
  • Salida esperada (los caracteres | forman parte de la salida):

    | Alice      |     95.8 |   A+  |
    # Create the variables and print the formatted table row
    Corrige la f-string rota
    Corrige el error

    El código de abajo debería imprimir "Hello, Sam! You scored 92.5%.", pero tiene errores. Encuéntralos y corrígelos.

    Hay 2 errores que corregir.

    name = "Sam"
    score = 0.925
    print("Hello, {name}! You scored {score:.1%}.")
    Genera un saludo personalizado para un correo
    Escribe el código

    Crea estas variables:

  • first_name = "Jordan"
  • items = 3
  • total = 89.95
  • Después, usa una f-string de varias líneas (con comillas triples) para imprimir exactamente este mensaje:

    Hi Jordan,
    
    Thank you for your purchase of 3 items.
    Your total is $89.95.
    
    Have a great day!

    Asegúrate de que el total muestre exactamente 2 decimales.

    # Create the variables and print the email greeting

    Tutoriales relacionados

    ¿Te sirvió este tutorial?

    Sugerir una mejora