IRIsrael RivasMatemáticas · TecnologíaEntrarMaestro

Entrar

¿Es tu primera vez? Regístrate · ¿No apareces en la lista? Entra escribiendo tu nombre

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.

1

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
La computadora hace exactamente lo que escribes, en el orden que lo escribes.Si el programa hace algo raro, no es que «se equivocó»: es que la lista de órdenes dice eso. Hay que revisar la lista.

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 escribisteQué 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.

Cuidado con esto

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

  1. ¿Qué imprime?
    print("Buenos días")
    ver la respuesta
    Buenos días
    Cómo se llega
    1. print muestra el texto de adentro.
    2. Las comillas no salen: solo marcan dónde empieza y termina el texto.
  2. ¿Qué imprime?
    print("Uno")
    print("Dos")
    ver la respuesta
    Uno (y abajo) Dos
    Cómo se llega
    1. De arriba abajo: primero Uno.
    2. Cada print empieza un renglón nuevo: luego Dos.
  3. Encuentra el error:
    print("Adiós)
    ver la respuesta
    Faltan las comillas de cierre
    Cómo se llega
    1. Abre comillas antes de Adiós y nunca las cierra.
    2. Debe ser print("Adiós").
  4. ¿Qué falta o qué sobra?
    Print("Hola")
    ver la respuesta
    La P mayúscula: es print
    Cómo se llega
    1. Python distingue mayúsculas y minúsculas.
    2. Print no existe; print sí.
  5. 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ínea
    Cómo se llega
    1. Tres renglones = tres órdenes print.
    2. Cada texto entre comillas y dentro de paréntesis.
    3. En el orden que quieres que salgan.
  6. 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, 1
    Cómo se llega
    1. El robot hace el paso 1 primero, y todavía no hay licuado.
    2. Las órdenes deben ir en el orden en que pasan las cosas: fruta, encender, servir.
2

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")
Si no puedes escribir los pasos en español, todavía no sabes qué programa quieres.Y si los puedes escribir, traducirlos es casi mecánico: ahí es donde el pseudocódigo te ahorra media hora.

Las tres palabras que hacen falta para escribir cualquier pseudocódigo:

En españolEn PythonPara qué
preguntar / leerinput()pedirle un dato al usuario
si… si no…if / elsedecidir entre dos caminos
repetir n veces / mientrasfor / whilehacer 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.

Cuidado con esto

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

  1. En un diagrama de flujo, ¿qué figura es una decisión?
    ver la respuesta
    El rombo
    Cómo se llega
    1. El óvalo es inicio y fin; el rectángulo, un paso.
    2. El rombo es la decisión, con salidas sí y no.
  2. ¿Cuántas salidas tiene un rombo?
    ver la respuesta
    2
    Cómo se llega
    1. Una por el sí y otra por el no.
    2. Si le falta una, el programa se queda sin camino.
  3. ¿En qué se traduce «preguntar la edad» al programar?
    ver la respuesta
    input()
    Cómo se llega
    1. Pedirle un dato al usuario es input().
    2. Si es número, se envuelve en int() o float().
  4. ¿En qué se traduce «repetir 5 veces»?
    ver la respuesta
    for i in range(5)
    Cómo se llega
    1. Repetir un número conocido de veces es un for.
    2. range(5) da cinco vueltas.
  5. Escribe el pseudocódigo en orden: ¿va antes «dividir entre 5» o «repetir 5 veces»?
    ver la respuesta
    Repetir 5 veces
    Cómo se llega
    1. Primero hay que juntar las cinco calificaciones.
    2. El promedio se calcula al final, cuando ya está la suma.
  6. ¿Qué figura del diagrama de flujo usarías para «imprimir el resultado»?
    ver la respuesta
    El rectángulo
    Cómo se llega
    1. Es un paso que se hace, no una decisión.
    2. Va en rectángulo.
3

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
El signo = no significa «es igual a». Significa «guarda en».Se lee de derecha a izquierda: primero Python calcula lo de la derecha y después lo mete en la caja de la izquierda.

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íneaQué hacepuntos
puntos = 10crea la caja10
puntos = puntos + 510 + 515
puntos = puntos * 215 × 230
print(puntos)muestra 3030

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.

Cuidado con esto

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

  1. ¿Qué imprime?
    x = 3
    print(x)
    ver la respuesta
    3
    Cómo se llega
    1. La caja x guarda 3.
    2. print(x) sin comillas muestra lo que hay en la caja.
  2. ¿Qué imprime?
    x = 3
    x = 10
    print(x)
    ver la respuesta
    10
    Cómo se llega
    1. Primero guarda 3.
    2. Luego guarda 10 y el 3 se pierde.
    3. Sale el último valor: 10.
  3. ¿Qué vale y al final?
    y = 8
    y = y - 3
    y = y * 2
    ver la respuesta
    10
    Cómo se llega
    1. y = 8.
    2. y = 8 − 3 = 5.
    3. y = 5 × 2 = 10.
  4. Encuentra el error:
    vidas = 3
    print(vida)
    ver la respuesta
    La caja se llama vidas, no vida: NameError
    Cómo se llega
    1. La primera línea crea vidas (con s).
    2. print(vida) busca otra caja que no existe.
  5. ¿Cuál de estos nombres de variable sí acepta Python? mi puntaje, 3vidas, nivel_2
    ver la respuesta
    nivel_2
    Cómo se llega
    1. mi puntaje tiene espacio: no.
    2. 3vidas empieza con número: no.
    3. nivel_2: letras, guion bajo y número al final: sí.
  6. 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) → 60
    Cómo se llega
    1. Crea la caja: precio = 45.
    2. Súbele: precio = precio + 15 (ahora tiene 60).
    3. Muestra: print(precio).
