Estructuras de control¶
Las estructuras de control de flujo establecen cuál es el orden de ejecución de las sentencias de un programa en base a condiciones que se evaluan como ciertas o falsas.
Valores booleanos¶
Un tipo booleano admite solo dos valores True
o False
.
Conversion a bool
Otros tipos pueden convertirse a bool siguiendo estas reglas: Cero, '' (dos comillas simples vacias que representan un string vacio) y None
se convierten en False
. Números distintos de cero, strings no vacios y cualquier objeto se convierten a True
.
Operadores de comparación¶
Estos operadores comparan dos valores y devuelven un tipo booleano (True
o False
).
Operador | Descripción | Ejemplo | Resultado |
---|---|---|---|
== | Evalua si dos valores son iguales. | 4 == 3 | False |
!= | Evalua si dos valores son distintos. | 4 != 3 | True |
< | Evalua si el valor de la izquierda es menor. | 4 < 3 | False |
<= | Evalua si el valor de la izquierda es menor o igual. | 4 <= 3 | False |
> | Evalua si el valor de la izquierda es mayor. | 4 > 3 | True |
>= | Evalua si el valor de la izquierda es mayor o igual. | 4 >= 3 | True |
Operadores lógicos¶
Los operadores lógicos se utilizan para combinar varias expresiones booleanas entre sí y devolver, a su vez, un tipo booleano (True
o False
).
Operador | Descripción | Ejemplo | Resultado |
---|---|---|---|
and | Devuelve True solo si ambos valores son True. | (1<2) and (2<3) | True |
or | Devuelve True si cualquiera de los valores es True. | (1<2) or (9>1) | True |
not | Devuleve True si el valor es False. | not (1<2) | True |
Estructuras condicionales¶
Estructura if¶
Con una estructura de control if
el programa decidirá si es necesario ejecutar una porción de código o no ejecutarla en base al resultado de una condición booleana.
En su forma más simple la estructura es la siguiente:
1 2 |
|
"condicion" es cualquier expresión booleana que se evalue a True
o False
. Habitualmente utilizará los operadores de comparación y/o lógicos vistos en los apartados anteriores. Después de la condición booleana es necesario escribir el carácter :
.
El "bloque de código" estará formado por una o varias sentencias que se ejecutarán si la condición se evalua a True
. Es fundamental que el "bloque de código" esté indentado a la derecha, preferiblemente con cuatro espacios.
Indentación
En Python la indentación es un concepto fundamental para determinar como un pedazo de código se relaciona con otro. Se recomienda utilizar cuatro espacios para la indentación en lugar de una tabulación.
Veamos un ejemplo donde no se cumple la condición y, por lo tanto, no se ejecutarán la sentencias que van indentadas bajo el if
.
1 2 3 4 5 |
|
Resultado:
Fin
Ahora modificamos el programa y vemos que ocurre cuando si se cumple la condición.
1 2 3 4 5 |
|
Resultado:
Puedes votar
Ejerce tu derecho con responsabilidad
Fin
Estructura if/else¶
Opcionalmente se puede incluir la palabra clave else
seguida de dos puntos después de un if
. Esto nos permite incluir un segundo bloque de código que se ejecutará cuando no se cumpla la condición.
Tendremos, por lo tanto, un primer bloque indentado después del if
y un segundo bloque indentado después del else
. Si la condición se cumple se ejecuta el primero, si no se cumple se ejecuta el segundo. Uno de los dos se ejecuta seguro.
1 2 3 4 5 |
|
Resultado:
No puedes votar
Estructura if/elif¶
En ocasiones hay varias condiciones que deseamos evaluar, de forma que evaluemos cada nueva condición si la anterior no se cumple. Para este escenario Python ofrece la palabra clave elif
dentro de una estructura if
. elif
es una forma compacta de indicar else if
. Finalmente, de forma opcional, podemos terminar con un else
cuyo código se ejecutaría si no se han cumplido ninguna de las condiciones anteriores.
1 2 3 4 5 6 7 8 9 |
|
Resultado:
Notable
If anidados¶
También es posible incluir estructuras if
dentro de otros if
. A esto le denominaremos if
anidados.
1 2 3 4 5 6 7 8 9 10 11 |
|
Resultado:
Notable
Expresión if¶
Hasta ahora hemos visto el uso de if
como sentencia. Vamos a ver ahora un uso más compacto como expresión. Una expresión devuelve siempre un valor (a diferencia de una sentencia).
En ocasiones queremos asignar un valor a una variable dependiendo de una condición. Vamos a validar si una nota es correcta asignando a la variable estado
los valores de "nota valida" o "nota invalida" según si la nota cumple con el rango admitido. Para ello utilizamos una sentencia if/else
con las dos asignaciones posibles.
1 2 3 4 5 6 7 |
|
Resultado:
nota valida
Una forma alternativa de hacerlo es utilizando una expresión con el siguiente formato:
1 |
|
Toda la expresión tomará el valor "valor1" cuando la condición se cumpla. En otro caso toda la expresión tomará el valor de "valor2".
1 2 3 |
|
Resultado:
nota valida
Pertencia a una colección¶
Para comprobar si un elemento pertenece a una colección podemos utilizar las palabras clave in
y not in
que devolverán un valor booleano.
1 2 3 4 5 6 7 8 9 |
|
Resultado:
Contine manzana
No contiene coco
Estructuras de repetición¶
Estructura while¶
La estructura while
permite repetir un bloque de código (una o varias sentencias) mientras se cumpla una determinada condición (una expresión sea True
). La estructura tiene el siguiente formato:
1 2 |
|
La condición se evalúa antes de cada repetición del bloque de código. Si la condición es True
, se ejecuta el bloque de código y, después, se evalua de nuevo la condición repitiendo el bucle hasta que la condición sea False
.
El bloque de código que pertenece al while debe aparecer indentado con respecto al mismo con 4 espacios.
1 2 3 4 5 6 |
|
Resultado:
Main engine start
6 5 4 3 2 1 Ignition!
Es necesario dar un valor inicial a la variable count
antes de llegar al ciclo while
. Esto es porque dicha variable se va a utilizar en la condición que decide si hay que repetir el bucle count > 0
. Esta condición se va a evaluar por primera vez al llegar la ejecución al while
. Mientras que la condición se cumpla se va a repetir el bloque de código compuesto en este caso por dos sentencias: una que imprime el valor de la cuenta y otra que se encarga de restar 1 al valor de count
.
Estructura for¶
La estructura for
también se utiliza para repetir un bloque de código un determinado número de veces. Su formato es el siguiente:
1 2 |
|
El bloque de código se repetirá para cada uno de los valores generados por range
. En cada repetición en la variable "nombre_variable" tendremos disponibles cada uno de los valores generados para operar.
range
admite entre paréntesis un valor inicial, un valor de finalización (que nunca se alcanza) y, opcionalmente, un valor de salto. Veamos un ejemplo:
1 2 |
|
Resultado:
4 6 8 10 12 14 16 18
En lugar de range
podemos utilizar otras colecciones de objetos como listas para iterar sobre sus elementos.
Veamos el ejemplo anterior resuelto con el while
en este caso con un for
:
1 2 3 4 |
|
Resultado:
Main engine start
6 5 4 3 2 1 Ignition!
En algunos casos solamente queremos utilizar un ciclo for
para repetir un número de veces un bloque de código y no tenemos interes en el valor concreto de la variable generada por el rango en cada repetición. En ese caso se suele emplear por convenio el nombre _
para la variable. Esto indica que la intención es no utilizar ese valor.
1 2 3 |
|
Resultado:
Password: ********
break¶
La palabra clave break
detiene la ejecución de un ciclo (ya sea un for
o un while
) en el momento que se ejecuta.
1 2 3 4 |
|
Resultado:
1 2
continue¶
La palabra clave continue
detiene la ejecución de la repetición actual del bloque de código y procede a evaluar la condición de repetición para comprobar si es necesario volver a repetirlo.
1 2 3 4 |
|
Resultado:
1 2 4 5
Estructura for/else¶
Un for
puede tener un else
de forma opcional al final del mismo. El bloque del else
se ejecutará si y solo si todos los elementos en la secuencia se han procesado. El for
puede quedarse sin procesar todos los elementos porque se produzca un error o porque se ejecute una instrucción break
que interrumpa el bucle.
1 2 3 4 5 6 7 8 |
|
Ejecución:
Enter failure second (-1 None): 3
6 5 4 Mission aborted.
Ejecución:
Enter failure second (-1 None): -1
6 5 4 3 2 1 Ignition!