Autor: Luis Fernando Apáez Álvarez
-Curso PyM-
Clase 2: Bucles y condicionales
Fecha: 09 de Agosto del 2022
En esta clase veremos el concepto de condicional en Python, el cual nos permitirá realizar una accíon si cierta condición es verdadera, en otras palabras si cierta variable boolena posee el valor de True
; y se relizará también una acción en dado caso de que la variable boleana tenga el valor de False
.
Asimismo, veremos también el concepto de bucles, en el cual cierta acción o acciones serán ejecutadas repetidamente cierto número de veces o hasta que cierta condición se cumpla.
Para entender de mejor manera el concepto de condicional (y muchos otros conceptos) es preciso tener ciertos conocimientos sobre Lógica. Recordemos que la clase pasada vimos algunos operadores lógicos y experimentamos con ellos cambiando el valor de verdad de una variable. Por ejemplo, si consideramas
v1 = False
print(v1)
print("-" * 30)
# Podemos cambiar su valor a True mediante el operador de negacion
v1 = not v1
print(v1)
False ------------------------------ True
De manera similar, el resto de operadores poseían un valor de verdad dependiendo las variables booleanas que las involucraban. Por ejemplo
# Declaramos dos variables boolenas
v2 = False
v3 = True
# Entonces
v4 = v2 and v3
print(f"La variable v4 es: {v4}")
print("-" * 30)
v5 = v2 or v3
print(f"La variable v4 es: {v5}")
La variable v4 es: False ------------------------------ La variable v4 es: True
Pues:
and
: éste es verdadero solamente cuando todas las variables booleanas involucradas son verdaderas; y será falso cuando al menos una de las variables involucradas sea falsa.or
: éste es verdadero siempre que, al menos una de las variables involucradas sea verdadera; será falso solamente cuando todas las variables involucradas sean falsas.not
: éste es verdadero solo si la variable involucrada es falsa, y viceversa.Retomando la idea del inicio de la clase, básicamente un condiconal representa ciertas instrucciones a ejecutar si una condición se cumple o es verdadera, asimismo, ciertas isntrucciones serán ejecutadas cuando la condición sea falsa. Por ejemplo
donde, si está en verde, entonces cruzamos, si no entonces no cruzamos. Así, para menjar condicionales dentro de Python manejamos la siguiente estructura:
if <<condicion>>:
instrucciones en caso de que la condicion sea verdadera
else:
instrucciones en caso de que la condicion sea falsa
Es importante mencionar que en Python la sangría tiene un papel importante, pues notemos que en la línea referente a las instrucciones se ha implementando un sangrado respecto a las palabras if
y else
. Por ejemplo, si escribimos el código anterior pero sin el sangrado en las líneas de las instrucciones
if <<condicion>>:
instrucciones en caso de que la condicion sea verdadera
else:
instrucciones en caso de que la condicion sea falsa
obtendríamos un error de identación. Ahora bien, podemos implementar nuestro primer condicional utilizando el ejemplo del semáforo:
# declaramos una variable denominada semaforo
# y le asignamos una cadena de texto representando
# el color que queramos que tenga
print("¿Cuál es el color que actualmente señala el semáforo?")
semaforo = input()
print("-" * 30)
# inicio del if
if semaforo == "verde":
# instruccion a realizar si la condicion del if es
# verdadera
print("Cruce")
# caso en semaforo no sea igual a "verde"
else:
# instruccion a realizar si la condicion del if
# es falsa
print("No cruce")
¿Cuál es el color que actualmente señala el smáforo? verde ------------------------------ Cruce
Donde, una vez que ingresamos el color a la variable semáforo, si ocurre que la cadena asignada a dicha variable es igual a la cadena verde
, entonces se imprimirá el mensaje Cruce
. Si la condición dada en el if
no se cumple, es decir, si la cadena asignada a la variable semaforo
no es igual a la cadena verde
, entonces se imprimirá No cruce
.
Cabe resaltar que el else
del condicional if
es opcional, es decir, si así lo queremos o si así nos sirve, simplemente podemos declarar el condicional if
sin el else
. Por ejemplo
# Le pedimos al usuario que ingrese su edad
print("Por favor, introduzca su edad: ")
edad = int(input())
# Primera validacion
if edad >= 18:
print("Eres mayor de edad")
# Si la condicion del if anterior es falsa, entonces
# no se ejecutara nada. Puede decirse entonces que
# dicha instrucción será ignorada por Python, luego,
# se ejecutara lo que haya debajo de ese codigo, que en
# este caso es:
# Segunda validacion
if (edad < 18) and (edad >= 14):
print("Eres un estudiante de preparatoria")
# Tercera validacion
if (edad < 14) and (edad >= 4):
print("Eres un estudiante niño/a")
# cuarta validacion
if (edad < 4) and (edad >= 0):
print("Eres un estudiante bebe")
Por favor, introduzca su edad: 24 Eres mayor de edad
Otro ejemplo. Supongamos que queremos escribir un programa que realice un descuento en automático del 20% si el monto total de la venta es mayor a 5000; si el monto total de la venta está entre 2000 y los 5000, entonces el descuento será del 10%. Finalmente, para montos de venta menores a los 2000 el descuento será del 5%. Recordemos que, si tenemos, por ejemplo, que un producto vale 1000, si éste tiene un descuento del 10% entonces para calcular el costo después del descuento de dicho producto tenemos que: $$ \textrm{Costo final: } 1000 - 1000 * 0.1 = 900 $$
Lo anterior lo implementamos en Python como sigue:
# variable que almacene el monto de venta
print("Ingrese el monto total de la venta: ")
monto = float(input())
print("-" * 30)
# declaramos una variable auxiliar para calcular el monto final
# despues del descuento. Por el momento le asignamos el valor de 0
monto_final = 0
# implementamos el if
# monto mayor o igual a 5000
if monto >= 5000:
monto_final = monto - monto * 0.2
# monto mayor o igual a 2000 y menor a 5000
if (monto >= 2000) and (monto < 5000):
monto_final = monto - monto * 0.1
# cualquier otro caso (montos menores a 2000)
else:
monto_final = monto - monto * 0.05
# Mensaje final al usuario
print(f"El monto total a pagar es de ${monto_final}")
Ingrese el monto total de la venta: 3580 ------------------------------ El monto total a pagar es de $3222.0
Cuando es necesario que ocupemos varias instrucciones if
, o en otras palabras cuando haya muchos casos que considerar para un if
(como en el ejemplo anterior), una alternativa más amigable es utilizar la cláusula elif
, la cual se puede interpretar como: si no se cumple la condición anterior, y si...
Por ejemplo, del código anterior tendríamos básicamente
En código tenemos
# variable que almacene el monto de venta
print("Ingrese el monto total de la venta: ")
monto = float(input())
print("-" * 30)
# declaramos una variable auxiliar para calcular el monto final
# despues del descuento. Por el momento le asignamos el valor de 0
monto_final = 0
# implementamos el if
# monto mayor o igual a 5000
if monto >= 5000:
monto_final = monto - monto * 0.2
# monto mayor o igual a 2000 y menor a 5000
elif (monto >= 2000) and (monto < 5000):
monto_final = monto - monto * 0.1
# cualquier otro caso (montos menores a 2000)
else:
monto_final = monto - monto * 0.05
# Mensaje final al usuario
print(f"El monto total a pagar es de ${monto_final}")
La ventaja es que considerar if
y elif
trae consigo la agrupación de todo el código involucrado, y no deja aislados los if
como vimos al principio. De esta manera tenemos mayor exactitud en cuanto a las condiciones o casos que estamos manejando.
Un bucle es un concepto, dentro de la programación, en el cual se estarán repitiendo algunas instrucciones cierto número de veces, o mientras una condición sea verdadera. En particular, el bucle for corresponde a la repetición de instrucciones un determinado número de veces. Por ejemplo, podemos programar lo siguiente:
o equivalantemente:
print("Hola")
cinco vecesdonde en esta última equivalencia vemos que una instrucción se está repitiendo (entrando en bucle) un número especifico de veces.
donde el bucle for
terminará una vez que la instrucción haya sido ejecutada 5 veces. Lo anterior lo implementamos en código como:
# comienzo del bucle for
# range(5) genera el rango 0,1,2,3,4
# range(8) genera: 0,1,2,3,4,5,6,7
# nunca se incluye el valor dado como parametro en la
# funcion range()
for i in range(5):
# instruccion a ejecutar
print("Hola")
Hola Hola Hola Hola Hola
donde i in range(5)
significa que la variable i
tomara cada uno de los valores generados en el rango de números enteros 0-4 (es decir 0,1,2,3,4). Así, cuando la i
ya tomó todos los valores del rango del bucle, entonces dicho bucle finaliza.
De tal manera, podemos ver, digamos, con rayos x cómo funciona el ciclo for
anterior:
i=0
: se ejecuta la instrucción print("Hola")
i=1
: se ejecuta la instrucción print("Hola")
i=2
: se ejecuta la instrucción print("Hola")
i=3
: se ejecuta la instrucción print("Hola")
i=4
: se ejecuta la instrucción print("Hola")
es por ello que se imprime 5 veces la cadena "Hola"
. Cabe resaltar que en este caso, la variable i
no fue definida previamente como estamos acostumbrados pues, dicha variable i
, pertenece exclusivamente al bucle, esto es, dicha variable se crea al momento de ejecutar el bucle, y ésta se elimina una vez que el bucle finaliza.
Podemos ver más a detalle cómo es que la variable i
cambia y va tomando todos los valores que genera cierto rango (de números enteros):
# range(3): 0,1,2
for i in range(3):
# imprimimos el valor de i
print(i)
0 1 2
Donde:
i=0
: se ejecuta la instrucción print(i)
, pero como en esa iteración i
tiene el valor de cero, por ello se imprime el 0.i=1
: se ejecuta la instrucción print(i)
, pero como en esa iteración i
tiene el valor de uno, por ello se imprime el 1.i=2
: se ejecuta la instrucción print(i)
, pero como en esa iteración i
tiene el valor de dos, por ello se imprime el 2.Podemos jugar un poco con los bucles for
:
# range(3): 0,1,2,3,4
for i in range(5):
# imprimimos el valor de i ** 2
print(i ** 2)
0 1 4 9 16
O podemos ser un poco más específicos
# range(3): 0,1,2,3,4,5,6
for i in range(7):
# imprimimos el valor de i ** 2
print(f"El número {i} elevado al cuadrado da como resultado: {i ** 2}")
El número 0 elevado al cuadrado da como resultado: 0 El número 1 elevado al cuadrado da como resultado: 1 El número 2 elevado al cuadrado da como resultado: 4 El número 3 elevado al cuadrado da como resultado: 9 El número 4 elevado al cuadrado da como resultado: 16 El número 5 elevado al cuadrado da como resultado: 25 El número 6 elevado al cuadrado da como resultado: 36
Asimismo, podemos especificar el inicio del rango y el final (menos 1). Por ejemplo, range(2,6)
generará el rango de números enteros 2,3,4,5, donde no se incluye el 6; o range(-1,3)
el cual generará el rango -1,0,1,2. En código
for i in range(-1,3):
print(i)
-1 0 1 2
Notemos que la salida como las anteriores del bucle for
, no nos convienen en el sentido del espacio, por ejemplo para rangos grandes
for i in range(20):
print(i)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Una alternativa es cambiar la forma en que se están imprimiendo los resultados. Para ello utilizaremos el parámetro adicional end
dentro de la función print()
. Con este parámetro logramos que la impresión sea horizontal y no vertical. Por ejemplo, podemos pasar de
print("Hola")
print("Mundo")
Hola Mundo
a lo siguiente:
print("Hola", end="-")
print("Mundo", end="-")
Hola-Mundo-
donde al colocar end="-"
, además de especificar que la salida será horizontal, estamos especificando que después de cada impresión se colocará el caracter -
. Podemos utilizar el "caracter vacío" ""
para que al final no se coloque nada
print("Hola", end="")
print("Mundo", end="")
HolaMundo
pero ahora nuestro texto está junto. Para solucionar lo anterior implementamos espacios en blanco
print("Hola", " ", end="")
print("Mundo", " ", end="")
Hola Mundo
Así, gracias a lo anterior podemso escribir:
for i in range(20):
print(i, " ", end = "")
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Otro ejemplo es que podemos calcular de maenra automática una tabla de multiplicar, por ejemplo
# le pedimos al usuario que ingrese un numero para
# poder calcularle su tabla de multiplicar
# \ nos permite continuar escribiendo una cadena
# de texto larga en la siguiente linea
print("Ingrese un número del cual desea conocer \
su tabla de multiplicar")
num = int(input())
Ingrese un número del cual desea conocer su tabla de multiplicar 5
Después, lo que haremos será mostrar repetidamente el mensaje:
print(f"{num} x {1} = {num * 1}")
print(f"{num} x {2} = {num * 2}")
5 x 1 = 5 5 x 2 = 10
pero iremos cambiando dicho 1 por el 2, el 3 y así sucesivamente hasta llegar al 10, lo cual conseguiremos implementanod un bucle for
como sigue:
# range(1,11): 1,2,3,...,10
for i in range(1,11):
# cambiamos el numero fijo por la i
print(f"{num} x {i} = {num * i}")
5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 5 x 10 = 50
De tal manera, así es como conseguimos la tabla del 5. Otro ejemplo:
print("Ingrese un número del cual desea conocer \
su tabla de multiplicar")
# entrada del usuario
num = int(input())
print("-" * 20)
# range(1,11): 1,2,3,...,10
for i in range(1,11):
# cambiamos el numero fijo por la i
print(f"{num} x {i} = {num * i}")
Ingrese un número del cual desea conocer su tabla de multiplicar 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
Podemos utilizar un bucle for
dentro de otro bucle for
, para ello podemos escribir algo como
# i sera el nombre de la variable del primer for
for i in range(3):
# j es el nombre de la variable del segundo for
for j in range(4):
print(f"{i} --> {j}")
0 --> 0 0 --> 1 0 --> 2 0 --> 3 1 --> 0 1 --> 1 1 --> 2 1 --> 3 2 --> 0 2 --> 1 2 --> 2 2 --> 3
En rayos x veríamos:
Primera iteración del primer for: i=0
:
j=0
: De tal manera, en esta ejecución se imprimirá 0 --> 0
j=1
: De tal manera, en esta ejecución se imprimirá 0 --> 1
j=2
: De tal manera, en esta ejecución se imprimirá 0 --> 2
j=3
: De tal manera, en esta ejecución se imprimirá 0 --> 3
. Con este valor el segundo bucle for ha llegado a su fin, de tal manera, la primer ejecución del primer bucle for también ha finalizado. Se continua entonces con la segunda ejecución del primer bucle for.Segunda iteración del primer for: i=1
:
j=0
: De tal manera, en esta ejecución se imprimirá 1 --> 0
j=1
: De tal manera, en esta ejecución se imprimirá 1 --> 1
j=2
: De tal manera, en esta ejecución se imprimirá 1 --> 2
j=3
: De tal manera, en esta ejecución se imprimirá 1 --> 3
.Tercer iteración del primer for: i=2
:
j=0
: De tal manera, en esta ejecución se imprimirá 2 --> 0
j=1
: De tal manera, en esta ejecución se imprimirá 2 --> 1
j=2
: De tal manera, en esta ejecución se imprimirá 2 --> 2
j=3
: De tal manera, en esta ejecución se imprimirá 2 --> 3
.Con lo cual conseguimos el resultado que vimos antes en la celda de código.
En el caso del bucle while
, éste es un bucle que se ejecutará siempre y cuando una cierta condición continúe siendo verdadera
y dicho bucle parará sólo cuando la condición sea falsa. La estructura básica del bucle while
es:
while <<condicion verdadera>>:
instruccion a realizar mientras
la condicion sea verdadera
Por ejemplo, podemos ejecutar print("Hola")
mientras que una variable x
sea mayor o igual a 0
# declaramos la variable x inicializandola en 4
x = 4
# declaramos el bucle while
while x >= 0:
print("Hola")
# Una vez que se ha impreso la cadena "hola"
# el bucle while vuelve a evaluar la veracidad
# de la condicion
El bucle anterior es un bucle infinito pues, como declaramos que x
tiene el valor de 4 y en ningún momento hemos cambiado este valor de x
, entonces x
continuará valiendo 4, de tal manera, como 4 siempre es mayor o igual a cero, el bucle anterior será un bucle infinito, pues la condición del while
siempre será verdadera.
Por ello, es común escribir dentro de nuestro bucle while
alguna instrucción para que, en cierto momento, la condición dada sea falsa. Por ejemplo, en el código anterio podemos restar una unidad al valor de la x
cada que se ejecute una iteración del bucle:
# declaramos la variable x inicializandola en 4
x = 4
# declaramos el bucle while
while x >= 0:
print("Hola")
# Restamos una unidad al valor actual de la x
x -= 1
Hola Hola Hola Hola Hola
Podemos ver lo anterior en rayos x:
x >= 0
, como x
tiene el valor de 4, entonces la condición del while
es verdadera, así, se ejecuta entonces la instrucción print("Hola")
. Después, se ejecuta la instrucción x -= 1
con lo cual cambiamos el valor de la x
de 4 a 3.x >= 0
, como x
tiene el valor de 3, entonces la condición del while
es verdadera, así, se ejecuta entonces la instrucción print("Hola")
. Después, se ejecuta la instrucción x -= 1
con lo cual cambiamos el valor de la x
de 3 a 2.x >= 0
, como x
tiene el valor de 2, entonces la condición del while
es verdadera, así, se ejecuta entonces la instrucción print("Hola")
. Después, se ejecuta la instrucción x -= 1
con lo cual cambiamos el valor de la x
de 2 a 1.x >= 0
, como x
tiene el valor de 1, entonces la condición del while
es verdadera, así, se ejecuta entonces la instrucción print("Hola")
. Después, se ejecuta la instrucción x -= 1
con lo cual cambiamos el valor de la x
de 1 a 0.x >= 0
, como x
tiene el valor de 0, entonces la condición del while
es verdadera, así, se ejecuta entonces la instrucción print("Hola")
. Después, se ejecuta la instrucción x -= 1
con lo cual cambiamos el valor de la x
de 0 a -1.x >= 0
, como x
tiene el valor de -1, entonces la condición del while
es falsa, de tal manera se interrumpe el bucle y ya no se ejecutan las instrucciones.Por lo tanto, vemos que se imprime cinco veces el mensaje "hola"
, pues el bucle while
tuvo 5 iteraciones hasta que la condición dada fue falsa.
Ahora, recordemos que Python se ejecuta de arriba a abajo, de tal manera, una vez que el bucle finaliza, el control de ejecución pasa a la siguiente línea debajo del while
, por ejemplo
# declaramos la variable x inicializandola en 4
x = 4
# declaramos el bucle while
# -----------------------------------------------
while x >= 0:
print("Hola")
# Restamos una unidad al valor actual de la x
x -= 1
# -----------------------------------------------
print("Fin. Este texto ya no pertenece al bucle while")
Hola Hola Hola Hola Hola Fin. Este texto ya no pertenece al bucle while
Otro ejemplo utilizando while
. Podemos realizar sumas repetidamente:
suma = 0
while suma <= 20:
suma += 5
print("Fin Del bucle")
print(f"El valor final de la variable suma es: {suma}")
Fin Del bucle El valor final de la variable suma es: 25
donde suma
comienza valiendo cero, pero después dentro del while
ocurre que:
suma <= 20
, como suma
tiene el valor de 0, entonces la condición del while
es verdadera, así, se ejecuta entonces la instrucción suma += 5
, con lo cual ahora suma
vale 5.suma <= 20
, como suma
tiene el valor de 5, entonces la condición del while
es verdadera, así, se ejecuta entonces la instrucción suma += 5
, con lo cual ahora suma
vale 10.Y así sucesivamente hasta llegar a
suma <= 20
, como suma
tiene el valor de 20, entonces la condición del while
es verdadera, así, se ejecuta entonces la instrucción suma += 5
, con lo cual ahora suma
vale 25.suma <= 20
, como suma
tiene el valor de 25, entonces la condición del while
es falsa, de modo que el bucle finaliza.Lo dicho anteriormente también lo podemos ver en código como sigue
suma = 0
n = 1
while suma <= 20:
suma += 5
print(f"validacion {n} || valor de suma: {suma}")
n += 1
print("Fin")
validacion 1 || valor de suma: 5 validacion 2 || valor de suma: 10 validacion 3 || valor de suma: 15 validacion 4 || valor de suma: 20 validacion 5 || valor de suma: 25 Fin