En esta clase continuaremos con nuestra introducción a Python. En concreto, abordaremos las estructuras de control típicas: los bucles y los condicionales
Objetivos:
if
, elif
, else
.for
.while
if <condition>:
<do something>
elif <condition>:
<do other thing>
else:
<do other thing>
# Definimos dos variables:
x = 3
y = 1
# If simple x > y
print(x,y)
if x > y:
print("x es mayor que y")
print("x sigue siendo mayor que y")
3 1 x es mayor que y x sigue siendo mayor que y
# indentation
if 1 < 0:
print("1 es menor que 0")
print("1 sigue siendo menor que 0") # <-- ¡Mal!
1 sigue siendo menor que 0
# indentation
if 1 < 0:
print("1 es menor que 0")
print("1 sigue siendo menor que 0")
File "<ipython-input-4-b64aa300331e>", line 4 print("1 sigue siendo menor que 0") ^ IndentationError: unexpected indent
Si queremos añadir ramas adicionales al condicional, podemos emplear la sentencia elif
(abreviatura de else if). Para la parte final, que debe ejecutarse si ninguna de las condiciones anteriores se ha cumplido, usamos la sentencia else
:
# Asignamos un nuevo valor a x
x = 0
# else
print(x,y)
if x > y:
print("x es mayor que y")
else:
print("x es menor que y")
0 1 x es menor que y
# Asignamos un nuevo valor a y
y = 0
# elif
print(x, y)
if x < y:
print("x es menor que y")
elif x == y:
print("x es igual a y")
else:
print("x no es ni menor ni igual que y")
0 0 x es igual a y
En Python existen dos tipos de estructuras de control típicas:
while
for
while
¶Los bucles while
repetiran las sentencias anidadas en él mientras se cumpla una condición:
while <condition>:
<things to do>
Como en el caso de los condicionales, los bloques se separan por indentación sin necesidad de sentencias del tipo end
ii = -2
while ii < 5:
print(ii)
ii += 1
-2 -1 0 1 2 3 4
Otros operadores 'in-place' son: -=
, *=
, /=
Se puede interrumpir el bucle a la mitad con la sentencia break
:
ii = 0
while ii < 5:
print(ii)
ii += 1
if ii == 3:
break
0 1 2
Un bloque else
justo después del bucle se ejecuta si este no ha sido interrumpido por nosotros:
ii = 0
while ii < 5:
print(ii)
ii += 1
if ii == 3:
break
else:
print("El bucle ha terminado")
0 1 2
ii = 0
while ii < 5:
print(ii)
ii += 1
#if ii == 3:
#break
else:
print("El bucle ha terminado")
0 1 2 3 4 El bucle ha terminado
for
¶El otro bucle en Python es el bucle for
, y funciona de manera un que puede resultar chocante al principio. La idea es recorrer un conjunto de elementos:
for <element> in <iterable_object>:
<do whatever...>
for ii in (1,2,3,4,5):
print(ii)
1 2 3 4 5
for nombre in "Juan", "Luis", "Carlos":
print(nombre)
Juan Luis Carlos
for ii in range(3):
print(ii)
0 1 2
for jj in range(2, 5):
print(jj)
2 3 4
Con todo lo que sabemos, ahora podemos procesar de una tacada, en bucle, un montón de archivos, con un esfuerzo similar al que necesitábamos para uno solo.
Sólo nos falta una librería:
import glob
La librería glob
contiene una función que se llama glob
y que sirve para encontrar todos los nombres que cumplen un patrón mediante una expresión regular.
# ipynb
glob.glob('*.ipynb')
['091-Ejemplos-Lotka-Volterra.ipynb', '001-PythonBasico-JupyterNotebook.ipynb', '000-Bienvenido.ipynb', '051-Pandas-Ejercicios.ipynb', '021-matplotlib-widgets.ipynb', '034-SciPy-EcuacionesNoLineales.ipynb', '011-NumPy-CaracteristicasArrays.ipynb', '035-SciPy-EcuacionesDiferencialesOrdinarias.ipynb', '002-Sintaxis_basica_i_tipos_datos.ipynb', '040-SymPy-Mecanica.ipynb', '003-Sintaxis_basica_iii_funciones.ipynb', '012-NumPy-Importacion.ipynb', '033-SciPy-InterpolacionAjuste.ipynb', '090-Ejemplos-Yukovski.ipynb', '040-SymPy-Intro.ipynb', '032-Scipy-Estadistica.ipynb', '010-NumPy-Intro.ipynb', '030-SciPy-FuncionesEspeciales.ipynb', '005-PythonBasico-EjercicioTiroParabolico.ipynb', '020-matplotlib-Intro.ipynb', '013-NumPy-SeccionesArrays.ipynb', '060-ScikitLearn-Intro.ipynb', '014-NumPy-AlgerbraLineal.ipynb', '092-Ejemplos-FelixBaumgartner.ipynb', '080-Numba-Intro.ipynb', '003b-Sintaxis_basica_iv_estructuras_control.ipynb', '004-PythonBasico-EjerciciosBuclesCondicionales.ipynb', '015-NumPy-EntradaSalida.ipynb', '002b-Sintaxis_basica_ii_utilizando_librerias.ipynb', '006-PythonBasico-SaltoDeLaRana.ipynb', '031-SciPy-CalculoIntegrales.ipynb', '050-Pandas-Intro.ipynb']
# csv
glob.glob('../data/swc//*.csv')
['../data/swc/inflammation-02.csv', '../data/swc/inflammation-01.csv', '../data/swc/inflammation-09.csv', '../data/swc/inflammation-07.csv', '../data/swc/inflammation-10.csv', '../data/swc/inflammation-08.csv', '../data/swc/inflammation-04.csv', '../data/swc/inflammation-03.csv', '../data/swc/inflammation-11.csv', '../data/swc/inflammation-06.csv', '../data/swc/inflammation-12.csv', '../data/swc/inflammation-05.csv']
El resultado es una lista de strings y por lo tanto, se pude iterar a lo largo de ella y aplicar a cada fichero una función para analizarlo:
Creemos una función analyze
para explorar cada archivo:
%matplotlib inline
import numpy as np
from matplotlib import pyplot as plt
def analyze(filename):
data = np.loadtxt(fname=filename, delimiter=',')
plt.plot(data.mean(axis=0))
plt.show()
analyze('../data/swc/inflammation-01.csv')
Podemos usarla dataset a dataset
analyze('../data/swc/inflammation-02.csv')
o ...
filenames = glob.glob('../data/swc/*.csv')
filenames = filenames[0:3]
for f in filenames:
print(f)
analyze(f)
../data/swc/inflammation-02.csv
../data/swc/inflammation-01.csv
../data/swc/inflammation-09.csv
** Hemos visto:**:
Referencias
Las siguientes celdas contienen configuración del Notebook
Para visualizar y utlizar los enlaces a Twitter el notebook debe ejecutarse como seguro
File > Trusted Notebook
# preserve
# Esta celda da el estilo al notebook
from IPython.core.display import HTML
css_file = '../styles/aeropython.css'
HTML(open(css_file, "r").read())