Módulo 01 — Variables, tipos y operadores

Programar es manipular datos. Antes de manipularlos hay que saber guardarlos y de qué clase son. Eso son las variables y los tipos. Este módulo es la base de todo lo demás, así que no lo despaches rápido.

Una variable es una etiqueta, no una caja

Cuando escribes x = 5, no estás metiendo el 5 en una caja llamada x. Estás pegando la etiqueta x a un valor que vive en memoria. Da igual la imagen mental mientras entiendas esto: una variable apunta a un valor, y puedes reapuntarla cuando quieras.

edad = 30
edad = 31        # ahora apunta a otro valor
edad = edad + 1  # lee el valor actual (31), suma 1, y reapunta a 32
print(edad)      # 32

Reglas para nombrar variables: solo letras, números y guion bajo; no pueden empezar por número; distinguen mayúsculas (edad y Edad son distintas). Por convención en Python se usa snake_case: minúsculas y guiones bajos, como precio_total o numero_de_alumnos.

Python deduce el tipo solo

No declaras el tipo de una variable. Python lo deduce del valor que le asignas. Esto se llama tipado dinámico.

x = 5        # int (entero)
x = 5.0      # ahora es float (decimal)
x = "cinco"  # ahora es str (cadena de texto)

Para saber de qué tipo es algo, usa type():

print(type(5))        # <class 'int'>
print(type(5.0))      # <class 'float'>
print(type("hola"))   # <class 'str'>
print(type(True))     # <class 'bool'>

Los cuatro tipos básicos

Enteros (int) — números sin decimales. Tan grandes como quieras, Python no se queja:

poblacion = 47000000
negativo = -8

Decimales (float) — números con parte fraccionaria. Ojo: la aritmética decimal del ordenador no es exacta.

precio = 19.99
print(0.1 + 0.2)  # 0.30000000000000004  <- no es un bug, es cómo funcionan los floats

Ese resultado raro aparece porque los ordenadores guardan los decimales en binario y algunos números no tienen representación exacta. Para dinero, más adelante verás soluciones; por ahora, que no te sorprenda.

Cadenas (str) — texto, entre comillas simples o dobles (da igual cuáles, pero sé coherente):

nombre = "Amador"
ciclo = 'DAW'
frase = "Dijo: \"hola\""   # \" escapa la comilla
multilinea = """Esto ocupa
varias líneas"""

Booleanos (bool) — solo dos valores: True y False. Son la base de toda decisión en un programa.

mayor_de_edad = True
tiene_descuento = False

Operadores aritméticos: cuidado con dos de ellos

