Semana 1: Variables, Tipos y E/S
🎯 Objetivos de aprendizaje
Al final de esta semana podrás:
- Almacenar un valor bajo un nombre (una variable) y explicar por qué ese nombre es solo una etiqueta, no una caja.
- Identificar los tipos básicos incorporados de Python:
int,float,str,bool. - Usar correctamente los operadores aritméticos, de comparación y de asignación aumentada.
- Leer entrada del estudiante desde el teclado e imprimir salida formateada.
- Escribir tu primer programa interactivo pequeño y completo que combine todo lo anterior.
Lección
Las variables como nombres de valores
En matemáticas, cuando escribes "sea ", estás vinculando un nombre a un valor para el resto del razonamiento. Python hace exactamente esto:
x = 5
El lado derecho se evalúa primero (5), y luego el nombre x se apunta hacia él. A diferencia de las matemáticas, x puede reasignarse — escribir x = 5 y luego más adelante x = x + 1 no es una contradicción, simplemente redirige la etiqueta:
x = 5
x = x + 1 # ahora x referencia a 6
Lee x = x + 1 como "el nuevo valor de es el valor anterior de más uno", de la misma forma en que leerías una relación de recurrencia .
Verás este patrón —leer el valor actual, calcular algo a partir de él, y volver a guardarlo bajo el mismo nombre— con tanta frecuencia que Python le da un atajo: los operadores de asignación aumentada:
x = 5
x += 1 # igual que x = x + 1 -> 6
x -= 2 # igual que x = x - 2 -> 4
x *= 3 # igual que x = x * 3 -> 12
x /= 4 # igual que x = x / 4 -> 3.0
Cómo nombrar tus variables
Un nombre (un identificador) debe comenzar con una letra o un guion bajo, y después solo puede contener letras, dígitos y guiones bajos — 2nd_score no es válido, second_score sí. La convención de Python (y el estilo de este curso en su totalidad) es snake_case: palabras en minúscula separadas por guiones bajos, como student_name o total_score, en lugar de studentName o TotalScore. Un puñado de palabras están reservadas por el propio lenguaje (if, for, class, True, y otras) y no pueden usarse como nombres de variable en absoluto.
Los nombres deben describir qué significa un valor, no solo satisfacer la sintaxis. x = 87.5 no le dice nada al lector; quiz_score = 87.5 le dice todo lo que necesita de un vistazo. Esto importa más de lo que parece: releerás tu propio código con mucha más frecuencia de la que lo escribes.
Tipos: ¿qué clase de valor es este?
Todo valor tiene un tipo — el conjunto al que pertenece, en términos matemáticos:
| Tipo | Analogía matemática | Ejemplo |
|---|---|---|
int | (enteros) | 42, -7 |
float | (reales, aproximados) | 3.14, -0.5 |
str | una secuencia finita de caracteres | "hello" |
bool | True, False |
Comprueba el tipo de un valor con type(...):
type(42) # <class 'int'>
type(3.14) # <class 'float'>
type("hi") # <class 'str'>
type(True) # <class 'bool'>
Python es un lenguaje de tipado dinámico: un nombre no está permanentemente ligado a un solo tipo. Escribir x = 5 y luego x = "five" es legal — x simplemente apunta a otro lugar. Esto es cómodo, pero también significa que el tipo de un nombre solo puede conocerse observando a qué apunta actualmente, no declarándolo de antemano.
Conversión entre tipos
Puedes convertir explícitamente un valor de un tipo a otro usando int(...), float(...), str(...) y bool(...) como funciones:
int("42") # 42 — str -> int
int(3.9) # 3 — float -> int, trunca (¡NO redondea!)
float("3.14") # 3.14 — str -> float
str(42) # "42" — int -> str
bool(0) # False — 0 (y también 0.0, y "") son "falsy"
bool(1) # True — cualquier número distinto de cero (y cualquier string no vacío) es "truthy"
Que int(3.9) dé 3, y no 4, confunde a la gente constantemente — la conversión a int siempre trunca hacia cero, nunca redondea. Usa la función incorporada round(3.9) (que da 4) si lo que en realidad quieres es redondear.
No toda conversión es posible: int("hello") lanza un ValueError, ya que "hello" no es un número en ninguna base. Python falla ruidosamente aquí en lugar de adivinar en silencio — una decisión de diseño que aprenderás a apreciar cuando estés depurando datos reales en la Sección 2.
Operadores
Los operadores aritméticos reflejan los que ya conoces, con dos adiciones propias de Python:
7 // 2 # 3 — división entera: floor(7/2)
7 % 2 # 1 — resto, es decir 7 mod 2
7 ** 2 # 49 — exponenciación, es decir 7^2
-7 // 2 # -4 — la división entera siempre redondea hacia menos infinito, no hacia cero
Esa última línea es una sorpresa común: -7 // 2 es -4, no -3, porque la división entera sigue la función matemática piso , que redondea hacia abajo (hacia ), no hacia cero.
Los operadores de comparación (==, !=, <, <=, >, >=) producen un bool. Nota que == (prueba de igualdad) no es = (asignación) — un error muy común al empezar. También puedes encadenar comparaciones tal como lo harías en matemáticas: 0 <= x < 10 significa exactamente lo mismo que , evaluado como una sola expresión, no como dos expresiones separadas que necesitarías unir con and (conocerás and/or correctamente la próxima semana).
Los operadores se combinan con la precedencia habitual: primero **, luego *, /, //, %, después +, -, de izquierda a derecha — el mismo orden PEMDAS que ya conoces. Los paréntesis lo anulan exactamente igual que en matemáticas:
2 + 3 * 4 # 14, no 20
(2 + 3) * 4 # 20
Entrada y salida
input() lee una línea de texto escrita por el estudiante — siempre devuelve un str, incluso si escribió un número:
name = input("What's your name? ")
print("Hello,", name)
Como input() siempre te da un str, convertir es algo común:
age_text = input("How old are you? ")
age = int(age_text) # str -> int
print("In 10 years you'll be", age + 10)
print() acepta múltiples argumentos separados por comas (que se unen con un espacio) o un f-string para más control:
score = 87.5
print(f"Your score is {score}%") # los f-strings interpolan {expresiones} directamente
Un f-string puede contener más que un simple nombre de variable — cualquier expresión funciona dentro de { }, y puedes formatear números con precisión:
price = 19.999
print(f"Total: ${price:.2f}") # "Total: $20.00" — :.2f redondea a 2 decimales
print(f"Double: {price * 2}") # cualquier expresión, no solo una variable
print(f"{'yes' if price > 10 else 'no'}") # incluso una expresión condicional funciona en línea
⚠️ Errores comunes
- Confundir
=y==.if score = 60:es un error de sintaxis (conocerásifcorrectamente la próxima semana) — Python no te deja asignar dentro de una condición por accidente, pero el instinto de escribir=cuando quieres decir "es igual a" es común al principio. - Olvidar que
input()devuelve un string.age = input("Age? ")y luegoage + 1lanzaTypeError: can only concatenate str (not "int") to str— convierte primero:age = int(input("Age? ")). - Esperar que
int()redondee.int(4.7)es4, no5. Usaround(4.7)para redondear. - Confundir
/y//./siempre da unfloat(incluso4 / 2es2.0);//da el cociente truncado hacia abajo.
Ejemplo práctico: un pequeño programa interactivo
Juntando todo lo aprendido esta semana —variables, tipos, conversión, operadores y E/S— en un programa corto que calcula una calculadora de propina simple:
bill = float(input("Bill amount: $"))
tip_percent = int(input("Tip percent (e.g. 15): "))
tip_amount = bill * tip_percent / 100
total = bill + tip_amount
print(f"Tip: ${tip_amount:.2f}")
print(f"Total: ${total:.2f}")
Fíjate cómo cada línea hace una cosa clara: leer un valor, convertirlo al tipo adecuado, calcular con él, e imprimir un resultado formateado. Este patrón "leer → calcular → reportar" es uno que reutilizarás constantemente, a lo largo de todo este curso.
🧩 Retos
¿Qué es type(7 / 2)? Predícelo antes de ejecutarlo en el playground, luego compruébalo.
Predice la salida de "3" + "4". ¿Es la misma que la de 3 + 4?
Escribe un programa que pida un nombre y un año de nacimiento (como dos prompts separados de input()), calcule una edad aproximada, e imprima una frase como "Amina, you are about 21 years old." Pruébalo en el playground.
Sin ejecutarlo, calcula 15 // 4 y 15 % 4 a mano. Luego verifica: ¿4 * (15 // 4) + (15 % 4) es igual a 15?
Predice int(-7.9) y -7.9 // 1. ¿Son iguales? Prueba ambos en el playground y explica cualquier diferencia usando lo que aprendiste sobre truncar versus redondear hacia abajo.
Extiende la calculadora de propina del ejemplo práctico para que también pregunte cuántas personas van a repartirse la cuenta, e imprime la parte que corresponde a cada persona.
🤔 Preguntas socráticas
input()siempre devuelve unstr. ¿Qué saldría mal si intentarasage + 10sin convertir primero conage = int(input(...))? ¿Qué te dice en realidad el mensaje de error?- Si
x = 5y luegoy = x, y despuésx = 10, ¿cuál es el valor dey? Explícalo en términos de "los nombres apuntan a valores" en lugar de "las cajas contienen valores". 0.1 + 0.2en Python no se imprime exactamente como0.3. Pruébalo en el playground. ¿Por qué unfloat—que aproxima usando dígitos binarios finitos— podría no representar con exactitud, de la misma forma en que no tiene una expansión decimal finita?bool(0)esFalseybool(1)esTrue— pero ¿qué predices que sonbool(-1)ybool(2)? Comprueba tu predicción. ¿Qué única regla explica los cuatro resultados?- La asignación aumentada
x += 1y la forma normalx = x + 1producen el mismo resultado con números. ¿Se te ocurre alguna razón por la que un lenguaje se moleste en ofrecer ambas formas, en lugar de exigir que todos escriban siemprex = x + 1?