En esta parte veremos 3 esquemas:
También presentaré el concepto de comprehensions que ofrece Python (pero no R).
Es la situación donde el programa ejecuta alguna sección del código, dependiendo si alguna condición se cumple o no:
from math import sqrt
value=-100
#condición
if value >= 0:
# si es Verdadero
rootValue=sqrt(value)
print (rootValue)
else:
# si es Falso
print('Lo lamento, no calculo raíces cuadradas de números negativos')
Nótese que sólo se usa indentación para identificar secciones de comandos. Sin la sección del else el programa funciona, pero no habrá mensaje de por qué no hay resultado mostrado.
Aquí le dices a la computadora cómo hacer algo muchas veces; así como indicarle cuándo dejarade hacerlo:
from math import sqrt # esta función tiene que llamarse
values=[9,25,100]
for value in values: # mientras hayan valores en 'values'...
print(sqrt(value))
Arriba, el código muestra el resultado, pero si deseas sólo guardalo:
values=[9,25,100]
rootValues=[] # creando lista vacía
for value in values:
rootValues.append(sqrt(value)) # actualizando lista
# si quieres verlos:
rootValues
Es evidente que si combinamos for e if-else tendremos mejores programas:
Above, you saw that Python gives an error ('ValueError'), it is because sqrt is not defined for negative values; then the process ended abruptly. The code below controls the execution better:
values=[9,25,-100]
rootValues=[]
for value in values:
if value >=0:
rootValues.append(sqrt(value))
else:
print('Puse un None, lo verás luego...')
rootValues.append(None)
# check:
rootValues
Si deseas detener la ejecución, usa break:
values=[9,25,-100,144,-72]
rootValues=[]
for value in values:
if value <0:
print('Mejor me detengo, se ha ingresado un valor inválido')
break
rootValues.append(sqrt(value))
# check:
rootValues
El comando continue puede ser útil para usar toda la data aun cuando hay errores:
import numpy as np
values=[9,None,np.nan,np.inf, '1000',-100, 144,-72]
for value in values: # notice the order of 'IFs'
if value in [None,np.nan,np.inf]: # condition1
print ('NA, nan o inf ha sido ingresado')
continue
if isinstance(value, str): #condition2
print ('Encontré un texto...no haré nada')
continue
if value < 0: # condition3
print ('Encontré un negativo...no haré nada')
continue
print (sqrt(value), 'es la raíz de ',value)
Vea que None y NaN tienen diferente naturaleza:
type(None),type(np.nan)
NaN es común en operaciones numéricas:
10 + np.nan
Pero hay error si usas None:
10 + None
10 + np.nan
A veces, quieres contar un valor particular:
values=[9,25,-100,144,-72]
counterOfInvalids=0 # el contador se inicializa
for value in values:
if value <0:
counterOfInvalids +=1 #incrementando contador
# ver
counterOfInvalids
Este código te enseña a guardar posiciones:
values=[9,25,-100,144,-72]
positionInvalids=[]
currentPosition=0 # posición inicial (de arranque)
for value in values:
if value <0:
positionInvalids.append(currentPosition)
currentPosition+=1 # atención dónde pones esto!
# to see the results:
positionInvalids
# testing:
for pos in positionInvalids:
print (values[pos])
Hemos controlado errores antes con if-else; veamos unas situaciones alternativas.
# what kind of error you get:
print (sqrt(-10))
# what kind of error you get:
print (sqrt('10'))
Python is giving different types of errors (Type and Value), let's use that:
values=[10,-10,'10']
for value in values:
try:
print (sqrt(value))
except ValueError:
print (value,'valor equivocado!')
except TypeError:
print (value,'se recibió texto!!')
Por ejemplo, si quieres una lista de las raices de otra:
#esto da error:
values=[9,25,49,121]
sqrt(values)
#esto no:
from math import sqrt
values=[9,25,49,121]
[sqrt(value) for value in values]
Los Dicts también pueden usar comprehensions:
values=[9,25,49,-121]
{value:(sqrt(value) if value > 0 else None) for value in values}
La función zip crea tuplas:
letters=['a','b','c','a']
numbers=[10,20,30,100]
list(zip(letters,numbers))
Las listas Zippeadas son útiles en las comprehensions:
[n for n,l in zip(numbers,letters) if l=='a']
AUSPICIO:
El desarrollo de estos contenidos ha sido posible gracias al grant del Berkeley Initiative for Transparency in the Social Sciences (BITSS) at the Center for Effective Global Action (CEGA) at the University of California, Berkeley
RECONOCIMIENTO
El autor reconoce el apoyo que el eScience Institute de la Universidad de Washington le ha brindado desde el 2015 para desarrollar su investigación en Ciencia de Datos.