Python I: tu primer programa

Tema 1 · Fase 1, Programar con datos · Toda la ruta

En esta ficha · 5 secciones
  1. Antes de empezar
  2. Ejercicios
  3. Mini-proyecto: un cuestionario
  4. Errores comunes
  5. ¿Lo lograste?

Antes de empezar

Abre un cuaderno nuevo en Colab y trabaja ahí: cada ejercicio en su propia celda. Algunos usan variables de la teoría (como imc); si no la corriste, pega primero los bloques de la ficha Código. Intenta cada ejercicio antes de abrir la respuesta: equivocarse primero y corregir después es como se aprende de verdad.

Ejercicios

1. Tu primer cuaderno

Este ejercicio es para entender el orden de ejecución de las celdas.

  1. Crea un cuaderno nuevo en Colab. En la primera celda escribe x = 5 y ejecútala.
  2. Agrega una segunda celda con print(x * 2) y ejecútala.
  3. Cambia la primera celda a x = 8, pero no la ejecutes. Ejecuta solo la segunda. ¿Qué imprime? ¿Por qué?
  4. Ahora ejecuta la primera y después la segunda. ¿Qué imprime?
  5. Usa Entorno de ejecución → Reiniciar sesión y ejecuta solo la segunda celda. ¿Qué pasa?
Respuesta
  • En el paso 2 imprime 10.
  • En el paso 3 sigue imprimiendo 10. Cambiar el texto de una celda no cambia nada hasta que la ejecutas: el cuaderno todavía tiene guardado x = 5. Los números entre corchetes lo delatan: la primera celda tiene un número más chico que la segunda, de la vez anterior.
  • En el paso 4 imprime 16, porque ahora x vale 8.
  • En el paso 5 aparece NameError: name 'x' is not defined. Al reiniciar, el cuaderno olvidó todas las variables, y la celda que crea x todavía no se ejecutó. Se arregla ejecutando primero la celda de arriba (o con Ejecutar todas).

2. Cuatro tipos

Crea cuatro variables que describan a una persona inventada: su nombre (str), su edad en años (int), su estatura en metros (float) y si tiene 18 años o más (bool). La última no la escribas a mano: calcúlala con una comparación a partir de la edad. Después muestra una frase con una f-string y el tipo de cada variable con type.

Respuesta
nombre = "Luis"
edad = 16
estatura = 1.72
es_mayor = edad >= 18
print(f"{nombre} tiene {edad} años y mide {estatura} m.")
print(f"¿Es mayor de edad? {es_mayor}")
print(type(nombre), type(edad), type(estatura), type(es_mayor))
Luis tiene 16 años y mide 1.72 m.
¿Es mayor de edad? False
<class 'str'> <class 'int'> <class 'float'> <class 'bool'>

edad >= 18 es una comparación, y toda comparación da un bool. Si escribiste estatura = 1,72 (con coma), Python no guarda un número: guarda dos valores juntos, 1 y 72, y type te dirá tuple. Los decimales van con punto.

3. Predice la salida

Para cada fragmento, escribe en un papel exactamente lo que va a imprimir, línea por línea. Recién después ejecútalo y compara. Si fallaste, busca en qué paso se separó tu predicción de lo que hizo Python.

a)

a = 10
b = 3
print(a / b > 3, a // b, a % b)
Respuesta a)
True 3 1

10 / 3 es 3,33…, que es mayor que 3, así que la comparación da True. 10 // 3 es 3 (cuántas veces cabe) y 10 % 3 es 1 (lo que sobra).

b)

x = "5"
y = 5
print(x * 3, y * 3)
Respuesta b)
555 15

x es texto, porque está entre comillas: multiplicar un texto por 3 lo repite tres veces. y es un int, así que y * 3 es una multiplicación de verdad.

c)

t = 0
for i in range(2, 9, 3):
    t = t + i
    print(i, t)
Respuesta c)
2 2
5 7
8 15

range(2, 9, 3) da 2, 5 y 8 (el siguiente sería 11, que ya pasa de 9). t acumula: 0 + 2 = 2, 2 + 5 = 7, 7 + 8 = 15. El print está dentro del bucle, así que se ejecuta en cada vuelta.

d)

n = 7
if n % 2 == 0:
    print("par")
elif n > 5:
    print("impar y mayor que 5")
else:
    print("impar y hasta 5")
Respuesta d)
impar y mayor que 5

7 % 2 es 1, así que la primera condición es falsa. La segunda, 7 > 5, es verdadera: se ejecuta ese bloque y el else ya no se revisa.

e)

k = 1
while k < 50:
    k = k * 3
print(k)
Respuesta e)
81

k pasa por 1, 3, 9, 27 y 81. Con 27 la condición todavía se cumple, así que hay una vuelta más y k llega a 81; con 81 el bucle se detiene. El resultado se pasa de 50: while revisa la condición antes de cada vuelta, no a la mitad. El print está fuera del bucle, así que imprime una sola vez.