4

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:

TipoQué esEjemplos
intnúmero entero12, 0, −5, 1000
floatnúmero con punto decimal3.5, 0.25, 2.0
strtexto (string): va entre comillas"Hola", "Ana", "3"
boolverdadero o falsoTrue, 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
Número + número suma. Texto + texto pega. Texto × número repite. Número + texto: error.Python no adivina si querías sumar o pegar. Si mezclas, se detiene con un TypeError.

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.

Cuidado con esto

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

  1. ¿De qué tipo es cada uno? 7, 7.0, "7"
    ver la respuesta
    int, float, str
    Cómo se llega
    1. 7 es entero: int.
    2. 7.0 tiene punto: float.
    3. "7" tiene comillas: texto, str.
  2. ¿Qué imprime?
    print("5" + "5")
    ver la respuesta
    55
    Cómo se llega
    1. Los dos tienen comillas: son texto.
    2. Texto + texto pega: 55.
  3. ¿Qué imprime?
    print(int("5") + 5)
    ver la respuesta
    10
    Cómo se llega
    1. int("5") convierte el texto en el número 5.
    2. 5 + 5 = 10.
  4. ¿Qué imprime?
    print("na" * 4)
    ver la respuesta
    nananana
    Cómo se llega
    1. Texto × número repite el texto.
    2. na cuatro veces.
  5. 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
    1. "Tengo " es texto y 12 es número: no se pueden pegar.
    2. str(12) lo vuelve texto "12" y ya se pega todo.
  6. 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
    1. nombre ya es texto; edad es número.
    2. Convierte edad con str() y pega todo con +.
    3. No olvides los espacios dentro de las comillas.
5

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:

SignoQué haceEjemploSale
+suma7 + 29
-resta7 - 25
*multiplica7 * 214
/divide (siempre da decimal)7 / 23.5
//división entera: cuántas veces cabe7 // 23
%residuo: lo que sobra7 % 21
**potencia7 ** 249

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
input() SIEMPRE devuelve texto, aunque el usuario escriba un número.Si vas a hacer cuentas con lo que te dieron, conviértelo: int(input(...)) para enteros, float(input(...)) para decimales.
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.

