Condicionales

Resumen

Enseñando: 10 min
Ejercicios: 15 min
Preguntas
  • ¿Cómo pueden los programas hacer cosas diferentes para datos diferentes?

Objectivos
  • Escribir correctamente los programas que usan declaraciones if y else y expresiones booleanas simples (sin operadores lógicos).

  • Rastrear la ejecución de sentencias condicionales no anidados y sentencias condicionales dentro de bucles.

Utiliza las declaraciones if para controlar si se ejecuta o no un bloque de código.

Una declaración if (más propiamente llamada declaración condicional) controla si algún bloque de código se ejecuta o no.

mass = 3.54
if mass > 3.0:
    print(mass, 'is large')

mass = 2.07
if mass > 3.0:
    print (mass, 'is large')
3.54 is large

Las sentencias condicionales a menudo se usan dentro de bucles.

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 3.0:
        print(m, 'is large')
3.54 is large
9.22 is large

Utiliza else para ejecutar un bloque de código cuando una condición if no es verdadera.

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 3.0:
        print(m, 'is large')
    else:
        print(m, 'is small')
3.54 is large
2.07 is small
9.22 is large
1.86 is small
1.71 is small

Usa elif para especificar verificaciones adicionales.

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 9.0:
        print(m, 'is HUGE')
    elif m > 3.0:
        print(m, 'is large')
    else:
        print(m, 'is small')
3.54 is large
2.07 is small
9.22 is HUGE
1.86 is small
1.71 is small

Las condiciones se verifican una vez, en orden.

grade = 85
if grade >= 70:
    print('grade is C')
elif grade >= 80:
    print('grade is B')
elif grade >= 90:
    print('grade is A')
grade is C
velocity = 10.0
if velocity > 20.0:
    print('moving too fast')
else:
    print('adjusting velocity')
    velocity = 50.0
adjusting velocity
velocity = 10.0
for i in range(5): # execute the loop 5 times
    print(i, ':', velocity)
    if velocity > 20.0:
        print('moving too fast')
        velocity = velocity - 5.0
    else:
        print('moving too slow')
        velocity = velocity + 10.0
print('final velocity:', velocity)
0 : 10.0
moving too slow
1 : 20.0
moving too slow
2 : 30.0
moving too fast
3 : 25.0
moving too fast
4 : 20.0
moving too slow
final velocity: 30.0

Crea una tabla que muestre los valores de las variables para rastrear la ejecución de un programa.

i 0 . 1 . 2 . 3 . 4 .
velocity 10.0 20.0 . 30.0 . 25.0 . 20.0 . 30.0

El programa debe tener una declaración print fuera del cuerpo del bucle. para mostrar el valor final de ‘velocity’, ya que su valor se actualiza hasta la última iteración del bucle

Relaciones Compuestas Usando and, or, y Paréntesis

A menudo, quieres alguna combinación de cosas para que la condición sea verdadera. Puedes combinar relaciones dentro de un condicional usando and y or. Continuando con el ejemplo arriba, suponga que tienes

mass     = [ 3.54,  2.07,  9.22,  1.86,  1.71]
velocity = [10.00, 20.00, 30.00, 25.00, 20.00]

i = 0
for i in range(5):
    if mass[i] > 5 and velocity[i] > 20:
        print("Fast heavy object.  Duck!")
    elif mass[i] > 2 and mass[i] <= 5 and velocity[i] <= 20:
        print("Normal traffic")
    elif mass[i] <= 2 and velocity[i] <= 20:
        print("Slow light object.  Ignore it")
    else:
        print("Whoa!  Something is up with the data.  Check it")

Al igual que con la aritmética, debes usar paréntesis siempre que se presente una posible ambigüedad. Una buena regla general es siempre usar paréntesis al mezclar and y or en la misma condición. Es decir, en lugar de:

if mass[i] <= 2 or mass[i] >= 5 and velocity[i] > 20:

escribe uno de estos:

if (mass[i] <= 2 or mass[i] >= 5) and velocity[i] > 20:
if mass[i] <= 2 or (mass[i] >= 5 and velocity[i] > 20):

