viernes, 31 de enero de 2014

Control del flujo


Control del flujo: if


La sentencia if se utiliza para controlar el flujo en la ejecución de un programa. Básicamente, si se cumple una condición puede hacerse que se ejecute un bloque de código, que estará sangrado, y si no se cumple o se dan otras posibilidades puede hacerse que se ejecuten otros bloques, igualmente sangrados. Para ello, se apoya en las clausulas elif que evalúa otras condiciones y en else, que en caso de no cumplirse ninguna de las condiciones anteriores ofrece la solución final. Varios ejemplos:

# Evaluar distintos valores numéricos

if edad <= 12:  # se evalúa la primera condición... 
    precio = 2  # y si edad es menor igual que 12, precio = 2
elif 13 <= edad <= 18:  # en caso contrario se evalúa...
    precio = 3  # si edad está entre 13 y 18, precio = 3
else:  # en cualquier otro caso...
    precio = 4  # precio = 4
print('A Pagar: ' + str(precio) + ' €')  # Muestra importe

# Evaluar en una sola línea

print('par' if edad % 2 == 0 else 'impar')  

# Evaluar si un valor está entre varios posibles

tecla = 'S'
if tecla in('s', 'S', 'y', 'Y'):
    print('Ha seleccionado: Sí')

# Evaluar variables booleanas

respuesta = True
if respuesta:  # Evalúa si respuesta es True
    print('Sí, es verdad')
else:
    print('Es falso')

# Evaluar variables por tipo de dato que contienen

var1 = "Python 3 para impacientes"
var2 = 3
var3 = 3.14
var4 = True
var5 = [1, 2, 3]
var6 = ('a', 'b', 'c')
var7 = {'a':1, 'b':2, 'c':3}

if type(var1) is str:
    print("'var1' es una cadena")

if type(var2) is int:
    print("'var2' es una número entero")

if type(var3) is float:
    print("'var3' es un número con decimales")

if type(var4) is bool:
    print("'var4' es un booleano")

if type(var4):
    print("'var4' es un booleano")

if type(var5) is list:
    print("'var5' es una lista")

if type(var6) is tuple:
    print("'var6' es una tupla")

if type(var7) is dict:
    print("'var7' es un diccionario")

# Evaluar si cadena, lista o diccionario están vacíos

var1 = ""
var2 = []
var3 = {}

if not var1:
    print("Cadena vacía")

if not var2:
    print("Lista sin elementos")
    
if not var3:
    print("Diccionario sin claves/valores")

# Evaluar si una variable no tiene ningún valor

var4 = None
if not var4:
    print("No tiene ningún valor")



Control del flujo con bucles: while


El bucle más elemental suele emplearse cuando un programa necesita repetir un número de veces un proceso hasta que una variable alcanza un valor o hasta que se cumple alguna condición predeterminada. Por ello, en muchos casos, los bucles incorporan variables que actúan como contadores que van cambiando su valor en cada ciclo o variables que representan un cambio de estado (p.e. verdadero y falso). 

La sentencia while incluye la condición que debe cumplirse para que se ejecute el bloque de código que contiene, aunque en cualquier momento podemos salir de un bucle con break o cancelar el ciclo actual y continuar con continue la ejecución del ciclo siguiente.

# Ejemplo de bucle con 'break'

contador = 0
limite = 5
while contador < 11:  # el bucle termina cuando contador=10 
    if contador == limite:  # o cuando alcance el valor limite 
        break
    else:
        contador += 1  # contador se incrementa en 1
        print(contador, limite)

# Ejemplo de bucle con 'continue' y 'break'

x=0
y=0
limite = 5
while True:
    y+=1
    if y!=limite:
        x+=y
    else:
        break
    if y!=3:
        continue
    print(x,y)


En un bucle infinito en el lugar de una condición se escribirá True o el valor 1. Las instrucciones del bucle se ejecutarán indefinidamente hasta que se fuerce su fin con un break.  

contador = 0
while True:
    contador += 1
    if contador == 10:  # cuando valor de contador sea 10...
        break  #  ...terminará la ejecución del bucle


Control del flujo con bucles: for...in


Otra forma de construir un bucle consiste en recorrer los elementos de un lista con la sentencia for...in. La construcción utiliza una variable que en cada ciclo toma el valor de un nuevo elemento de la lista de la clausula in. El bucle terminará cuando se alcance el último elemento de la lista o cuando se fuerce su fin con break

loteria = [12019, 23023, 90326, 40506, 89450, 21023, 13237]
for numero in loteria:
    if numero == 21023:
        print('Tiene el primer premio:', numero) 
        break


Con for también se puede usar la clausula in range que, en su uso más elemental, recorre una secuencia de valores (ver más opciones).

for num in range(10):
    print(num)  # recorre del 0 al 9


Relacionado: Bucles eficaces con Itertools

Ir al índice del tutorial de Python