4. Corrige los errores

Cada programa tiene un error. Lee el mensaje, encuentra la línea que lo causa y corrígela. En el último no hay mensaje: el programa corre, pero el resultado está mal.

a) Debería imprimir 0, 1 y 2.

for i in range(3)
    print(i)
  ...
    for i in range(3)
                     ^
SyntaxError: expected ':'
Respuesta a)

Faltan los dos puntos al final de la línea del for. El ^ señala justo ese lugar.

for i in range(3):
    print(i)
0
1
2

b) Debería saludar a Carla.

nombre = Carla
print(f"Hola, {nombre}")
Traceback (most recent call last):
  ...
----> 1 nombre = Carla

NameError: name 'Carla' is not defined
Respuesta b)

Sin comillas, Python cree que Carla es el nombre de una variable, y esa variable no existe. Un texto siempre va entre comillas.

nombre = "Carla"
print(f"Hola, {nombre}")
Hola, Carla

c) La edad llega como texto, como si viniera de input. Debería imprimir la edad del próximo año.

edad = "15"
print(edad + 1)
Traceback (most recent call last):
  ...
----> 2 print(edad + 1)

TypeError: can only concatenate str (not "int") to str
Respuesta c)

edad es un str y 1 es un int: con +, Python solo sabe pegar texto con texto. Hay que convertir la edad en número antes de sumar.

edad = "15"
print(int(edad) + 1)
16

d) Debería imprimir la suma de 1, 2 y 3.

total = 0
for n in range(1, 4):
total = total + n
print(total)
  ...
    total = total + n
    ^
IndentationError: expected an indented block after 'for' statement on line 2
Respuesta d)

La línea que se repite tiene que ir sangrada, dentro del for. El print queda sin sangría, porque se ejecuta una sola vez, al final.

total = 0
for n in range(1, 4):
    total = total + n
print(total)
6

e) Debería imprimir el promedio de tres notas, que es 70.

nota1 = 60
nota2 = 80
nota3 = 70
promedio = nota1 + nota2 + nota3 / 3
print(promedio)
163.33333333333334
Respuesta e)

La división se calcula antes que la suma, así que el programa hizo 60 + 80 + (70 / 3). Faltan paréntesis para sumar primero. Python no se queja porque la línea es válida: hace exactamente lo que se le escribió, que no es lo que queríamos.

promedio = (nota1 + nota2 + nota3) / 3
print(promedio)
70.0

5. FizzBuzz

Escribe un programa que recorra los números del 1 al 15 y, para cada uno, imprima:

  • FizzBuzz si es múltiplo de 3 y también de 5;
  • Fizz si es múltiplo de 3 (pero no de 5);
  • Buzz si es múltiplo de 5 (pero no de 3);
  • el número mismo en cualquier otro caso.

Pista: un número es múltiplo de 3 cuando el resto de dividirlo entre 3 es 0.

Respuesta
for n in range(1, 16):
    if n % 3 == 0 and n % 5 == 0:
        print("FizzBuzz")
    elif n % 3 == 0:
        print("Fizz")
    elif n % 5 == 0:
        print("Buzz")
    else:
        print(n)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

El orden importa. Si la primera condición fuera n % 3 == 0, el 15 entraría ahí, imprimiría Fizz y nunca llegaría a la de FizzBuzz: el if ejecuta solo el primer bloque cuya condición se cumple. Por eso el caso más exigente va primero.

6. Doblar una hoja

Una hoja de papel tiene un grosor de 0,1 mm. Cada vez que la doblas por la mitad, el grosor se duplica. Usa un while para averiguar cuántas veces habría que doblarla para que el grosor pase de 1 metro (1000 mm), y cuánto mediría. (En la práctica, una hoja no se deja doblar más de unas pocas veces; aquí solo hacemos la cuenta.)

Respuesta
grosor = 0.1      # en milímetros
dobleces = 0
while grosor <= 1000:
    grosor = grosor * 2
    dobleces = dobleces + 1
print(f"{dobleces} dobleces: {grosor:.1f} mm")
14 dobleces: 1638.4 mm

No sabíamos de antemano cuántas vueltas hacían falta: para eso está while. Duplicar muchas veces crece muy rápido: con solo 14 dobleces se pasa del metro y medio.

Mini-proyecto: un cuestionario

Vas a programar un cuestionario de 5 preguntas que diga, después de cada respuesta, si fue correcta, y al final cuente los aciertos.

