Estudia por tu cuenta · Programación · curso 21 de 24
Python desde cero
Python es un lenguaje de programación de verdad, el mismo que usan científicos y empresas. Aquí aprendes a darle órdenes a la computadora: guardar datos, hacer cuentas, decidir, repetir, ordenar listas, hacer funciones y leer los errores sin asustarte. Cada lección trae el programa y lo que sale en pantalla.
for i in range(3):\n print("Hola", i)Antes de empezar: conviene haber jugado «Pícale al código» y «Calculadora de código» en la sala, pero no es obligatorio.
Qué es programar
Lección 1 de 14
Un programa es una lista de órdenes exactas, en orden. La computadora no adivina: hace justo lo que dice la lista, ni más ni menos.
Lo que hay que saber
Piensa en cómo le explicarías a alguien que nunca ha hecho un sándwich cómo hacerlo. «Pon el jamón» no sirve si antes no dijiste «saca el pan». Esa lista de pasos, exactos y en orden, se llama algoritmo. En el juego «Prográmame» lo viviste: el maestro hace solo lo que le dicen, y por eso se atora.
Una computadora es igual de obediente y de literal. Programar es escribir el algoritmo en un idioma que la máquina entienda. Ese idioma es un lenguaje de programación, y el que vamos a usar se llama Python: se lee casi como inglés y se usa en todo, desde videojuegos hasta robots.
Tu primer programa tiene una sola orden: print («imprime», o sea «muestra en pantalla»). Lo que va entre comillas es el texto que quieres mostrar.
print("Hola")
Sale:
Hola
Si pones varias órdenes, Python las hace una por una, de arriba abajo. Nunca se salta una ni cambia el orden.
print("Saca el pan")
print("Unta la mayonesa")
print("Pon el jamón")
Sale:
Saca el pan Unta la mayonesa Pon el jamón
Como la máquina es tan literal, hasta una letra importa. Estos cuatro programas parecen casi iguales al de arriba y ninguno funciona:
| Lo que escribiste | Qué pasa |
|---|---|
Print("Hola") | Python distingue mayúsculas: Print no existe, solo print. |
print("Hola) | Abriste comillas y no las cerraste. |
print("Hola" | Abriste paréntesis y no lo cerraste. |
print "Hola" | Faltan los paréntesis. |
A esos se les llama errores de dedo. Le pasan a todos los programadores, todos los días. Lo importante no es no cometerlos nunca: es saber leer el mensaje que te da Python para encontrarlos (eso lo vemos en la última lección).
Así se hace, paso a paso
Escribe un programa que muestre tu nombre, tu grupo y tu juego favorito, cada uno en su renglón
Paso 1 · Decide el orden. Primero el nombre, luego el grupo, luego el juego. Tres cosas, tres órdenes.
Paso 2 · Una orden por línea. Cada una es un print con el texto entre comillas y dentro de paréntesis.
print("Me llamo Dani")
print("Voy en 1° B")
print("Mi juego favorito es Pícale al código")
Paso 3 · Revisa los dedos. print con minúscula, comillas abiertas y cerradas, paréntesis abiertos y cerrados. Todo bien.
Sale:
Me llamo Dani Voy en 1° B Mi juego favorito es Pícale al código
Tres órdenes, tres renglones, en el orden que las escribiste.
Pensar que la computadora «entiende» lo que quisiste decir. No entiende nada: obedece. Si escribiste Print, no va a suponer que era print.
Comillas y paréntesis a medias. Todo lo que abres, lo cierras. Cuenta: una comilla que abre, una que cierra; un paréntesis que abre, uno que cierra.
Ejercicios
- ¿Qué imprime?
print("Buenos días")ver la respuesta
Buenos díasCómo se llega- print muestra el texto de adentro.
- Las comillas no salen: solo marcan dónde empieza y termina el texto.
- ¿Qué imprime?
print("Uno") print("Dos")ver la respuesta
Uno (y abajo) DosCómo se llega- De arriba abajo: primero Uno.
- Cada print empieza un renglón nuevo: luego Dos.
- Encuentra el error:
print("Adiós)ver la respuesta
Faltan las comillas de cierreCómo se llega- Abre comillas antes de Adiós y nunca las cierra.
- Debe ser print("Adiós").
- ¿Qué falta o qué sobra?
Print("Hola")ver la respuesta
La P mayúscula: es printCómo se llega- Python distingue mayúsculas y minúsculas.
- Print no existe; print sí.
- Escribe el programa que imprime tres renglones: Lunes, Martes y Miércoles.
ver la respuesta
print("Lunes") / print("Martes") / print("Miércoles"), cada uno en su líneaCómo se llega- Tres renglones = tres órdenes print.
- Cada texto entre comillas y dentro de paréntesis.
- En el orden que quieres que salgan.
- Tu hermano escribió estas órdenes para un robot que hace licuados: 1. Sirve el licuado. 2. Pon la fruta en la licuadora. 3. Enciende la licuadora. ¿Funciona? ¿Cómo lo arreglas?
ver la respuesta
No: sirve un vaso vacío. Orden correcto: 2, 3, 1Cómo se llega- El robot hace el paso 1 primero, y todavía no hay licuado.
- Las órdenes deben ir en el orden en que pasan las cosas: fruta, encender, servir.
Pensarlo en español antes de teclear
Lección 2 de 14
Antes de escribir código, escribe los pasos en español. Se llama pseudocódigo, y es lo que separa a quien programa de quien copia programas.
Lo que hay que saber
El error más caro de un programador que empieza no es de sintaxis: es empezar a teclear sin saber qué va a hacer el programa. La cura se llama pseudocódigo: los pasos escritos en español, numerados, sin preocuparse por los puntos ni los paréntesis.
Quiero un programa que diga si alguien puede entrar a una función de cine para mayores de 15. En pseudocódigo:
1. Preguntar la edad
2. Si la edad es 15 o más
decir "puedes pasar"
Si no
decir "no puedes pasar"
Y ahora, traducido a Python casi palabra por palabra:
edad = int(input("¿Cuántos años tienes? "))
if edad >= 15:
print("puedes pasar")
else:
print("no puedes pasar")
Las tres palabras que hacen falta para escribir cualquier pseudocódigo:
| En español | En Python | Para qué |
|---|---|---|
| preguntar / leer | input() | pedirle un dato al usuario |
| si… si no… | if / else | decidir entre dos caminos |
| repetir n veces / mientras | for / while | hacer algo varias veces |
El diagrama de flujo es el mismo plan pero dibujado, y tiene tres figuras que conviene reconocer porque se usan en todos lados:
- Óvalo: inicio y fin.
- Rectángulo: un paso que se hace (calcular, imprimir, guardar).
- Rombo: una decisión, con dos salidas: sí y no.
Lo útil del rombo es que te obliga a contestar qué pasa por cada salida. Casi todos los programas que «a veces no funcionan» son programas a los que les falta una de las dos salidas del rombo.
Cómo se usa de verdad. Escribe el pseudocódigo en el cuaderno. Luego traduce una línea a la vez y corre el programa cada dos o tres líneas, para que si algo truena sepas exactamente qué fue lo último que escribiste.
Así se hace, paso a paso
De la idea al pseudocódigo al programa
La idea: «quiero sumar las calificaciones de 5 materias y decir el promedio».
Paso 1 · pseudocódigo.
1. Empezar con la suma en 0
2. Repetir 5 veces:
preguntar una calificación
sumarla a la suma
3. Dividir la suma entre 5
4. Decir el resultado
Paso 2 · lo traduzco. «Empezar con la suma en 0» es una variable; «repetir 5 veces» es un for; «dividir» y «decir» son una cuenta y un print.
suma = 0
for i in range(5):
cal = float(input("Calificación: "))
suma = suma + cal
print("Promedio:", suma / 5)
Paso 3 · reviso con un caso. Si las cinco fueran 10, la suma sería 50 y el promedio 10. ✓
El pseudocódigo tiene 4 pasos y el programa 5 líneas: casi uno a uno.
Escribir pseudocódigo con sintaxis de Python. Si ya lleva paréntesis y dos puntos, no es pseudocódigo: es código mal escrito. Va en español.
Dejar un rombo con una sola salida. Toda decisión tiene dos: qué pasa si sí y qué pasa si no.
Teclear 30 líneas sin correr nada. Traduce de dos en dos y corre.
Ejercicios
- En un diagrama de flujo, ¿qué figura es una decisión?
ver la respuesta
El romboCómo se llega- El óvalo es inicio y fin; el rectángulo, un paso.
- El rombo es la decisión, con salidas sí y no.
- ¿Cuántas salidas tiene un rombo?
ver la respuesta
2Cómo se llega- Una por el sí y otra por el no.
- Si le falta una, el programa se queda sin camino.
- ¿En qué se traduce «preguntar la edad» al programar?
ver la respuesta
input()Cómo se llega- Pedirle un dato al usuario es input().
- Si es número, se envuelve en int() o float().
- ¿En qué se traduce «repetir 5 veces»?
ver la respuesta
for i in range(5)Cómo se llega- Repetir un número conocido de veces es un for.
- range(5) da cinco vueltas.
- Escribe el pseudocódigo en orden: ¿va antes «dividir entre 5» o «repetir 5 veces»?
ver la respuesta
Repetir 5 vecesCómo se llega- Primero hay que juntar las cinco calificaciones.
- El promedio se calcula al final, cuando ya está la suma.
- ¿Qué figura del diagrama de flujo usarías para «imprimir el resultado»?
ver la respuesta
El rectánguloCómo se llega- Es un paso que se hace, no una decisión.
- Va en rectángulo.
Variables: cajas con nombre
Lección 3 de 14
Una variable es una caja con nombre donde guardas un valor. El signo = no es «igual a»: es «guarda en». Por eso x = x + 1 tiene sentido: toma lo que hay, súmale 1 y guárdalo de nuevo.
Lo que hay que saber
Un programa necesita recordar cosas: el puntaje, el nombre del jugador, cuántas vidas quedan. Para eso usa variables: cajas con nombre donde guardas un valor. Para crear una escribes el nombre, el signo = y lo que quieres guardar.
edad = 12 nombre = "Ana"
Desde ese momento, cada vez que escribes edad, Python va a la caja y saca el 12. Fíjate en la diferencia: sin comillas usa la caja; con comillas es solo la palabra.
edad = 12
print(edad)
print("edad")
Sale:
12 edad
Por eso una caja puede cambiar de valor, y por eso tiene sentido esta línea que en matemáticas sería imposible:
x = 5 x = x + 1 print(x)
Sale:
6
Léela así: «toma lo que hay en x (5), súmale 1 (6) y guarda el resultado en x». La caja tenía 5; ahora tiene 6. El valor viejo se pierde.
Para seguir un programa con variables conviene hacer una tabla de seguimiento: un renglón por línea, y qué queda en cada caja después de esa línea.
puntos = 10 puntos = puntos + 5 puntos = puntos * 2 print(puntos)
| Línea | Qué hace | puntos |
|---|---|---|
| puntos = 10 | crea la caja | 10 |
| puntos = puntos + 5 | 10 + 5 | 15 |
| puntos = puntos * 2 | 15 × 2 | 30 |
| print(puntos) | muestra 30 | 30 |
Nombres válidos. Un nombre lleva letras, números y guion bajo, sin espacios ni acentos, y no puede empezar con número: edad, mi_edad, puntos2 sí; 2puntos, mi edad, mi-edad no. Mayúsculas y minúsculas son distintas: Edad y edad son dos cajas diferentes. Y un buen nombre dice qué guarda: precio es mejor que p.
Así se hace, paso a paso
¿Qué imprime este programa?
a = 4 b = a a = a + 3 print(a) print(b)
Paso 1 · a = 4. La caja a tiene 4.
Paso 2 · b = a. Python saca lo que hay en a (4) y lo guarda en b. Ahora b tiene 4. Es una copia: b no queda «amarrada» a a.
Paso 3 · a = a + 3. 4 + 3 = 7, se guarda en a. La caja b no se entera: sigue con 4.
Paso 4 · Los prints. a es 7, b es 4.
Sale:
7 4
a = 7, b = 4. Cuando copias una caja, cambiar la original no cambia la copia.
Usar una caja que no existe. Si escribes print(puntaje) y nunca hiciste puntaje = algo, Python se detiene con un NameError: «no sé qué es puntaje».
Cambiar una letra del nombre. vidas y Vidas y vida son tres cajas distintas. Si creas vidas e imprimes vida, también es NameError.
Leer el = como en mates. x = x + 1 no es una ecuación sin solución: es una orden. Derecha primero, luego guarda.
Ejercicios
- ¿Qué imprime?
x = 3 print(x)
ver la respuesta
3Cómo se llega- La caja x guarda 3.
- print(x) sin comillas muestra lo que hay en la caja.
- ¿Qué imprime?
x = 3 x = 10 print(x)
ver la respuesta
10Cómo se llega- Primero guarda 3.
- Luego guarda 10 y el 3 se pierde.
- Sale el último valor: 10.
- ¿Qué vale y al final?
y = 8 y = y - 3 y = y * 2
ver la respuesta
10Cómo se llega- y = 8.
- y = 8 − 3 = 5.
- y = 5 × 2 = 10.
- Encuentra el error:
vidas = 3 print(vida)
ver la respuesta
La caja se llama vidas, no vida: NameErrorCómo se llega- La primera línea crea vidas (con s).
- print(vida) busca otra caja que no existe.
- ¿Cuál de estos nombres de variable sí acepta Python?
mi puntaje,3vidas,nivel_2ver la respuesta
nivel_2Cómo se llega- mi puntaje tiene espacio: no.
- 3vidas empieza con número: no.
- nivel_2: letras, guion bajo y número al final: sí.
- Una torta cuesta $45 y le suben $15. Escribe el programa que guarda el precio en una variable, le suma el aumento y muestra el precio nuevo.
ver la respuesta
precio = 45 / precio = precio + 15 / print(precio) → 60Cómo se llega- Crea la caja: precio = 45.
- Súbele: precio = precio + 15 (ahora tiene 60).
- Muestra: print(precio).
Tipos de datos: número, texto, verdadero o falso
Lección 4 de 14
Python distingue entre números enteros (int), decimales (float), texto (str) y verdadero/falso (bool). "3" con comillas es texto, no número: por eso "3" + "4" da 34 y no 7.
Lo que hay que saber
No todos los valores son iguales para Python. Hay cuatro tipos que vas a usar todo el tiempo:
| Tipo | Qué es | Ejemplos |
|---|---|---|
| int | número entero | 12, 0, −5, 1000 |
| float | número con punto decimal | 3.5, 0.25, 2.0 |
| str | texto (string): va entre comillas | "Hola", "Ana", "3" |
| bool | verdadero o falso | True, False |
Para saber de qué tipo es algo, se lo preguntas a Python con type():
print(type(12))
print(type(3.5))
print(type("Hola"))
print(type(True))
Sale:
<class 'int'> <class 'float'> <class 'str'> <class 'bool'>
Lo que más confunde: las comillas convierten cualquier cosa en texto, aunque adentro haya un número. "3" no es el número 3: es el dibujo de un 3. Y con texto, el signo + no suma: pega.
print(3 + 4)
print("3" + "4")
print("Hola" + " " + "Ana")
print("ja" * 3)
Sale:
7 34 Hola Ana jajaja
Cuando tienes un dato del tipo equivocado, lo conviertes: int("3") vuelve el texto "3" en el número 3; str(5) vuelve el número 5 en el texto "5"; float("2.5") da el decimal 2.5.
print(int("3") + int("4"))
print(str(5) + "0")
print(float("2.5") + 1)
Sale:
7 50 3.5
En el juego «Fábrica de palabras» hiciste justo esto: pegar, repetir y recortar textos. Y en «Calculadora de código» viste que la calculadora se queja si le das un texto donde iba un número.
Así se hace, paso a paso
Cuatro programas parecidos, cuatro salidas distintas
print("3" + "4")
print(int("3") + int("4"))
print(str(3) + str(4))
print("3" * 4)
Línea 1. Dos textos: + pega. "3" + "4" = "34".
Línea 2. int() los convierte en números: 3 + 4 = 7.
Línea 3. str() convierte los números en texto: "3" + "4" = "34".
Línea 4. Texto × número repite: "3" cuatro veces.
Sale:
34 7 34 3333
Lo que decide el resultado no es el signo: es el tipo de los datos.
Pegar texto con número. print("Tengo " + 12 + " años") da TypeError. Arreglo: str(12).
Creer que "12" es un número. Con comillas es texto. "12" + 1 también es TypeError; int("12") + 1 da 13.
Ejercicios
- ¿De qué tipo es cada uno? 7, 7.0, "7"
ver la respuesta
int, float, strCómo se llega- 7 es entero: int.
- 7.0 tiene punto: float.
- "7" tiene comillas: texto, str.
- ¿Qué imprime?
print("5" + "5")ver la respuesta
55Cómo se llega- Los dos tienen comillas: son texto.
- Texto + texto pega: 55.
- ¿Qué imprime?
print(int("5") + 5)ver la respuesta
10Cómo se llega- int("5") convierte el texto en el número 5.
- 5 + 5 = 10.
- ¿Qué imprime?
print("na" * 4)ver la respuesta
nanananaCómo se llega- Texto × número repite el texto.
- na cuatro veces.
- Encuentra el error y corrígelo:
print("Tengo " + 12 + " años")ver la respuesta
Texto + número da TypeError. Corregido: print("Tengo " + str(12) + " años")Cómo se llega- "Tengo " es texto y 12 es número: no se pueden pegar.
- str(12) lo vuelve texto "12" y ya se pega todo.
- Tienes nombre = "Luis" y edad = 12. Escribe el print que muestre: Luis tiene 12 años
ver la respuesta
print(nombre + " tiene " + str(edad) + " años")Cómo se llega- nombre ya es texto; edad es número.
- Convierte edad con str() y pega todo con +.
- No olvides los espacios dentro de las comillas.
Operaciones y pedirle datos al usuario
Lección 5 de 14
Python tiene siete operaciones básicas y respeta la jerarquía igual que en mates. input() te deja pedirle algo al usuario, pero SIEMPRE te lo da como texto: si es un número, hay que convertirlo.
Lo que hay que saber
Python es una calculadora muy obediente. Estas son sus operaciones con números:
| Signo | Qué hace | Ejemplo | Sale |
|---|---|---|---|
| + | suma | 7 + 2 | 9 |
| - | resta | 7 - 2 | 5 |
| * | multiplica | 7 * 2 | 14 |
| / | divide (siempre da decimal) | 7 / 2 | 3.5 |
| // | división entera: cuántas veces cabe | 7 // 2 | 3 |
| % | residuo: lo que sobra | 7 % 2 | 1 |
| ** | potencia | 7 ** 2 | 49 |
Ojo con la división: 6 / 2 no da 3, da 3.0 (un float). Si quieres el entero, usas 6 // 2. Y % es el residuo de la casita: por eso n % 2 == 0 dice si n es par.
La jerarquía es la misma que en matemáticas: primero paréntesis, luego potencias, luego multiplicar, dividir, // y %, y al final sumar y restar. De izquierda a derecha cuando empatan.
print(2 + 3 * 4) print((2 + 3) * 4) print(20 - 2 ** 3)
Sale:
14 20 12
Ahora lo nuevo: pedirle algo al usuario con input(). Lo que va entre paréntesis es la pregunta que se muestra; lo que la persona escriba se guarda en la variable.
nombre = input("¿Cómo te llamas? ")
print("Hola, " + nombre)
Sale (si escribes Ana):
¿Cómo te llamas? Ana Hola, Ana
edad = int(input("¿Cuántos años tienes? "))
print("El año que entra tendrás", edad + 1)
Sale (si escribes 12):
¿Cuántos años tienes? 12 El año que entra tendrás 13
Sin el int(), edad + 1 sería "12" + 1: texto más número, TypeError. Fíjate también que print acepta varias cosas separadas por coma y les pone un espacio entre ellas.
Hay una forma más cómoda de mezclar texto con variables: la f-string. Pones una f antes de las comillas y, adentro, las variables entre llaves. Python las sustituye por su valor (y hasta hace cuentas adentro).
edad = 12
print(f"Tienes {edad} años y en 5 años tendrás {edad + 5}")
Sale:
Tienes 12 años y en 5 años tendrás 17
Así se hace, paso a paso
Un programa que pide dos números y muestra su suma y su producto
Paso 1 · Pide los datos y conviértelos. Son números, así que int(input(...)).
Paso 2 · Haz las cuentas en variables. Una para la suma, una para el producto.
Paso 3 · Muestra con f-strings.
a = int(input("Primer número: "))
b = int(input("Segundo número: "))
suma = a + b
producto = a * b
print(f"{a} + {b} = {suma}")
print(f"{a} x {b} = {producto}")
Sale (si escribes 6 y 7):
Primer número: 6 Segundo número: 7 6 + 7 = 13 6 x 7 = 42
Sin los int(), la «suma» habría sido 67: texto pegado.
Olvidar convertir el input. Es el error número uno. Si vas a sumar, restar o comparar con números, el input va dentro de int() o float().
Confundir / con //. 7 / 2 = 3.5 y 7 // 2 = 3. Si quieres «cuántos camiones completos», es //.
Olvidar la f. Sin la f, "Tienes {edad} años" se imprime tal cual, con las llaves.
Ejercicios
- ¿Qué imprime?
print(10 // 3) print(10 % 3)
ver la respuesta
3 y 1Cómo se llega- 10 // 3: el 3 cabe 3 veces.
- 10 % 3: sobra 1.
- ¿Qué imprime?
print(2 + 3 * 4)
ver la respuesta
14Cómo se llega- Primero multiplica: 3 × 4 = 12.
- Luego suma: 2 + 12 = 14.
- ¿Qué imprime?
print((2 + 3) * 4)
ver la respuesta
20Cómo se llega- El paréntesis va primero: 2 + 3 = 5.
- 5 × 4 = 20.
- Encuentra el error:
edad = input("¿Edad? ") print(edad + 1)ver la respuesta
input da texto; texto + 1 es TypeError. Arreglo: edad = int(input("¿Edad? "))Cómo se llega- Aunque escribas 12, input lo guarda como "12".
- "12" + 1 mezcla texto y número.
- int() lo convierte antes de sumar.
- ¿Qué imprime si el usuario escribe 7?
n = int(input()) print(f"El doble de {n} es {n * 2}")ver la respuesta
El doble de 7 es 14Cómo se llega- n = 7 (ya convertido).
- La f-string sustituye {n} por 7 y {n * 2} por 14.
- Escribe el programa que pide el precio de una torta y cuántas quieres, y muestra «Son $__ en total».
ver la respuesta
precio = int(input("Precio: ")) / cantidad = int(input("Cuántas: ")) / print(f"Son ${precio * cantidad} en total")Cómo se llega- Dos inputs convertidos a int.
- El total es precio × cantidad.
- Una f-string con la cuenta entre llaves.
Condicionales: if, elif, else
Lección 6 de 14
Un if hace una pregunta de verdadero o falso. Si es verdadera, se ejecuta lo que está con sangría debajo; si no, se salta. La sangría de 4 espacios no es adorno: es lo que le dice a Python qué pertenece al if.
Lo que hay que saber
Hasta ahora los programas hacen siempre lo mismo. Un if («si») les permite decidir: hace una pregunta, y según la respuesta hace una cosa u otra.
edad = 15
if edad >= 12:
print("Puedes entrar")
else:
print("Todavía no")
Sale:
Puedes entrar
Mira la forma: la pregunta termina en dos puntos, y lo que depende de ella va un escalón adentro (4 espacios). A eso se le llama sangría. El else («si no») es lo que pasa cuando la pregunta sale falsa; es opcional.
Las preguntas se hacen con comparaciones, que siempre dan True o False:
| Se escribe | Pregunta | Ejemplo |
|---|---|---|
| == | ¿es igual? | 5 == 5 → True |
| != | ¿es distinto? | 5 != 3 → True |
| > | ¿es mayor? | 5 > 8 → False |
| < | ¿es menor? | 5 < 8 → True |
| >= | ¿mayor o igual? | 5 >= 5 → True |
| <= | ¿menor o igual? | 5 <= 4 → False |
Ojo: == (dos signos) pregunta si es igual; = (uno) guarda en una caja. Son cosas distintas.
Cuando hay más de dos caminos, usas elif («si no, pero si…»). Python revisa las preguntas de arriba abajo y entra en la primera que sea verdadera; las demás ya no las mira.
calif = 8
if calif >= 9:
print("Excelente")
elif calif >= 6:
print("Aprobado")
else:
print("A estudiar")
Sale:
Aprobado
Puedes juntar preguntas con and (las dos tienen que ser verdaderas), or (basta una) y not (voltea la respuesta). Es lo mismo que el «y», «o» y «no» del curso de Lógica.
edad = 14
if edad >= 12 and edad <= 15:
print("Eres de secundaria")
Para saber qué hace un programa con if, sigue las líneas con la mano, en una tabla: qué vale cada variable, si cada pregunta sale verdadera o falsa, y por dónde se va.
Así se hace, paso a paso
Seguir con la mano este programa
x = 7
if x > 10:
print("A")
elif x % 2 == 1:
print("B")
else:
print("C")
print("D")
| Línea | ¿Qué pasa? |
|---|---|
| x = 7 | x vale 7 |
| if x > 10 | ¿7 > 10? Falso: se salta la A |
| elif x % 2 == 1 | 7 % 2 = 1. ¿1 == 1? Verdadero: imprime B |
| else | ya entró en una rama: no se revisa |
| print("D") | sin sangría: se ejecuta siempre |
Sale:
B D
Solo una rama del if-elif-else se ejecuta. La D sale siempre porque está pegada a la izquierda.
Poner = en vez de ==. if x = 5: es SyntaxError. Para preguntar son dos.
Olvidar los dos puntos o la sangría. Las dos cosas van siempre: if x > 5: y la siguiente línea con 4 espacios.
Creer que se ejecutan todas las ramas verdaderas. Con elif, solo la primera verdadera. Si calif = 10, sale «Excelente» nada más, aunque también sea mayor que 6.
Ejercicios
- ¿Qué imprime?
x = 4 if x > 3: print("sí") else: print("no")ver la respuesta
síCómo se llega- ¿4 > 3? Verdadero.
- Entra al if: sí.
- ¿Qué imprime?
n = 10 if n == 5: print("cinco") print("fin")ver la respuesta
finCómo se llega- ¿10 == 5? Falso: se salta «cinco».
- print("fin") no tiene sangría: se ejecuta siempre.
- Encuentra el error:
if x = 5: print("cinco")ver la respuesta
Para comparar es ==, no =Cómo se llega- Un solo = es «guarda en».
- La pregunta «¿es igual?» se escribe x == 5.
- ¿Qué le falta a este programa?
x = 8 if x > 2 print("grande")ver la respuesta
Los dos puntos después de x > 2 y la sangría en el printCómo se llega- Toda pregunta termina en dos puntos.
- Lo que depende del if va 4 espacios adentro.
- ¿Qué imprime?
temp = 30 if temp > 35: print("Mucho calor") elif temp > 25: print("Calor") else: print("Fresco")ver la respuesta
CalorCómo se llega- ¿30 > 35? Falso.
- ¿30 > 25? Verdadero: Calor.
- El else ya no se revisa.
- Escribe un programa que pida la edad y diga «Puedes votar» si es 18 o más, y «Todavía no» si no.
ver la respuesta
edad = int(input("¿Edad? ")) / if edad >= 18: / print("Puedes votar") / else: / print("Todavía no")Cómo se llega- Pide y convierte: int(input(...)).
- if edad >= 18: con dos puntos y sangría.
- else: para el otro caso.
Repetir con for
Lección 7 de 14
for i in range(5) repite lo de adentro 5 veces, con i valiendo 0, 1, 2, 3, 4. Empieza en 0 y termina antes del número que pusiste.
Lo que hay que saber
En «Atrapa el bucle» encontraste lo que se repetía y lo escribiste una sola vez. En Python eso se hace con for:
for i in range(5):
print("Hola")
Sale:
Hola Hola Hola Hola Hola
Léelo así: «para cada i en el rango de 5, haz lo de adentro». Lo de adentro, igual que en el if, va con sangría y dos puntos antes. La variable i es el contador de vueltas, y vale algo distinto en cada una:
for i in range(5):
print(i)
Sale:
0 1 2 3 4
Si quieres empezar en otro número, le das inicio y fin: range(1, 6) es 1, 2, 3, 4, 5 (el 6 no entra). Y con un tercer número das el paso: range(2, 11, 2) es 2, 4, 6, 8, 10.
for i in range(1, 4):
print(f"Vuelta {i}")
Sale:
Vuelta 1 Vuelta 2 Vuelta 3
Lo más útil de un bucle es acumular: ir sumando en una caja vuelta tras vuelta. La caja se crea antes del bucle, en 0, y cada vuelta le agrega algo. Para no perderte, haz la tabla de seguimiento con una columna por variable:
suma = 0
for i in range(1, 5):
suma = suma + i
print(suma)
| Vuelta | i | suma = suma + i |
|---|---|---|
| antes | — | 0 |
| 1 | 1 | 0 + 1 = 1 |
| 2 | 2 | 1 + 2 = 3 |
| 3 | 3 | 3 + 3 = 6 |
| 4 | 4 | 6 + 4 = 10 |
Sale:
10
Y la tortuga de «El tortugito» es puro for. Un cuadrado son cuatro veces «avanza y gira 90°»:
import turtle
t = turtle.Turtle()
for i in range(4):
t.forward(100)
t.left(90)Las dos líneas con sangría se repiten juntas, cuatro veces. Con range(3) y left(120) sale un triángulo; con range(6) y left(60), un hexágono. El giro siempre es 360 entre el número de lados.
Así se hace, paso a paso
¿Qué imprime este programa?
total = 0
for i in range(3):
total = total + 5
print(total)
print("Fin")
Paso 1 · ¿Cuántas vueltas? range(3): tres, con i = 0, 1, 2. Aquí i no se usa adentro; solo cuenta.
Paso 2 · Tabla. total empieza en 0. Vuelta 1: 0 + 5 = 5, imprime 5. Vuelta 2: 5 + 5 = 10, imprime 10. Vuelta 3: 10 + 5 = 15, imprime 15.
Paso 3 · Lo de afuera. print("Fin") no tiene sangría: se hace una sola vez, al terminar el bucle.
Sale:
5 10 15 Fin
Tres vueltas, tres números, y el Fin una sola vez.
Contar una vuelta de más. range(5) son cinco vueltas, pero i llega hasta 4, no hasta 5. Si quieres del 1 al 10, es range(1, 11).
Crear la caja dentro del bucle. Si pones suma = 0 adentro, cada vuelta la borra y nunca acumula. La caja se crea antes.
Sangría a medias. Lo que está con sangría se repite; lo que no, se hace una vez. Un print mal alineado sale 5 veces en vez de 1, o al revés.
Ejercicios
- ¿Cuántas veces se imprime Hola?
for i in range(7): print("Hola")ver la respuesta
7Cómo se llega- range(7) da 7 valores: 0 a 6.
- Una vuelta por cada uno.
- ¿Qué imprime?
for i in range(3): print(i)ver la respuesta
0, 1, 2 (cada uno en su renglón)Cómo se llega- Empieza en 0.
- Termina antes del 3.
- ¿Qué imprime?
for i in range(2, 5): print(i)ver la respuesta
2, 3, 4Cómo se llega- Empieza en 2.
- El 5 no entra.
- ¿Qué vale suma al final?
suma = 0 for i in range(1, 4): suma = suma + iver la respuesta
6Cómo se llega- i vale 1, 2, 3.
- suma: 0 → 1 → 3 → 6.
- ¿Qué falta para que la tortuga dibuje un hexágono?
for i in range(6): t.forward(80)ver la respuesta
t.left(60) con sangría, debajo del forwardCómo se llega- Seis lados: seis vueltas, ya está.
- Falta girar después de cada lado: 360 ÷ 6 = 60°.
- Escribe el programa que imprime la tabla del 7, del 1 al 10, en la forma «7 x 3 = 21».
ver la respuesta
for i in range(1, 11): / print(f"7 x {i} = {7 * i}")Cómo se llega- Del 1 al 10 es range(1, 11).
- En cada vuelta una f-string con i y 7 * i.
Repetir con while
Lección 8 de 14
while repite MIENTRAS una condición sea verdadera. Algo adentro tiene que acercarla a falsa, o el bucle nunca termina. for es para «tantas veces»; while es para «hasta que pase algo».
Lo que hay que saber
El for sirve cuando sabes cuántas vueltas quieres. Pero a veces no lo sabes: «pregunta hasta que acierte», «resta hasta que se acabe». Para eso está while («mientras»): repite lo de adentro mientras la condición sea verdadera, y la revisa antes de cada vuelta.
x = 1
while x <= 3:
print(x)
x = x + 1
print("Fin")
| x | ¿x <= 3? | Qué hace |
|---|---|---|
| 1 | Sí | imprime 1, x pasa a 2 |
| 2 | Sí | imprime 2, x pasa a 3 |
| 3 | Sí | imprime 3, x pasa a 4 |
| 4 | No | se sale del bucle |
Sale:
1 2 3 Fin
La variable que se revisa en la condición se llama contador. Fíjate en la línea x = x + 1: es la que mueve al contador. Sin ella, pasa esto:
x = 1
while x <= 3:
print(x)
Sale:
1 1 1 1 … (nunca termina)
Es un bucle infinito: x siempre vale 1, la condición siempre es verdadera, y el programa se queda imprimiendo unos para siempre. Si te pasa, lo detienes con Ctrl + C.
A veces quieres salir del bucle a la mitad, sin esperar la condición. Para eso está break («rompe»): sale del bucle en ese instante. Es común con while True: (una condición que siempre es verdadera) y un if adentro que decide cuándo parar.
while True:
r = input("¿Seguimos? ")
if r == "no":
break
print("Adiós")
Pregunta y pregunta; en cuanto escribes «no», el break lo saca y sale «Adiós».
¿for o while? Si sabes cuántas veces (10 vueltas, cada elemento de una lista): for. Si es hasta que pase algo (que acierte, que se acabe el dinero, que escriba «salir»): while.
Así se hace, paso a paso
Seguir con la mano una cuenta regresiva
n = 10
while n > 0:
n = n - 3
print(n)
| n al revisar | ¿n > 0? | Adentro |
|---|---|---|
| 10 | Sí | n = 7, imprime 7 |
| 7 | Sí | n = 4, imprime 4 |
| 4 | Sí | n = 1, imprime 1 |
| 1 | Sí | n = −2, imprime −2 |
| −2 | No | se sale |
Sale:
7 4 1 -2
Fíjate: imprime el −2 porque la condición se revisa ANTES de cada vuelta, no después de restar. Cuando n era 1, todavía era mayor que 0 y entró una vez más.
El bucle infinito. Olvidar mover el contador. Revisa siempre que adentro haya un x = x + 1, un n = n − 1 o algo que cambie la condición.
Una vuelta de más o de menos. while x < 5 y while x <= 5 no dan lo mismo. Haz la tabla.
Comparar con = en vez de ==. Igual que en el if: while r = "no" es SyntaxError.
Ejercicios
- ¿Cuántas veces se imprime Hola?
x = 0 while x < 4: print("Hola") x = x + 1ver la respuesta
4Cómo se llega- x vale 0, 1, 2, 3 al entrar: cuatro vueltas.
- Cuando x llega a 4, ya no es menor que 4.
- ¿Qué vale x al final?
x = 2 while x < 20: x = x * 2ver la respuesta
32Cómo se llega- x: 2 → 4 → 8 → 16 → 32.
- Con 16 todavía entra (16 < 20); con 32 ya no.
- Este programa nunca termina. ¿Qué le falta?
n = 5 while n > 0: print(n)ver la respuesta
n = n - 1 dentro del bucleCómo se llega- n siempre vale 5: la condición nunca se vuelve falsa.
- Hay que restarle en cada vuelta.
- ¿Qué imprime?
i = 1 while i <= 10: if i == 4: break print(i) i = i + 1ver la respuesta
1, 2, 3Cómo se llega- Imprime 1, 2, 3.
- Cuando i vale 4, el break lo saca antes de imprimir.
- ¿for o while? a) Imprimir los números del 1 al 100. b) Pedir la contraseña hasta que sea correcta. c) Sumar las 5 calificaciones de un alumno.
ver la respuesta
a) for, b) while, c) forCómo se llega- a y c: sabes cuántas vueltas.
- b: no sabes cuántos intentos; es hasta que pase algo.
- Escribe un programa que pida una contraseña una y otra vez hasta que escriban «python», y entonces diga «Bienvenido».
ver la respuesta
clave = "" / while clave != "python": / clave = input("Contraseña: ") / print("Bienvenido")Cómo se llega- Crea la caja vacía antes del while.
- Mientras sea distinta de "python", vuelve a pedir.
- El print va afuera, sin sangría.
La tabla de rastreo: seguir el código a mano
Lección 9 de 14
Haz una tabla con una columna por variable y un renglón por vuelta, y ve anotando los valores. Es la única manera de saber de verdad qué hace un bucle.
Lo que hay que saber
Un bucle se puede copiar sin entenderlo. La prueba de que lo entiendes es poder decir, sin correr el programa, qué valor tiene cada variable en cada vuelta. Para eso está la tabla de rastreo: una columna por variable y un renglón por vuelta.
total = 0
for i in range(1, 5):
total = total + i
print(total)
Se sigue a mano, anotando antes y después de cada vuelta:
| Vuelta | i | total antes | total después |
|---|---|---|---|
| 1ª | 1 | 0 | 1 |
| 2ª | 2 | 1 | 3 |
| 3ª | 3 | 3 | 6 |
| 4ª | 4 | 6 | 10 |
El programa imprime 10, y ahora sabes por qué. Fíjate en dos cosas que la tabla deja ver y el código no: que range(1, 5) da cuatro vueltas (el 5 no entra) y que total se va acumulando en lugar de empezar de cero cada vez.
Cómo se hace, paso a paso:
- Apunta las variables que hay, cada una en su columna, con su valor inicial.
- Entra a la primera vuelta y escribe el valor de la variable del bucle.
- Ejecuta cada línea de adentro, en orden, cambiando los valores que toquen.
- Al final de la vuelta, revisa la condición: ¿hay otra vuelta?
- Cuando se acaba, la última línea de la tabla es lo que va a imprimir.
Con un while es igual, pero hay que apuntar la condición, porque ahí es donde se cuelgan los programas:
vidas = 3
while vidas > 0:
print("Te quedan", vidas)
vidas = vidas - 1
| Vuelta | vidas al entrar | ¿vidas > 0? | imprime | vidas al salir |
|---|---|---|---|---|
| 1ª | 3 | sí | Te quedan 3 | 2 |
| 2ª | 2 | sí | Te quedan 2 | 1 |
| 3ª | 1 | sí | Te quedan 1 | 0 |
| 4ª | 0 | no | — | se sale |
Si en ese programa borras la línea vidas = vidas - 1, la condición nunca se vuelve falsa y el programa no se detiene nunca. La tabla lo caza al tercer renglón, cuando ves que la columna de vidas no se mueve.
Así se hace, paso a paso
Rastrea este programa y di qué imprime
x = 10
for i in range(3):
x = x - 2
print(x)
Paso 1 · las columnas. Hay dos variables: i (la del bucle) y x, que empieza en 10.
Paso 2 · lleno los renglones. Vuelta 1: i = 0, x pasa de 10 a 8. Vuelta 2: i = 1, x pasa de 8 a 6. Vuelta 3: i = 2, x pasa de 6 a 4.
Paso 3 · cuántas vueltas. range(3) da tres vueltas, con i valiendo 0, 1 y 2. Nunca llega a 3.
Paso 4 · la respuesta. El print está afuera del bucle, así que se hace una sola vez, al final.
Imprime 4.
Así se hace, paso a paso
Cazar un bucle infinito con la tabla
n = 5
while n != 0:
print(n)
n = n - 2
Paso 1 · rastreo. n = 5 (imprime 5), luego 3 (imprime 3), luego 1 (imprime 1), luego −1…
Paso 2 · reviso la condición. La condición es n != 0, o sea «mientras n no sea cero». Pero n va 5, 3, 1, −1, −3… nunca pasa por el 0.
Paso 3 · la conclusión. El bucle no se detiene nunca. Con tres renglones de tabla ya se veía venir.
Paso 4 · cómo se arregla. Cambiar la condición a n > 0, que sí se vuelve falsa.
Es un bucle infinito: la condición nunca se cumple porque n se salta el 0.
Llenar la tabla «de memoria». Cada renglón se calcula del anterior, aunque ya creas saber el resultado.
Olvidar que range(3) empieza en 0. Da 0, 1 y 2: tres vueltas, pero el último valor es 2.
Confundir el print de adentro con el de afuera. Adentro imprime en cada vuelta; afuera, una sola vez al final. La sangría lo decide.
Ejercicios
- ¿Qué imprime?
t = 0 for i in range(1, 4): t = t + i print(t)ver la respuesta
6Cómo se llega- i vale 1, 2 y 3 (el 4 no entra).
- t: 0 → 1 → 3 → 6.
- ¿Cuántas vueltas da
for i in range(5)?ver la respuesta
5Cómo se llega- i vale 0, 1, 2, 3 y 4.
- Son 5 vueltas, aunque nunca llegue al 5.
- ¿Qué imprime?
x = 20 for i in range(4): x = x - 5 print(x)ver la respuesta
0Cómo se llega- Cuatro vueltas restando 5: 15, 10, 5, 0.
- El print está afuera: imprime 0.
- En la tabla de rastreo, ¿qué va en cada columna?
ver la respuesta
Una variableCómo se llega- Una columna por variable y un renglón por vuelta.
- Así se ve cómo cambia cada una.
- ¿Qué imprime?
v = 3 while v > 0: v = v - 1 print(v)ver la respuesta
0Cómo se llega- v baja 3 → 2 → 1 → 0 y ahí la condición se vuelve falsa.
- Imprime 0.
- Si a un
whilele quitas la línea que cambia la variable de la condición, ¿qué pasa?ver la respuesta
Se vuelve un bucle infinitoCómo se llega- La condición nunca se vuelve falsa.
- El programa no se detiene: hay que pararlo a mano.
Listas
Lección 10 de 14
Una lista guarda varios valores en una sola caja, en orden. Cada uno tiene un número de lugar (índice) que empieza en 0. El último es el [-1].
Lo que hay que saber
Si quieres guardar las calificaciones de 30 alumnos, no vas a hacer 30 variables. Para eso existe la lista: una caja con varios compartimentos, en orden. Se escribe entre corchetes, con los valores separados por coma.
frutas = ["manzana", "pera", "uva"] print(frutas[0]) print(frutas[2]) print(len(frutas))
Sale:
manzana uva 3
Cada compartimento tiene un número que se llama índice, y empieza en 0: el primero es [0], el segundo [1], el tercero [2]. len() dice cuántos elementos hay.
| Lugar | primero | segundo | tercero |
|---|---|---|---|
| Índice | 0 | 1 | 2 |
| Valor | manzana | pera | uva |
Hay un atajo para el último: [-1]. Y [-2] es el penúltimo. Así no tienes que saber cuántos hay.
Para agregar al final se usa append, y para recorrer la lista completa, un for que va tomando los elementos uno por uno (sin range: directamente «para cada fruta en frutas»):
frutas.append("mango")
print(frutas[-1])
for f in frutas:
print("Me gusta la " + f)
Sale:
mango Me gusta la manzana Me gusta la pera Me gusta la uva Me gusta la mango
Las listas también guardan números, y con un for se acumulan igual que en la lección anterior. Y para buscar si algo está, se usa in:
califs = [8, 10, 7]
total = 0
for c in califs:
total = total + c
print(total)
print(10 in califs)
Sale:
25 True
Así se hace, paso a paso
¿Qué imprime este programa?
nums = [4, 8, 15]
nums.append(16)
total = 0
for n in nums:
total = total + n
print(total)
print(nums[-1])
print(nums[1])
Paso 1 · Después del append. La lista es [4, 8, 15, 16]: cuatro elementos, índices 0 a 3.
Paso 2 · El for. n toma 4, 8, 15, 16. total: 0 → 4 → 12 → 27 → 43.
Paso 3 · Los índices. [-1] es el último: 16. [1] es el segundo (no el primero): 8.
Sale:
43 16 8
Cuatro elementos, índices 0, 1, 2, 3; el [1] es el segundo.
Contar desde 1. El error clásico: pensar que [1] es el primero. Es el segundo. El primero es [0].
Pedir el índice igual al tamaño. Si len es 3, el [3] no existe: IndexError. El último es [2] o [-1].
Olvidar los corchetes al crearla. frutas = "manzana", "pera" no es una lista (bueno, es otra cosa). Las listas llevan [ ].
Ejercicios
- ¿Qué imprime?
colores = ["rojo", "verde", "azul"] print(colores[1])
ver la respuesta
verdeCómo se llega- [0] es rojo, [1] es verde.
- El índice 1 es el segundo.
- Con la misma lista, ¿qué imprimen?
print(len(colores)) print(colores[-1])
ver la respuesta
3 y azulCómo se llega- len cuenta: 3.
- [-1] es el último: azul.
- Encuentra el error:
colores = ["rojo", "verde", "azul"] print(colores[3])
ver la respuesta
IndexError: los índices son 0, 1 y 2; el 3 no existeCómo se llega- Tres elementos: índices 0, 1, 2.
- Para el último: colores[2] o colores[-1].
- ¿Cómo queda la lista?
lista = [1, 2] lista.append(3) lista.append(4)
ver la respuesta
[1, 2, 3, 4]Cómo se llega- append agrega al final, uno por uno.
- ¿Qué imprime?
for n in [2, 4, 6]: print(n * 10)ver la respuesta
20, 40, 60Cómo se llega- n toma 2, luego 4, luego 6.
- Cada uno por 10.
- Escribe un programa con una lista de 5 calificaciones que calcule y muestre el promedio.
ver la respuesta
califs = [8, 9, 7, 10, 6] / total = 0 / for c in califs: / total = total + c / print(total / len(califs))Cómo se llega- Acumula con un for.
- Promedio = total entre cuántas hay: len(califs).
- Sale 8.0.
Funciones: escribirlo una vez, usarlo muchas
Lección 11 de 14
Una función es un pedazo de programa con nombre. Lo defines una vez con def y lo llamas las veces que quieras. Recibe datos (parámetros) y puede devolver un resultado con return.
Lo que hay que saber
Si en «El tortugito» dibujaste tres cuadrados, escribiste el mismo bucle tres veces. Una función evita eso: le pones nombre a un pedazo de programa y luego lo llamas por su nombre cuantas veces quieras.
def saluda(nombre):
print("Hola, " + nombre)
saluda("Ana")
saluda("Beto")
Sale:
Hola, Ana Hola, Beto
Las partes: def («define») avisa que viene una función; saluda es su nombre; lo que va entre paréntesis, nombre, es el parámetro: una caja que se llena con lo que le mandes al llamarla. El cuerpo va con sangría, como el if y el for. Y saluda("Ana") es la llamada: mete "Ana" en la caja nombre y ejecuta el cuerpo.
Muchas funciones no muestran nada: calculan y devuelven un resultado con return, para que lo uses donde quieras: guardarlo en una variable, imprimirlo, meterlo en otra cuenta.
def doble(x):
return x * 2
y = doble(4)
print(y)
print(doble(10) + 1)
Sale:
8 21
Una función puede tener varios parámetros, separados por coma. Al llamarla, los valores entran en el mismo orden:
def area(base, altura):
return base * altura
print(area(5, 3))
print(area(10, 2))
Sale:
15 20
Una idea importante: las variables que creas dentro de una función solo existen adentro. Si en area hicieras resultado = base * altura, afuera no podrías usar resultado: es una caja de adentro. Lo que quieras sacar, lo sacas con return.
Y la tortuga, con función: def cuadrado(lado): con el for de 4 vueltas adentro, y luego cuadrado(50), cuadrado(100), cuadrado(150). Tres cuadrados de distinto tamaño, un solo bucle escrito.
Así se hace, paso a paso
¿Qué imprime este programa?
def precio_final(precio, descuento):
rebaja = precio * descuento // 100
return precio - rebaja
print(precio_final(200, 10))
p = precio_final(50, 20)
print(p + 5)
Paso 1 · El def no hace nada todavía. Solo guarda la receta.
Paso 2 · Primera llamada. precio = 200, descuento = 10. rebaja = 200 × 10 // 100 = 20. return 200 − 20 = 180. Se imprime 180.
Paso 3 · Segunda llamada. precio = 50, descuento = 20. rebaja = 50 × 20 // 100 = 10. return 40. Se guarda en p.
Paso 4 · print(p + 5). 40 + 5 = 45.
Sale:
180 45
La misma receta, dos veces, con datos distintos. La caja rebaja solo existe dentro de la función.
Olvidar el return. Si la función solo hace print y no return, al hacer y = doble(4) la caja y queda con None («nada»). Si vas a usar el resultado, return.
Llamar sin los datos. Si la función pide un parámetro y la llamas vacía, saluda(), Python se queja: le falta nombre.
Olvidar los dos puntos y la sangría. def nombre(...): y el cuerpo adentro, como siempre.
Ejercicios
- ¿Qué imprime?
def triple(n): return n * 3 print(triple(5))ver la respuesta
15Cómo se llega- triple(5) mete 5 en n.
- return 5 × 3 = 15.
- ¿Qué imprime?
def hola(): print("Hola") print("Fin")ver la respuesta
FinCómo se llega- La función está definida pero nunca se llama.
- Solo se ejecuta el print de afuera.
- ¿Qué imprime?
def suma(a, b): return a + b print(suma(2, 3) + suma(1, 1))ver la respuesta
7Cómo se llega- suma(2, 3) = 5.
- suma(1, 1) = 2.
- 5 + 2 = 7.
- Encuentra el error:
def cuadrado(x): x * x print(cuadrado(3))ver la respuesta
Falta el return: imprime None. Debe ser return x * xCómo se llega- La función calcula 9 pero no lo devuelve.
- Sin return, la llamada vale None.
- ¿Qué falta en la llamada?
def saluda(nombre): print("Hola", nombre) saluda()ver la respuesta
El dato: saluda("Ana") o cualquier nombreCómo se llega- La función pide un parámetro.
- Hay que mandarle un valor al llamarla.
- Escribe una función precio_con_iva(precio) que devuelva el precio más 16 %, y úsala para 100 y para 250.
ver la respuesta
def precio_con_iva(precio): / return precio * 1.16 / print(precio_con_iva(100)) / print(precio_con_iva(250)) → 116.0 y 290.0Cómo se llega- Más 16 % es multiplicar por 1.16.
- return con la cuenta.
- Dos llamadas con distintos datos.
Leer los errores
Lección 12 de 14
Un mensaje de error no es un regaño: es Python diciéndote en qué línea se atoró y por qué. Lee el último renglón (el tipo de error) y el número de línea, y ya casi lo tienes.
Lo que hay que saber
Todos los programas fallan al principio. La diferencia entre quien programa y quien se frustra es que el primero lee el mensaje. Mira uno completo:
Traceback (most recent call last):
File "juego.py", line 2, in <module>
print(puntaje)
NameError: name 'puntaje' is not defined
Parece mucho, pero solo importan dos cosas: line 2 (en qué línea se atoró) y el último renglón: el tipo de error y una pista. «NameError: name puntaje is not defined» = «no conozco ninguna caja llamada puntaje». Vas a la línea 2 y ves que escribiste puntaje donde la caja se llamaba puntos.
Estos son los cuatro que vas a ver todo el tiempo, con sus causas:
| Error | Qué significa | Causas típicas |
|---|---|---|
| SyntaxError | está mal escrito; Python ni lo entiende | comillas o paréntesis sin cerrar, faltan los dos puntos del if/for/def, = en vez de == |
| NameError | usas un nombre que no existe | variable que no creaste, una letra cambiada, mayúscula distinta, Print en vez de print |
| TypeError | mezclas tipos que no van | texto + número, input() sin int(), llamar una función sin sus datos |
| IndentationError | la sangría está mal | falta sangría después de :, o sobra en una línea que no va adentro |
Hay otros dos que también verás: IndexError (pediste un lugar de la lista que no existe) y ZeroDivisionError (dividiste entre 0). Los nombres dicen lo que pasó: con el tiempo los lees como palabras normales.
Cuando el programa no explota pero da un resultado raro, la herramienta es probar con prints: pones print(variable) en varios puntos para ver qué valor lleva cada caja, y así descubres en qué línea se descompuso. Es lo mismo que la tabla de seguimiento, pero la hace Python por ti.
total = 0
for i in range(1, 4):
total = total + i
print("vuelta", i, "total", total)
print(total)
Sale:
vuelta 1 total 1 vuelta 2 total 3 vuelta 3 total 6 6
Si esperabas 10 y ves que la última vuelta es la 3, ya sabes: te faltó una vuelta, el range debía llegar a 5. Cuando lo arreglas, quitas el print de prueba.
Así se hace, paso a paso
Arreglar un programa con tres errores, uno por uno
nombre = input("¿Nombre? ")
edad = input("¿Edad? ")
if edad >= 12
print("Hola " + nombre + ", tienes " + edad + " años")
Error 1. Lo corres y sale: line 3 … SyntaxError: expected ':'. Línea 3, le faltan los dos puntos al if. Los pones.
Error 2. Lo corres de nuevo: line 3 … TypeError: '>=' not supported between 'str' and 'int'. Línea 3 otra vez: está comparando texto con número, porque input() dio texto. Arreglo en la línea 2: edad = int(input("¿Edad? ")).
Error 3. Otra vez: line 4 … TypeError: can only concatenate str (not "int") to str. Ahora edad es número y lo estás pegando con texto. Arreglo: str(edad), o mejor una f-string.
nombre = input("¿Nombre? ")
edad = int(input("¿Edad? "))
if edad >= 12:
print(f"Hola {nombre}, tienes {edad} años")
Un error a la vez: corre, lee la línea y el tipo, arregla, vuelve a correr. Nunca intentes arreglar tres cosas de un golpe.
No leer el mensaje. Muchos ven rojo y borran todo. El mensaje te está diciendo dónde y qué. Léelo de abajo hacia arriba.
Buscar el error solo en la línea que dice. A veces la causa está una o dos líneas arriba (una comilla sin cerrar, un paréntesis).
Arreglar a lo loco. Cambiar cosas al azar hasta que «funcione» suele meter errores nuevos. Un cambio, una prueba.
Ejercicios
- ¿Qué error da?
print("Hola)ver la respuesta
SyntaxError: faltan las comillas de cierreCómo se llega- Python no encuentra dónde termina el texto.
- Está mal escrito: SyntaxError.
- ¿Qué error da?
nombre = "Ana" print(Nombre)
ver la respuesta
NameError: Nombre con mayúscula no existeCómo se llega- La caja se llama nombre, con minúscula.
- Nombre es otro nombre que nunca se creó.
- ¿Qué error da?
print("Edad: " + 12)ver la respuesta
TypeError: texto + númeroCómo se llega- "Edad: " es str y 12 es int.
- No se pueden pegar sin str(12).
- ¿Qué error da?
x = 5 if x > 3: print("sí")ver la respuesta
IndentationError: al print le falta la sangríaCómo se llega- Después de los dos puntos, la siguiente línea va 4 espacios adentro.
- Lee este mensaje:
File "tienda.py", line 3, in <module> TypeError: can only concatenate str (not "int") to str
¿En qué línea está el error y qué pasó?ver la respuesta
Línea 3; se pegó un texto con un númeroCómo se llega- line 3 dice dónde.
- TypeError de concatenar str con int: falta str() o una f-string.
- Corrige los tres errores:
vidas = 3 Print("Te quedan " + vidas + " vidas") if vidas > 0 print("Sigue jugando")ver la respuesta
print con minúscula, str(vidas) (o f-string), y dos puntos después de vidas > 0Cómo se llega- Línea 2: Print → print (NameError).
- Línea 2: "texto" + vidas es TypeError → str(vidas).
- Línea 3: falta el : (SyntaxError).
Cazar el error por mitades
Lección 13 de 14
Si el programa corre pero da mal, pon un print a la mitad. Si ahí ya está mal, el error está antes; si está bien, está después. Cada print parte el problema en dos.
Lo que hay que saber
Hay dos clases de errores. Los de la lección anterior hacen que el programa truene, y el mensaje te dice la línea. Los peores son los otros: el programa corre bien y da un resultado equivocado, sin decir nada.
Para ésos hay un método, y es el mismo de «adivina el número»: partir por la mitad.
- Busca un caso donde falle y que puedas calcular a mano. Si no sabes cuál es la respuesta correcta, no puedes depurar.
- Pon un
printa la mitad del programa, mostrando las variables importantes. - Corre y compara con lo que debería valer ahí.
- Si ahí ya está mal, el error está antes; si está bien, está después.
- Repite en la mitad que quedó, hasta que el error quepa en una línea.
print bien puesto elimina la mitad del programa. Con 4 prints acorralas un error en un programa de 16 líneas.Es búsqueda binaria, igual que buscar una palabra en el diccionario: abres a la mitad y decides de qué lado seguir.Ejemplo. Este programa debería dar el promedio de 10 y 20, o sea 15, y da 20:
a = 10 b = 20 suma = a + b promedio = suma / a print(promedio)
Pongo un print a la mitad, después de la suma: print("suma:", suma). Sale 30, que es lo correcto, así que el error está después de esa línea. Y ahí está: dice suma / a en lugar de suma / 2.
Las tres preguntas de un programa que da mal, en orden:
| Pregunta | Qué revisar |
|---|---|
| ¿Entran bien los datos? | imprime las variables justo después de leerlas |
| ¿Está bien la cuenta? | imprime los valores de en medio y compáralos con los de tu mano |
| ¿Se imprime lo que debe? | revisa si el print está adentro o afuera del bucle |
Dos reglas de oro para no enredarte más:
- Un cambio, una prueba. Si cambias tres cosas y funciona, no sabes qué era; si deja de funcionar, tampoco.
- Quita los prints de depuración al final. No son parte del programa, son tus andamios.
El caso más común de todos. El programa da mal porque la variable no empezó donde debía: un total que no se puso en 0, o que se pone en 0 adentro del bucle y se borra en cada vuelta. La tabla de rastreo de la lección anterior y un print en la primera vuelta lo cazan en diez segundos.
Así se hace, paso a paso
Depurar un programa que suma mal
Debería sumar 1 + 2 + 3 + 4 + 5 = 15, y da 5:
for i in range(1, 6):
total = 0
total = total + i
print(total)
Paso 1 · el caso a mano. Sé que la respuesta correcta es 15. Eso es lo que me permite depurar.
Paso 2 · print adentro del bucle. Agrego print(i, total) como última línea de adentro. Sale: 1 1 · 2 2 · 3 3 · 4 4 · 5 5.
Paso 3 · leo el síntoma. El total nunca acumula: cada vuelta vale lo mismo que i. Entonces algo lo está poniendo en cero cada vez.
Paso 4 · la causa. total = 0 está adentro del bucle, así que se borra en cada vuelta. Va afuera, antes del for.
Paso 5 · compruebo. Con el total = 0 arriba, imprime 15. ✓ Y quito el print de depuración.
El error era la sangría de total = 0: estaba adentro del bucle.
Depurar sin saber la respuesta correcta. Primero calcula un caso a mano; si no, estás adivinando.
Cambiar cosas al azar. Un cambio, una prueba, y si no era, se deshace.
Poner los prints hasta el final. El print útil va en medio, donde parte el programa en dos.
Ejercicios
- Un programa corre pero da mal. ¿Dónde pones el primer print?
ver la respuesta
A la mitadCómo se llega- Así eliminas la mitad del programa de un golpe.
- Si ahí ya está mal, el error está antes; si está bien, después.
- Pones un print a la mitad y el valor ya está mal. ¿Dónde está el error?
ver la respuesta
Antes de ese printCómo se llega- El valor llegó mal a ese punto.
- Hay que buscar en la primera mitad.
- Pones un print a la mitad y el valor está bien. ¿Dónde está el error?
ver la respuesta
Después de ese printCómo se llega- Hasta ahí todo iba bien.
- El error está en la segunda mitad.
- ¿Qué imprime este programa, y qué debería imprimir?
for i in range(1, 4): total = 0 total = total + i print(total)ver la respuesta
Imprime 3 y debería imprimir 6Cómo se llega- total = 0 está adentro del bucle: se borra en cada vuelta.
- Va antes del for.
- Un programa de 16 líneas: ¿cuántos prints bien puestos bastan para acorralar el error en una línea?
ver la respuesta
4Cómo se llega- Cada print parte el problema a la mitad: 16 → 8 → 4 → 2 → 1.
- Son 4 pasos.
- ¿Qué haces con los prints de depuración cuando ya arreglaste el programa?
ver la respuesta
QuitarlosCómo se llega- Son andamios, no parte del programa.
- Se borran al final.
Simular: tirar diez mil dados
Lección 14 de 14
La computadora puede tirar un dado diez mil veces en un segundo. Comparar lo que sale con lo que la probabilidad predice es la mejor manera de entender las dos cosas.
Lo que hay que saber
En el curso de estadística aprendes que la probabilidad de sacar un 3 con un dado es 16. Eso quiere decir que a la larga sale una de cada seis veces. Pero «a la larga» no se puede ver tirando un dado veinte veces… y sí se puede ver con un programa.
Python trae una caja de herramientas para el azar que se llama random:
import random dado = random.randint(1, 6) print(dado)
random.randint(1, 6) da un número al azar del 1 al 6, los dos incluidos. Ahora lo tiramos diez mil veces y contamos cuántos 3 salen:
import random
treses = 0
for i in range(10000):
if random.randint(1, 6) == 3:
treses = treses + 1
print(treses)
Lo esperado es 10 000 ÷ 6 = 1 666 y algo. Al correrlo sale algo como 1 648, o 1 702: cerca, pero nunca exacto. Y si lo corres otra vez sale otro número parecido. Eso es la probabilidad: no una promesa, una tendencia.
Lo que se puede responder simulando y es un dolor de cabeza calculando:
- ¿Qué suma sale más seguido con dos dados? Tira dos dados diez mil veces y cuenta. Sale el 7, porque es la suma que se puede armar de más maneras.
- ¿Cuántas veces hay que tirar una moneda para sacar tres águilas seguidas? Es una pregunta difícil con lápiz y fácil simulando.
- ¿Cuánta gente hace falta en un salón para que dos cumplan el mismo día? Con 23 personas ya es más probable que sí: suena imposible, y la simulación lo confirma.
Las dos herramientas del azar que vas a usar:
| Instrucción | Qué hace |
|---|---|
random.randint(1, 6) | un entero al azar del 1 al 6 |
random.choice(["águila", "sol"]) | escoge uno al azar de una lista |
Lo honesto de una simulación. Da un resultado aproximado, así que se reporta redondo: «salió como 1 670 de 10 000, o sea cerca de 16». Si la simulación y la cuenta teórica se alejan mucho, hay un error: en el programa o en la cuenta. Las dos se revisan entre ellas, y eso es lo que la hace valiosa.
Así se hace, paso a paso
Simular dos dados y contar los sietes
import random
sietes = 0
for i in range(6000):
a = random.randint(1, 6)
b = random.randint(1, 6)
if a + b == 7:
sietes = sietes + 1
print(sietes)
Paso 1 · lo esperado, a mano. Con dos dados hay 36 resultados posibles, y el 7 se arma de 6 maneras (1-6, 2-5, 3-4, 4-3, 5-2, 6-1). Así que la probabilidad es 636 = 16.
Paso 2 · cuántos espero. 6 000 × 16 = 1 000.
Paso 3 · lo que sale. Al correrlo: 987. Otra vez: 1 014. Otra: 996. Siempre alrededor de 1 000.
Paso 4 · qué aprendí. Que la cuenta teórica estaba bien, y que «16» quiere decir cerca de 1 000 de 6 000, no exactamente mil.
Esperado 1 000; simulado, siempre algo cercano. Las dos maneras se confirman.
Esperar el número exacto. Si sale 1 014 en vez de 1 000, no hay ningún error: es azar.
Simular pocas veces. Con 20 tiros no se ve nada. El efecto aparece con miles.
Olvidar import random. Sin esa línea, NameError.
Creer que la simulación demuestra. No demuestra: sugiere, y muy bien. La demostración es la cuenta.
Ejercicios
- Si tiras un dado 600 veces, ¿cuántos 4 esperas?
ver la respuesta
100Cómo se llega- La probabilidad de un 4 es 16.
- 600 × 16 = 100.
- Si tiras una moneda 1 000 veces, ¿cuántas águilas esperas?
ver la respuesta
500Cómo se llega- La probabilidad de águila es 12.
- 1 000 × 12 = 500.
- ¿Qué hace
random.randint(1, 6)?ver la respuesta
Da un número al azar del 1 al 6Cómo se llega- Los dos extremos están incluidos.
- Es como tirar un dado.
- Con dos dados, ¿qué suma sale más seguido?
ver la respuesta
7Cómo se llega- El 7 se arma de 6 maneras de las 36 posibles.
- Ninguna otra suma se arma de tantas.
- Tiras un dado 6 000 veces y salen 1 020 seises. ¿Está mal el dado?
ver la respuesta
NoCómo se llega- Lo esperado es 1 000 y salió 1 020.
- Esa diferencia es normal: es azar, no un dado cargado.
- ¿Qué línea hay que poner arriba para usar el azar en Python?
ver la respuesta
import randomCómo se llega- Hay que traer la caja de herramientas del azar.
- Sin esa línea sale NameError.
El examen de python desde cero
Diez preguntas de todas las lecciones, del mismo nivel que los ejercicios. Hay cuatro versiones parecidas: si no te va bien, lo repites con otra. Se aprueba con 7 de 10.
Puedes hacerlo sin entrar, pero si entras con tu nombre el resultado se guarda en tu tablero.
Hacer el examen →