Cuidado con esto

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

  1. ¿Qué imprime?
    print(10 // 3)
    print(10 % 3)
    ver la respuesta
    3 y 1
    Cómo se llega
    1. 10 // 3: el 3 cabe 3 veces.
    2. 10 % 3: sobra 1.
  2. ¿Qué imprime?
    print(2 + 3 * 4)
    ver la respuesta
    14
    Cómo se llega
    1. Primero multiplica: 3 × 4 = 12.
    2. Luego suma: 2 + 12 = 14.
  3. ¿Qué imprime?
    print((2 + 3) * 4)
    ver la respuesta
    20
    Cómo se llega
    1. El paréntesis va primero: 2 + 3 = 5.
    2. 5 × 4 = 20.
  4. 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
    1. Aunque escribas 12, input lo guarda como "12".
    2. "12" + 1 mezcla texto y número.
    3. int() lo convierte antes de sumar.
  5. ¿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 14
    Cómo se llega
    1. n = 7 (ya convertido).
    2. La f-string sustituye {n} por 7 y {n * 2} por 14.
  6. 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
    1. Dos inputs convertidos a int.
    2. El total es precio × cantidad.
    3. Una f-string con la cuenta entre llaves.
6

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.

La sangría es parte del lenguaje: lo que está adentro pertenece al if; lo que está pegado a la izquierda se ejecuta siempre.Si olvidas la sangría, Python te da IndentationError. Si la pones donde no va, el programa hace cosas raras sin avisar.

Las preguntas se hacen con comparaciones, que siempre dan True o False:

Se escribePreguntaEjemplo
==¿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 = 7x vale 7
if x > 10¿7 > 10? Falso: se salta la A
elif x % 2 == 17 % 2 = 1. ¿1 == 1? Verdadero: imprime B
elseya 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.

Cuidado con esto

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

  1. ¿Qué imprime?
    x = 4
    if x > 3:
        print("sí")
    else:
        print("no")
    ver la respuesta
    sí
    Cómo se llega
    1. ¿4 > 3? Verdadero.
    2. Entra al if: sí.
  2. ¿Qué imprime?
    n = 10
    if n == 5:
        print("cinco")
    print("fin")
    ver la respuesta
    fin
    Cómo se llega
    1. ¿10 == 5? Falso: se salta «cinco».
    2. print("fin") no tiene sangría: se ejecuta siempre.
  3. Encuentra el error:
    if x = 5:
        print("cinco")
    ver la respuesta
    Para comparar es ==, no =
    Cómo se llega
    1. Un solo = es «guarda en».
    2. La pregunta «¿es igual?» se escribe x == 5.
  4. ¿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 print
    Cómo se llega
    1. Toda pregunta termina en dos puntos.
    2. Lo que depende del if va 4 espacios adentro.
  5. ¿Qué imprime?
    temp = 30
    if temp > 35:
        print("Mucho calor")
    elif temp > 25:
        print("Calor")
    else:
        print("Fresco")
    ver la respuesta
    Calor
    Cómo se llega
    1. ¿30 > 35? Falso.
    2. ¿30 > 25? Verdadero: Calor.
    3. El else ya no se revisa.
  6. 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
    1. Pide y convierte: int(input(...)).
    2. if edad >= 18: con dos puntos y sangría.
    3. else: para el otro caso.
7

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
range(n) da n valores: empieza en 0 y termina ANTES de n.range(5) es 0, 1, 2, 3, 4. Cinco números, pero el 5 no está. Es el error más común de los bucles.

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)
Vueltaisuma = suma + i
antes—0
110 + 1 = 1
221 + 2 = 3
333 + 3 = 6
446 + 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)
4 veces: avanza 100, gira 90°
Cuatro vueltas de avanzar y girar: un cuadrado

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.

Cuidado con esto

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

  1. ¿Cuántas veces se imprime Hola?
    for i in range(7):
        print("Hola")
    ver la respuesta
    7
    Cómo se llega
    1. range(7) da 7 valores: 0 a 6.
    2. Una vuelta por cada uno.
  2. ¿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
    1. Empieza en 0.
    2. Termina antes del 3.
  3. ¿Qué imprime?
    for i in range(2, 5):
        print(i)
    ver la respuesta
    2, 3, 4
    Cómo se llega
    1. Empieza en 2.
    2. El 5 no entra.
  4. ¿Qué vale suma al final?
    suma = 0
    for i in range(1, 4):
        suma = suma + i
    ver la respuesta
    6
    Cómo se llega
    1. i vale 1, 2, 3.
    2. suma: 0 → 1 → 3 → 6.
  5. ¿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 forward
    Cómo se llega
    1. Seis lados: seis vueltas, ya está.
    2. Falta girar después de cada lado: 360 ÷ 6 = 60°.
  6. 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
    1. Del 1 al 10 es range(1, 11).
    2. En cada vuelta una f-string con i y 7 * i.
8

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
1Síimprime 1, x pasa a 2
2Síimprime 2, x pasa a 3
3Síimprime 3, x pasa a 4
4Nose 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.

Dentro del while algo tiene que cambiar para que la condición llegue a ser falsa.Antes de correr un while, pregúntate: ¿qué línea de adentro acerca el final? Si no la hay, es infinito.

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
10Sín = 7, imprime 7
7Sín = 4, imprime 4
4Sín = 1, imprime 1
1Sín = −2, imprime −2
−2Nose 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.