print(7 + 3)   # 10   suma
print(7 - 3)   # 4    resta
print(7 * 3)   # 21   multiplicación
print(7 / 3)   # 2.333...  división (SIEMPRE devuelve float)
print(7 // 3)  # 2    división entera (descarta decimales)
print(7 % 3)   # 1    módulo (el resto de la división)
print(7 ** 3)  # 343  potencia (7 al cubo)

Los dos que más confunden al principio: // te da el cociente entero y % te da el resto. El módulo es utilísimo: n % 2 == 0 comprueba si n es par.

Operar con cadenas: concatenar y repetir

nombre = "Ada"
apellido = "Lovelace"
print(nombre + " " + apellido)  # Ada Lovelace
print("=" * 20)                 # ====================

Pero no puedes mezclar tipos sin convertir:

edad = 30
# print("Edad: " + edad)   # ERROR: no se puede sumar str + int
print("Edad: " + str(edad))  # bien, convertimos el int a str
print(f"Edad: {edad}")       # mejor: f-string

Convertir entre tipos

int("42")     # 42    texto a entero
float("3.14") # 3.14  texto a decimal
str(42)       # "42"  número a texto
int(3.9)      # 3     trunca, NO redondea
round(3.9)    # 4     esto sí redondea
bool(0)       # False
bool(5)       # True  (cualquier número distinto de 0 es True)

La conversión de texto a número es constante cuando lees datos de un archivo o de un usuario: todo entra como texto y tú lo conviertes.

Leer datos del usuario

input() muestra un mensaje y devuelve lo que el usuario escriba, siempre como cadena:

nombre = input("¿Cómo te llamas? ")
edad = int(input("¿Qué edad tienes? "))  # convertimos a int para poder operar
print(f"El año que viene tendrás {edad + 1}")

Si olvidas el int(), edad + 1 falla porque estarías sumando un texto y un número.

Trabajar con cadenas: métodos imprescindibles

Las cadenas traen métodos (funciones que se aplican con un punto) para transformarlas:

texto = "  Hola Mundo  "
print(texto.strip())        # "Hola Mundo"   quita espacios de los extremos
print(texto.lower())        # "  hola mundo  "
print(texto.upper())        # "  HOLA MUNDO  "
print(texto.replace("o", "0"))  # "  H0la Mund0  "
print("hola".capitalize())  # "Hola"
print("a,b,c".split(","))   # ['a', 'b', 'c']   parte en una lista
print(len("hola"))          # 4    longitud

split() y strip() los usarás muchísimo cuando limpies datos en Pandas. Tenlos presentes.

Acceder a partes de una cadena (indexación y slicing)

Cada carácter tiene una posición que empieza en 0:

palabra = "Python"
print(palabra[0])    # 'P'   primer carácter
print(palabra[-1])   # 'n'   último (los negativos cuentan desde el final)
print(palabra[0:3])  # 'Pyt' del 0 al 3 sin incluir el 3
print(palabra[2:])   # 'thon' del 2 hasta el final
print(palabra[:2])   # 'Py'  desde el principio hasta el 2 sin incluir

Este corte con [inicio:fin] se llama slicing y es uno de los conceptos más reutilizados en Python. Funciona igual en listas y en Pandas.


Ejercicios

01.1 — Pide al usuario dos números y muestra su suma, resta, producto, división y resto. Recuerda convertir el input.

01.2 — Pide un número y di si es par o impar usando el operador módulo. (Pista: un número es par si n % 2 == 0.)

01.3 — Pide al usuario una frase y muéstrala en mayúsculas, en minúsculas, su longitud y la frase con los espacios de los extremos eliminados.

01.4 — Calcula el precio final de un producto: pide el precio base y aplícale un 21% de IVA. Muestra el resultado redondeado a 2 decimales (usa round(valor, 2)).

01.5 — Pide un nombre completo (“Ada Lovelace”) y muestra solo las iniciales (“A.L.”). Pista: split() separa por el espacio y luego coges el primer carácter de cada parte.

01.6 — Formatea el número 1234567.891 para que se muestre como "1.234.567,89 €" (separador de miles con punto, dos decimales con coma). Pista: usa f"{n:,.2f}" y sustituye los separadores con replace.

01.7 — Escribe una expresión que determine si un año es bisiesto: divisible entre 4, excepto centenarios, salvo que también sean divisibles entre 400. Prueba con 2000, 1900, 2024 y 2023.

01.8 — Pide una palabra al usuario y comprueba si es palíndromo (se lee igual al revés). Ignora mayúsculas. Pruébalo con “Ana”, “Python” y “reconocer”.


Soluciones

01.1

a = float(input("Primer número: "))
b = float(input("Segundo número: "))
print(f"Suma: {a + b}")
print(f"Resta: {a - b}")
print(f"Producto: {a * b}")
print(f"División: {a / b}")
print(f"Resto: {a % b}")

01.2

n = int(input("Número: "))
if n % 2 == 0:
    print("Es par")
else:
    print("Es impar")

(El if/else se ve a fondo en el módulo 02; aquí adelantamos su uso.)


01.3

frase = input("Escribe una frase: ")
print(frase.upper())
print(frase.lower())
print(len(frase))
print(frase.strip())

01.4

base = float(input("Precio base: "))
final = base * 1.21
print(f"Precio final: {round(final, 2)} €")

01.5

nombre = input("Nombre completo: ")
partes = nombre.split(" ")
iniciales = partes[0][0] + "." + partes[1][0] + "."
print(iniciales)

01.6

n = 1234567.891
formateado = f"{n:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
print(f"{formateado} €")   # 1.234.567,89 €

01.7

def es_bisiesto(año):
    return (año % 4 == 0 and año % 100 != 0) or (año % 400 == 0)

for a in [2000, 1900, 2024, 2023]:
    print(a, es_bisiesto(a))
# 2000 True | 1900 False | 2024 True | 2023 False

01.8

palabra = input("Escribe una palabra: ").lower()
es_palindromo = palabra == palabra[::-1]
print("Es palíndromo" if es_palindromo else "No es palíndromo")

[::-1] invierte la cadena con slicing de paso -1.