Curso de introducción a la programación con Python¶

    Autor: Luis Fernando Apáez Álvarez
    -Curso PyM-
    Clase 2: Bucles y condicionales
    Fecha: 09 de Agosto del 2022


Contenido¶

  • Algo de Lógica
  • Condicionales
  • Bucle for
  • Bucle while

Introducción¶

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.

Captura.PNG

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.

Captura2.PNG

Algo de lógica ¶

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

In [1]:
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

In [2]:
# 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:

  • Para el operador 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.
  • Para el operador 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.
  • Para el operador not: éste es verdadero solo si la variable involucrada es falsa, y viceversa.

Condicionales ¶

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

Captura3.PNG

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:

In [3]:
# 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

In [6]:
# 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:

In [9]:
# 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

Elif¶

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

  • si el monto es mayor a 5000 da el descuento del 20%
  • si no, y si el monto es mayor a 2000 pero menor a 5000 da el descuento del 15%
  • Luego, en este caso si conviene ya agregar un else: si no, entonces da el descuento del 10%

En código tenemos

In [ ]:
# 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.

Captura4.PNG

Bucle for ¶

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:

  • imprime "Hola" cinco veces

o equivalantemente:

  • ejecuta print("Hola") cinco veces

donde en esta última equivalencia vemos que una instrucción se está repitiendo (entrando en bucle) un número especifico de veces.

Captura5.PNG

donde el bucle for terminará una vez que la instrucción haya sido ejecutada 5 veces. Lo anterior lo implementamos en código como:

In [10]:
# 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:

  • Para i=0: se ejecuta la instrucción print("Hola")
  • Para i=1: se ejecuta la instrucción print("Hola")
  • Para i=2: se ejecuta la instrucción print("Hola")
  • Para i=3: se ejecuta la instrucción print("Hola")
  • Para 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):

In [11]:
# range(3): 0,1,2
for i in range(3):
    # imprimimos el valor de i
    print(i)
0
1
2

Donde:

  • Para 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.
  • Para 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.
  • Para 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:

In [2]:
# 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

In [13]:
# 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

In [14]:
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

In [16]:
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

In [21]:
print("Hola")
print("Mundo")
Hola
Mundo

a lo siguiente:

In [23]:
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

In [25]:
print("Hola", end="")
print("Mundo", end="")
HolaMundo

pero ahora nuestro texto está junto. Para solucionar lo anterior implementamos espacios en blanco

In [26]:
print("Hola", " ", end="")
print("Mundo", " ", end="")
Hola  Mundo  

Así, gracias a lo anterior podemso escribir:

In [27]:
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

In [9]:
# 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:

In [12]:
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:

In [13]:
# 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:

In [15]:
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

Bucle for dentro de otro bucle for¶

Podemos utilizar un bucle for dentro de otro bucle for, para ello podemos escribir algo como

In [18]:
# 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:

    • Primera iteración del segundo for: j=0: De tal manera, en esta ejecución se imprimirá 0 --> 0
    • Segunda iteración del segundo for: j=1: De tal manera, en esta ejecución se imprimirá 0 --> 1
    • Tercera iteración del segundo for: j=2: De tal manera, en esta ejecución se imprimirá 0 --> 2
    • Cuarta iteración del segundo for: 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:

    • Primera iteración del segundo for: j=0: De tal manera, en esta ejecución se imprimirá 1 --> 0
    • Segunda iteración del segundo for: j=1: De tal manera, en esta ejecución se imprimirá 1 --> 1
    • Tercera iteración del segundo for: j=2: De tal manera, en esta ejecución se imprimirá 1 --> 2
    • Cuarta iteración del segundo for: j=3: De tal manera, en esta ejecución se imprimirá 1 --> 3.
  • Tercer iteración del primer for: i=2:

    • Primera iteración del segundo for: j=0: De tal manera, en esta ejecución se imprimirá 2 --> 0
    • Segunda iteración del segundo for: j=1: De tal manera, en esta ejecución se imprimirá 2 --> 1
    • Tercera iteración del segundo for: j=2: De tal manera, en esta ejecución se imprimirá 2 --> 2
    • Cuarta iteración del segundo for: 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.

Captura8.PNG

Bucle while ¶

En el caso del bucle while, éste es un bucle que se ejecutará siempre y cuando una cierta condición continúe siendo verdadera

Captura7.PNG

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:

In [19]:
# 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:

  • Primera validación de la condición: se válida si 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.
  • Segunda validación de la condición: se válida si 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.
  • Tercera validación de la condición: se válida si 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.
  • Cuarta validación de la condición: se válida si 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.
  • Quinta validación de la condición: se válida si 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.
  • Sexta validación de la condición: se válida si 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

In [20]:
# 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:

In [22]:
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:

  • Primera validación de la condición: se válida si 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.
  • Segunda validación de la condición: se válida si 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

  • Quinta validación de la condición: se válida si 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.
  • Sexta validación de la condición: se válida si 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

In [28]:
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