Cuidado con esto

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

  1. ¿Cuántas veces se imprime Hola?
    x = 0
    while x < 4:
        print("Hola")
        x = x + 1
    ver la respuesta
    4
    Cómo se llega
    1. x vale 0, 1, 2, 3 al entrar: cuatro vueltas.
    2. Cuando x llega a 4, ya no es menor que 4.
  2. ¿Qué vale x al final?
    x = 2
    while x < 20:
        x = x * 2
    ver la respuesta
    32
    Cómo se llega
    1. x: 2 → 4 → 8 → 16 → 32.
    2. Con 16 todavía entra (16 < 20); con 32 ya no.
  3. Este programa nunca termina. ¿Qué le falta?
    n = 5
    while n > 0:
        print(n)
    ver la respuesta
    n = n - 1 dentro del bucle
    Cómo se llega
    1. n siempre vale 5: la condición nunca se vuelve falsa.
    2. Hay que restarle en cada vuelta.
  4. ¿Qué imprime?
    i = 1
    while i <= 10:
        if i == 4:
            break
        print(i)
        i = i + 1
    ver la respuesta
    1, 2, 3
    Cómo se llega
    1. Imprime 1, 2, 3.
    2. Cuando i vale 4, el break lo saca antes de imprimir.
  5. ¿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) for
    Cómo se llega
    1. a y c: sabes cuántas vueltas.
    2. b: no sabes cuántos intentos; es hasta que pase algo.
  6. 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
    1. Crea la caja vacía antes del while.
    2. Mientras sea distinta de "python", vuelve a pedir.
    3. El print va afuera, sin sangría.
9

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:

Vueltaitotal antestotal después
1ª101
2ª213
3ª336
4ª4610

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.

Una columna por variable, un renglón por vuelta, y se llena sin adivinar: cada renglón sale del anterior.Si tu tabla y el programa no coinciden, uno de los dos está mal, y averiguar cuál es justo el ejercicio.

Cómo se hace, paso a paso:

  1. Apunta las variables que hay, cada una en su columna, con su valor inicial.
  2. Entra a la primera vuelta y escribe el valor de la variable del bucle.
  3. Ejecuta cada línea de adentro, en orden, cambiando los valores que toquen.
  4. Al final de la vuelta, revisa la condición: ¿hay otra vuelta?
  5. 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
Vueltavidas al entrar¿vidas > 0?imprimevidas al salir
1ª3síTe quedan 32
2ª2síTe quedan 21
3ª1síTe quedan 10
4ª0no—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.

Cuidado con esto

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

  1. ¿Qué imprime?
    t = 0
    for i in range(1, 4):
        t = t + i
    print(t)
    ver la respuesta
    6
    Cómo se llega
    1. i vale 1, 2 y 3 (el 4 no entra).
    2. t: 0 → 1 → 3 → 6.
  2. ¿Cuántas vueltas da for i in range(5)?
    ver la respuesta
    5
    Cómo se llega
    1. i vale 0, 1, 2, 3 y 4.
    2. Son 5 vueltas, aunque nunca llegue al 5.
  3. ¿Qué imprime?
    x = 20
    for i in range(4):
        x = x - 5
    print(x)
    ver la respuesta
    0
    Cómo se llega
    1. Cuatro vueltas restando 5: 15, 10, 5, 0.
    2. El print está afuera: imprime 0.
  4. En la tabla de rastreo, ¿qué va en cada columna?
    ver la respuesta
    Una variable
    Cómo se llega
    1. Una columna por variable y un renglón por vuelta.
    2. Así se ve cómo cambia cada una.
  5. ¿Qué imprime?
    v = 3
    while v > 0:
        v = v - 1
    print(v)
    ver la respuesta
    0
    Cómo se llega
    1. v baja 3 → 2 → 1 → 0 y ahí la condición se vuelve falsa.
    2. Imprime 0.
  6. Si a un while le quitas la línea que cambia la variable de la condición, ¿qué pasa?
    ver la respuesta
    Se vuelve un bucle infinito
    Cómo se llega
    1. La condición nunca se vuelve falsa.
    2. El programa no se detiene: hay que pararlo a mano.
10

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.

Lugarprimerosegundotercero
Índice012
Valormanzanaperauva
El índice cuenta desde 0. En una lista de 3, los índices son 0, 1 y 2; el [3] no existe.Pedir un índice que no existe detiene el programa con IndexError: «índice fuera de rango».

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.