Pasos.

  1. Las preguntas. Escribe 5 preguntas de respuesta corta (un número o una palabra) sobre lo que quieras: matemáticas, Python, tu ciudad. Guarda cada pregunta y su respuesta correcta en variables, o en dos listas como en el juego de adivinar el número.
  2. Preguntar. En Colab, usa input para cada pregunta. Recuerda que input devuelve texto: compara la respuesta con un texto ("56"), no con un número.
  3. Corregir. Con un if y un else, imprime «¡Correcto!» o «Incorrecto: era …» con la respuesta correcta.
  4. Contar. Usa un acumulador aciertos que empiece en 0 y suba en 1 con cada respuesta correcta.
  5. Cerrar. Al final imprime los aciertos y un mensaje distinto según el resultado (con if, elif y else): por ejemplo, uno para 5 de 5, otro para 3 o 4, y otro para menos.
  6. Mejorar. Si alguien escribe «Sucre» y la respuesta guardada es «sucre», ¿cuenta como correcta? Arréglalo con .lower(), que pasa un texto a minúsculas ("Sucre".lower() da "sucre"), y con .strip(), que quita los espacios de los bordes.
Una solución posible

Aquí las respuestas del jugador están en una lista, porque en esta página nadie puede escribirlas. En Colab, cambia respuesta = respuestas_jugador[i] por respuesta = input(preguntas[i] + " ") y borra la lista.

preguntas = [
    "¿Cuánto es 7 * 8?",
    "¿De qué tipo es el valor 3.5: int, float, str o bool?",
    "¿Cuánto vale 17 % 5?",
    "¿Cuál es la capital constitucional de Bolivia?",
    "¿Qué imprime print(2 ** 3)?",
]
correctas = ["56", "float", "2", "sucre", "8"]
# Lo que contesta el jugador, en orden
respuestas_jugador = ["56", "Float", "3", " Sucre", "8"]

aciertos = 0
for i in range(5):
    print(preguntas[i])
    respuesta = respuestas_jugador[i]
    if respuesta.strip().lower() == correctas[i]:
        print("  ¡Correcto!")
        aciertos = aciertos + 1
    else:
        print(f"  Incorrecto: era {correctas[i]}")

print(f"Acertaste {aciertos} de 5.")
if aciertos == 5:
    print("¡Perfecto!")
elif aciertos >= 3:
    print("Muy bien. Repasa las que fallaste.")
else:
    print("Vuelve a leer la teoría e inténtalo de nuevo.")
¿Cuánto es 7 * 8?
  ¡Correcto!
¿De qué tipo es el valor 3.5: int, float, str o bool?
  ¡Correcto!
¿Cuánto vale 17 % 5?
  Incorrecto: era 2
¿Cuál es la capital constitucional de Bolivia?
  ¡Correcto!
¿Qué imprime print(2 ** 3)?
  ¡Correcto!
Acertaste 4 de 5.
Muy bien. Repasa las que fallaste.

Gracias a .strip().lower(), «Float» y « Sucre» (con un espacio adelante) cuentan como correctas. Las respuestas correctas se guardan ya en minúsculas para que la comparación funcione.

Errores comunes

  • Olvidar los dos puntos al final de una línea con if, elif, else, for o while. El mensaje es SyntaxError: expected ':'.
  • Sangrías desparejas. Las líneas de un mismo bloque deben tener exactamente la misma sangría. Usa siempre 4 espacios (Colab los pone solo).
  • Confundir = con ==. Un = guarda un valor; dos == comparan. if nota = 51: es un SyntaxError.
  • Escribir decimales con coma. 1,65 no es un número en Python: es un par de valores. Se escribe 1.65.
  • Hacer cuentas con lo que devuelve input. Siempre es texto. Conviértelo con int o float antes de sumar o comparar con números.
  • Olvidar que range no incluye el final. range(1, 10) llega hasta el 9. Para llegar al 10, escribe range(1, 11).
  • Reiniciar el acumulador dentro del bucle. Si total = 0 está dentro del for, vuelve a 0 en cada vuelta y al final solo queda el último número.
  • Un while que nunca termina. Algo en el bloque tiene que acercar la condición a False. Si la celda no termina, detenla y revisa qué variable debería cambiar.
  • Ejecutar las celdas en desorden. Si una variable tiene un valor raro o aparece un NameError que no entiendes, reinicia la sesión y usa Ejecutar todas.
  • Leer el mensaje de error desde arriba. Empieza por la última línea: ahí está el tipo de error y la explicación.

¿Lo lograste?

Al terminar este tema deberías poder hacer lo siguiente. Al lado, dónde lo practicaste.

  • Abrir un cuaderno en Colab, ejecutar celdas y explicar qué pasa si las ejecutas en desorden (ejercicio 1).
  • Usar variables de tipo int, float, str y bool, y predecir qué hacen sus operaciones (ejercicios 2 y 3).
  • Escribir un if/elif/else y un bucle for o while (ejercicios 5 y 6, y el mini-proyecto).
  • Leer un mensaje de error y corregir la línea que lo causa (ejercicio 4).