así que es perfectamente claro para un lector (y para Python) lo que realmente quieres decir.

Rastreo de Ejecución

¿Qué imprime este programa?

pressure = 71.9
if pressure > 50.0:
    pressure = 25.0
elif pressure <= 50.0:
    pressure = 0.0
print(pressure)

Solución

25.0

Recorte de valores

Complete los espacios en blanco para que este programa cree una nueva lista que contenga ceros (0) donde los valores de la lista original eran negativos y unos (1) donde los valores de la lista original eran positivos

original = [-1.5, 0.2, 0.4, 0.0, -1.3, 0.4]
result = ____
for value in original:
    if ____:
        result.append(0)
    else:
        ____
print(result)
[0, 1, 1, 1, 0, 1]

Solución

original = [-1.5, 0.2, 0.4, 0.0, -1.3, 0.4]
result = []
for value in original:
    if value<0.0:
        result.append(0)
    else:
        result.append(1)
print(result)

Procesando archivos pequeños

Modifica este programa de manera que solo procese archivos con menos de 50 registros.

import glob
import pandas as pd
for filename in glob.glob('data/*.csv'):
    contents = pd.read_csv(filename)
    ____:
        print(filename, len(contents))

Solución

import glob
import pandas as pd
for filename in glob.glob('data/*.csv'):
    contents = pd.read_csv(filename)
    if len(contents)<50:
        print(filename, len(contents))

Iniciando

Modifique este programa para que encuentre los valores más altos y más bajos en la lista sin importar cuál sea el rango de valores originalmente.

values = [...some test data...]
smallest, largest = None, None
for v in values:
    if ____:
        smallest, largest = v, v
    ____:
        smallest = min(____, v)
        largest = max(____, v)
print(smallest, largest)

¿Cuáles son las ventajas y desventajas de usar este método para encontrar el rango de los datos?

Solución

values = [-2,1,65,78,-54,-24,100]
smallest, largest = None, None
for v in values:
    if smallest==None and largest==None:
        smallest, largest = v, v
    else:
        smallest = min(smallest, v)
        largest = max(largest, v)
print(smallest, largest)

Uso de Funciones con Condicionales en Pandas

Las funciones a menudo contienen condicionales. Aquí hay un breve ejemplo que indicará en qué cuartil se encuentra el argumento basado en valores codificados a mano para los puntos de corte del cuartil.

def calculate_life_quartile(exp):
    if exp < 58.41:
        # This observation is in the first quartile
        return 1
    elif exp >= 58.41 and exp < 67.05:
        # This observation is in the second quartile
       return 2
    elif exp >= 67.05 and exp < 71.70:
        # This observation is in the third quartile
       return 3
    elif exp >= 71.70:
        # This observation is in the fourth quartile
       return 4
    else:
        # This observation has bad data
       return None

calculate_life_quartile(62.5)
2

Esa función normalmente se usaría dentro de un bucle for, pero Pandas tiene una forma diferente y más eficiente de hacer lo mismo, y eso es mediante aplicando una función a un dataframe o una parte de ello. El siguiente ejemplo, usa la definición anterior.

data = pd.read_csv('Americas-data.csv')
data['life_qrtl'] = data['lifeExp'].apply(calculate_life_quartile)

Hay mucho en esa segunda línea, así que vamos a tomarlo pieza por pieza. En el lado derecho de = comenzamos con data ['lifeExp'], que es la columna en el dataframe llamado data con la etiqueta lifExp. Usamos el apply() para hacer lo que dice, aplique el ‘calculate_life_quartile` al valor de esta columna para cada fila en el dataframe.

Puntos Clave

  • Utiliza las declaraciones if para controlar si se ejecuta o no un bloque de código.

  • Las sentencias condicionales a menudo se usan dentro de bucles.

  • Usa else para ejecutar un bloque de código cuando una condición if no es verdadera.

  • Usa elif para especificar verificaciones adicionales.

  • Las condiciones se verifican una vez, en orden.

  • Crea una tabla que muestre los valores de las variables para rastrear la ejecución de un programa.