Cuidado con esto

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

  1. ¿Qué imprime?
    colores = ["rojo", "verde", "azul"]
    print(colores[1])
    ver la respuesta
    verde
    Cómo se llega
    1. [0] es rojo, [1] es verde.
    2. El índice 1 es el segundo.
  2. Con la misma lista, ¿qué imprimen?
    print(len(colores))
    print(colores[-1])
    ver la respuesta
    3 y azul
    Cómo se llega
    1. len cuenta: 3.
    2. [-1] es el último: azul.
  3. Encuentra el error:
    colores = ["rojo", "verde", "azul"]
    print(colores[3])
    ver la respuesta
    IndexError: los índices son 0, 1 y 2; el 3 no existe
    Cómo se llega
    1. Tres elementos: índices 0, 1, 2.
    2. Para el último: colores[2] o colores[-1].
  4. ¿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
    1. append agrega al final, uno por uno.
  5. ¿Qué imprime?
    for n in [2, 4, 6]:
        print(n * 10)
    ver la respuesta
    20, 40, 60
    Cómo se llega
    1. n toma 2, luego 4, luego 6.
    2. Cada uno por 10.
  6. 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
    1. Acumula con un for.
    2. Promedio = total entre cuántas hay: len(califs).
    3. Sale 8.0.
11

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.

Definir una función no la ejecuta. Se ejecuta cada vez que la llamas.Si escribes el def y nunca la llamas, no pasa nada. Si la llamas tres veces, corre tres veces.

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.

Cuidado con esto

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

  1. ¿Qué imprime?
    def triple(n):
        return n * 3
    
    print(triple(5))
    ver la respuesta
    15
    Cómo se llega
    1. triple(5) mete 5 en n.
    2. return 5 × 3 = 15.
  2. ¿Qué imprime?
    def hola():
        print("Hola")
    
    print("Fin")
    ver la respuesta
    Fin
    Cómo se llega
    1. La función está definida pero nunca se llama.
    2. Solo se ejecuta el print de afuera.
  3. ¿Qué imprime?
    def suma(a, b):
        return a + b
    
    print(suma(2, 3) + suma(1, 1))
    ver la respuesta
    7
    Cómo se llega
    1. suma(2, 3) = 5.
    2. suma(1, 1) = 2.
    3. 5 + 2 = 7.
  4. Encuentra el error:
    def cuadrado(x):
        x * x
    
    print(cuadrado(3))
    ver la respuesta
    Falta el return: imprime None. Debe ser return x * x
    Cómo se llega
    1. La función calcula 9 pero no lo devuelve.
    2. Sin return, la llamada vale None.
  5. ¿Qué falta en la llamada?
    def saluda(nombre):
        print("Hola", nombre)
    
    saluda()
    ver la respuesta
    El dato: saluda("Ana") o cualquier nombre
    Cómo se llega
    1. La función pide un parámetro.
    2. Hay que mandarle un valor al llamarla.
  6. 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.0
    Cómo se llega
    1. Más 16 % es multiplicar por 1.16.
    2. return con la cuenta.
    3. Dos llamadas con distintos datos.
12

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.

Lee el último renglón (qué tipo de error) y el número de línea (dónde). Casi siempre el error está en esa línea o en la de arriba.Si no es en esa línea, es que algo de antes la dejó mal: una comilla sin cerrar en la línea 3 puede explotar en la 4.

Estos son los cuatro que vas a ver todo el tiempo, con sus causas:

ErrorQué significaCausas típicas
SyntaxErrorestá mal escrito; Python ni lo entiendecomillas o paréntesis sin cerrar, faltan los dos puntos del if/for/def, = en vez de ==
NameErrorusas un nombre que no existevariable que no creaste, una letra cambiada, mayúscula distinta, Print en vez de print
TypeErrormezclas tipos que no vantexto + número, input() sin int(), llamar una función sin sus datos
IndentationErrorla sangría está malfalta 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.

