Lección 4: Herramientas de Control de Flujo en Python

Saludos otra vez, en esta ocasión veremos algunos tipos de Control de Flujo que usaremos en nuestros scripts... Empecemos !!

Control de Flujo Simple: Construcciones if

Quizá la mejor conocida de las construcciones es if ("si" en Español). Veamos un ejemplo: este script pedirá al usuario un número, luego evaluará si el número es positivo, negativo o cero mostrando el resultado en un mensaje. Bueno... abre el IDLE de Python, luego abre una ventana nueva en el menú File / New Window, pega este código en esa ventana (editor), guardalo y ejecútalo en modo consola (doble click sobre el archivo guardado). ¿entiendes el funcionamiento interno del script?, si es así ... excelente !!! , caso contrario... no te preocupes que lo explicaré en un momento
# -*- coding: utf-8 -*-
# control de flujo simple prueba_2.py

x = input('Ingrese un número: ')
if x > 0:
print 'El número es positivo'
elif x < 0:
print 'El número es negativo'
else:
print 'El número es cero'

from time import sleep
sleep(5)
primero expliquemos el funcionamiento de la construcción if

if <condición_1 es verdadera> :
       acción 1.1
       acción 1.2
       . . .
elif <condición_2 es verdadera> :
       acción 2.1
       acción 2.2
       . . .
else :
       acción a
       acción b
       . . .

Puede haber cero o más partes elif y la parte else (si no) es opcional. La palabra clave elif es una abreviatura de else if (a lo mejor viste esto en otros lenguajes de programación). Una secuencia if . . . elif . . . elif . . . es la sustituta de las sentencias switch o case de otros lenguajes. ¿Cómo se ejecuta la construcción if? ... veamos
  1. Primero se evalúa la condición_1 del if.
  2. Si la evaluación resulta verdadera, se ejecutan las acciones del if : acción 1.1, acción 1.2, acción 1.3, etc... luego de ejecutarse estas acciones, se termina toda la estructura y las demás condiciones ni siquiera se evalúan, es decir se sale completamente del if.
  3. Pero, si la evaluación de la condición_1 fuera falsa entonces se evalúa la condición_2 del elif. Si el resultado de esta evaluación es verdadero, entonces se ejecutan sus acciones: acción 2.1, acción 2.2, acción 2.3, etc... y luego se termina la estructura completamente.
  4. En caso de que las evaluaciones de las condiciones anteriores sean todas falsas, entonces se ejecutan las acciones del else y luego se termina la estructura (ten en cuenta que aquí no hay condiciones).
Para resumir, ¿cómo funciona? pues... se evalua la primera condición y luego dice: "si esta es cierta entonces ejecuto sus acciones y salgo de la estructura, pero si es falsa entonces paso a evaluar la siguiente condición", ya en la segunda condición dice: "si esta es cierta ejecuto sus acciones y luego termino la estructura, pero si es falsa, paso al siguiente"... y asi sucesivamente... Si todas son falsas dice: "ejecuto si o si las acciones de respaldo del else y salgo de la estructura". 

De esto podemos notar que se ejecuta las acciones de sólo una de las condiciones, aquella que resulte verdadera.

Ahora que sabemos el funcionamiento de la estructura if, expliquemos nuestro script del ejemplo: 

Cuidado !!  la indentación es importante: ¿notaste que las palabras if, elif y else están a la misma altura en sus respectivas líneas, mientras que print esta indentado osea desplazado un poco  hacia la derecha? bueno... pues esa ordenación es importante. if, elif y else son, por decirlo menos técnico, del mismo rango de prioridad por tanto cualquiera de ellos no puede estar indentado dentro del otro (a menos que se trate de una subconstrucción if). Te invito a indentar la línea del elif o la del else de nuestro ejemplo y verás que el programa no se ejecutará por ese error. Por otro lado, print es una tarea a ejecutarse ya sea del if, elif o else por lo tanto ella si debe estar indentada.... recuerda la indentación es importante no sólo en nuestro ejemplo sino en todo script hecho en python.

