Condicionales y bucles
En esta guía (15)
Hasta ahora tus programas ejecutaban todas las líneas, una vez cada una. En esta lección vas a aprender a decidir qué código se ejecuta (if, elif, else) y a repetir código (while, for, range). También vas a ver dos patrones que vas a usar siempre: el acumulador y el contador.
if: ejecutar algo solo si se cumple una condición
temperatura = 31
if temperatura > 30:
print("Hace calor")
print("Tomá agua")
print("Fin del pronóstico")
Hace calor
Tomá agua
Fin del pronóstico
La estructura es:
if, una condición (cualquier expresión que déTrueoFalse) y dos puntos.- Abajo, el bloque: las líneas que se ejecutan si la condición es verdadera. Van indentadas con 4 espacios.
- La primera línea sin indentación (
print("Fin del pronóstico")) ya está fuera delify se ejecuta siempre.
En Python la indentación no es decorativa: es lo que define qué líneas pertenecen al bloque. VS Code inserta 4 espacios cuando apretás Tab dentro de un archivo .py.
else y elif
else define qué hacer cuando la condición es falsa:
edad = 16
if edad >= 18:
print("Puede votar de forma obligatoria")
else:
print("Todavía no es obligatorio")
Todavía no es obligatorio
Cuando hay más de dos caminos, se encadenan condiciones con elif ("si no, si..."):
nota = 7
if nota >= 9:
calificacion = "Sobresaliente"
elif nota >= 7:
calificacion = "Muy bien"
elif nota >= 4:
calificacion = "Aprobado"
else:
calificacion = "Desaprobado"
print(calificacion)
Muy bien
Python evalúa las condiciones en orden y ejecuta solo el primer bloque cuya condición sea verdadera; el resto se saltea. Por eso, con nota = 7, no llega a preguntar nota >= 4 aunque también sea cierto. El orden importa: si pusieras nota >= 4 primero, un 10 diría "Aprobado".
Operadores lógicos: and, or, not
Para combinar condiciones:
| Operador | Es True cuando... |
|---|---|
a and b | las dos son verdaderas |
a or b | al menos una es verdadera |
not a | a es falsa |
edad = 25
tiene_entrada = True
if edad >= 18 and tiene_entrada:
print("Puede pasar")
dia = "sábado"
if dia == "sábado" or dia == "domingo":
print("Es fin de semana")
if not tiene_entrada:
print("Comprá una entrada")
Puede pasar
Es fin de semana
Para preguntar si un número está en un rango, Python permite encadenar comparaciones:
hora = 14
if 9 <= hora < 18:
print("Horario de atención")
Horario de atención
Condiciones con truthiness
Como viste en la lección 2, "", 0 y None cuentan como falsos. Eso permite escribir:
nombre = ""
if nombre:
print(f"Hola, {nombre}")
else:
print("No ingresaste un nombre")
No ingresaste un nombre
if nombre: se lee "si nombre tiene algo".
while: repetir mientras se cumpla una condición
while repite su bloque mientras la condición sea verdadera:
cuenta = 1
while cuenta <= 3:
print(f"Vuelta {cuenta}")
cuenta += 1
print("Listo")
Vuelta 1
Vuelta 2
Vuelta 3
Listo
Cada repetición se llama iteración. Antes de cada vuelta, Python evalúa la condición; cuando da False, sale del bucle y sigue con lo que viene después.
Fijate en cuenta += 1: si no cambiaras cuenta, la condición sería verdadera para siempre y el programa no terminaría nunca (un bucle infinito). Si te pasa, cortalo con Ctrl + C en la terminal.
while con input: repetir hasta que el usuario decida
while es ideal cuando no sabés de antemano cuántas veces vas a repetir. Por ejemplo, pedir una contraseña hasta que sea la correcta:
clave = input("Clave: ")
while clave != "python123":
print("Incorrecta, probá de nuevo")
clave = input("Clave: ")
print("Acceso concedido")
Clave: hola
Incorrecta, probá de nuevo
Clave: python123
Acceso concedido
for: recorrer una secuencia
for recorre los elementos de una secuencia, uno por uno. Un string es una secuencia de caracteres:
for letra in "sol":
print(letra)
s
o
l
En cada vuelta, la variable letra toma el siguiente elemento. El nombre de esa variable lo elegís vos.
En la lección 4 vas a usar for para recorrer listas, que es lo más común. Por ahora, lo vamos a combinar con range.
range: secuencias de números
range genera una secuencia de enteros. Tiene tres formas:
for i in range(5): # de 0 a 4
print(i, end=" ")
print()
for i in range(1, 6): # de 1 a 5
print(i, end=" ")
print()
for i in range(0, 20, 5): # de 0 a 19, de 5 en 5
print(i, end=" ")
print()
for i in range(10, 0, -2): # de 10 a 1, bajando de 2 en 2
print(i, end=" ")
print()
0 1 2 3 4
1 2 3 4 5
0 5 10 15
10 8 6 4 2
range(fin): desde 0 hastafin, sin incluirfin.range(inicio, fin): desdeiniciohastafin, sin incluirfin.range(inicio, fin, paso): depasoenpaso. Para contar hacia atrás, el paso tiene que ser negativo (y el inicio mayor que el fin).
La regla que más confunde: el fin nunca se incluye. Si querés llegar hasta el 10, escribí range(1, 11). Una forma de recordarlo: range(5) genera exactamente 5 números.
print(..., end=" ") cambia lo que print pone al final: en vez de un salto de línea, un espacio. El print() vacío de después hace el salto.
range no arma todos los números de antemano: los va generando a medida que el for los pide. Por eso range(1_000_000) no ocupa memoria de más.
break y continue
breakcorta el bucle inmediatamente.continuesaltea el resto de la vuelta actual y pasa a la siguiente.
for n in range(1, 20):
if n % 7 == 0:
print(f"Primer múltiplo de 7: {n}")
break
Primer múltiplo de 7: 7
for n in range(1, 11):
if n % 3 == 0:
continue
print(n, end=" ")
print()
1 2 4 5 7 8 10
Un patrón muy usado es while True con break: un bucle "infinito" que se corta desde adentro cuando se cumple algo. Es la forma natural de armar un menú:
while True:
opcion = input("Escribí 'saludar' o 'salir': ")
if opcion == "salir":
break
if opcion == "saludar":
print("¡Hola!")
else:
print("Opción no válida")
print("Chau")
Escribí 'saludar' o 'salir': saludar
¡Hola!
Escribí 'saludar' o 'salir': bailar
Opción no válida
Escribí 'saludar' o 'salir': salir
Chau
Acumuladores y contadores
Dos patrones que aparecen en todos lados:
- Un acumulador es una variable que va sumando (o multiplicando, o concatenando) valores en cada vuelta. Arranca en un valor neutro:
0para sumar,1para multiplicar,""para unir textos. - Un contador es una variable que suma 1 cada vez que pasa algo.
Ejemplo: sumar los múltiplos de 3 entre 1 y 30, y contar cuántos son.
suma = 0 # acumulador
cantidad = 0 # contador
for n in range(1, 31):
if n % 3 == 0:
suma += n
cantidad += 1
print(f"Hay {cantidad} múltiplos de 3 y suman {suma}")
Hay 10 múltiplos de 3 y suman 165
El acumulador y el contador se inicializan antes del bucle. Si los pusieras adentro, se reiniciarían en cada vuelta.
Con while y entrada del usuario, el mismo patrón sirve para totalizar algo hasta que el usuario indique que terminó:
total = 0.0
compras = 0
monto = float(input("Monto (0 para terminar): "))
while monto != 0:
total += monto
compras += 1
monto = float(input("Monto (0 para terminar): "))
print(f"{compras} compras, total ${total:.2f}")
Monto (0 para terminar): 1500
Monto (0 para terminar): 820.5
Monto (0 para terminar): 0
2 compras, total $2320.50
Un acumulador suma a medida que recorre, sin necesidad de guardar todos los valores. Eso es más simple y gasta menos memoria que guardarlos primero y sumarlos al final.
Un primer chequeo de lo que escribe el usuario
En la lección 2 viste que int("hola") da error. Los strings tienen un método llamado isdigit() que devuelve True si el texto tiene solo dígitos. (Un método es una función que se llama con un punto sobre un valor; en la lección 6 los vas a ver a fondo.) Con un while podés pedir un dato hasta que sea válido:
texto = input("Edad: ")
while not texto.isdigit():
print("Ingresá solo números")
texto = input("Edad: ")
edad = int(texto)
print(f"Tenés {edad} años")
Edad: veinte
Ingresá solo números
Edad: 20
Tenés 20 años
isdigit() no acepta signos ni decimales ("-3" o "2.5" dan False). En la lección 8 vas a ver una forma más completa de validar con try/except.
Errores comunes
IndentationError: mezclaste espacios y tabs, o una línea quedó con más o menos espacios que sus vecinas. Usá siempre 4 espacios.- Olvidar los dos puntos al final de
if,elif,else,whileofor: daSyntaxError: expected ':'. - Esperar que
rangeincluya el final.range(1, 10)llega hasta 9. - Contar hacia atrás con paso positivo.
range(10, 0)no genera nada: hace faltarange(10, 0, -1). - Bucle infinito con
while: la variable de la condición nunca cambia dentro del bucle. Cortá con Ctrl + C y revisá qué debería actualizarse. - Inicializar el acumulador adentro del bucle. Se reinicia en cada vuelta y al final solo tiene el último valor.
- Comparar con
=:if x = 5:es unSyntaxError. Para comparar es==. - Condiciones con
ormal armadas.if dia == "sábado" or "domingo":siempre es verdadero, porque"domingo"solo ya cuenta comoTrue. Hay que repetir la comparación:dia == "sábado" or dia == "domingo".
Practicá
- Pedí una temperatura (número entero) y mostrá "Helada" si es menor a 0, "Frío" entre 0 y 14, "Templado" entre 15 y 24, y "Calor" de 25 en adelante.
- Pedí un número entre 1 y 10 y mostrá su tabla de multiplicar del 1 al 10, con el formato
7 x 3 = 21. - Pedí una frase y contá cuántas vocales tiene (sin importar si son mayúsculas o minúsculas). Pista:
letra in "aeiouAEIOU"esTruesi la letra es una vocal. - Juego de adivinar: el número secreto es
37. El usuario tiene 5 intentos; después de cada intento incorrecto, decile si el secreto es mayor o menor. Si acierta, felicitalo y terminá; si se le acaban los intentos, mostrá cuál era.
Soluciones
Ejercicio 1:
temperatura = int(input("Temperatura: "))
if temperatura < 0:
print("Helada")
elif temperatura < 15:
print("Frío")
elif temperatura < 25:
print("Templado")
else:
print("Calor")
Temperatura: 18
Templado
Como las condiciones se evalúan en orden, en el segundo elif ya sabés que la temperatura es al menos 0: no hace falta escribir 0 <= temperatura < 15.
Ejercicio 2:
numero = int(input("Número: "))
for i in range(1, 11):
print(f"{numero} x {i} = {numero * i}")
Número: 7
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70
Ejercicio 3:
frase = input("Frase: ")
vocales = 0
for letra in frase:
if letra in "aeiouAEIOUáéíóúÁÉÍÓÚ":
vocales += 1
print(f"Tiene {vocales} vocales")
Frase: Programar en Python
Tiene 5 vocales
Ejercicio 4:
secreto = 37
intentos = 5
acerto = False
while intentos > 0:
intento = int(input("Tu número: "))
intentos -= 1
if intento == secreto:
acerto = True
break
elif intento < secreto:
print(f"Es mayor. Te quedan {intentos} intentos")
else:
print(f"Es menor. Te quedan {intentos} intentos")
if acerto:
print("¡Adivinaste!")
else:
print(f"Se acabaron los intentos. Era {secreto}")
Tu número: 50
Es menor. Te quedan 4 intentos
Tu número: 30
Es mayor. Te quedan 3 intentos
Tu número: 37
¡Adivinaste!
La variable acerto es una bandera: un booleano que recuerda si pasó algo dentro del bucle, para decidir qué hacer después.
Resumen
if/elif/elseeligen qué bloque ejecutar; se evalúan en orden y se ejecuta solo el primero que se cumpla.- La indentación (4 espacios) define qué líneas pertenecen a cada bloque.
and,orynotcombinan condiciones;9 <= x < 18chequea un rango.whilerepite mientras una condición sea verdadera;forrecorre los elementos de una secuencia.range(inicio, fin, paso)genera enteros y nunca incluye el fin; para bajar, el paso es negativo.breakcorta el bucle;continuepasa a la siguiente vuelta;while True+breaksirve para menús.- Acumuladores y contadores se inicializan antes del bucle y se actualizan adentro.