Cadenas en Python
Contenido
Repaso rápido: Lo que ya sabemos de las cadenas
Recordemos lo que vimos en las clases anteriores:
- Creación: Se crean con comillas simples (
') o dobles (").python saludo = "Hola, mundo" despedida = 'Adiós' - Concatenación: Se pueden unir (concatenar) con el operador
+.python nombre = "Ana" mensaje = "Hola, " + nombre # Resultado: "Hola, Ana" - Repetición (*): Se pueden repetir usando el operador de multiplicación con un número entero.
risa = "ja" * 4 # Resultado: "jajajaja"
separador = "-" * 20 # Resultado: "--------------------"
print(separador)
- Entrada y Salida: Las usamos con
print()y siempre las obtenemos deinput(). - Longitud: Podemos saber cuántos caracteres tienen con la función
len().python print(len("Python")) # Muestra 6
Pero las cadenas son mucho más que eso. Vamos a ver todo lo que se puede hacer con ellas.
Las cadenas son secuencias: Indexación y Slicing
La característica más importante de una cadena es que es una secuencia ordenada de caracteres. Esto significa que cada carácter tiene una posición (un índice) y podemos acceder a él.
Indexación (acceder a un carácter)
En Python, los índices empiezan a contar desde cero (0).
Imagina la palabra "PYTHON" como una serie de cajas numeradas:
| P | Y | T | H | O | N |
|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 |
Para acceder a un carácter, usamos corchetes [] después de la variable.
palabra = "PYTHON"
print(palabra[0]) # Muestra 'P' (el primer carácter)
print(palabra[3]) # Muestra 'H'
Tip: Indexación negativa Python también permite contar desde el final usando números negativos. El
-1es el último carácter,-2el penúltimo, y así sucesivamente.
print(palabra[-1]) # Muestra 'N' (el último carácter)
print(palabra[-2]) # Muestra 'O'
Slicing (Extraer sub-cadenas)
El slicing (rebanado) nos permite extraer una porción de la cadena. La sintaxis es [inicio:fin].
inicio: El índice donde empieza la rebanada (incluido).fin: El índice donde termina la rebanada (no incluido).
palabra = "PYTHON"
print(palabra[0:3]) # Desde el índice 0 hasta el 3 (sin incluirlo). Muestra "PYT"
print(palabra[2:5]) # Desde el índice 2 hasta el 5 (sin incluirlo). Muestra "THO"
Atajos para el slicing:
- Si omites el
inicio, Python asume que es desde el principio (0). - Si omites el
fin, Python asume que es hasta el final.
print(palabra[:3]) # Desde el principio hasta el 3. Muestra "PYT"
print(palabra[3:]) # Desde el 3 hasta el final. Muestra "HON"
print(palabra[:]) # Muestra una copia de la cadena completa "PYTHON"
Inmutabilidad: Las cadenas no se pueden cambiar
Este es un concepto clave en Python. Una vez que creas una cadena, no puedes modificar sus caracteres. A esto se le llama inmutabilidad.
Si intentas cambiar un carácter directamente, obtendrás un error:
nombre = "Josu"
# nombre[0] = "j" # ¡Esto dará un TypeError!
¿Entonces cómo «modificamos» una cadena?
Creamos una nueva cadena a partir de la original.
nombre = "Josu"
nombre_minuscula = "j" + nombre[1:] # Concatenamos 'j' con la rebanada 'osu'
print(nombre_minuscula) # Muestra "josu"
print(nombre) # La original sigue intacta: "Josu"
La «caja de herramientas»: Métodos y operadores de String
Las cadenas tienen muchas «funciones» incorporadas llamadas métodos y operadores especiales que nos facilitan la vida.
Operador in: Comprobando pertenencia
A menudo, no necesitamos saber dónde está algo, sino simplemente si está o no. Para esto usamos el operador in, que devuelve un booleano (True o False). Es perfecto para usarlo en condicionales if.
Sintaxis: subcadena in cadena_principal
frase = "El veloz zorro marrón salta sobre el perro perezoso."
if "zorro" in frase:
print("¡Sí, la palabra 'zorro' está en la frase!")
if "gato" not in frase:
print("No, la palabra 'gato' no está en la frase.")
Importante: El operador
indistingue entre mayúsculas y minúsculas.
texto = "Hola Mundo"
print("mundo" in texto) # Muestra False, porque la 'M' es mayúscula.
# Solución: convertir todo a minúsculas para la comprobación.
print("mundo" in texto.lower()) # Muestra True
Cambio de mayúsculas y minúsculas
.upper(): Convierte toda la cadena a mayúsculas..lower(): Convierte toda la cadena a minúsculas..capitalize(): Pone en mayúscula solo el primer carácter..title(): Pone en mayúscula el primer carácter de cada palabra.
frase = "hola, bienvenido al MUNDO de python"
print(frase.upper()) # Muestra: "HOLA, BIENVENIDO AL MUNDO DE PYTHON"
print(frase.capitalize()) # Muestra: "Hola, bienvenido al mundo de python"
print(frase.title()) # Muestra: "Hola, Bienvenido Al Mundo De Python"
Búsqueda y reemplazo
.find('texto'): Busca'texto'dentro de la cadena y devuelve el índice de su primera aparición. Si no lo encuentra, devuelve-1..replace('viejo', 'nuevo'): Devuelve una nueva cadena reemplazando todas las apariciones de'viejo'por'nuevo'.
email = "alumno@ejemplo.com"
print(email.find('@')) # Muestra 6 (la posición de la arroba)
print(email.find('xyz')) # Muestra -1 (no lo encuentra)
frase_fea = "Python es aburrido."
frase_bonita = frase_fea.replace("aburrido", "divertido")
print(frase_bonita) # Muestra "Python es divertido."
Limpieza de espacios en blanco
.strip(): Elimina los espacios en blanco (o saltos de línea) al principio y al final de la cadena. Muy útil para limpiar la entrada del usuario.
usuario_input = " josu "
print(usuario_input.strip()) # Muestra "josu" (sin los espacios)
Formateo de cadenas, las f-strings
Hasta ahora, para combinar texto y variables, hemos usado +:
nombre = "Carla"
edad = 30
# Forma antigua y poco práctica:
print("Hola, " + nombre + ". Tienes " + str(edad) + " años.")
Esto es engorroso: hay que tener cuidado con los espacios y convertir los números a str() manualmente.
Python nos ofrece una forma mucho mejor: las f-strings.
¿Cómo se usan?
- Pon una
fjusto antes de las comillas de apertura. - Inserta tus variables directamente dentro de la cadena, rodeadas por llaves
{}.
nombre = "Carla"
edad = 30
# Forma moderna con f-string:
print(f"Hola, {nombre}. Tienes {edad} años.")
Como ves, es mucho más limpio y legible. Dentro de las llaves puedes poner incluso operaciones:
print(f"El año que viene tendrás {edad + 1} años.")
Aprovechando las f-strings
La utilidad real de las f-strings aparece cuando añadimos opciones de formato dentro de las llaves, justo después de la variable, separadas por dos puntos (:).
Sintaxis: f"{variable:formato}"
Veamos los casos más útiles.
Controlando el ancho y la alineación
Podemos reservar un número de espacios para nuestra variable y decidir cómo se alinea dentro de ese espacio. Esto es ideal para mostrar datos en columnas bien ordenadas.
<: Alinear a la izquierda (por defecto para texto).^: Centrar.>: Alinear a la derecha (por defecto para números).
# Reservamos 15 caracteres para cada nombre
nombre1 = "Ana"
nombre2 = "Rodrigo"
nombre3 = "Margarita"
print(f"|{nombre1:<15}|") # Alinear a la izquierda
print(f"|{nombre2:^15}|") # Centrar
print(f"|{nombre3:>15}|") # Alinear a la derecha
Salida:
|Ana |
| Rodrigo |
| Margarita|
Tip: Carácter de relleno Puedes especificar qué carácter usar para rellenar el espacio sobrante, poniéndolo justo antes del símbolo de alineación.
print(f"|{nombre2:*^15}|") # Centra y rellena con asteriscos
# Salida: |***Rodrigo****|
Formateando números decimales (float)
Cuando trabajamos con cálculos, a menudo obtenemos resultados con demasiados decimales. Podemos controlar con precisión cuántos queremos mostrar.
La sintaxis es :.Nf, donde N es el número de decimales que queremos.
pi = 3.14159265
division = 10 / 3
print(f"El valor de pi es: {pi}")
print(f"El resultado de la división es: {division}")
print("--- Formateado ---")
# Mostramos pi con solo 2 decimales
print(f"El valor de pi es: {pi:.2f}")
# Mostramos la división con 4 decimales
print(f"El resultado de la división es: {division:.4f}")
Salida:
El valor de pi es: 3.14159265
El resultado de la división es: 3.3333333333333335
--- Formateado ---
El valor de pi es: 3.14
El resultado de la división es: 3.3333
Combinando formatos y otros trucos útiles
Lo mejor es que puedes combinar estas reglas. Por ejemplo, alinear un número y a la vez limitar sus decimales.
precio = 49.9
# Reservar 10 espacios, alinear a la derecha y mostrar 2 decimales
print(f"Precio: ${precio:>10.2f}")
# Salida: Precio: $ 49.90
Otros formatos muy prácticos:
- Separador de miles (
:,): Añade comas para hacer los números grandes más legibles.python numero_grande = 1234567890 print(f"Población mundial aproximada: {numero_grande:,}") # Salida: Población mundial aproximada: 1,234,567,890 - Porcentajes (
:%): Multiplica el número por 100 y le añade el símbolo%.python descuento = 0.25 print(f"Oferta especial: ¡Un {descuento:.0%} de descuento!") # Salida: Oferta especial: ¡Un 25% de descuento!
Ejercicios prácticos
1. Extractor de información
Pide al usuario que introduzca su dirección de email. Luego, usando slicing, extrae y muestra por separado el nombre de usuario y el dominio.
- Pista: Primero, encuentra la posición del
@con el método.find(). - Ejemplo: Si el email es
nombre.apellido@gmail.com, el programa debería mostrar:- Nombre de usuario:
nombre.apellido - Dominio:
gmail.com
- Nombre de usuario:
2. Formateador de nombres
- Pide al usuario su nombre completo (puede que lo escriba con mayúsculas, minúsculas y espacios extra).
- Limpia los espacios en blanco al principio y al final.
- Formatea el nombre para que aparezca en formato de título (la primera letra de cada palabra en mayúscula).
- Muestra un saludo personalizado usando una f-string, por ejemplo:
¡Bienvenido, Nombre Apellido!
3. Censor de palabras
- Pide al usuario una palabra que quiera censurar de esa frase.
- Pide al usuario que introduzca una frase, para censurarla.
- Usa el método
.replace()para sustituir esa palabra por"[CENSURADO]". - Muestra la frase original y la frase censurada.
- Extra: Integra los pasos 2-4 dentro de un bucle
whilepara que el usuario pueda continuar introduciendo frases y aparezca censurado. Además, puedes usar el carácter ▮ para censurar.
4. Palíndromos
Un palíndromo es una palabra o frase que se lee igual de izquierda a derecha que de derecha a izquierda (ej: "ana", "radar", "oso").
- Pide al usuario una palabra.
- Limpia la palabra: conviértela a minúsculas y quítale los espacios con
.replace(" ", ""). - Crea una versión invertida de la palabra. Pista: puedes usar slicing con un paso negativo
palabra\[\:\:-1] - Compara la palabra limpia con su versión invertida y dile al usuario si es un palíndromo o no.
6. Dibujante de separadores
Escribe un programa que haga lo siguiente:
- Pida al usuario un título para una sección.
- Pida al usuario un carácter para usar como adorno (ej:
-,*, =,#). - Calcule la longitud del título.
- Usando la multiplicación de cadenas, cree una línea de adorno que sea 4 caracteres más larga que el título (dos por cada lado).
- Muestre el título centrado con sus adornos.
Ejemplo de ejecución:
Introduce el título: Conceptos Básicos
Introduce el carácter de adorno: =
<mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark>===
Conceptos Básicos
<mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark>===
Pista: Para la línea del título, puedes concatenar adorno + " " + titulo + " " + adorno.
7. Generador de tickets de compra
Objetivo: Crear un programa que simule un ticket de compra simple. El objetivo es que la salida esté perfectamente formateada y alineada, como un ticket real, utilizando las capacidades avanzadas de las f-strings.
Instrucciones:
-
Define las variables: Crea variables para al menos tres productos diferentes. Cada producto debe tener un nombre (texto), una cantidad (puede ser entero o flotante) y un precio unitario (flotante). También define una variable para el tipo de IVA (por ejemplo, 21% se escribe como
0.21).```python
Datos de los productos
producto1_nombre = "Barra de pan" producto1_cant = 2 producto1_precio = 0.85
producto2_nombre = "Leche (litro)" producto2_cant = 1 producto2_precio = 1.05
producto3_nombre = "Manzanas (kg)" producto3_cant = 1.5 producto3_precio = 1.99
IVA
IVA = 0.21 ```
-
Realiza los cálculos:
- Calcula el total para cada producto (cantidad * precio).
- Calcula el subtotal (la suma de los totales de todos los productos).
- Calcula la cantidad de IVA a aplicar sobre el subtotal.
- Calcula el total final (subtotal + IVA).
- Imprime el Ticket Formateado: Utiliza f-strings para imprimir el ticket. Debe tener:
- Un encabezado para el ticket.
- Cabeceras para las columnas: "Producto", "Cant.", "Precio Unit.", "Total". Asegúrate de que estén bien alineadas.
- Una línea por cada producto, con los datos alineados bajo sus cabeceras. Los precios y totales deben mostrarse siempre con 2 decimales.
- Una línea separadora.
- Las líneas para el Subtotal, el IVA (mostrando el porcentaje aplicado) y el Total Final. Estas deben estar alineadas a la derecha.
Salida esperada:
Tu programa debería generar una salida que se vea exactamente así (con los mismos espacios y alineación):
<mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark>
TICKET DE COMPRA
<mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark><mark>=</mark>
Producto Cant. Precio Unit. Total
--------------------------------------------------
Barra de pan 2 0.85 1.70
Leche (litro) 1 1.05 1.05
Manzanas (kg) 1.5 1.99 2.98
--------------------------------------------------
Subtotal: 5.73
IVA (21%): 1.20
TOTAL A PAGAR: 6.93
Pistas:
- Para las cabeceras y las líneas de productos, combina la alineación a la izquierda (
<) para el nombre del producto y a la derecha (>) para los números. - Usa el formato
:.2fpara todos los precios y totales. - Para la línea del IVA, puedes anidar una f-string dentro de otra para mostrar el porcentaje:
f"IVA ({IVA:.0%}):" - Juega con los números de ancho en tus f-strings (ej:
{variable:>10.2f}) hasta que las columnas queden perfectamente alineadas como en el ejemplo.