La línea 1 es la codificación para poder escribir carácteres como tildes, eñes y demás.
La línea 2 es un simple comentario
La línea 4  es la instrucción input que le permite al usuario ingresar data numérica a través del teclado
Las líneas 5 y 6 son la escructura if donde se evalua su condición. Si ingresamos por ejemplo x = 3 esta condición sería cierta (pues 3 es mayor que cero) y por lo tanto la instrucción  print de la línea 6 al ejecutarse mostraría en pantalla el mensaje "El número es positivo."
Las líneas 7 y 8 . Si la condición en la línea 5 es falsa y si el número ingresado fuera menor que cero, por ejemplo x = -5, entonces se verifica la condición de la línea 7 y se mostraría en pantalla el mensaje "El número es negativo."
Las líneas 9 y 10. Si las condiciones anteriores son falsas, es decir si ingresamos el número x = 0 (ni negativo ni positivo) pues se ejecuta la línea 10 y la instrucción print nos mostraría "El número es cero."
Las líneas 12 y 13. Cuando ejecutamos el programa en modo consola, estas dos líneas trabajan en conjunto para pausar el programa por unos segundos antes de cerrar la ventana de ejecución; de lo contrario, el programa cerrará su ventana muy rápido.

Control de Flujo Repetitivo: Construcciones For

La construcción For (para) es un poco diferente a lo acostumbrado en C o Pascal. En lugar de recorrer siempre una progresión aritmética (como en Pascal) o dejar al programador total libertad de elección de inicialización, comprobación y salto de paso (como en C), el For de Python recorre los elementos de una secuencia (una lista o cadena), en el orden en que aparecen en la secuencia. Si no conoces C o Pascal y por lo tanto no entendiste muy bien lo que acabo de mencionar, no te preocupes que con los ejemplos que mostraré aprenderás a usar construcciones For en Python sin ningún problema, pero creo que fue necesario mencionar eso para aquellos que si conocen esos lenguajes y vean una diferencia inmediata. Veamos un primer ejemplo para tener las cosas más claras:

Observación: En esta ocasión trabajaremos en la ventana principal del IDLE (donde se ve el prompt), por lo tanto escribe una a una las instrucciones siguientes presionando Enter después de cada instrucción.
>>> x = [2, 4, 9, 7, 15]
>>> x
[2, 4, 9, 7, 15]
>>> type(x)
type 'list'
>>> for i in x:
print i


2
4
9
7
15

en este ejemplo primero hemos creado una lista de números x = [2, 5, 9, 7, 15], ten cuenta que las listas se crean entre corchetes. Como observas en el ejemplo, al escribir x y luego presionar Enter vemos esa lista de números almacenados en x. ¿quieres confirmar que x es una lista porque no me crees? esta bién... escribe type(x) como en el ejemplo y Python te confirmará que x es un  lista: type 'list'. Ahora veamos lo que nos interesa "La construcción For" en este caso aplicado a una lista numérica.

Te explico... todo empieza con la variable i. Primero nota que esta variable i no fue declarada previamente, pues es la primera vez que aparece ¿por qué? como te mencióne en un post anterior, en Python se puede usar las variables que queramos sin decir el tipo de ellas (no es necesario declarar las variables como string, integer, float, etc... para nada. Es lo bueno de Python !!!).

 Aclarado esto (a lo mejor ni lo notaste pero ahora ya sabes) ¿Cómo crees que funcione la construcción For?¿alguna idea? bueno... debes saber que For es un ciclo repetitivo donde las acciones dentro del For se repetirán tantas veces como la longitud de la variable x, en este caso 5 veces (pues x tiene 5 elementos).¿Como se inicia? La variable i toma como valor al primer elemento de la lista x ( es decir i = 2 ) y ejecuta todas las acciones dentro de la construcción (en nuestro caso sólo imprime el valor de i en pantalla), luego regresa y esta ves i toma como valor al segundo elemento de x ( es decir i = 4 ) y otra vez se ejecuta las mismas acciones que para el caso anterior (imprime en pantalla en nuestro ejemplo) y asi sucesivamente hasta que i toma el último valor de la lista x ( es decir i = 15 ) donde se ejecutan las acciones por última vez, luego de que i toma cada uno de los valores de la lista x, se termina el ciclo repetitivo For.  ¿Fácil verdad?

Hemos visto un ejemplo con una lista numérica, pero esto tambien es posible con una lista de strings o cadenas de texto. Veamos el segundo ejemplo:
>>> y = ["hola","saludos","adios"]
>>> y
['hola', 'saludos', 'adios']
>>> type(x)
type 'list'
>>> for j in y:
print j