Cuidado con esto

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

  1. ¿Qué error da?
    print("Hola)
    ver la respuesta
    SyntaxError: faltan las comillas de cierre
    Cómo se llega
    1. Python no encuentra dónde termina el texto.
    2. Está mal escrito: SyntaxError.
  2. ¿Qué error da?
    nombre = "Ana"
    print(Nombre)
    ver la respuesta
    NameError: Nombre con mayúscula no existe
    Cómo se llega
    1. La caja se llama nombre, con minúscula.
    2. Nombre es otro nombre que nunca se creó.
  3. ¿Qué error da?
    print("Edad: " + 12)
    ver la respuesta
    TypeError: texto + número
    Cómo se llega
    1. "Edad: " es str y 12 es int.
    2. No se pueden pegar sin str(12).
  4. ¿Qué error da?
    x = 5
    if x > 3:
    print("sí")
    ver la respuesta
    IndentationError: al print le falta la sangría
    Cómo se llega
    1. Después de los dos puntos, la siguiente línea va 4 espacios adentro.
  5. 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úmero
    Cómo se llega
    1. line 3 dice dónde.
    2. TypeError de concatenar str con int: falta str() o una f-string.
  6. 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 > 0
    Cómo se llega
    1. Línea 2: Print → print (NameError).
    2. Línea 2: "texto" + vidas es TypeError → str(vidas).
    3. Línea 3: falta el : (SyntaxError).
13

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.

  1. Busca un caso donde falle y que puedas calcular a mano. Si no sabes cuál es la respuesta correcta, no puedes depurar.
  2. Pon un print a la mitad del programa, mostrando las variables importantes.
  3. Corre y compara con lo que debería valer ahí.
  4. Si ahí ya está mal, el error está antes; si está bien, está después.
  5. Repite en la mitad que quedó, hasta que el error quepa en una línea.
Cada 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:

PreguntaQué 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.

Cuidado con esto

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

  1. Un programa corre pero da mal. ¿Dónde pones el primer print?
    ver la respuesta
    A la mitad
    Cómo se llega
    1. Así eliminas la mitad del programa de un golpe.
    2. Si ahí ya está mal, el error está antes; si está bien, después.
  2. Pones un print a la mitad y el valor ya está mal. ¿Dónde está el error?
    ver la respuesta
    Antes de ese print
    Cómo se llega
    1. El valor llegó mal a ese punto.
    2. Hay que buscar en la primera mitad.
  3. Pones un print a la mitad y el valor está bien. ¿Dónde está el error?
    ver la respuesta
    Después de ese print
    Cómo se llega
    1. Hasta ahí todo iba bien.
    2. El error está en la segunda mitad.
  4. ¿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 6
    Cómo se llega
    1. total = 0 está adentro del bucle: se borra en cada vuelta.
    2. Va antes del for.
  5. Un programa de 16 líneas: ¿cuántos prints bien puestos bastan para acorralar el error en una línea?
    ver la respuesta
    4
    Cómo se llega
    1. Cada print parte el problema a la mitad: 16 → 8 → 4 → 2 → 1.
    2. Son 4 pasos.
  6. ¿Qué haces con los prints de depuración cuando ya arreglaste el programa?
    ver la respuesta
    Quitarlos
    Cómo se llega
    1. Son andamios, no parte del programa.
    2. Se borran al final.
14

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 esperado se calcula multiplicando: tiros × probabilidad. En 600 tiros de un dado, los 3 esperados son 600 × 16 = 100.Y entre más tiros, más se le acerca lo que sale de verdad. Con 60 tiros puedes andar lejos; con 60 000, casi nunca.

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ónQué 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.

Cuidado con esto

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

  1. Si tiras un dado 600 veces, ¿cuántos 4 esperas?
    ver la respuesta
    100
    Cómo se llega
    1. La probabilidad de un 4 es 16.
    2. 600 × 16 = 100.
  2. Si tiras una moneda 1 000 veces, ¿cuántas águilas esperas?
    ver la respuesta
    500
    Cómo se llega
    1. La probabilidad de águila es 12.
    2. 1 000 × 12 = 500.
  3. ¿Qué hace random.randint(1, 6)?
    ver la respuesta
    Da un número al azar del 1 al 6
    Cómo se llega
    1. Los dos extremos están incluidos.
    2. Es como tirar un dado.
  4. Con dos dados, ¿qué suma sale más seguido?
    ver la respuesta
    7
    Cómo se llega
    1. El 7 se arma de 6 maneras de las 36 posibles.
    2. Ninguna otra suma se arma de tantas.
  5. Tiras un dado 6 000 veces y salen 1 020 seises. ¿Está mal el dado?
    ver la respuesta
    No
    Cómo se llega
    1. Lo esperado es 1 000 y salió 1 020.
    2. Esa diferencia es normal: es azar, no un dado cargado.
  6. ¿Qué línea hay que poner arriba para usar el azar en Python?
    ver la respuesta
    import random
    Cómo se llega
    1. Hay que traer la caja de herramientas del azar.
    2. 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 →
← Antes: Cómo resolver problemasSigue: HTML y CSS: tu primera página →