hola
saludos
adios

La misma idea del ejemplo anterior, sólo que ahora la variable de recorrido es j la misma que uno a uno se autoasigna los elementos de la lista y que es una lista de strings. Sencillo verdad ??

Control de Flujo Repetitivo: Construcciones While

Esta construcción ya la vimos en el post anterior Primer script en el lenguaje Python. En ese post, estudiamos el funcionamiento de este bucle con detalle. Recordemos algo, con el siguiente ejemplo:

Abre una ventana nueva en menú File / New Window y escribe el siguiente código y guardalo. A continuación paso a explicar las líneas:
# -*- coding: utf-8 -*-
# construcción while

x = 4
while x > 0:
print x
x = x-1
if x == 0:
print 'el bucle se acabó'

from time import sleep
sleep(5)

ejecuta el script ya sea en modo consola o usando el IDLE con F5. Verás que se ejecuta muy rápido, no toma ni un segundo en mostrar este resultado:
>>> ================================ RESTART ================================
>>>
4
3
2
1
el bucle se acabó
>>>

Expliquemos el funcionamiento. Bueno, creamos una variable x = 4... luego viene el bucle While ¿Cómo funciona? pues asi:
  1. Evalua la condición x > 0
  2. Si al evaluar la condición esta resulta verdadera entonces se ejecutan las acciones del bucle que en nuestro problema son: (a) imprimir en pantalla el número, (b) restarle al número una unidad y luego (3) verificar si x en ese instante es cero o no. Luego que todas las acciones se han ejecutado, se regresa al punto 1. y nuevamente se evalua la misma condición (recuerda que x ya cambió de valor) y asi sucesivamente.
  3. Termina la estructura cuando el resultado de la condición es falso.
En nuestro ejemplo, en cada instante del bucle se trata de verificar si x > 0. Al confirmarse ello, el valor de x diminuye en una unidad según la línea x = x-1 y se autoasigna a si mimo el nuevo valor disminuido, es decir los valores que toma la variable x son {4, 3, 2, 1, 0} una vez por cada ciclo ¿pero el 0 no se muestra? Cierto... pero el último valor de x es cero  momento en el cual se ejecuta la condicion del if mostrando el mensaje "el bucle se acabó" (pues 0 > 0 es falso) y allí termina el bucle. 

Nuestro ejemplo es un bucle que termina o finito, pero ¿hay bucles infinitos? Si... mira el siguiente ejemplo y ejecútalo:
# -*- coding: utf-8 -*-
# construcción while: bucle infinito

x = 1
while x > 0:
print x
x = x+1

from time import sleep
sleep(5)
ejecútalo con F5 o en modo consola... y sorpresa !!!! el script corre y corre y no se detiene mostrándonos números en una columna uno debajo del otro... dejalo por horas si quieres pero nunca se cerrará la ventana por si sola. Ok.. no te asustes...cierra la ventana como lo habitual y listo se acabó el programa. ¿por qué sucedió esto? Es fácil darse cuenta donde esta el problema: la condicion y la línea x = x+1. Con esta última línea x tomará los valores {1,2,3,4,5,6,7,8,9,10,11,...} y si ves la condición, x siempre es mayor que cero... por eso el bucle es infinito.

Te preguntarás ¿Para qué me puede servir un bucle infinito si parece un error del programador? Bueno... en nuestro ejemplo es obviamente un error, pero eso no significa que todo bucle infinito lo sea... Más adelante, cuando empecemos a programar juegos con Python y Pygame verás la utilidad de los bucles infinitos y es más, ellos son la parte principal del juego. Si... leiste bien. Aprenderemos a hacer nuestros propios juegos en Python usando Pygame... así que espera que eso ya viene pronto. Por el momento hay que ir entendiendo conceptos básicos pero sólidos sobre lo que usaremos en programas mas complejos.

Bueno... esto sería todo en este post... ya conocemos algo más y poco a poco ya estamos adquiriendo más confianza con los conceptos básicos de programación en python. Nos vemos en la próxima entrega

Related Posts

ADBLOCK DETECTED!

You are running an AdBlock extension in your browser!
If you wish to continue please disable AdBlock for this website.
Subscribe Our Newsletter