Computación Avanzada
Grado en Matemáticas
Tema 0: Introducción a la programación
con Python
Curso 2021-2022
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Indice I
1 Variables, operadores y tipos de datos básicos
Operadores
Variables y asignaciones
Errores y excepciones
Tipos de datos
Cadenas
Números
Listas y Tuplas
Diccionarios
2 Estructuras de control
Sentencias condicionales
Sentencias iterativas
Anidamiento de estructuras
3 Funciones y módulos
Funciones predefinidas
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Indice II
Definición de funciones
Variables locales y variables globales
Llamadas a función y paso de parámetros
Consejos sobre cuándo definir funciones
Módulos
4 Entrada/Salida
Entrada por teclado
Salida por pantalla
Ficheros
Lectura de ficheros
Escritura de ficheros
Tratamiento de errores
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
¿Por qué Python?
En 8 del Top10 de Departamentos de Informática (Berkeley, MIT, Stanford, etc.) se
utiliza Python como lenguaje para los cursos de iniciación a la programación.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Nivel de popularidad de los lenguajes de programación
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Python y otros lenguajes de programación
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Python
Teniendo en cuenta lo anterior y considerando además que Python es un lenguaje de
programación interpretado cuya filosofı́a hace hincapié en una sintaxis que favorezca un
código legible, unido al hecho de que en la actualidad existen multitud de herramientas
para realizar cálculos cientı́ficos y desarrollar aplicaciones cientı́ficas en Python.
¿Nuestra elección?
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Python
Python es un lenguaje de programación creado por Guido van
Rossum a principios de los años 90 cuyo nombre está inspirado en el
grupo de cómicos ingleses Monty Python.
Es administrado por la Python Software Foundation.
Es un lenguaje con sintaxis muy limpia y favorece un código legible.
Se trata de un lenguaje interpretado o de script, con tipado
dinámico, fuertemente tipado, multiplataforma y multiparadigma.
El intérprete de Python está disponible en multitud de plataformas
(UNIX, Solaris, Linux, DOS, Windows, OS/2, Mac OS, etc.) por lo
que si no utilizamos librerı́as especı́ficas de cada plataforma nuestro
programa podrá correr en todos estos sistemas sin grandes cambios.
Python es un lenguaje de programación multiparadigma, ya que
soporta orientación a objetos, programación imperativa y, en menor
medida, programación funcional.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Python: lenguaje interpretado
Python a pesar de ser un lenguaje interpretado, tiene, no obstante,
muchas de las caracterı́sticas de los lenguajes compilados, por lo que
se podrı́a decir que es semi-interpretado.
En Python, como en Java y muchos otros lenguajes, el código
fuente se traduce a un pseudocódigo máquina intermedio llamado
bytecode la primera vez que se ejecuta, generando archivos .pyc o
.pyo (bytecode optimizado), que son los que se ejecutarán en
sucesivas ocasiones.
Como lenguajes interpretados tiene la ventaja de poder generar el
código in-situ, sin necesidad de recurrir a una compilación.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Python: tipado
La caracterı́stica de tipado dinámico se refiere a que no es
necesario declarar el tipo de dato que va a contener una
determinada variable, sino que su tipo se determinará en tiempo de
ejecución según el tipo del valor al que se asigne, y el tipo de esta
variable puede cambiar si se le asigna un valor de otro tipo.
Es fuertemente tipado porque no se permite tratar a una variable
como si fuera de un tipo distinto al que tiene, es necesario convertir
de forma explı́cita dicha variable al nuevo tipo previamente.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Python
Ventajas
Sintaxis simple, clara y sencilla.
Tipado dinámico.
Gestor de memoria.
Gran cantidad de librerı́as disponibles.
Potencia del lenguaje.
Desarrollar en Python es sencillo y muy rápido.
Apropiado para iniciarse en la programación.
Desventajas
Python no es adecuado para la programación de bajo nivel.
Python tampoco es adecuado para el desarrollo de aplicaciones en
las que el rendimiento sea un factor crı́tico.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Implementaciones de Python
CPython es la implementación oficial y más ampliamente utilizada
del lenguaje de programación Python. Cuando la gente habla de
Python normalmente se refiere a esta implementación. En este caso
tanto el intérprete como los módulos están escritos en C.
Jython es la implementación en Java de Python, mientras que
IronPython es su contrapartida en C# (.NET). Su interés estriba
en que utilizando estas implementaciones se pueden utilizar todas
las librerı́as disponibles para los programadores de Java y .NET.
PyPy es una implementación en Python de Python.
Cosas a tener en cuenta
CPython está instalado por defecto en la mayor parte de las distribuciones Linux y en las
últimas versiones de Mac OS.
Para saber si tenemos Python instalado podemos probar a teclear en la consola:
python --version
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Sesiones interactivas
Podemos escribir lı́neas de código en el intérprete y obtener una
respuesta del intérprete para cada lı́nea
Para iniciar una sesión interactiva bastará con abrir un terminal y
escribir python
Para finalizar una sesión interactiva bastará con pulsar Ctrl-D
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Sesiones interactivas
A la hora de realizar una sesión interactiva se puede instalar y
utilizar iPython, en lugar de la consola interactiva de Python.
Se puede encontrar en http://ipython.scipy.org.
iPython cuenta con caracterı́sticas añadidas muy interesantes:
La función de autocompletado. Se lanza pulsando el tabulador. Si
escribimos fi y pulsamos el tabulador nos mostrará una lista de los
objetos que comienzan por fi (file, filter y finally). Si
escribimos file. y pulsamos el tabulador nos mostrará una lista de
los métodos y propiedades del objeto file.
El operador ? nos muestra información sobre los objetos. Se utiliza
añadiendo el sı́mbolo de interrogación al final del nombre del objeto
del cual queremos más información.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Sesiones interactivas
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Archivo con el código fuente
La otra alternativa consiste en escribir el código de un programa en un
archivo de código fuente y luego ejecutarlo.
Ejemplo: Hola mundo
Para probarlo, crearemos un archivo llamado hola.py con el
siguiente contenido:
#!/usr/bin/python
print('Hola Mundo')
El shebang indica al sistema operativo que dicho script se debe
ejecutar utilizando el intérprete especificado.
Para conocer la ruta al intérprete de Python: which python
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Estructuras de control
Funciones y módulos
Entrada/Salida
Archivo con el código fuente
Ejemplo: Hola mundo
Una vez creado el archivo, debemos darle permisos de ejecución:
chmod u+x hola.py
Para ejecutar el programa:
./hola.py
Como alternativa para ejecutar el programa directamente, sin
cambiar los permisos:
python hola.py
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Indice
1 Variables, operadores y tipos de datos básicos
Operadores
Variables y asignaciones
Errores y excepciones
Tipos de datos
2 Estructuras de control
3 Funciones y módulos
4 Entrada/Salida
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Operadores aritméticos
>>> 1 + 2
3
>>> 1 + 2 + 3
6
>>> 1 + 2 - 3
0
>>> 1 - 2 + 3
2
>>> 1 - (2 + 3)
-4
>>> --3
3
>>> 1-2 + 3
2
>>> 2
File "<stdin>", line 1
2
^
IndentationError: unexpected indent
Se pueden introducir varias operaciones en una misma lı́nea o expresión.
En principio el orden en el que se efectúan las operaciones es de izquierda a derecha.
El uso de los espacios es bastante liberal, salvo en medio de un número y al comienzo de
una expresión.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Operadores aritméticos
>>> 3 * 4 /2
6
>>> 3 * 4 / 2
6
>>> 12 / 3 * 2
8
>>> 2 + 5 * 3
17
>>> 2 * 5 + 3
13
>>> (2 + 5) * 3
21
>>> 10 / 3
3.3333333333333335
Se aplica la precedencia de operadores.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Operadores aritméticos
>>> 10 % 2
0
>>> 10 % 3
1
>>> 2 ** 3
8
>>> 2 ** 3 ** 2
512
El operador módulo: %
El operador exponenciación: **
La exponenciación es asociativa por la derecha.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Operadores aritméticos
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Operadores lógicos
>>> True and False
False
>>> True and True
True
>>> True or False
True
>>> False or False
False
>>> not True
False
>>> not False
True
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Operadores de comparación
>>> 2 == (3 - 1)
True
>>> 3 > 1
True
>>> 5 <= 2
False
>>> 3 != 0
True
>>> True == (1 + 2)
False
>>> True == 1
True
>>> 2 < 3 > 1
True
>>> (2 < 3) and (3 > 1)
True
>>> 2 == 3 - 1 > 1
True
>>> (2 == (3 - 1)) and ((3 - 1) > 1)
True
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Precedencia de operadores
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Operadores binarios
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Variables y asignaciones
>>> 4 = 3
File "<stdin>", line 1
SyntaxError: can't assign to literal
>>> a = 2 + 5
>>> a
7
>>> b = 4 * -3
>>> b
-12
>>> c = a + b
>>> c
-5
>>> c = 2
>>> c
2
>>> a = a + 1
>>> a
8
>>> a == a + 1
False
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Asignaciones con operador
>>> a = 5
>>> a
5
>>> a += 1
>>> a
6
>>> a *= 2
>>> a
12
>>> a /= 3
>>> a
4
Todos los operadores aritméticos tienen su asignación con operador
asociada.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Identificadores o nombres de variables
>>> numero = 3
>>> NUMERO = 3
>>> NuMeRo12345 = 3
>>> número = 3
File "<stdin>", line 1
número = 3
^
SyntaxError: invalid syntax
>>> num_23 = 23
>>> _num = 2
>>> n1_n2 = 2
>>> 1num = 2
File "<stdin>", line 1
1num = 2
^
SyntaxError: invalid syntax
Un identificador debe estar formado por letras minúsculas, mayúsculas, dı́gitos y/o el
caracter de subrayado ( ).
El primer caracter no puede ser un dı́gito.
Un identificador no puede coincidir con una palabra reservada.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Variables no inicializadas
>>> a + 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> z = x + y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
En Python, la primera operación sobre una variable debe ser la
asignación de un valor.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Errores y excepciones
>>> 2 *+ 1
2
>>> 2 - + * 3
File "<stdin>", line 1
2 - + * 3
^
SyntaxError: invalid syntax
>>> 1 + 2)
File "<stdin>", line 1
1 + 2)
^
SyntaxError: invalid syntax
>>> ((1 + 2) * 3
...
... )
9
>>> 2/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Cadenas
>>> c1 = 'hola'
>>> c1
'hola'
>>> c2 = 'adios'
>>> c2
'adios'
>>> c3 = c1 + ' y ' + c2
>>> c3
'hola y adios'
>>> c4 = c1 + y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
>>> c5 = '12' + '12'
>>> c5
'1212'
>>> c6 = 12+12
>>> c6
24
>>> '-' * 50
'--------------------------------------------------'
Se definen entre comillas simples o comillas dobles.
Es posible realizar operaciones con cadenas.
Distinguir entre cadenas y variables, y entre cadenas y otros tipos de datos.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Cadenas
>>> 'hola' < 'adios'
False
>>> 'holaaaa' > 'hola'
True
>>> 'hola' == 'hola'
True
>>> 'hola' != 'hola'
False
>>> 'hola' >= 'HOla'
True
>>> ord('a')
97
>>> ord('A')
65
>>> chr(97)
'a'
Dos cadenas son iguales si son iguales caracter a caracter, y distintas en caso contrario.
Para comparar cadenas con los operadores < y > se utiliza el criterio de orden alfabético.
Se utiliza el código ASCII de los caracteres para decidir su orden.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Cadenas
>>> s1 = 'luis delgado cruz'
>>> s1
'luis delgado cruz'
>>> s1.lower()
'luis delgado cruz'
>>> s1.upper()
'LUIS DELGADO CRUZ'
>>> s1.title()
'Luis Delgado Cruz'
>>> s1.replace('luis', 'juan')
'juan delgado cruz'
>>> 'probando'.replace('o', '*')
'pr*band*'
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Cadenas
s.count(sub[, start[, end]]): devuelve el número de veces que se encuentra sub en
la cadena. Los parámetros opcionales start y end definen una subcadena en la que
buscar.
s.find(sub[, start[, end]]): devuelve la posición en la que se encontró por primera
vez sub en la cadena o -1 si no se encontró.
s.join(seq): devuelve una cadena resultante de concatenar las cadenas de la secuencia
seq separadas por la cadena sobre la que se llama el método.
s.partition(sep): busca el separador sep en la cadena y devuelve una tupla con la
subcadena hasta dicho separador, el separador en sı́, y la subcadena del separador hasta
el final de la cadena. Si no se encuentra el separador, la tupla contendrá la cadena en sı́
y dos cadenas vacı́as.
s.replace(old, new[, count]): devuelve una cadena en la que se han reemplazado
todas las ocurrencias de la cadena old por la cadena new. Si se especifica el parámetro
count, éste indica el número máximo de ocurrencias a reemplazar.
s.split([sep [,maxsplit]]): devuelve una lista conteniendo las subcadenas en las
que se divide nuestra cadena al dividirlas por el delimitador sep. En el caso de que no se
especifique sep, se usan espacios. Si se especifica maxsplit, éste indica el número
máximo de particiones a realizar.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Números enteros
>>> n = 5
>>> type(n)
<type 'int'>
>>> k = 100L
>>> type(k)
<type 'long'>
>>> j = 027
>>> j
23
>>> k = 0x17
>>> k
23
En Python, no se declara el tipo de la variable al crearla.
Al asignar un número entero a una variable, por defecto, será de tipo int, a menos que
el número sea tan grande como para requerir el uso del tipo long.
Para que explı́citamente un número se almacene usando el tipo long hay que añadir una
L al final.
El literal que se asigna a la variable también se puede expresar como un octal,
anteponiendo un cero, o bien en hexadecimal, anteponiendo un 0x
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Números reales
>>> x = 5.0
>>> type(x)
<type 'float'>
>>> a = 0.1e-3
>>> a
0.0001
>>> y = 7/3
>>> y
2.3333333333333335
>>> type(y)
<class 'float'>
>>> y = 7.0 // 3.0
>>> y
2.0
Se permite la utilización de la notación cientı́fica.
Para que el resultado de la división sea un número real al menos uno de los operandos
debe ser un número real.
El operador // es división entera, a pesar de que los operandos y el resultado sean
float.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Números complejos
>>> c = 5 + 3j
>>> d = 3 + 2j
>>> e = c + d
>>> e
(8+5j)
>>> type(e)
<type 'complex'>
Este tipo de datos se almacena en una estructura compuesta por
dos variables de tipo double, sirviendo una de ellas para almacenar
la parte real y la otra para la parte imaginaria.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Listas
>>> l = [1, 'dos', False, ['a', 'b']]
>>> l = [1, 'dos', False, ['a', b]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>> l[0]
1
>>> l[3]
['a', 'b']
>>> l[3][0]
'a'
>>> l[3][0] = 'A'
>>> l
[1, 'dos', False, ['A', 'b']]
>>> l[-1]
['A', 'b']
>>> l[-2]
False
Una lista es un tipo de colección ordenada.
Las listas pueden contener cualquier tipo de dato: números, cadenas, booleanos, ... y
también listas.
En otros lenguajes se denominan arrays o vectores.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Listas
>>> l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> l[0:10:2]
[0, 2, 4, 6, 8]
>>> l[0:11:2]
[0, 2, 4, 6, 8, 10]
>>> l[0:11]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> l[::2]
[0, 2, 4, 6, 8, 10]
>>> l[::]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> l[5::2]
[5, 7, 9]
>>> l[0:5:2] = [0, 0, 0]
>>> l
[0, 1, 0, 3, 0, 5, 6, 7, 8, 9, 10]
El slicing o particionado, consiste en permitir seleccionar porciones de la lista:
[inicio:fin:salto].
Si se omiten cualquiera de estos valores se tomará por defecto, el inicio, el fin de la lista
y un salto de 1.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Listas
l.append(object): añade un objeto al final de la lista.
l.count(value): devuelve el número de veces que se encontró el valor en la lista.
l.extend(iterable): añade los elementos del iterable a la lista.
l.index(value[, start[, stop]]): devuelve la posición en la que se encontró la
primera ocurrencia de value. Si se especifican, start y stop definen las posiciones de
inicio y fin de una sublista en la que buscar.
l.insert(index, object): inserta el objeto object en la posición index.
l.pop([index]): devuelve el valor en la posición index y lo elimina de la lista. Si no se
especifica la posición, se utiliza el último elemento de la lista.
l.remove(value): eliminar la primera ocurrencia de value en la lista.
l.reverse(): invierte la lista.
l.sort(cmp=None, key=None, reverse=False): ordena la lista. Si se especifica cmp,
éste debe ser una función que tome como parámetro dos valores x e y de la lista y
devuelva -1 si x es menor que y, 0 si son iguales y 1 si x es mayor que y. El parámetro
reverse es un booleano que indica si se debe ordenar la lista de forma inversa.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Listas de listas
>>> M = [ [1, 2, 3], [2, 12, 6], [1, 0, -3], [0, -1, 0] ]
>>> M[0]
[1, 2, 3]
>>> M[1]
[2, 12, 6]
>>> M[0][2]
3
>>> M[1][1]
12
>>> a = [0] * 6
>>> a
[0, 0, 0, 0, 0, 0]
>>> M2 = [a] * 3
>>> M2
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
>>> M2[0][0] = 1
>>> M2
[[1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]]
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Listas de listas
Disposiciones bidimensionales de valores: arrays bidimensionales o matrices.
Cuidado con la inicialización de las matrices.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Tuplas
>>> t = (1, 2, 3)
>>> t
(1, 2, 3)
>>> t[0]
1
>>> t[0] = 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t = (1)
>>> t
1
>>> type(t)
<type 'int'>
>>> t = (1, )
>>> t
(1,)
La diferencia con las listas reside en que las tuplas son inmutables, es decir, sus valores
no se pueden modificar una vez creada; y tienen un tamaño fijo.
A cambio de estas limitaciones las tuplas son más “ligeras” que las listas, por lo que si
el uso que le vamos a dar a una colección es muy básico, podemos utilizar tuplas en
lugar de listas y ahorrar memoria.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Diccionarios
>>> d = {'Imagine': 'The Beatles', 'Satisfaction': 'The Rolling Stones'}
>>> d['Imagine']
'The Beatles'
>>> d['The Beatles']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'The Beatles'
>>> d['Imagine'] = 'Beatles'
>>> d
{'Satisfaction': 'The Rolling Stones', 'Imagine': 'Beatles'}
El primer valor se trata de la clave y el segundo del valor asociado a la clave.
Como clave podemos utilizar cualquier valor inmutable: números, cadenas, booleanos,
pero no listas o diccionarios.
La diferencia principal entre los diccionarios y las listas o las tuplas es que a los valores
almacenados en un diccionario se les accede no por su ı́ndice, porque de hecho no tienen
orden, sino por su clave.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Operadores
Estructuras de control Variables y asignaciones
Funciones y módulos Errores y excepciones
Entrada/Salida Tipos de datos
Diccionarios
D.get(k[, d]): busca el valor de la clave k en el diccionario. Si no se encuentra la clave
devuelve el valor d, si se especificó el parámetro o bien se lanza una excepción.
D.has key(k): comprueba si el diccionario tiene la clave k.
D.items(): Devuelve una lista de tuplas con pares clave-valor.
D.keys(): Devuelve una lista de las claves del diccionario.
D.pop(k[, d]): Borra la clave k del diccionario y devuelve su valor. Si no se encuentra
la clave se devuelve d, si se especificó el parámetro o bien se lanza una excepción.
D.values(): Devuelve una lista de los valores del diccionario.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Indice
1 Variables, operadores y tipos de datos básicos
2 Estructuras de control
Sentencias condicionales
Sentencias iterativas
Anidamiento de estructuras
3 Funciones y módulos
4 Entrada/Salida
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Flujo de ejecución secuencial
Hasta el momento...
Hemos escrito programas en los que:
1 Se piden datos al usuario, asignando a variables los valores dados
por teclado (input).
2 Se efectúan cálculos con los datos introducidos por el usuario,
guardando el resultado en variables (mediante asignaciones).
3 Se muestran por pantalla los resultados obtenidos (sentencia print).
El flujo de ejecución es estrictamente secuencial
Estos programas se forman como una serie de lı́neas que se ejecutan una
tras otra, desde la primera hasta la última, siguiendo siempre el mismo
orden con el que aparecen en el fichero.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Alterar el flujo de ejecución
Es posible alterar el flujo de ejecución de los programas para hacer que:
Tomen decisiones a partir de los datos y/o resultados intermedios y,
en función de estos, ejecuten ciertas sentencias y otras no.
Tomen decisiones a partir de los datos y/o resultados intermedios y,
en función de estos, ejecuten ciertas sentencias más de una vez.
Permitan detectar y tratar los errores que se producen al ejecutar un
programa.
Estructuras de control de flujo
Sentencias condicionales o de selección.
Sentencias iterativas o de repetición.
Sentencias para el lanzamiento y captura de excepciones.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
La sentencia if
if condición:
acción1
acción2
acción3
...
A tener en cuenta
Uso del :
Indentación o sangrado.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
#!/usr/bin/python
# encoding: utf-8
edad = int(input('Introduzca su edad: '))
if edad >= 18:
print('Usted es mayor de edad')
x = 10
edad += x
print('Dentro de %d a~
nos usted tendrá %d a~
nos' % (x, edad)
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
#!/usr/bin/python
# encoding: utf-8
edad = int(input('Introduzca su edad: '))
if edad >= 18:
print('Usted es mayor de edad')
if edad < 18:
print('Usted es menor de edad')
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
#!/usr/bin/python
# encoding: utf-8
edad = int(input('Introduzca su edad: '))
if edad >= 18:
print('Usted es mayor de edad')
if edad < 18:
print('Usted es menor de edad')
print('Usted tiene %d a~
nos' % (edad))
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
#!/usr/bin/python
# encoding: utf-8
edad = int(input('Introduzca su edad: '))
if edad >= 18:
print('Usted es mayor de edad')
if edad < 18:
print('Usted es menor de edad')
print('Usted tiene %d a~
nos' % (edad))
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Sentencias if anidadas
if condición1:
acción11
acción12
...
if condición2:
acción 21
acción 22
...
acción1n
...
A tener en cuenta
Se permiten varios niveles de anidamiento.
Se permiten más de un if en cada nivel de anidamiento.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
#!/usr/bin/python
# encoding: utf-8
n = int(input('Introduzca un número: '))
if n % 2 == 0:
if n % 4 == 0:
print('El número %d es par y múltiplo de 4' % (n))
if n % 2 == 1:
if n % 5 == 0:
print('El número %d es impar y múltiplo de 5' % (n))
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
La sentencia if-else
if condición:
acción1
acción2
acción3
...
if condición_contraria:
otra_acción1
otra_acción2
otra_acción3
...
Esta situación es tan común que se utiliza una sentencia especı́fica:
if-else
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
La sentencia if-else
if condición:
acción11
acción12
acción13
...
else:
acción21
acción22
acción23
...
En caso de que se cumpla la condición se realizarán una serie de acciones
y en caso contrario se realizarán otra serie de acciones.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
#!/usr/bin/python
# encoding: utf-8
edad = int(input('Introduzca su edad: '))
if edad >= 18:
print('Usted es mayor de edad')
else:
print('Usted es menor de edad')
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Sentencias if-else anidadas
if condición:
acción
...
else:
if otra_condición:
otra_acción
...
else:
cualquier_otra_acción
...
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
radio = float(input('Dame el radio de un cı́rculo: '))
print('Escoge una opción: ')
print('a) Calcular el diámetro')
print('b) Calcular el perı́metro')
print('c) Calcular el área')
opcion = input('Teclea a, b o c y pulsa el retorno de carro: ')
if opcion == 'a':
diametro = 2 * radio
print('El diámetro es', diametro)
else:
if opcion == 'b':
perimetro = 2 * 3.14 * radio
print('El perı́metro es', perimetro)
else:
if opcion == 'c':
area = 3.14 * radio ** 2
print('El área es', area)
else:
print('Ha introducido una opción que no es válida')
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
La sentencia elif
if condición:
acción1
acción2
acción3
...
elif otra_condición:
otra_acción1
otra_acción2
otra_acción3
...
Un else inmediatamente seguido por un if puede escribirse de una
forma más compacta.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
radio = float(input('Dame el radio de un cı́rculo: '))
print('Escoge una opción: ')
print('a) Calcular el diámetro')
print('b) Calcular el perı́metro')
print('c) Calcular el área')
opcion = input('Teclea a, b o c y pulsa el retorno de carro: ')
if opcion == 'a':
diametro = 2 * radio
print('El diámetro es', diametro)
elif opcion == 'b':
perimetro = 2 * 3.14 * radio
print('El perı́metro es', perimetro)
elif opcion == 'c':
area = 3.14 * radio ** 2
print('El área es', area)
else:
print('Ha introducido una opción que no es válida')
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
La sentencia while
while condición:
acción1
acción2
acción3
...
Mientras se cumpla la condición, se repiten las acciones.
Las sentencias que denotan repetición se denominan bucles.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
Código:
i = 0
while i < 3:
print(i)
i += 1
Salida por pantalla:
0
1
2
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
La sentencia for-in
for variable in serie de valores:
acción1
acción2
acción3
...
Se ejecuta el conjunto de acciones para cada uno de los valores que
puede tomar la variable.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
Código:
for nombre in ['Pepe', 'Ana', 'Juan']:
print('Hola, %s.' % nombre)
Salida por pantalla:
Hola, Pepe.
Hola, Ana.
Hola, Juan.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
Código:
numero = int(input('Introduzca un número: '))
for potencia in [2, 3, 4, 5]:
print('%d elevado a %d es %d' % (numero, potencia, numero ** potencia))
Salida por pantalla:
Introduzca un número: 2
2 elevado a 2 es 4
2 elevado a 3 es 8
2 elevado a 4 es 16
2 elevado a 5 es 32
Pero, ¿y si quisiéramos mostrar hasta una potencia mucho mayor?
¿tendrı́amos que escribir uno a uno todos los elementos del rango?
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Rangos de valores
>>> lista = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> rango = range(1, 10)
>>> lista
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> rango
range(1, 10)
>>> print(lista)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(rango)
range(1, 10)
>>> lista == rango
False
>>> list(rango)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lista == list(rango)
True
Si queremos tratar a una variable de tipo rango como una lista habrá que hacer
“explı́citamente” la conversión a lista.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Rangos de valores
>>> list(range(1, 10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(0, 5))
[0, 1, 2, 3, 4]
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(0, 11, 2))
[0, 2, 4, 6, 8, 10]
>>> list(range(0, 11, 5))
[0, 5, 10]
>>> list(range(10, 0, -1))
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> list(range(5, -6, -2))
[5, 3, 1, -1, -3, -5]
>>> list(range(-5, 6, 1))
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
>>> list(range(-5, 6))
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
range (valor inicial, valor final + 1)
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejemplo
Código:
numero = int(input('Introduzca un número: '))
for potencia in range(101):
print('%d elevado a %d es %d' % (numero, potencia, numero**potencia))
Salida por pantalla:
Introduzca un número: 2
2 elevado a 0 es 1
2 elevado a 1 es 2
2 elevado a 2 es 4
2 elevado a 3 es 8
2 elevado a 4 es 16
2 elevado a 5 es 32
2 elevado a 6 es 64
2 elevado a 7 es 128
2 elevado a 8 es 256
2 elevado a 9 es 512
2 elevado a 10 es 1024
...
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
La sentencia break
creo_que_se_cumple_para_alguno = False
for elemento in conjunto:
if condición:
creo_que_se_cumple_para_alguno = True
break
Permite abortar la ejecución de un bucle desde cualquier punto del
mismo.
Usarlo sólo cuando sea útil: a veces es más claro poner una
condición en el propio bucle.
Una sentencia break siempre aborta la ejecución de un solo bucle y
éste es el que lo contiene directamente.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Anidamiento de estructuras
for elemento1 in conjunto1:
for elemento2 in conjunto2:
while condicion1:
if condicion2:
...
No se debe asignar un valor a un ı́ndice de bucle ni usar la misma
variable para ı́ndices de bucles anidados.
Importante la indentación.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejercicio
Escriba un programa en Python que lea la edad de dos personas y diga
quién es más joven, la primera o la segunda. Hay que tener en cuenta
que ambas personas pueden tener la misma edad.
#!/usr/bin/python
# encoding: utf-8
numero1 = int(input('Introduzca la primera edad: '))
numero2 = int(input('Introduzca la segunda edad: '))
if numero1 < numero2:
print('La primera persona es más joven')
elif numero1 > numero2:
print('La segunda persona es más joven')
else:
print('Tienen la misma edad')
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejercicio
Escriba un programa en Python que, dado un número entero, determine
si éste es el doble de un número impar.
(Por ejemplo: 14 es el doble de 7, que es impar).
#!/usr/bin/python
# encoding: utf-8
numero = int(input('Introduzca un número entero: '))
if numero % 2 == 0:
mitad = numero/2
if mitad % 2 == 1:
print('%d es el doble de %d, que es impar' % (numero, mitad))
else:
print('%d es el doble de %d, que es par' % (numero, mitad))
else:
print('El número no es par')
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejercicio
Escriba un programa en Python que, dados dos números enteros, muestre
por pantalla uno de estos mensajes, dependiendo de la verificación de la
condición correspondiente al significado de cada mensaje:
“El segundo número es el cuadrado exacto del primero”
“El segundo número es menor que el cuadrado del primero”
“El segundo número es mayor que el cuadrado del primero”
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejercicio
#!/usr/bin/python
# encoding: utf-8
n1 = int(input('Introduce el primer número: '))
n2 = int(input('Introduce el segundo número: '))
if n2 == n1 * n1:
print('El segundo es el cuadrado exacto del primero')
elif n2 < n1 * n1:
print('El segundo es menor que el cuadrado del primero')
else:
print('El segundo es mayor que el cuadrado del primero')
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejercicio
m
X
Escriba un programa en Python que calcule i donde n y m son
i=n
números enteros que deberá introducir el usuario por teclado.
Si n > m, el programa no efectuará ningún cálculo y muestre por
pantalla un mensaje que diga que n debe ser menor o igual que m.
Implemente una versión utilizando la sentencia while y otra versión
utilizando la sentencia for-in.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejercicio
#!/usr/bin/python
# encoding: utf-8
n = int(input('Introduzca el número n: '))
m = int(input('Introduzca el número m: '))
suma = 0
if n > m:
print('ERROR: n debe ser menor o igual que m')
else:
while (n <= m):
suma = suma + n
n += 1
print(suma)
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos Sentencias condicionales
Estructuras de control Sentencias iterativas
Funciones y módulos Anidamiento de estructuras
Entrada/Salida Ejercicios
Ejercicio
#!/usr/bin/python
# encoding: utf-8
n = int(input('Introduzca el número n: '))
m = int(input('Introduzca el número m: '))
suma = 0
if n > m:
print('ERROR: n debe ser menor o igual que m')
else:
for valor in range(n, m+1):
suma = suma + valor
print(suma)
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Indice
1 Variables, operadores y tipos de datos básicos
2 Estructuras de control
3 Funciones y módulos
Funciones predefinidas
Definición de funciones
Módulos
4 Entrada/Salida
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Funciones predefinidas
Hasta el momento...
Hemos estado invocando funciones que reciben cero, uno o más
argumentos separados por comas y encerrados entre un par de paréntesis
y pueden devolver un valor o no devolver nada:
abs(-3)
round(2.45, 1)
int(‘124’)
str(124)
Para las funciones que devuelven un valor, el tipo del mismo está
predeterminado y, por tanto, tendremos que estar atentos a la hora de
combinarlo con otras variables.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Funciones predefinidas
>>> abs(-7)
7
>>> float('2.5e10')
25000000000.0
>>> float('a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: a
>>> int(-2.5)
-2
>>> round(2.5)
2
>>> round(2.55)
3
>>> str(2.5)
'2.5'
>>> str(2.5e10)
'25000000000.0'
>>> a = str(2.5e10)
>>> a + 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Definición de funciones
Definición: cabecera y cuerpo
def doble(x):
return 2 * x
Llamada o invocación: parámetros de la función
print(doble(5))
x = 1 + doble(3)
Las reglas para dar nombre a las funciones y a sus parámetros son las
mismas que seguimos para dar nombre a las variables.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Funciones con varios parámetros
Definición:
def potencia(x, y):
return x ** y
Llamada o invocación:
print(potencia(5, 2))
x = 1 + potencia(3, 3)
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Funciones sin parámetros
def lee_entero_positivo():
numero = int(input())
while numero < 0:
print('ERROR: el número debe ser positivo.')
numero = int(input())
return numero
x = lee_entero_positivo()
Los paréntesis NO son opcionales: es obligatorio poner paréntesis a
continuación del identificador, tanto al definir la función como al
invocarla.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Funciones sin devolución de valor
def pares(n):
for i in range(2, n+1, 2):
print(i)
pares(100)
A una función que no devuelve valor se le denomina procedimiento.
Se suelen utilizan para mostrar mensajes o resultados por pantalla.
Cuando no se devuelve nada, en realidad se devuelve un None. Por
ejemplo, si hiciéramos resultado = pares(100) y luego
mostráramos su valor print(resultado) obtendrı́amos un None.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Funciones que devuelven varios valores
def min_max(valores):
minimo = maximo = valores[0]
for i in range(len(valores)):
if valores[i] < minimo:
minimo = valores[i]
if valores[i] > maximo:
maximo = valores[i]
return minimo, maximo
lista = [3, 7, 0, -1, 8, -5, 2]
resultado = min_max(lista)
minimo, maximo = min_max(lista)
print(resultado, minimo, maximo)
# (-5, 8) -5 8
Lo hacen mediante una tupla (por defecto). También se pueden devolver
varios valores mediante una lista.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Variables locales
Código:
def doble(x):
d = 2 * x
return d
print(doble(5))
print(d)
Salida por pantalla:
10
Traceback (most recent call last):
File './doble.py', line 9, in <module>
print(d)
NameError: name 'd' is not defined
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Variables locales
def doble(x):
d = 2 * x
return d
print(doble(5))
print(d)
Cada función define un ámbito local propio: su cuerpo.
Los identificadores de las variables locales sólo son visibles en su
ámbito local. Es decir, fuera de la función, no están definidas.
Disponer de variables locales permite asegurar que las llamadas a
función no modificarán accidentalmente las variables globales,
aunque se llamen igual.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Variables globales
Código:
def doble(x):
return 2 * y
y = 2
print(doble(5))
Salida por pantalla:
4
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Variables globales
def doble(x):
return 2 * y
y = 2
print(doble(5))
Hay un ámbito global que incluye a aquellas lı́neas del programa
que no forman parte del cuerpo de una función.
Los identificadores de las variables globales son visibles en el ámbito
global y desde cualquier ámbito local.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Variables globales
Código:
def doble(x):
d = 2 * x
return d
d = 2
print(d)
print(doble(5))
print(d)
Salida por pantalla:
2
10
2
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Variables globales
def doble(x):
d = 2 * x
return d
d = 2
print(d)
print(doble(5))
print(d)
Hay una excepción a la regla de que las variables del ámbito global sean
accesibles desde cualquier punto del programa: si el identificador de una
variable (o función) definida en el ámbito global se usa para nombrar una
variable local en una función, la variable (o función) global queda oculta
y no es accesible desde el cuerpo de la función.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Acceso a variables globales desde funciones
Ejemplo:
carga50 = 100
carga20 = 100
carga10 = 100
def sacar_dinero(cantidad):
de50 = cantidad / 50
cantidad = cantidad % 50
de20 = cantidad / 20
cantidad = cantidad % 20
de10 = cantidad / 10
carga50 = carga50 - de50
carga20 = carga20 - de20
carga10 = carga10 - de10
return de50, de20, de10
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Acceso a variables globales desde funciones
Este código provocarı́a un error porque las variables “locales”
(carga50, carga20 y carga10) se utilizan antes de ser inicializadas.
Para decidir si una variable usada en una función es local o global,
Python utiliza la siguiente regla: si se le asigna un valor, es local; si
no, es global.
Para indicar explı́citamente que las variables son globales habrá que
hacer lo siguiente:
global carga50, carga20, carga10
De todas formas hay que tener en cuenta que modificar variables
globales internamente desde una función no es una práctica de
programación recomendable.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Paso de parámetros
Código:
def incrementa(p):
p = p + 1
return p
a = 1
b = incrementa(a)
print('a:', a)
print('b:', b)
Salida por pantalla:
a: 1
b: 2
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Paso de expresiones como argumentos
Código:
def incrementa(p):
p = p + 1
return p
a = 1
a = incrementa(2 + 2)
print('a:', a)
Salida por pantalla:
a: 5
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Más sobre el paso de parámetros
def modifica(a, b):
a.append(4)
b = b + [4]
return b
lista1 = [1, 2, 3]
lista2 = [1, 2, 3]
lista3 = modifica(lista1, lista2)
print(lista1)
print(lista2)
print(lista3)
Salida por pantalla:
[1, 2, 3, 4]
[1, 2, 3]
[1, 2, 3, 4]
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Más sobre el paso de parámetros
Hay que tener en cuenta que:
La asignación puede implicar un cambio del lugar de memoria al que
apunta una variable. Si un parámetro modifica su valor mediante
una asignación, perderá toda relación con el argumento del que
tomó el valor al efectuar el paso de parámetros.
Operaciones como append, del o la asignación a elementos
indexados de listas modifican a la propia lista, por lo que los
cambios afectan tanto al parámetro como al argumento en sı́.
Con las cadenas ocurre algo similar a lo estudiado con las listas, solo
que las cadenas son inmutables y no pueden sufrir cambio alguno
mediante operaciones como append, del o asignación directa a
elementos de la cadena.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Consejos sobre cuándo definir funciones
Todos los fragmentos de programa que vayas a utilizar en más de
una ocasión son buenos candidatos a definirse como funciones, pues
de ese modo se evitará tener que copiarlos varias veces en lugares
distintos.
Si un fragmento de programa lleva a cabo una acción que puede ser
nombrada o descrita con una sola frase, probablemente convenga
convertirlo en una función. Lo ideal es que el programa conste de
una serie de definiciones de función y un programa principal breve
que las use y resulte muy legible.
No conviene que las funciones que definas sean muy largas. Una
función no sólo deberı́a ser breve, además deberı́a hacer una única
cosa y hacerla bien.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Módulos
Las funciones nos permiten repetir una y otra vez los mismos
cálculos en un mismo programa. Sin embargo, cuando escribamos
varios programas, posiblemente nos daremos cuenta de que hay
muchas funciones que tendrı́amos que escribir en cada uno de los
programas.
Para evitar esto podemos escribir nuestros propios módulos.
Un módulo es una colección de definiciones de constantes, variables,
funciones y tipos (entre otras cosas) que pueden ser importadas para
ser usadas desde cualquier programa.
Conviene que estas colecciones se agrupen en módulos según su
ámbito de aplicación.
La distribución estándar de Python nos ofrece gran número de
módulos predefinidos: math, string, calendar, random, etc.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Creación de módulos
Fichero minmax.py
def min(a, b):
if a < b:
return a
else:
return b
def max(a, b):
if a > b:
return a
else:
return b
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Importación de módulos
En cualquier programa donde deseemos utilizar las funciones min y
max bastará con incluir antes la siguiente lı́nea:
from minmax import min, max
Para importar todas las funciones del módulo podremos hacer lo
siguiente:
from minmax import *
Para importar el módulo completo podemos hacer lo siguiente:
import minmax
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Importación de módulos
import math
print(math.sqrt(3))
from math import sqrt
print(sqrt(3))
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Importación de variables y constantes definidas en un
módulo
Ejemplo:
from math import pi, e
print('e =', e)
print('PI =', pi)
Salida por pantalla:
e = 2.71828182846
PI = 3.14159265359
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Carga de módulos
Cuando se importa por primera vez el módulo minmax.py, Python
crea automáticamente un fichero llamado minmax.pyc.
Ese fichero contiene una versión del módulo más fácil de cargar en
memoria para Python (fichero codificado en formato binario).
Python pretende ası́ acelerar la carga de módulos que se usen en los
programas, pero sin obligarte al usuario a gestionar los ficheros .pyc.
Si se borra el fichero minmax.pyc Python lo volverá a crear cuando
se cargue nuevamente el módulo minmax.py desde un programa.
Si se modifica el contenido del fichero (módulo) minmax.py, Python
regenerará automáticamente el fichero minmax.pyc.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Carga de módulos
Generalmente, los módulos se almacenan en ficheros que pueden
encontrarse en:
En el directorio actual de trabajo.
En el directorio donde Python ha sido instalado: PYTHONHOME.
En una ruta o lista de rutas almacenadas en la variable PYTHONPATH.
Esta ruta se puede comprobar a través de la variable sys.path.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Ejecución de módulos
def min(a, b):
if a < b:
return a
else:
return b
def max(a, b):
if a > b:
return a
else:
return b
if __name__ == '__main__':
print('El máximo de 3 y 10 es', max(3,10))
print('El mı́nimo de 3 y 10 es', min(3,10))
La variable name está predefinida en Python y vale main sólo cuando
ejecutamos directamente el fichero (módulo).
La variable name toma el nombre del módulo (minmax) cuando se importa el
módulo desde otro fichero.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Funciones predefinidas
Estructuras de control
Definición de funciones
Funciones y módulos
Módulos
Entrada/Salida
Elementos definidos en un módulo
Es posible averiguar qué funciones, variables, constantes, etc. se han
definido en un módulo:
>>> import minmax
>>> dir(minmax)
['__builtins__', '__doc__', '__file__', '__name__', '__package__',
'max', 'min']
El propósito de la función dir() es encontrar qué nombres están
definidos en un determinado espacio de nombres.
Si se llama sin argumentos, devuelve una lista con los nombres definidos
en el espacio de nombres local.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Indice
1 Variables, operadores y tipos de datos básicos
2 Estructuras de control
3 Funciones y módulos
4 Entrada/Salida
Entrada por teclado
Salida por pantalla
Ficheros
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Lectura de datos del teclado
>>> numero = int(input('Teclea un valor: '))
Teclea un valor: 35
>>> numero
35
>>> numero + 5
40
input(): detiene la ejecución del programa y espera a que el
usuario escriba un texto y pulse la tecla de retorno de carro; en ese
momento prosigue la ejecución y la función devuelve una cadena con
el texto que tecleó el usuario.
El texto tendrá que convertirse en el tipo de dato que necesitamos.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Salida por pantalla
>>> print('Esto es una prueba')
Esto es una prueba
>>> a = 10
>>> b = 5
>>> print(a)
10
>>> print('a = ', a, '--- b = ', b)
a = 10 --- b = 5
>>> print(a, 'veces')
10 veces
Para mostrar un dato por la terminal se utiliza la instrucción print():
print(datos, sep = ' ', end = '\n', file = sys.stdout)
datos: son los datos a imprimir y pueden indicarse tantos como se quieran (separados
por comas).
sep: es el separador entre los datos, por defecto es un espacio.
end: es la cadena final de la impresión, por defecto es un salto de lı́nea.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Salida con formato (viejo formateo de cadenas)
>>> n = 4
>>> m = 3
>>> print('%d elevado a %d es igual a %d' % (n, m, n**m))
4 elevado a 3 es igual a 64
>>> a = 2
>>> b = 6
>>> cadena = '%d sumado con %d es igual a %d' % (a, b, a+b)
>>> cadena.upper()
'2 SUMADO CON 6 ES IGUAL A 8'
>>> print(cadena)
2 sumado con 6 es igual a 8
Cada marca de formato %d en la cadena se sustituye por un número
entero.
Cadena % (valor1, valor2, ...): como resultado se obtiene
una cadena.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Salida con formato (viejo formateo de cadenas)
>>> print(%d elevado a %d es %4d' % (7, 2, 7**2))
7 elevado a 2 es 49
>>> print('%d elevado a %d es %4d' % (7, 3, 7**3))
7 elevado a 3 es 343
>>> print('%d elevado a %d es %4d' % (7, 4, 7**4))
7 elevado a 4 es 2401
>>> print('%d elevado a %d es %4d' % (7, 5, 7**5))
7 elevado a 5 es 16807
>>> print('%f' % 2.0)
2.000000
>>> print('%6.3f' % 2.0)
2.000
>>> nombre = 'Pepe'
>>> print('Hola %s' % (nombre))
Hola Pepe
%4d: indica que el entero se representará ocupando 4 casillas.
%6.3f: seis casillas y tres decimales.
Los paréntesis en el argumento de la derecha son opcionales si sólo se pasa un valor.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Ficheros
Protocolo de trabajo con ficheros
Al trabajar con ficheros es recomendable seguir los pasos siguientes:
1 Abrir el fichero indicando su ruta (relativa o absoluta) y el modo
de trabajo. Hay varios modos de trabajo:
1 Lectura: es posible leer información del fichero, pero no modificarla ni
añadir nueva información.
2 Escritura: sólo es posible escribir información en el fichero. Por regla
general, la apertura de un fichero en modo escritura borra todo el
contenido previo del mismo.
3 Lectura/escritura: permite leer y escribir información del fichero.
4 Adición: permite añadir nueva información al fichero, pero no
modificar la ya existente.
2 Leer o escribir la información correspondiente.
3 Cerrar el fichero al finalizar.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Leer un fichero lı́nea a lı́nea
#!/usr/bin/python
# encoding: utf-8
#Paso 1: abrir el fichero.
fichero = open('fichero.txt', 'r')
# Paso 2: leer los datos del fichero.
for linea in fichero:
print(linea)
# Paso 3: cerrar el fichero.
fichero.close()
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Leer un fichero lı́nea a lı́nea
A la función open se le pasan dos argumentos:
El nombre del fichero (su ruta), que en este ejemplo es relativa.
El modo de apertura, que en este ejemplo es de lectura (“read”).
Como hemos abierto el fichero en modo lectura, sólo podremos leer
su contenido, pero no modificarlo.
La función open devuelve un objeto que almacenamos en la variable
fichero.
Toda operación que efectuemos sobre el fichero se hará a través del
identificador fichero.
Tras cerrar el fichero no se podrán efectuar más operaciones sobre el
mismo.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Leer un fichero lı́nea a lı́nea
Fichero a leer:
Hola Ana
Hola Pepe
Adiós Pepe
Adiós Ana
Salida por pantalla:
Hola Ana
Hola Pepe
Adiós Pepe
Adiós Ana
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Leer un fichero lı́nea a lı́nea
#!/usr/bin/python
# encoding: utf-8
#Paso 1: abrir el fichero.
fichero = open('fichero.txt', 'r')
# Paso 2: leer los datos del fichero.
for linea in fichero:
print(linea, end='')
# Paso 3: cerrar el fichero.
fichero.close()
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Leer un fichero lı́nea a lı́nea
Salida por pantalla:
Hola Ana
Hola Pepe
Adiós Pepe
Adiós Ana
Hemos evitado que el print introduzca un salto de lı́nea extra al
contenido leı́do desde el fichero.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Leer un fichero lı́nea a lı́nea
f = open('fichero.txt', 'r')
for linea in f:
print(linea.rstrip())
f.close()
f = open('fichero.txt', 'r')
while 1:
linea = f.readline()
if linea == '':
break
print(linea.rstrip())
f.close()
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Leer un fichero caracter a caracter
nombre = input('Nombre del fichero: ')
fichero = open(nombre, 'r')
contador = 0
while 1:
caracter = fichero.read(1)
if caracter == '':
break
contador += 1
fichero.close()
print(contador)
El método read actúa sobre un fichero abierto y recibe como argumento
el número de caracteres que deseamos leer. El resultado es una cadena
con, a lo sumo, ese número de caracteres. Al alcanzar el final del fichero,
read devuelve la cadena vacı́a.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Lectura completa en memoria
f = open('fichero.txt', 'r')
lineas = f.readlines()
print(lineas)
f.close()
Salida por pantalla:
['Hola Ana\n', 'Hola Pepe\n', 'Adi\xc3\xb3s Pepe\n',
'Adi\xc3\xb3s Ana\n']
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Lectura completa en memoria
f = open('fichero.txt', 'r')
lineas = f.read()
print(lineas)
f.close()
Salida por pantalla:
Hola Ana
Hola Pepe
Adiós Pepe
Adiós Ana
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Escritura caracter a caracter
f1 = open('fichero.txt', 'r')
f2 = open('copia.txt', 'w')
while 1:
char = f1.read(1)
if char == '':
break
f2.write(char)
f1.close()
f2.close()
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Escritura lı́nea a lı́nea
f1 = open('fichero.txt', 'r')
f2 = open('copia.txt', 'w')
for linea in f1:
f2.write(linea)
f1.close()
f2.close()
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Añadir texto a un fichero
Al abrir un fichero en modo escritura se borra todo su contenido.
Con la opción ‘a’ podemos añadir texto a un fichero existente, sin
perder la información que ya tenı́a el fichero.
f = open('fichero.txt', 'a')
comentario = input('Comentario a a~
nadir en el fichero: ')
f.write('Comentario: ' + comentario + '\n')
f.close()
Hola Ana
Hola Pepe
Adiós Pepe
Adiós Ana
Comentario: Esta es la última lı́nea
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Abrir un fichero que no existe
Al abrir un fichero para lectura, Python comprueba si el fichero
existe.
Si no existe, el intérprete de Python aborta la ejecución y nos
advierte del error.
Si en la función open pasamos como primer argumento un fichero
que no existe, obtendremos un error como el que se muestra a
continuación:
Traceback (most recent call last):
File 'read_line_by_line.py', line 5, in <module>
fichero = open('ejemplo.txt', 'r')
IOError: [Errno 2] No such file or directory: 'ejemplo.txt'
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Tratar errores al abrir un fichero
import os
if os.path.exists('ejemplo.txt'):
fichero = open('ejemplo.txt', 'r')
for linea in fichero:
print(linea)
fichero.close()
else:
print('ERROR: El fichero no existe.')
% Tienes el isfile() and isdir() pero el exists comprueba que
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Tratar errores al abrir un fichero
try:
fichero = open('ejemplo.txt', 'r')
for linea in fichero:
print(linea)
fichero.close()
except IOError:
print('El fichero no existe.')
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Crear ficheros temporales
Es importante usar nombre de ficheros que no existan.
El módulo os contiene algunas funciones útiles para gestionar
ficheros y directorios:
remove
rmdir
mkdir
chdir
listdir
rename
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Variables, operadores y tipos de datos básicos
Entrada por teclado
Estructuras de control
Salida por pantalla
Funciones y módulos
Ficheros
Entrada/Salida
Cosas que no se pueden hacer con ficheros de texto
Ubicarnos en una determinada lı́nea del fichero.
Tener en cuenta que las lı́neas pueden tener tamaños distintos.
La función seek nos permite desplazarnos un determinado número de
bytes dentro del fichero.
La función tell determina la posición en la que nos encontramos
dentro del fichero.
No se pueden modificar u eliminar unas determinadas lı́neas de un
fichero.
Gara Miranda Valladares Tema 0: Introducción a la programación con Python
Computación Avanzada
Grado en Matemáticas
Tema 1: Programación avanzada
Curso 2021-2022
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Indice
1 Librerı́a estándar y utilidades
Números, fechas y horas
Cadenas y expresiones regulares
Iteradores, generadores y colecciones
Funciones lambda
Paso de argumentos a un programa y gestión de errores
2 Programación orientada a objetos
3 Documentación, depuración y pruebas
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Inicialización
Podemos inicializar enteros usando diferente bases:
>>> a = 5
>>> b = 0b1101
>>> b
13
>>> type(b)
<class ‘int’>
>>> c = 0o1572
>>> c
890
>>> type(c)
<class ‘int’>
>>> d = 0x5FA
>>> d
1530
>>> type(d)
<class ‘int’>
>>> a + b + c + d
2438
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato
Podemos convertir valores enteros a diferentes bases pero eso no
modifica el valor almacenado en la variable:
>>> format(a, "b")
‘101’
>>> format(b, "o")
‘15’
>>> format(c, "x")
‘37a’
>>> format(c, "d")
‘890’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Conversión entre bases y tipos
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Conversión entre bases y tipos
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Enteros grandes
En Python 3, no existe lı́mite en relación a lo grande que un número
entero puede ser. Evidentemente siempre existe el lı́mite de la memoria
que nos ofrece el sistema pero a parte de eso, podemos manejar de forma
transparente enteros grandes:
>>> print(123123123123123123123123123123123123123123123123 + 1)
123123123123123123123123123123123123123123123124
>>> a = 100**100
>>> a
1000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> b = float(a)
>>> b
1e+200
>>> format(a, "e")
‘1.000000e+200’
>>> format(a, "0.2e")
‘1.00e+200’
>>> format(a, "20.2e")
‘ 1.00e+200’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato de números
Redondeo positivo/negativo:
>>> round(1.23, 1)
1.2
>>> round(1.27, 1)
1.3
>>> round(-1.27, 1)
-1.3
>>> round(1.25361,3)
1.254
>>> a = 1627731
>>> round(a, -1)
1627730
>>> round(a, -2)
1627700
>>> round(a, -3)
1628000
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Representación en punto flotante
IEEE 754 standard: 64-bit double-precision values.
>>> 1.79e308
1.79e+308
>>> 1.8e308
inf
>>>
>>> 5e-324
5e-324
>>> 1e-325
0.0
Los float se representan internamente como fracciones binarias. La mayor parte de
fracciones decimales no pueden ser representadas exactamente como fracciones
binarias ası́ que la representación de un número en punto flotante es una aproximación
al valor real.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Precisión en los cálculos
>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
Los números en punto flotante no son capaces de representar con
precisión todos los decimales. En estos casos forzar el redondeo no es una
buena opción.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Precisión en los cálculos
Para no perder precisión ni eficiencia en los cálculos, se recomienda
utilizar el módulo decimal.
>>> from decimal import Decimal
>>> a = Decimal(‘4.2’)
>>> b = Decimal(‘2.1’)
>>> a + b
Decimal(‘6.3’)
>>> print(a + b)
6.3
>>> (a + b) == Decimal(‘6.3’)
True
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Precisión en los cálculos
>>> from decimal import localcontext
>>> a = Decimal(‘1.3’)
>>> b = Decimal(‘1.7’)
>>> print(a / b)
0.7647058823529411764705882353
>>> with localcontext() as ctx:
... ctx.prec = 3
... print(a / b)
...
0.765
>>> with localcontext() as ctx:
... ctx.prec = 50
... print(a / b)
...
0.76470588235294117647058823529411764705882352941176
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Precisión en los cálculos
Las variables de tipo Decimal puede construirse a partir de enteros, cadenas, flotantes o
tuplas. Cuando se construyen a partir de un valor numérico (int o float) se lleva a cabo una
conversión directa del valor de entrada.
>>> from decimal import *
>>> getcontext().prec = 28
>>> Decimal(10)
Decimal(‘10’)
>>> Decimal(‘3.14’)
Decimal(‘3.14’)
>>> Decimal(3.14)
Decimal(‘3.140000000000000124344978758017532527446746826171875’)
>>> Decimal((0, (3, 1, 4), -2))
Decimal(‘3.14’)
>>> Decimal((1, (3, 1, 4), -2))
Decimal(‘-3.14’)
>>> Decimal((0, (3, 1, 4), -3))
Decimal(‘0.314’)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Precisión en los cálculos
La precisión se aplica al realizar cálculos.
>>> from decimal import *
>>> getcontext().prec = 28
>>> Decimal(str(2.0 ** 0.5))
Decimal(‘1.41421356237’)
>>> Decimal(2) ** Decimal(‘0.5’)
Decimal(‘1.414213562373095048801688724’)
>>> Decimal(‘NaN’)
Decimal(‘NaN’)
>>> Decimal(‘-Infinity’)
Decimal(‘-Infinity’)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Precisión en los cálculos
Evaluar en qué aplicaciones necesitamos realmente más precisión que la
que nos da la representación de un float. Quizás cuando queramos
evitar los problemas de propagación...
>>> nums = [1.23e+18, 1, -1.23e+18]
>>> sum(nums) # ¿Y el 1?
0.0
Y si necesitamos más precisión en los cálculos, no sólo en la
representación.
>>> import math
>>> math.fsum(nums)
1.0
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Funciones matemáticas
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Trabajando con Infinity y NaN
>>> a = float(‘inf’)
>>> b = float(‘-inf’)
>>> c = float(‘nan’)
>>> a
inf
>>> b
-inf
>>> c
nan
>>> import math
>>> math.isinf(a)
True
>>> math.isnan(c)
True
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Trabajando con Infinity y NaN
>>> a = float(‘inf’)
>>> a + 45
inf
>>> a * 10
inf
>>> 10 / a
0.0
>>> a/a
nan
>>> b = float(‘-inf’)
>>> a + b
nan
Se opera con Inf y NaN sin que se produzca por ello ningún tipo de error ni excepción.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Trabajando con Infinity y NaN
>>> c = float(‘nan’)
>>> c + 23
nan
>>> c / 2
nan
>>> c * 2
nan
>>> math.sqrt(c)
nan
>>> d = float(‘nan’)
>>> c == d
False
>>> c is d
False
La única forma segura de testear un NaN es con math.isnan().
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Números aleatorios
>>> import random
>>> random.randint(0, 10)
3
>>> random.randint(0, 10)
10
>>> random.randint(0, 10)
5
>>> random.randint(0, 10)
0
>>> random.randint(0, 10)
4
>>> random.randint(0, 10)
8
>>> random.randint(0, 10)
8
>>> random.randint(0, 10)
7
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Números aleatorios
Valores de tipo float uniformemente generados en el intervalo [0.0, 1.0):
>>> random.random()
0.9406677561675867
>>> random.random()
0.133129581343897
>>> random.random()
0.4144991136919316
>>>
N dı́gitos aleatorios expresados como un entero:
>>> random.getrandbits(200)
335837000776573622800628485064121869519521710558559406913275
El módulo random genera números aleatorios usando el algoritmo Mersenne Twister. Puesto
que es un algoritmo determinista, es importante cambiar la semilla inicial:
random.seed(): semilla basada en la hora del sistema.
random.seed(12345): semilla basada en un entero dado.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Números aleatorios
>>> random.uniform(3, 8)
5.602059839657899
>>> random.uniform(50, 100)
89.3108208162893
Más información sobre otras funciones que generan distribuciones de
valores reales:
https://docs.python.org/2/library/random.html
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Seleccionando aleatoriamente
>>> import random
>>> values = [1, 2, 3, 4, 5, 6]
>>> random.choice(values)
2
>>> random.choice(values)
3
>>> random.choice(values)
1
>>> random.choice(values)
4
>>> random.choice(values)
6
>>> random.sample(values, 2)
[6, 2]
>>> random.sample(values, 2)
[4, 3]
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Seleccionando aleatoriamente
...
>>> random.sample(values, 3)
[4, 3, 1]
>>> random.sample(values, 3)
[5, 4, 1]
>>> random.shuffle(values)
>>> values
[2, 4, 6, 5, 3, 1]
>>> random.shuffle(values)
>>> values
[3, 5, 2, 1, 6, 4]
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Midiendo tiempos
En algunos momentos puede ser de interés evaluar la eficiencia de
nuestros programas o de ciertas partes de nuestro código:
1 from time import time
2 start = time ()
3
4 # do some stuff
5 print ( ’ It took ’ , round ( time () - start , 3) , ’ seconds . ’)
Para convertir a horas, minutos y segundos:
1 ...
2 t = time () - start
3 secs = t % 60
4 mins = t // 60
5 hours = mins // 60
La función time() devuelve el número de segundos desde el 01/01/1970.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Fechas
>>> from datetime import datetime
>>> d = datetime(1, 1, 1).now()
>>> d
datetime.datetime(2020, 2, 10, 15, 48, 56, 660612)
>>> print(‘{}:{:02d} {}/{}/{}’.format(d.hour, d.minute, d.month, d.day, d.year))
15:48 2/10/2020
>>> print(‘{}:{:02d} {}/{}/{}’.format(d.hour, d.minute, d.day, d.month, d.year))
15:48 10/2/2020
>>> d1 = datetime(2011, 2, 1, 7, 33)
>>> print(‘{}:{:02d} {}/{}/{}’.format(d1.hour, d1.minute, d1.day, d1.month, d1.year))
7:33 1/2/2011
>>> d2 = datetime(2011, 2, 1)
>>> print(‘{}:{:02d} {}/{}/{}’.format(d2.hour, d2.minute, d2.day, d2.month, d2.year))
0:00 1/2/2011
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formateando fechas
>>> from datetime import datetime
>>> d = datetime(1, 1, 1).now()
>>> print(d)
2020-02-10 16:00:31.309674
>>> print(d.strftime(‘%A %x’))
Monday 02/10/20
>>> print(d.strftime(‘%c’))
Mon Feb 10 16:00:31 2020
>>> print(d.strftime(‘%A %B %d, %Y’))
Monday February 10, 2020
>>> print(d.strftime(‘%I%p on %B %d’))
04PM on February 10
>>> print(d.strftime(‘{}%p on %B {}’).format(d.hour%12, d.day))
4PM on February 10
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formateando fechas
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Calculando tiempos entre fechas
>>> from datetime import timedelta
>>> a = timedelta(days=2, hours=6)
>>> b = timedelta(hours=4.5)
>>> c = a + b
# Only days, seconds and microseconds are stored internally
>>> c
datetime.timedelta(2, 37800)
>>> c.days
2
>>> c.seconds
37800
>>> c.microseconds
0
>>> c.seconds / 3600
10.5
>>> c.total_seconds() / 3600
58.5
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Calculando tiempos entre fechas
Además de usar los timedelta para calcular tiempos también se pueden hacer
operaciones matemáticas simples para calcular tiempos entre fechas:
>>> from datetime import datetime
>>> from datetime import timedelta
>>> a = datetime(2012, 9, 23)
>>> print(a + timedelta(days=10))
2012-10-03 00:00:00
>>> b = datetime(2012, 12, 21)
>>> d = b - a
>>> d.days
89
>>> now = datetime.today()
>>> print(now)
2020-02-10 18:31:25.875253
>>> print(now + timedelta(minutes=10))
2020-02-10 18:41:25.875253
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Calculando tiempos entre fechas
>>> from datetime import datetime
>>> text = ‘2015-07-18’
>>> y = datetime.strptime(text, ‘%Y-%m-%d’)
>>> y
datetime.datetime(2015, 7, 18, 0, 0)
>>> z = datetime.now()
>>> diff = z - y
>>> diff
datetime.timedelta(1668, 66950, 409568)
>>> print(diff)
1668 days, 18:35:50.409568
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Fechas e idioma
>>> from datetime import datetime
>>> datetime.strftime(datetime.today(), ‘%A %B %d, %Y’)
‘Monday February 10, 2020’
>>>
>>> import locale
>>> locale.setlocale(locale.LC_TIME, ‘es_ES.UTF-8’)
‘es_ES.UTF-8’
>>> datetime.strftime(datetime.today(), ‘%A %B %d, %Y’)
‘lunes febrero 10, 2020’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato de cadenas: formato mediante %
>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> ‘‘Hello, %s %s. You are %s. You are a %s. \
... You were a member of %s.’’ \
... % (first_name, last_name, age, profession, affiliation)
‘Hello, Eric Idle. You are 74. You are a comedian. \
You were a member of Monty Python.’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato de cadenas: str.format()
>>> "Hello, {}. You are {}.".format(name, age)
‘Hello, Eric. You are 74.’
>>> "Hello, {1}. You are {0}.".format(age, name)
‘Hello, Eric. You are 74.’
>>> person = {‘name’: ‘Eric’, ‘age’: 74}
>>> "Hello, {name}. You are {age}.".format(name=person[‘name’], \
... age=person[‘age’])
‘Hello, Eric. You are 74.’
>>> person = {‘name’: ‘Eric’, ‘age’: 74}
>>> "Hello, {name}. You are {age}.".format(**person)
‘Hello, Eric. You are 74.’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato de cadenas: str.format()
>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> print(("Hello, {first_name} {last_name}. You are {age}. " + \
... "You are a {profession}. " + \
... "You were a member of {affiliation}.") \
... .format(first_name=first_name, last_name=last_name, \
... age=age, profession=profession, \
... affiliation=affiliation))
‘Hello, Eric Idle. You are 74. You are a comedian. \
You were a member of Monty Python.’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato de cadenas: f-Strings
Formatted string literals son cadenas precedidas por una f o F y que contienen
expresiones entre llaves que serán evaluadas y sustituidas en tiempo de ejecución.
>>> name = "Eric"
>>> age = 74
>>> f"Hello, {name}. You are {age}."
‘Hello, Eric. You are 74.’
>>>
>>> F‘Hello, {name}. You are {age}.’
‘Hello, Eric. You are 74.’
>>>
>>> name = ‘Eric Idle’
>>> f"{name.lower()} is funny."
‘eric idle is funny.’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato de cadenas: f-Strings
Podemos usar cualquier expresión evaluable y cuyo tipo de datos sepa
como convertirse a string.
>>> from datetime import datetime
>>> d = datetime.today()
>>> f"{d} es una fecha"
‘2020-02-10 19:21:50.648871 es una fecha’
>>>
>>> c = 5 + 2j
>>> f"{c} es un numero complejo"
‘(5+2j) es un numero complejo’
>>>
>>> a = 5
>>> b = 10
>>> f"{a} + {b} = {a+b}"
‘5 + 10 = 15’
>>>
>>> f"Convertimos {a} en un float: {float(a)}"
‘Convertimos 5 en un float: 5.0’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato de cadenas: f-Strings
>>> comedian = {‘name’: ‘Eric Idle’, ‘age’: 74}
>>> f"The comedian is {comedian[‘name’]}, aged {comedian[‘age’]}."
The comedian is Eric Idle, aged 74.
>>> comedian = {‘name’: ‘Eric Idle’, ‘age’: 74}
>>> f‘The comedian is {comedian[‘name’]}, aged {comedian[‘age’]}.’
File "<stdin>", line 1
f‘The comedian is {comedian[‘name’]}, aged {comedian[‘age’]}.’
^
SyntaxError: invalid syntax
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Formato de cadenas: f-Strings
>>> name = "Eric"
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> message = f"Hi {name}. " \
... f"You are a {profession}. " \
... f"You were in {affiliation}."
...
>>> message
‘Hi Eric. You are a comedian. You were in Monty Python.’
>>> message = f"""
... Hi {name}.
... You are a {profession}.
... You were in {affiliation}.
... """
...
>>> message
‘\n Hi Eric.\n You are a comedian.\n You were in Monty Python.\n’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Trabajando con cadenas
Sustituimos apariciones de una determinada subcadena por otra:
>>> ‘abcdef abcxyz’.replace(‘abc’, ‘*’)
‘*def *xyz’
Sustituimos varias “posibles” subcadenas por otra subcadena:
>>> import re
>>> re.sub(r‘[ad]’, ‘*’, ‘abcdef’)
‘*bc*ef’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Expresiones regulares
La subcadena a buscar/reemplazar se especifica a través de un patrón:
>>> import re
>>> re.sub(r‘([LRUD])(\d+)’, ‘***’, ‘Locations L3 and D22 full.’)
‘Locations *** and *** full.’
>>> import re
>>> re.sub(r‘[abc][123]’, ‘*’, ‘a1 + b2 + c5 + x2’)
‘* + * + c5 + x2’
[A − Z] Cualquier letra mayúscula
[0 − 9] Cualquier dı́gito
[A − Za − z0 − 9] Cualquier letra o dı́gito
. Cualquier caracter (excepto el salto de lı́nea)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Expresiones regulares
>>> import re
>>> re.sub(r‘A.B’, ‘*’, ‘A2B AxB AxxB A$B’)
‘* * AxxB *’
>>> re.sub(r‘AB+’, ‘*’, ‘ABC ABBBBBBC AC’)
‘*C *C AC’
>>> re.sub(r‘AB{3,6}’, ‘*’, ‘ABB ABBB ABBBB ABBBBBBBBB’)
‘ABB * * *BBB’
>>> re.sub(r‘AB{3,6}?’, ‘*’, ‘ABB ABBB ABBBB ABBBBBBBBB’)
‘ABB * *B *BBBBBB’
. Cualquier caracter (excepto el salto de lı́nea)
+ Una o más ocurrencias
* Cero o más ocurrencias
? Cero o una única ocurrencia
m Exactamente m ocurrencias
m,n Entre m y n ocurrencias (ambas incluidas)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Expresiones regulares
>>> import re
>>> re.sub(r‘abc|xyz’, ‘*’, ‘abcdefxyz123abc’)
‘*def*123*’
>>> re.sub(‘^abc’, ‘*’, ‘abcdefgabc’)
‘*defgabc’
>>> re.sub(‘abc$’, ‘*’, ‘abcdefgabc’)
‘abcdefg*’
>>> re.sub(‘abc$’, ‘*’, ‘abcdefgabcfg’)
‘abcdefgabcfg’
| Una cosa u otra (or)
^ Primera ocurrencia (comienzo del patrón)
$ Última ocurrencia (final del patrón)
\+, \*, \\ Los caracteres especiales hay que escaparlos
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Expresiones regulares
>>> import re
>> re.sub(r‘\d’, ‘*’, ‘3 + 14 = 17’)
‘* + ** = **’
>>> re.sub(r‘\D’, ‘*’, ‘3 + 14 = 17’)
‘3***14***17’
>>>
>>> re.sub(r‘\w’, ‘*’, ‘This is a test. Or is it?’)
‘**** ** * ****. ** ** **?’
>>> re.sub(r‘\W’, ‘*’, ‘This is a test. Or is it?’)
‘This*is*a*test**Or*is*it*’
>>>
>>> re.sub(r‘\s’, ‘*’, ‘This is a test. Or is it?’)
‘This*is*a*test.*Or*is*it?’
>>> re.sub(r‘\s’, ‘*’, ‘This is a \n test. Or is it?’)
‘This*is*a***test.*Or*is*it?’
>>> re.sub(r‘\S’, ‘*’, ‘This is a test. Or is it?’)
‘**** ** * ***** ** ** ***’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Expresiones regulares
\d Cualquier dı́gito
\D Cualquier caracter que no sea un dı́gito
\w Cualquier letra o dı́gito
\W Cualquier caracter que no sea letra ni dı́gito
\s Cualquier blanco
\S Cualquier caracter que no sea un blanco
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Expresiones regulares
>>> import re
>>> re.sub(r‘the(?= cat)’, ‘*’, ‘the dog and the cat’)
‘the dog and * cat’
>>>
>>> re.sub(r‘(?<= )the’, ‘*’, ‘the dog and the cat’)
‘the dog and * cat’
>>>
>>> re.sub(r‘(?<!\w)[Tt]he(?!\w)’, ‘*’, ‘The cat is on the lathe there.’)
‘* cat is on * lathe there.’
(?=) Sólo si está seguido de
(?!) Sólo si no está seguido de
(?<=) Sólo si está precedido de
(?<!) Sólo si no está precedido de
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Expresiones regulares: grupos
Se utilizan paréntesis para memorizar el texto que coincide con el patrón
1 def modify ( match ) :
2 letter = match . group ()
3 return letter . lower ()
4
5 re . sub ( r ’ ([ A - Z ]) [a - z ] ’ , modify , ’ PEACH Apple ApriCot ’)
PEACH apple apricot
Se llama a la función de modificación tantas veces como ocurrencias
hayan casado con el patrón.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Expresiones regulares: otras funciones
>>> re.sub(r‘a’, ‘*’, ‘ababababa’, count=2)
‘*b*bababa’
>>>
>>> re.findall(r‘[AB]\d’, ‘A3 + B2 + A99’)
[‘A3’, ‘B2’, ‘A9’]
>>>
>>> re.split(r‘\+|\-’, ‘3x+4y-12x^2+7’)
[‘3x’, ‘4y’, ‘12x^2’, ‘7’]
>>>
>>> print(re.match(r‘ZZZ’, ‘abc ZZZ xyz’))
None
>>> print(re.match(r‘abc’, ‘abc ZZZ xyz’))
<_sre.SRE_Match object; span=(0, 3), match=‘abc’>
>>> print(re.search(r‘ZZZ’, ‘abc ZZZ xyz ZZZ’))
<_sre.SRE_Match object; span=(4, 7), match=‘ZZZ’>
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Iteradores
Un iterador es un objeto que contiene una secuencia definida de valores.
Los iteradores se usan generalmente para iterar (elemento a elemento)
sobre los tipos de secuencias estándar:
Cadenas
Listas
Tuplas
Diccionarios
Conjuntos
Se puede hacer una iteración manual de uno a uno con next, o bien,
hacer iteraciones correlativas sobre cada uno de los elementos de la
secuencia a través de una sentencia for-in.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Iteradores
>>> mystr = ‘hello’
>>> istr = iter(mystr)
>>> next(istr)
‘h’
>>> next(istr)
‘e’
>>> next(istr)
‘l’
>>> next(istr)
‘l’
>>> next(istr)
‘o’
>>> next(istr)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Iteradores
>>> mylist = [1, 2, 3, 4, 5]
>>> ilist = iter(mylist)
>>> next(ilist)
1
>>> next(ilist)
2
>>> next(ilist)
3
>>> next(ilist)
4
>>> next(ilist)
5
>>> next(ilist)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Iteradores
>>> for i in mystr:
... print(i)
...
h
e
l
l
o
>>>
>>> for i in mylist:
... print(i)
...
1
2
3
4
5
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Generadores
Un generador es una función especial que produce secuencias de
resultados en lugar de ofrecer un único resultado. En lugar de devolver
los valores con return lo hacemos con yield.
>>> def generador():
... yield "Uno"
... yield "Dos"
... yield "Tres"
...
>>> for valor in generador():
... print(valor)
...
Uno
Dos
Tres
Para usarlo con clases habrá que definir los métodos iter y
next .
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Permutaciones
>>> from itertools import *
>>>
>>> list(permutations([1, 2, 3]))
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
>>> list(permutations([1, 2, 3], 2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
>>>
>>> for i in permutations(‘abc’):
... print(i)
...
(‘a’, ‘b’, ‘c’)
(‘a’, ‘c’, ‘b’)
(‘b’, ‘a’, ‘c’)
(‘b’, ‘c’, ‘a’)
(‘c’, ‘a’, ‘b’)
(‘c’, ‘b’, ‘a’)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Combinaciones
Si no importa el orden...
>>> from itertools import *
>>>
>>> list(combinations([1, 2, 3], 2))
[(1, 2), (1, 3), (2, 3)]
>>> list(combinations([1, 2, 3], 3))
[(1, 2, 3)]
>>>
>>> for i in combinations(‘abc’, 2):
... print(i)
...
(‘a’, ‘b’)
(‘a’, ‘c’)
(‘b’, ‘c’)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Producto cartesiano
>>> for p in product(‘abc’, ‘123’):
... print(p)
...
(‘a’, ‘1’)
(‘a’, ‘2’)
(‘a’, ‘3’)
(‘b’, ‘1’)
(‘b’, ‘2’)
(‘b’, ‘3’)
(‘c’, ‘1’)
(‘c’, ‘2’)
(‘c’, ‘3’)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Producto cartesiano
>>> for p in product(‘abc’, [0, 1]):
... print(p)
...
(‘a’, 0)
(‘a’, 1)
(‘b’, 0)
(‘b’, 1)
(‘c’, 0)
(‘c’, 1)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Producto cartesiano
>>> for x in range(1, 101):
... for y in range(1, 101):
... for z in range(1, 101):
... if x**2 + y**2 == z**2:
... print(x, y, z)
...
3 4 5
4 3 5
5 12 13
6 8 10
7 24 25
8 6 10
8 15 17
9 12 15
9 40 41
10 24 26
11 60 61
12 5 13
...
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Producto cartesiano
>>> X = range(1, 101)
>>> for (x, y, z) in product (X, X, X):
... if x**2 + y**2 == z**2:
... print(x, y, z)
...
3 4 5
4 3 5
5 12 13
6 8 10
7 24 25
8 6 10
8 15 17
9 12 15
9 40 41
10 24 26
11 60 61
12 5 13
...
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Agrupamientos
La función groupby divide una lista en grupos: cada vez que se detecta
un cambio en los valores, se crea un nuevo grupo. Devuelve parejas con
un elemento de la lista y la sublista con los elementos que conforman el
grupo.
>>> from itertools import *
>>>
>>> L = [0, 0, 1, 1, 1, 2, 0, 4, 4, 4, 4, 4]
>>> for key,group in groupby(L):
... print(key, ‘:’, list(group))
...
0 : [0, 0]
1 : [1, 1, 1]
2 : [2]
0 : [0]
4 : [4, 4, 4, 4, 4]
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Agrupamientos
>>> from itertools import *
>>> L = [0, 0, 1, 1, 1, 2, 0, 4, 4, 4, 4, 4]
>>> L.sort()
>>> for key,group in groupby(L):
... print(key, ‘:’, len(list(group)))
...
0 : 3
1 : 3
2 : 1
4 : 5
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Agrupamientos
Se le puede indicar otros criterios para realizar los agrupamientos:
>>> L = [‘this’, ‘is’, ‘a’, ‘test’, ‘of’, ‘groupby’]
>>> L.sort(key = len)
>>> for key,group in groupby(L, len):
... print(key, ‘:’, list(group))
...
1 : [‘a’]
2 : [‘is’, ‘of’]
4 : [‘this’, ‘test’]
7 : [‘groupby’]
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Contadores
Cuenta los elementos en la secuencia y devuelve asociaciones de
clave-valor.
>>> from collections import *
>>> Counter(‘aababcabcdabcde’)
Counter({‘a’: 5, ‘b’: 4, ‘c’: 3, ‘d’: 2, ‘e’: 1})
>>>
>>> c = Counter(‘aababcabcdabcde’)
>>> c[‘a’]
5
>>> list(c.keys())
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
>>> list(c.values())
[5, 4, 3, 2, 1]
>>>
>>> Counter([1, 5, 3, 6, 8, 2, 1, 1, 5, 6, 8, 8, 8])
Counter({8: 4, 1: 3, 5: 2, 6: 2, 3: 1, 2: 1})
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Funciones lambda
Una función lambda es una función anónima, esto es, una función sin
nombre.
En Python podemos ejecutar una función sin definirla con def, la
diferencia es que el contenido de una función lambda debe ser una única
expresión en lugar de un bloque de acciones.
Las funciones lambda sirven para realizar funciones simples:
def doblar(num):
resultado = num * 2
return resultado
doblar(2)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Funciones lambda
Cuando las funciones son tan sencillas, podemos simplificar un poco el
código:
def doblar(num):
return num * 2
Incluso podemos escribirlo todo en una sola lı́nea:
def doblar(num): return num*2
Esta notación simple es la que una función lambda intenta replicar:
lambda num: num*2
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Funciones lambda
Y para usar una función lambda harı́amos lo siguiente:
>>> doblar = lambda num: num*2
>>> doblar(10)
20
Otro ejemplo para determinar si un número es impar:
>>> impar = lambda num: num%2 != 0
>>> impar(5)
True
Y otro ejemplo para invertir una cadena:
>>> invertir = lambda cadena: cadena[::-1]
>>> invertir(’hola’)
’aloh’
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Filtrando
Con la función filter podemos seleccionar un conjunto de elementos,
esto es, a partir de una lista o iterador y una función condicional,
podemos devolver aquellos elementos que cumplan la condición.
def par(numero):
if numero % 2 == 0:
return True
return False
numeros = [2, 5, 10, 23, 50, 33]
numeros_pares = list(filter(par, numeros))
print(numeros_pares)
Como lo que devuelve filter es un filtro, para mostrarlo por pantalla lo
más sencillo es convertirlo a una lista.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Filtrando
Teniendo en cuenta las funciones lambda, podemos combinar el uso de
los filtros con las funciones lambda.
De esta forma, podrı́amos hacer algo como lo siguiente:
>>> numeros = [2, 5, 10, 23, 50, 33]
>>> list( filter(lambda numero: numero%2 == 0, numeros) )
[2, 10, 50]
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Filtrando
También se pueden filtrar objetos.
1 class Person :
2 def __init__ ( self , name , age = 0) :
3 self . name = name
4 self . age = age
5
6 # Convertir a cadena una persona
7 def __str__ ( self ) :
8 return ( f ’ Nombre : { self . name } , Edad : { self . age } ’)
9
10 p = [ Person ( ’ Juan ’ , 20) , Person ( ’ Ana ’ , 15) , \
11 Person ( ’ Julia ’ , 35) , Person ( ’ Javier ’ , 10) ]
12 mayores_edad = filter ( lambda persona : persona . age >= 18 , p )
13 for persona in mayores_edad :
14 print ( persona )
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Filtrando
En este caso se seleccionarı́an las instancias de personas con atributo age
con un valor mayor o igual a 18.
Nombre: Juan, Edad: 20
Nombre: Julia, Edad: 35
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Filtrando
1 class Person :
2 def __init__ ( self , name , age = 0) :
3 self . __name = name
4 self . __age = age
5
6 # Getters
7 def getName ( self ) :
8 return self . __name
9 def getAge ( self ) :
10 return self . __age
11
12 # Setters
13 def setName ( self , n ) :
14 self . __name = n
15 def setAge ( self , a ) :
16 self . __age = a
17
18 ...
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Filtrando
1 class Person :
2 ...
3
4 # Convert to string
5 def __str__ ( self ) :
6 return ( f ’ Nombre : { self . __name } , Edad : { self . __age } ’
)
7
8 p = [ Person ( ’ Juan ’ , 20) , Person ( ’ Ana ’ , 15) , \
9 Person ( ’ Julia ’ , 35) , Person ( ’ Javier ’ , 10) ]
10 mayores = filter ( lambda persona : persona . getAge () >= 18 , p )
11 for persona in mayores :
12 print ( persona )
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Paso de argumentos a un programa
1 import sys
2
3 print len ( sys . argv )
4 print sys . argv [0]
5 nombre = sys . argv [1]
6 numero = int ( sys . argv [2])
7 if ( numero >= 1) :
8 f = open ( nombre , ’r ’)
9 n = 1
10 for linea in f :
11 print ( linea . rstrip () )
12 if n == numero :
13 break
14 else :
15 n += 1
16 f . close ()
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Paso de argumentos a un programa
Ejecución del programa:
python read_x_lines.py fichero.txt 2
Salida por pantalla:
3
read_x_lines.py
Hola Ana
Hola Pepe
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Captura y tratamiento de excepciones
try:
acción potencialmente errónea
acción potencialmente errónea
...
acción potencialmente errónea
except:
acción para tratar el error
acción para tratar el error
...
acción para tratar el error
Pueden aparecer errores en tiempo de ejecución (excepciones): divisiones por
cero, intentos de calcular raı́ces de valores negativos, problemas al operar con
tipos incompatibles (como sumar cadena y entero), etc.
La idea fundamental es algo como: intenta ejecutar estas acciones y, si se comete
un error, ejecuta inmediatamente estas otras.
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Ejemplo
a = float(input(‘Valor de a: ’))
b = float(input(‘Valor de b: ’))
try:
x = -b/a
print(‘Solución: ’, x)
except:
if b != 0:
print(‘La ecuación no tiene solución.’)
else:
print(‘La ecuación tiene infinitas soluciones.’)
Gara Miranda Valladares Tema 1: Programación avanzada
Números, fechas y horas
Librerı́a estándar y utilidades Cadenas y expresiones regulares
Programación orientada a objetos Iteradores, generadores y colecciones
Documentación, depuración y pruebas Funciones lambda
Paso de argumentos a un programa y gestión de errores
Ejemplo
from math import sqrt
a = float(input(‘Valor de a: ’))
b = float(input(‘Valor de b: ’))
c = float(input(‘Valor de c: ’))
try:
x1 = (-b + sqrt(b**2 - 4*a*c)) / (2 * a)
x2 = (-b - sqrt(b**2 - 4*a*c)) / (2 * a)
if x1 == x2:
print(‘Solución de la ecuación: x=%.3f’ % x1)
else:
print(‘Soluciones de la ecuación: x1=%.3f y x2=%.3f’ % (x1, x2))
except ZeroDivisionError:
if b != 0:
print(‘La ecuación no tiene solución.’)
else:
print(‘La ecuación tiene infinitas soluciones.’)
except ValueError:
print ‘No hay soluciones reales.’
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Indice
1 Librerı́a estándar y utilidades
2 Programación orientada a objetos
Clases y objetos
Herencia
Polimorfismo
Encapsulación
3 Documentación, depuración y pruebas
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Programación orientada a objetos
La programación orientada a objetos es un paradigma de programación
que se centra en los objetos, en sus caracterı́sticas y comportamiento ası́
como en las interacciones de los mismos, para diseñar aplicaciones y
programas informáticos.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Programación orientada a objetos
La programación orientada a objetos es un paradigma de programación
que se centra en los objetos, en sus caracterı́sticas y comportamiento ası́
como en las interacciones de los mismos, para diseñar aplicaciones y
programas informáticos.
Conceptos básicos
Clase
Objeto
Atributo
Método
Herencia
Polimorfismo
Encapsulamiento
... Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Programación orientada a objetos
Caracterı́sticas principales
Abstracción: el proceso de abstracción permite seleccionar las caracterı́sticas
relevantes dentro de un conjunto e identificar comportamientos comunes para
definir nuevos tipos de entidades en el mundo real.
Encapsulamiento: consiste en agrupar todos los elementos que pueden
considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción.
Esto permite aumentar la cohesión de los componentes del sistema.
Modularidad: permite subdividir una aplicación en partes más pequeñas, cada
una de las cuales debe ser tan independiente como sea posible de la aplicación en
sı́ y de las restantes partes.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Programación orientada a objetos
Caracterı́sticas principales
Interfaz o principio de ocultación: cada tipo de objeto expone una interfaz a
otros objetos que especifica cómo pueden interactuar con los objetos de la clase.
Este aislamiento protege a las propiedades de un objeto contra su modificación
por quien no tenga derecho a acceder a ellas.
Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden
compartir el mismo nombre.
Herencia: los objetos heredan las propiedades y el comportamiento de todas las
clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el
encapsulamiento, permitiendo a los objetos ser definidos y creados como tipos
especializados de objetos preexistentes. Estos pueden compartir (y extender) su
comportamiento sin tener que volver a implementarlo.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Objetos
¿Qué es un objeto?
Un objeto es una entidad que agrupa un estado y una funcionalidad
relacionadas.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Objetos
¿Qué es un objeto?
Un objeto es una entidad que agrupa un estado y una funcionalidad
relacionadas.
El estado del objeto se define a través de variables llamadas
atributos.
La funcionalidad del objeto se modela a través de funciones a las
que se les conoce con el nombre de métodos.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Objetos
¿Qué es un objeto?
Un objeto es una entidad que agrupa un estado y una funcionalidad
relacionadas.
El estado del objeto se define a través de variables llamadas
atributos.
La funcionalidad del objeto se modela a través de funciones a las
que se les conoce con el nombre de métodos.
Ejemplo
Mi coche es un objeto que tiene un conjunto de atributos (marca Ford,
modelo Fiesta, matrı́cula 1234 ABC, 5 puertas, etc.) y funcionalidades
(arrancar, frenar, cambiar de marcha, etc.) relacionadas.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Clases
¿Qué es una clase?
Una clase es una plantilla genérica a partir de la cual se pueden
“instanciar” los objetos. Es decir, la plantilla define qué atributos y
métodos tendrán los objetos de la clase.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Clases
¿Qué es una clase?
Una clase es una plantilla genérica a partir de la cual se pueden
“instanciar” los objetos. Es decir, la plantilla define qué atributos y
métodos tendrán los objetos de la clase.
Ejemplo
Siguiendo con el ejemplo de los coches, podremos decir que los coches
tienen un conjunto de atributos (marca, modelo, matrı́cula, número de
puertas, etc.) y funcionalidades o comportamiento (arrancar, frenar,
cambiar de marcha, etc.) común.
Mi coche y el de mi vecino pueden ser de marcas y modelos distintos,
pero la funcionalidad que tienen es la misma.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Objetos y clases
Hasta el momento
Hemos estado utilizando numerosos tipos de datos provistos por
Python: los números, las cadenas de caracteres, las listas, las tuplas,
los diccionarios, los archivos, etc.
Cada uno de estos tipos tiene sus caracterı́sticas, tienen operaciones
propias de cada uno y nos proveen una gran cantidad de
funcionalidades que podemos utilizar para nuestros programas.
Como ya se ha mencionado, para saber de qué tipo es una variable,
utilizamos la función type, y para saber qué métodos y atributos
tiene esa variable utilizamos la función dir.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Objetos y clases
>>> a = open(‘archivo.txt’, ‘r’)
>>> type(a)
<class ‘_io.TextIOWrapper’>
>>>
>>> dir(a)
[‘_CHUNK_SIZE’, ‘__class__’, ‘__del__’, ‘__delattr__’, ‘__dict__’,
‘__dir__’, ‘__doc__’, ‘__enter__’, ‘__eq__’, ‘__exit__’, ‘__format__’,
‘__ge__’, ‘__getattribute__’, ‘__getstate__’, ‘__gt__’, ‘__hash__’,
‘__init__’, ‘__init_subclass__’, ‘__iter__’, ‘__le__’, ‘__lt__’,
‘__ne__’, ‘__new__’, ‘__next__’, ‘__reduce__’, ‘__reduce_ex__’,
‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’,
‘_checkClosed’, ‘_checkReadable’, ‘_checkSeekable’, ‘_checkWritable’,
‘_finalizing’, ‘buffer’, ‘close’, ‘closed’, ‘detach’, ‘encoding’,
‘errors’, ‘fileno’, ‘flush’, ‘isatty’, ‘line_buffering’, ‘mode’,
‘name’, ‘newlines’, ‘read’, ‘readable’, ‘readline’, ‘readlines’, ‘seek’,
‘seekable’, ‘tell’, ‘truncate’, ‘writable’, ‘write’, ‘writelines’]
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Definición de una clase
A pesar de que Python nos provee con un gran número de tipos ya
definidos, en muchas situaciones utilizar solamente los tipos
provistos por el lenguaje resultará insuficiente.
En estas situaciones será conveniente poder crear nuevos tipos
propios que almacenen la información relevante para el problema a
resolver y contengan las funciones para operar con esa información.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Definición de una clase
1 class Coche :
2 def __init__ ( self , gasolina ) :
3 self . gasolina = gasolina
4 print ( ‘ Tenemos ’ , gasolina , ‘ litros ’)
5
6 def arrancar ( self ) :
7 if self . gasolina > 0:
8 print ( ’ Arranca ’)
9 else :
10 print ( ’ No arranca ’)
11
12 def conducir ( self ) :
13 if self . gasolina > 0:
14 self . gasolina -= 1
15 print ( ’ Quedan ’ , self . gasolina , ‘ litros ’)
16 else :
17 print ( ’ No se mueve ’)
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Definición de una clase
El método init se ejecuta justo después de crear un nuevo
objeto a partir de la clase, proceso que se conoce con el nombre de
instanciación.
El método init sirve para realizar cualquier proceso de
inicialización que sea necesario.
El primer parámetro del método init y del resto de métodos de
la clase es siempre self.
Este mecanismo permite acceder a atributos y métodos del objeto
diferenciando, por ejemplo, una variable local var de un atributo del
objeto self.var.
En programación orientada a objetos al método init se le
denomina constructor de la clase.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Instanciación
A partir de una clase es posible crear distintas variables que son de
ese tipo.
A las variables que son de una clase en particular, se les llama
instancia de esa clase.
Se dice que los objetos tienen estado y comportamiento, ya que los
valores que tengan los atributos de una instancia determinan el
estado actual de esa instancia, y los métodos definidos en una clase
determinan cómo se va a comportar ese objeto.
Convenio a seguir
Los nombres de las clases que definamos deberán comenzar con una letra
mayúscula.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Instanciación
1 mi_coche = Coche (10)
2 tu_coche = Coche (25)
3
4 print ( mi_coche . gasolina )
5 tu_coche . conducir ()
A pesar de que el método init tiene dos parámetros, al crear el
objeto pasamos un único argumento a init
Python pasa el primer argumento (la referencia al objeto que se
crea) automáticamente.
Una vez ya hemos creado un objeto, podemos acceder a sus
atributos y métodos mediante la sintaxis objeto.atributo y
objeto.metodo()
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Métodos especiales
init (self, args): método llamado después de crear el objeto
para realizar tareas de inicialización.
del (self): método llamado cuando el objeto va a ser borrado.
También llamado destructor, se utiliza para realizar tareas de
limpieza.
str (self): método llamado para crear una cadena de texto que
represente a nuestro objeto. Se utiliza cuando usamos print para
mostrar nuestro objeto o cuando usamos la función str(obj).
len (self): método llamado para comprobar la longitud del
objeto. Se utiliza, por ejemplo, cuando se llama a la función
len(obj) sobre nuestro objeto.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Métodos especiales - Sobrecarga de operadores
abs (self)
add (self, other)
and (self, other)
truediv (self, other)
floordiv (self, other)
mod (self, other)
mul (self, other)
neg (self)
or (self, other)
pow (self, other)
sub (self, other)
Más información en:
https://docs.python.org/3/library/operator.html
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Métodos especiales - Operadores de comparación
Operador Método
== eq
!= ne
< lt
≤ le
> gt
≥ ge
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Métodos especiales
class Coche:
def __init__(self, gasolina):
self.gasolina = gasolina
print(‘Tenemos’, gasolina, ‘litros’)
def __del__(self):
print(‘Eliminando coche con %d litros de gasolina’ % self.gasolina)
def __str__(self):
return ‘Coche con %d litros de gasolina’ % self.gasolina
def __gt__(self, other):
if self.gasolina > other.gasolina:
return True
return False
def __len__(self):
return self.gasolina
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Métodos especiales
Programa principal:
mi_coche = Coche(10)
tu_coche = Coche(25)
print(mi_coche)
print(tu_coche)
if (mi_coche > tu_coche):
print ‘Mi coche tiene más gasolina’
print("La longitud de mi coche es:", len(mi_coche))
print("La longitud de tu coche es:", len(tu_coche))
Salida por pantalla:
Tenemos 10 litros
Tenemos 25 litros
Coche con 10 litros de gasolina
Coche con 25 litros de gasolina
La longitud de mi coche es: 10
La longitud de tu coche es: 25
Eliminando coche con 10 litros de gasolina
Eliminando coche con 25 litros de gasolina
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Comprobación de tipos en el constructor
class Coche:
def __init__(self, gasolina=0):
self.gasolina = gasolina
def __str__(self):
return ‘Coche con ’ + str(self.gasolina) + ‘ litros de gasolina’
mi_coche = Coche(10)
tu_coche = Coche(‘Hola’)
print(mi_coche)
print(tu_coche)
Coche con 10 litros de gasolina
Coche con Hola litros de gasolina
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Comprobación de tipos en el constructor
class Coche:
def __init__(self, gasolina=0):
if isinstance(gasolina, (int, float)):
self.gasolina = gasolina
else:
raise TypeError("Gasolina debe ser un valor numérico")
def __str__(self):
return ‘Coche con %d litros de gasolina’ % self.gasolina
mi_coche = Coche(10)
tu_coche = Coche(‘Ford’)
print(mi_coche)
print(tu_coche)
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Comprobación de tipos en el constructor
mi_coche = Coche(10)
tu_coche = Coche(‘Ford’)
print(mi_coche)
print(tu_coche)
Coche con 10 litros de gasolina
Traceback (most recent call last):
File "./coche_comprobaciontipos.py", line 44, in <module>
tu_coche = Coche(‘Ford’)
File "./coche_comprobaciontipos.py", line 10, in __init__
raise TypeError("Gasolina debe ser un valor numérico")
TypeError: Gasolina debe ser un valor numérico
Exception AttributeError: "‘Coche’ object has no attribute ‘gasolina’"
in <bound method Coche.__del__ of <__main__.Coche object at
0x7f43dee72a50>> ignored
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Usando clases desde otras clases
Una clase puede contener (como atributos) una o más instancias de otra
clase, a las que delegará parte de sus funcionalidades.
Ejemplo
Queremos construir una clase Rectangulo que se describe mediante los
siguientes atributos:
Longitud de su base: un número.
Longitud de su altura: un número.
El punto del plano de su esquina inferior izquierda: un punto del
plano (para este atributo podremos utilizar la clase Punto).
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Usando clases desde otras clases
1 from punto import Punto
2
3 class Rectangulo :
4 def __init__ ( self , base , altura , origen ) :
5 self . base = base
6 self . altura = altura
7 self . origen = origen
8
9 def trasladar ( self , dx = 0 , dy = 0) :
10 self . origen = self . origen + Punto ( dx , dy )
11
12 def area ( self ) :
13 return self . base * self . altura
14
15 def __str__ ( self ) :
16 return f ’ Base : { self . base } , Altura : { self . altura } ,
Esquina inf . izq .: { self . origen } ’
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Usando clases desde otras clases
1 class Punto :
2 def __init__ ( self , x =0 , y =0) :
3 if isinstance (x , ( int , float ) ) and isinstance (y , ( int ,
float ) ) :
4 self . x = x
5 self . y = y
6 else :
7 raise TypeError ( ’ Las coordenadas deben ser numeros ’)
8
9 def __str__ ( self ) :
10 return f ’ ({ self . x } , { self . y }) ’
11
12 def __eq__ ( self , other ) :
13 if ( self . x == other . x ) and ( self . y == other . y ) :
14 return True
15 return False
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Usando clases desde otras clases
>>> from punto import Punto
>>> from rectangulo import Rectangulo
>>> r = Rectangulo(2, 3, Punto(1, 2))
>>> print(r)
Base: 2, Altura: 3, Esquina inf. izq.: (1, 2)
>>> print(r.area())
6
>>> r.trasladar(2,4)
>>> print(r)
Base: 2, Altura: 3, Esquina inf. izq.: (3, 6)
El punto que describe la posición de la esquina inferior izquierda del rectángulo
es un objeto de tipo Punto.
El atributo origen contiene una referencia a dicho objeto.
Utilizando el método trasladar, podemos modificar el valor del punto contenido
dentro del rectángulo.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia
La herencia es un mecanismo de la programación orientada a objetos que
sirve para crear clases nuevas a partir de clases preexistentes. Se toman
(heredan) atributos y comportamientos de las clases existentes y se los
modifica para modelar una nueva situación.
A la clase preexistente se le llama clase base o superclase y a la
clase que se construye a partir de ella se le denominada clase
derivada o subclase.
Al acto de heredar de una clase también se le llama “extender una
clase”.
Por ejemplo, podrı́amos tener una clase para representar vehı́culos en
general, y luego clases como moto, coche o camión que son tipos de
vehı́culos pero cada uno de ellos con unas particularidades determinadas.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia
1 class Persona :
2 def __init__ ( self , dni , nombre , apellidos ) :
3 """ Constructor de Persona """
4 self . dni = dni
5 self . nombre = nombre
6 self . apellidos = apellidos
7 def __str__ ( self ) :
8 return f ’{ self . dni }: { self . apellidos } , { self . nombre
}’
9
10 class Alumno ( Persona ) :
11 def __init__ ( self , dni , nombre , apellidos , alu ) :
12 # Llamada al constructor de Persona
13 Persona . __init__ ( self , dni , nombre , apellidos )
14 # Inicializamos el nuevo atributo
15 self . alu = alu
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia
Probamos la nueva clase:
a = Alumno("35123456", "Juan", "Pérez Garcı́a", "0100102095")
print(a)
Salida por pantalla:
35123456: Pérez Garcı́a, Juan
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia
Implementamos en la subclase el método str :
1 class Alumno ( Persona ) :
2
3 def __init__ ( self , dni , nombre , apellidos , alu ) :
4 # Llamada al constructor de Persona
5 Persona . __init__ ( self , dni , nombre , apellidos )
6 # Inicializamos el nuevo atributo
7 self . alu = alu
8
9 def __str__ ( self ) :
10 return f ’{ self . dni }: { self . apellidos } , { self . nombre
} ({ self . alu }) ’
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia
Probamos la nueva clase:
a = Alumno("35123456", "Juan", "Pérez Garcı́a", "0100102095")
print(a)
Salida por pantalla:
35123456: Pérez Garcı́a, Juan (alu0100102095)
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia
Otro ejemplo de herencia.
1 class Shape :
2 def __init__ ( self ) :
3 pass
4
5 def area ( self ) :
6 return 0
7
8 class Square ( Shape ) :
9 def __init__ ( self , l ) :
10 Shape . __init__ ( self )
11 self . length = l
12
13 def area ( self ) :
14 return self . length * self . length
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia
Probamos la nueva clase:
aSquare = Square(3)
print(aSquare.area())
Salida por pantalla:
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia múltiple
En Python, se permite la herencia múltiple, es decir, una clase puede
heredar de varias clases a la vez.
1 class Mascota :
2
3 def __init__ ( self , nombre , edad ) :
4 self . nombre = nombre
5 self . edad = edad
6 print ( ’ Se crea la mascota ’)
7
8 def sientate ( self ) :
9 print ( " %s se ha sentado " % self . nombre )
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia múltiple
1 class Felino :
2 def __init__ ( self ) :
3 print ( ’ Se crea el felino ’)
4 def rugido ( self ) :
5 print ( ’ El felino dio un rugido ’)
6
7 class Gato ( Felino , Mascota ) :
8 def __init__ ( self , nombre , edad , energia , hambre ) :
9 Mascota . __init__ ( self , nombre , edad )
10 self . energia = energia
11 self . hambre = hambre
12 print ( ’ Se creo un gato ’)
13 def acariciar ( self ) :
14 print ( ’ prrrrr ... ’)
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Herencia múltiple
Probamos la clase:
g = Gato(‘Misi’, 2, 5, 0)
g.acariciar()
g.rugido()
g.sientate()
Salida por pantalla:
Se creó la mascota
Se creó un gato
prrrrr...
El felino dió un rugido
Misi se ha sentado
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Polimorfismo
Definición
El concepto de polimorfismo (del griego muchas formas) implica que si
en una porción de código se invoca un determinado método de un objeto,
podrán obtenerse distintos resultados según la clase del objeto.
Distintos objetos pueden tener un método con un mismo nombre, pero
que realice distintas operaciones.
Sin saberlo, ya hemos estado sacando provecho de las posibilidades que
proporciona el polimorfismo.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Polimorfismo
Ejemplos
Es posible recorrer cualquier tipo de secuencia (ya sea una lista, una
tupla, un diccionario, un archivo o cualquier otro tipo de secuencia)
utilizando la misma estructura de código:
for elemento in secuencia
Hemos utilizado funciones que pueden trabajar con los distintos
tipos numéricos sin hacer distinción sobre de qué tipo de número se
trataba (entero, real o complejo).
También hemos visto que, al construir una clase, es posible incluir el
método str para que cuando se quiera imprimir el objeto se
haga de la forma deseada; ası́ como una gran variedad de otros
métodos especiales, que permiten que operadores comunes sean
utilizados sobre distintos tipos de objetos.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Interfaz
Una interfaz es un conjunto de funciones, métodos o atributos con
nombres especı́ficos.
Una interfaz es un contrato entre el programador que realiza una
clase y el que la utiliza, puede consistir en uno o varios métodos o
atributos.
Por ejemplo, para que un objeto se pueda comparar con otros, debe
cumplir con la interfaz rich comparisons, que implica definir los
métodos eq , ne , lt , le , gt , ge .
La idea de polimorfismo se basa, entonces, en utilizar distintos tipos de
datos a través de una interfaz común.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Redefinición de métodos
Llamamos redefinición a la acción de definir un método con el mismo
nombre en distintas clases, de tal forma que provea una interfaz.
Un bloque de código será polimórfico cuando dentro de ese código se
realicen llamadas a métodos que puedan estar redefinidos en distintas
clases.
Supongamos un bloque en el que se recorre una secuencia (lista, tupla, archivo,
etc) mediante una misma estructura de código.
Esto es posible gracias a la redefinición del método especial iter que
devuelve un iterador.
En Python al no ser necesario especificar explı́citamente el tipo de los parámetros que
recibe una función, las funciones son naturalmente polimórficas.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Sobrecarga de métodos
El término sobrecarga viene de un posible uso de polimorfismo que
está presente en algunos lenguajes orientados a objetos: la
posibilidad de tener, dentro de una misma clase, dos métodos que se
llamen igual pero que reciban parámetros de distintos tipos. Es
decir, que el método al que hay que llamar se decide por el tipo del
parámetro, no por el tipo del objeto que lo contiene.
En Python no tenemos sobrecarga de métodos, ya que al no definir
los tipos de los parámetros en el encabezado, no serı́a posible
distinguir a qué método hay que llamar.
Sin embargo, se puede decir que sı́ tenemos sobrecarga de
operadores, ya que al encontrar un operador, Python llamará a
distintos métodos según el tipo de las variables que se quiera sumar,
restar, multiplicar, etc.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Encapsulación
Uno de los efectos del encapsulamiento es impedir la visualización o
acceso de las variables de manera directa.
En otros lenguajes esto se logra en el momento de declarar la
variable como public o como private.
En Python, para declarar una variable o una función como privada,
el nombre de la función o variable debe comenzar con doble guión
bajo.
Comenzar el nombre con bastará para que lo declarado sea
reconocido como privado.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Encapsulación
1 class Ejemplo :
2 def publico ( self ) :
3 print " Publico "
4
5 def __privado ( self ) :
6 print " Privado "
7
8 ej = Ejemplo ()
9 ej . publico ()
10 ej . __privado ()
Sólo se imprimirá la cadena correspondiente al método publico, mientras que al
intentar llamar al método privado Python lanzará una excepción quejándose de que
no existe (evidentemente existe, pero no lo podemos ver porque es privado).
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Encapsulación
En ocasiones también puede suceder que queramos permitir el acceso a
algún atributo de nuestro objeto, pero que éste se produzca de forma
controlada.
Para esto podemos escribir métodos cuyo único cometido sea éste,
métodos que normalmente, por convención, tienen nombres como
getVariable y setVariable; y que, por ello, se les conoce también
como getters y setters.
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Encapsulación
1 class Person :
2 def __init__ ( self , name , age = 0) :
3 self . name = name
4 self . __age = age
5
6 # Getter method
7 def get_age ( self ) :
8 return self . __age
9
10 # Setter method
11 def set_age ( self , a ) :
12 self . __age = a
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Encapsulación
1 # Testing the class
2 p1 = Person ( ’ Pepe ’)
3 print ( p1 . name )
4 print ( p1 . __age )
Sólo se imprimirá la cadena correspondiente al nombre, mientras que al
intentar mostrar la edad se lanzará una excepción:
AttributeError: ’Person’ object has no attribute ‘ age’
Gara Miranda Valladares Tema 1: Programación avanzada
Clases y objetos
Librerı́a estándar y utilidades
Herencia
Programación orientada a objetos
Polimorfismo
Documentación, depuración y pruebas
Encapsulación
Encapsulación
1 # Testing the class
2 p1 = Person ( ’ Pepe ’)
3 print ( p1 . name )
4 print ( p1 . get_age () )
5 p1 . set_age (20)
6 print ( p1 . get_age () )
Pepe
0
20
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Indice
1 Librerı́a estándar y utilidades
2 Programación orientada a objetos
3 Documentación, depuración y pruebas
Documentación
Guı́a de estilo
Depuración
Pruebas
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings
¿Qué es un doc string?
Un doc string es una cadena de documentación que se produce a partir
del primer comentario que se encuentra en la declaración de un módulo,
función, clase, o definición de método.
Un doc string se convertirá en el atributo especial doc del objeto.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings
¿Qué es un doc string?
Un doc string es una cadena de documentación que se produce a partir
del primer comentario que se encuentra en la declaración de un módulo,
función, clase, o definición de método.
Un doc string se convertirá en el atributo especial doc del objeto.
Para los doc strings se recomienda utilizar la notación de comentarios
multi-lı́nea, incluso cuando el comentario pudiera realizarse en una única
lı́nea.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
Fichero sortstring.py:
def ignorecase_sort(a, b):
"""
Compare two strings a and b, ignoring case.
Returns -1 if a<b, 0 if a==b and 1 if a>b.
"""
a = a.lower();
b = b.lower();
# Use the built-in cmp function to perform the comparison
return cmp(a, b)
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
Accediendo a la documentación:
>>> from sortstring import *
>>> print(ignorecase_sort.__doc__)
Compare two strings a and b, ignoring case.
Returns -1 if a<b, 0 if a==b and 1 if a>b.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
Accediendo a la documentación:
>>> help(ignorecase_sort)
Para salir del modo de ayuda pulsar la tecla q (Quit).
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
Accediendo a la documentación:
>>> import sortstring
>>> help(sortstring)
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
"""
Assuming this is file mymodule.py, then this string, being the
first statement in the file, will become the "mymodule" module’s
docstring when the file is imported.
"""
class MyClass(object):
"""The class’s docstring"""
def my_method(self):
"""The method’s docstring"""
def my_function():
"""The function’s docstring"""
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
>>> import mymodule
>>> help(mymodule)
>>> help(mymodule.MyClass)
>>> help(mymodule.MyClass.my_method)
>>> help(mymodule.my_function)
>>> print(mymodule.my_function.__doc__)
The function’s docstring
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
Help on module mymodule:
NAME
mymodule
DESCRIPTION
Assuming this is file mymodule.py, then this string, being the
first statement in the file, will become the "mymodule" module’s
docstring when the file is imported.
CLASSES
builtins.object
MyClass
class MyClass(builtins.object)
| The class’s docstring
|
| Methods defined here:
|
| my_method(self)
| The method’s docstring
| Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
Help on module mymodule:
...
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
FUNCTIONS
my_function()
The function’s docstring
FILE
/home/user/P7/mymodule.py
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
Help on class MyClass in module mymodule:
class MyClass(builtins.object)
| The class’s docstring
|
| Methods defined here:
|
| my_method(self)
| The method’s docstring
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doc Strings: Ejemplo
Help on function my_method in module mymodule:
my_method(self)
The method’s docstring
Help on function my_function in module mymodule:
my_function()
The function’s docstring
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Recomendaciones
El docstring de un script deberı́a especificar toda aquella
información relativa a su uso: qué es lo que hace, cuál es la sintaxis
de su llamada por lı́nea de comandos, cuáles son sus variables o
ficheros principales, etc. Suele ser conveniente incluir ejemplos de
uso.
El docstring de una función o método deberı́a resumir su
comportamiento, indicar sus argumentos, el valor que devuelve,
posibles efectos colaterales, excepciones que lanza o restricciones a
la hora de realizar la llamada.
El docstring de una clase deberı́a resumir su comportamiento y
listar los métodos públicos y variables. Se deberı́a especificar
también el funcionamiento básico de su método init .
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Recomendaciones
El docstring de un módulo deberı́a listar las clases, excepciones,
funciones y cualquier otro objeto que sea exportado por el módulo.
El docstring de un paquete deberı́a listar todos los módulos y
subpaquetes exportados por el propio paquete.
La información en clases o módulos sobre los métodos o funciones
que proporcionan deberı́an ser más simples que las descripciones que
se incluyan en el propio método o función.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Herramientas
En cuanto a la generación de documentación, en Python tenemos las
herramientas siguientes:
Doctest
Pydoc
Pydoctor
Epydoc
Sphinx
Doxygen
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Pydoc
Pydoc genera automáticamente documentación para módulos de
Python.
La documentación se puede presentar en forma de páginas de texto
en la consola, o bien en formato html.
Para módulos, clases, funciones y métodos, la documentación se
genera a partir del docstring correspondiente (atributo doc del
objeto).
Ejecutando en la consola pydoc module se obtiene una salida
análoga a la que mostrarı́a help(module). La función help() que
se ejecuta desde el intérprete interactivo de Python invoca al sistema
de ayuda online, que utiliza Pydoc para generar la documentación.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Usando Pydoc
Al ejecutar en la consola pydoc math obtenemos el resultado siguiente:
Help on built-in module math:
NAME
math
FILE
(built-in)
DESCRIPTION
This module is always available. It provides access to the
mathematical functions defined by the C standard.
FUNCTIONS
acos(...)
acos(x)
Return the arc cosine (measured in radians) of x.
acosh(...)
acosh(x)
Return the hyperbolic arc cosine (measured in radians) of x.
...
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Usando Pydoc
Si ejecutamos en la consola pydoc mymodule obtenemos un resultado
similar al que obtuvimos al utilizar el help:
NAME
mymodule
FILE
/home/user/P7/mymodule.py
DESCRIPTION
Assuming this is file mymodule.py, then this string, being the
first statement in the file, will become the "mymodule" module’s
docstring when the file is imported.
CLASSES
__builtin__.object
MyClass
...
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Opciones de Pydoc
pydoc -k keyword: busca la palabra keyword en la documentación
de todos los módulos disponibles.
pydoc -p port: arranca un servidor HTTP en el puerto
especificado de la máquina local.
pydoc -g: Abre una interfaz gráfica para la búsqueda de
documentación.
pydoc -w name [...]: escribe en formato HTML la
documentación para un módulo (fichero del directorio actual) o para
todos los elementos del directorio, dependiendo de lo que se le pase
como parámetro.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Generando HTML con Pydoc
Ejemplo: pydoc -w mymodule
Genera un fichero mymodule.html que contiene lo siguiente:
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Generando HTML con Pydoc
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Sphinx
Python tiene mucha documentación y en ella han contribuido
multitud de autores.
El lenguaje de marcas utilizado para la documentación de Python es
reStructuredText, aunque también se puede usar Markdown.
reStructuredText ha sido desarrollado por el proyecto Docutils.
El propósito del proyecto Docutils es crear un conjunto de
herramientas que sean capaces de procesar documentación en
formato de texto plano y convertirla a formatos como: HTML, XML
o LaTeX.
La marcación permite la definición y la estructura de texto para la
salida apropiada.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
reStructuredText: Ejemplo
This is a Title
===============
That has a paragraph about a main subject and is set when the ‘=’
is at least the same length of the title itself.
Subject Subtitle
----------------
Subtitles are set with ‘-’ and are required to have the same length
of the subtitle itself, just like titles.
Lists can be unnumbered like:
* Item Foo
* Item Bar
Or automatically numbered:
#. Item 1
#. Item 2
Inline Markup
-------------
Words can have *emphasis in italics* or be **bold** and you can define
code samples with back quotes, like when you talk about a command: ‘‘sudo‘‘
gives you super user powers!
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
reStructuredText
La sintaxis se ve bastante legible en texto plano.
Cuando llega el momento de crear un formato especı́fico (como
HTML):
El tı́tulo se verá como una cabecera principal y tendrá fuentes más
grandes que el subtı́tulo
Las listas numeradas serán numeradas apropiadamente. Añadir más
elementos o cambiar el orden en la lista numerada no afecta la
numeración.
La cursiva y la negrita aparecen en aquel texto en el que se haya
especificado.
...
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
reStructuredText
Para más información sobre reStructuredText aquı́ puede encontrar una
guı́a completa y un enlace a la documentación de Python:
https:
//docutils.sourceforge.io/docs/user/rst/quickref.html
https://devguide.python.org/documenting/
#restructuredtext-primer
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Usando Sphinx
Si instalamos Sphinx (el paquete se llama python-sphinx) y ejecutamos
el comando sphinx-quickstart se nos crearán los directorios y archivos
siguientes:
Makefile: archivo que contiene instrucciones para compilar salidas de
documentación cuando se usa el comando make.
build: en este directorio se ubicarán los archivos generados.
static: los archivos que no son parte del código de origen (como las imágenes)
se ubican aquı́ y después se enlazan en el directorio de compilación.
conf.py: contiene los valores de configuración para sphynx, incluidos los
seleccionados cuando se ejecuta sphinx-quickstart.
index.rst: es la raı́z del proyecto de documentación (documentación dividida en
varios archivos).
Para una configuración rápida se puede pulsar Enter para escoger la opción por
defecto.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Usando Sphinx
En el fichero index.rst debemos incluir el elemento raı́z de nuestro
proyecto.
.. myproject documentation master file, created by
sphinx-quickstart on tue nov 18 15:08:56 2014.
you can adapt this file completely to your liking, but it should at least
contain the root ‘toctree‘ directive.
welcome to myproject’s documentation!
=====================================
contents:
.. toctree::
:maxdepth: 2
mymodule
indices and tables
==================
* :ref:‘genindex‘
* :ref:‘modindex‘
* :ref:‘search‘
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Usando Sphinx
Al encontrar en el fichero index.rst la referencia a mymodule,
sphinx buscará el fichero mymodule.rst y plasmará su contenido en
index.html, ası́ como las referencias que se encuentren a su vez en
mymodule.rst y luego recursivamente en este, ası́ hasta alcanzar la
profundidad máxima definida en el parámetro :maxdepth
Si quisiéramos generar automáticamente el fichero mymodule.rst a
partir de los docstrings del módulo, tendrı́amos que ejecutar en la
consola:
sphinx-apidoc -o docs .
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Usando Sphinx
~/P7$ sphinx-apidoc -o docs .
Creating file docs/conf.rst.
Creating file docs/mymodule.rst.
Creating file docs/sortstring.rst.
Creating file docs/modules.rst.
En la opción -o ponemos el directorio donde queremos que se creen los
ficheros .rst y en el siguiente parámetro el directorio desde el que
queremos que sphinx-apidoc empiece a buscar.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Generando HTML con Sphinx
Ya podrı́amos generar la documentación en formato HTML, por ejemplo.
gara@goliat:~/documentos/pythontools/ejemplos$ make html
sphinx-build -b html -d _build/doctrees . _build/html
making output directory...
running sphinx v1.1.3
loading pickled environment... not yet created
building [html]: targets for 2 source files that are out of date
updating environment: 2 added, 0 changed, 0 removed
reading sources... [100%] index
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [100%] index
writing additional files... genindex search
copying static files... done
dumping search index... done
dumping object inventory... done
build succeeded.
build finished. the html pages are in _build/html.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Generando HTML con Sphinx
Si abrimos el fichero build/html/index.html en un navegador:
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Generando HTML con Sphinx
Si abrimos el fichero build/html/index.html en un navegador:
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Sphinx: otros formatos de salida
Please use ‘make <target>’ where <target> is one of
html to make standalone HTML files
dirhtml to make HTML files named index.html in directories
singlehtml to make a single large HTML file
pickle to make pickle files
json to make JSON files
htmlhelp to make HTML files and a HTML help project
qthelp to make HTML files and a qthelp project
devhelp to make HTML files and a Devhelp project
epub to make an epub
latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
latexpdf to make LaTeX files and run them through pdflatex
text to make text files
man to make manual pages
texinfo to make Texinfo files
info to make Texinfo files and run them through makeinfo
gettext to make PO message catalogs
changes to make an overview of all changed/added/deprecated items
linkcheck to check all external links for integrity
doctest to run all doctests embedded in the documentation (if enabled)
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Guı́as de estilo de programación
Las guı́as de estilo, estándares de código o estilos de programación son
un conjunto de normas usadas para escribir código fuente.
Generalmente, dependen del lenguaje de programación pero siempre
persiguen como objetivo la obtención de una estructura de código fácil
de entender no solo para quien lo programa sino para el resto de
desarrolladores o usuarios.
Se pretende aportar eficiencia al proceso de desarrollo, logrando que los
programas sean más robustos y comprensibles.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Programa ilegible
¿Y qué pasará cuando...?
Tengamos que depurar el programa.
Después de un tiempo queramos modificar el código.
Queramos que otra persona utilice el código.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Programa legible
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Aumentar la legibilidad de los programas
Utilizar identificadores representativos y tan largos como sea
necesario.
Diferenciar claramente zonas distintas del programa: lectura de
datos, realización de cálculos y visualización de resultados. Se
pueden utilizar marcas visuales para separar las zonas.
Utilizar formas de expresión de los cálculos que sean estándar.
Utilizar mensajes de E/S que sean lo más informativo posible.
Incluir comentarios:
En la cabecera del programa, para comentar el nombre del programa, su
propósito, el autor y la fecha.
Al principio de cada una de las zonas diferenciadas del programa, indicando qué se
hace en ellas.
Al final de algunas de las lı́neas para comentar alguna peculiaridad de la misma.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Criterios de estilo
Algunos de los criterios que se suelen definir de cara a mejorar la
legibilidad de los programas y favorecer, por tanto, no sólo su uso sino su
futuro mantenimiento, suelen estar relacionados con:
La indentación y el espaciado.
La longitud de las lı́neas.
El uso de paréntesis
El nombre de variables, funciones, clases, métodos o módulos.
El formato y contenido de los comentarios.
Las interfaces públicas/privadas.
Algunas otras recomendaciones...
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Guı́a de estilo para código Python
Para más información:
https://www.python.org/dev/peps/pep-0008
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Depuración
Para depurar código Python lo más común es utilizar algún IDE que
integre depurador.
Algunas opciones son:
Komodo
NetBeans
KDevelop
PyDev
PyStudio
Más información
https://wiki.python.org/moin/IntegratedDevelopmentEnvironments
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Depurador interactivo: pdb
pdb implementa un entorno de depuración interactivo para programas
escritos en Python.
Incluye opciones para pausar un programa, observar los valores de las
variables y observar la ejecución del programa paso a paso, para que
puedas comprender lo que hace el programa y encontrar errores en el
funcionamiento lógico del programa.
Se puede ejecutar:
Desde la consola: python3 -m pdb prueba.py
Desde el propio programa.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Depurador interactivo: pdb
Para llamar al depurador desde el propio código del programa hay dos
opciones:
import pdb; pdb.set_trace()
...
O bien:
breakpoint()
La ventaja de usar la segunda opción es que si luego hacemos
PYTHONBREAKPOINT=0 en nuestro entorno, deshabilitaremos el modo
depuración sin necesidad de modificar nuestro código.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Depurador interactivo: pdb
~/P7$ python3 -m pdb prueba.py
> /home/user/P7/prueba.py(1)<module>()
-> def doble(x):
(Pdb) n
> /home/user/P7/prueba.py(5)<module>()
-> y = doble(5)
(Pdb) s
--Call--
> /home/user/P7/prueba.py(1)doble()
-> def doble(x):
(Pdb) s
> /home/user/P7/prueba.py(2)doble()
-> d = 2 * x
(Pdb) s
> /home/user/P7/prueba.py(3)doble()
-> return(d)
(Pdb) s
--Return--
> /home/user/P7/prueba.py(3)doble()->10
-> return(d)
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Depurador interactivo: pdb
Algunos comandos básicos:
Poner un breakpoint: b file:linenumber
Imprimir el valor de una variable: p variable
Next - Ejecutar (al completo) la siguiente lı́nea de código, aunque
esto implique la llamada a una función: n
Step - Ejecutar un único paso (si es necesario, entrar a otra función
o método): s
Salir (quit): q
Para más información:
https://docs.python.org/3/library/pdb.html
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Pruebas unitarias
En programación, una prueba unitaria es una forma de comprobar el
correcto funcionamiento de una unidad de código: una función, método o
clase.
Se usan para verificar que:
El código hace lo que tiene que hacer.
Los nombres y tipos de los parámetros son correctos.
El tipo de lo que se devuelve es correcto.
Si el estado inicial es válido, entonces el estado final es válido
también.
Etc.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Pruebas unitarias
Las principales ventajas por las cuales es conveniente utilizar este tipo de
pruebas son:
Fomentan el cambio, puesto que se automatizan las pruebas.
Simplifican la integración continua puesto que las pruebas son
repetibles o reutilizables.
Documentan el código, especialmente si son completas y cubren la
mayor parte del código.
Separan la interfaz de la implementación.
Los errores son más fáciles de encontrar puesto que las pruebas son
independientes las unas de las otras.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Unittest
Se recomienda ir escribiendo el código de pruebas al mismo tiempo
que se implementa el código del programa.
De hecho, incluso definir las pruebas antes de empezar con el
desarrollo puede ayudar a ser más precisos con la implementación.
Unittest es un módulo de la biblioteca standard de Python que
permite realizar pruebas unitarias.
Para definir o crear casos de prueba se debe extender la clase
unittest.TestCase.
Para más información:
https://docs.python.org/3/library/unittest.html
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Unittest: ejemplo
import unittest
def multiply(a, b):
return a * b
class TestUM(unittest.TestCase):
def setUp(self):
pass
def test_numbers_3_4(self):
self.assertEqual( multiply(3,4), 12)
def test_strings_a_3(self):
self.assertEqual( multiply(‘a’,3), ‘aaa’)
if __name__ == ‘__main__’:
unittest.main()
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Unittest: ejemplo
$ python3 unittest_example.py
..
-------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
$ python unittest_example.py -v
test_numbers_3_4 (__main__.TestUM) ... ok
test_strings_a_3 (__main__.TestUM) ... ok
-------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Asserts en unittest
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doctest
El módulo doctest busca en el código segmentos de texto (en los
docstrings) que, en apariencia, sean como sesiones interactivas de
Python.
Los tests realizados con doctest tienen una funcionalidad distinta a
las pruebas unitarias.
Generalmente estas pruebas son más simples y menos detalladas,
por lo que no suelen testear todos los casos especiales.
Este tipo de pruebas son muy útiles como una forma de
documentación, con mayor nivel de expresividad, de los principales
casos de uso de un módulo y sus componentes.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doctest: ejemplo
def square(x):
"""Squares x.
>>> square(2)
4
>>> square(-2)
4
"""
return x * x
if __name__ == ‘__main__’:
import doctest
doctest.testmod()
Cuando se ejecuta el módulo desde la lı́nea de comandos (python3 module.py), los
doctests se ejecutarán y como las pruebas se ejecutan sin errores no se mostrará
ningún mensaje por pantalla.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doctest: ejemplo
def square(x):
"""Squares x.
>>> square(2)
4
>>> square(-2)
-4
"""
return x * x
if __name__ == ‘__main__’:
import doctest
doctest.testmod()
Cuando se ejecuta el módulo desde la lı́nea de comandos (python3 module.py), los
doctests se ejecutarán y darán un mensaje de aviso porque las pruebas no dan los
resultados esperados.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Doctest: ejemplo
*******************************************************************
File "square.py", line 8, in __main__.square
Failed example:
square(-2)
Expected:
-4
Got:
4
*******************************************************************
1 items had failures:
1 of 2 in __main__.square
***Test Failed*** 1 failures.
Gara Miranda Valladares Tema 1: Programación avanzada
Documentación
Librerı́a estándar y utilidades
Guı́a de estilo
Programación orientada a objetos
Depuración
Documentación, depuración y pruebas
Pruebas
Otras alternativas
Además de unittest y doctest existen otras herramientas para la
realización de pruebas:
py.test
Nose
tox
Unittest2
mock
Gara Miranda Valladares Tema 1: Programación avanzada
Computación Avanzada
Grado en Matemáticas
Tema 2: Bibliotecas cientı́ficas
Curso 2021-2022
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Indice
1 IPython
2 NumPy
3 Matplotlib
4 SymPy
5 SciPy
6 Pandas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
SciPy
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
SciPy
Distribuciones de Scientific Python
Anaconda
Enthought Canopy
Python(x,y)
WinPython
Pyzo
Algorete Loopy
Para instalar los paquetes en nuestra distribución de Linux
http://www.scipy.org/install.html
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Indice I
1 IPython
2 NumPy
3 Matplotlib
4 SymPy
5 SciPy
6 Pandas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
IPython
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
IPython
IPython es un intérprete interactivo de Python que añade
funcionalidades extra al modo interactivo que viene por defecto con las
distribuciones estándar de Python.
Funcionalidades principales
Resaltado de lı́neas y errores mediante colores.
Sintaxis adicional para la shell.
Autocompletado y ayuda mediante el tabulador.
Interfaz gráfica más amigable.
Una consola hı́brida entre una shell y una GUI que permite visualizar
gráficos en la propia consola en lugar de en ventanas independientes
(QtConsole).
Más información en: Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
IPython
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
IPython Notebooks
Además, como última evolución de este entorno interactivo, tenemos los
originalmente denominados IPython Notebooks, un sistema interactivo
basado en web que permite a los usuarios crear documentos en los que se
mezcla el código ejecutable, el texto, las fórmulas, las imágenes o las
animaciones en un único documento web.
En la actualidad, a estos documentos se les denomina Jupyter
Notebooks y son muy útiles para desarrollar informes, presentaciones,
tutoriales, o incluso para procesos de depuración.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Jupyter Notebooks
En un documento .ipynb podremos:
Ejecutar código en tiempo real.
Incluir ecuaciones LaTeX.
Insertar código HTML.
Incluir enlaces web.
Incrustar videos e imágenes.
Más información en:
https://jupyter.org/
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Jupyter Notebooks
Jupyter Lab es una nueva alternativa de entorno de desarrollo para
cuadernos de este tipo. Forma parte del proyecto Jupyter y combina la
interfaz de los Jupyter Notebooks con un explorador de archivos, un
editor de texto, una shell, una consola de IPython, etc., a modo de
entorno integrado de desarrollo disponible a través de una interfaz web.
Algunas alternativas:
Google Colab
Azure Notebooks
Kaggle
Amazon SageMaker
CoCalc
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Jupyter Notebooks
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Jupyter Notebooks
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Jupyter Notebooks
El contenido principal de un cuaderno se organiza en un conjunto de
celdas de entrada y salida. Los principales tipos de celda son:
Code: contienen código Python. Si pulsamos Shift + Enter sobre
una de estas celdas, conseguimos que el código se envı́e al kernel
para ser evaluado por el intérprete de Python. El resultado se envı́a
al navegador y se visualiza en la correspondiente celda de salida.
Markdown: contiene texto plano que será interpretado utilizando
Markdown y HTML. Estas celdas también pueden contener
ecuaciones formateadas con LaTeX y que serán renderizadas en la
interfaz web a través del motor de MathJax.
Raw: contiene texto plano que se visualizará en el cuaderno tal cual,
es decir, sin ningún tipo de pre-procesamiento.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Markdown
Markdown es un lenguaje de marcado que trata de incorporar formato
en documentos de texto plano sin entorpecer su legibilidad.
Algunos de los elementos que permite Markdown en su sintaxis son:
Énfasis en el texto
Encabezados
Listas (enumeradas y no enumeradas)
Códigos
Enlaces
Imágenes y tablas
Más información en:
https://www.markdownguide.org
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Markdown
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Markdown
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Markdown
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Markdown/LaTeX
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Indice I
1 IPython
2 NumPy
Arrays n-dimensionales
Arrays estructurados
Matrices
Números aleatorios
Más funcionalidades
3 Matplotlib
4 SymPy
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Indice II
5 SciPy
6 Pandas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
NumPy
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
NumPy
NumPy es uno de los paquetes más importantes para la realización de
cómputo cientı́fico en Python.
NumPy constituye el núcleo principal del tipo de datos que permite hacer
cómputo numérico. Cuando un determinado cómputo debe ser ejecutado
sobre un conjunto de valores de entrada, es conveniente agrupar estos
datos homogéneos en una única estructura (vector, matriz o array de
mayores dimensiones). De esta forma, en lugar de hacer bucles sobre los
datos, se aplican directamente operaciones sobre la propia estructura,
implicando ası́ la operación sobre cada uno de sus elementos.
La principal ventaja de estas operaciones vectorizadas es que simplifican
el código a la vez que permiten aumentar la eficiencia gracias al uso de
librerı́as de más bajo nivel.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
NumPy
NumPy proporciona las estructuras de datos que permiten vectorizar
nuestra información de entrada y luego operar con este tipo de
estructuras mediante una gran variedad de métodos y funciones.
Por lo tanto, NumPy es el backend para cualquier librerı́a cientı́fica o
técnica que vaya a manejar datos en Python.
Caracterı́sticas principales
Objeto para el manejo de arrays multidimensionales.
Herramientas para la integración con C/C++ y Fortran.
Álgebra lineal.
Transformadas de Fourier.
Generación de números aleatorios.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
NumPy
Antes de utilizar NumPy es necesario importar el módulo. Es bastante
común importarlo asignándole el alias np:
import numpy as np
De esta forma para utilizar cualquier método o clase de la librerı́a bastará
con antecederlo del alias.
Para más información:
http://www.numpy.org/
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Objeto de tipo ndarray
El núcleo central del paquete NumPy es el objeto ndarray.
Este objeto encapsula un array n-dimensional de tipo de datos
homogéneos (mismo tipo y mismo tamaño).
Algunas diferencias entre arrays de NumPy y las secuencias estándar
de Python son:
A los arrays de tipo ndarray se les asigna un tamaño determinado en
el momento de su creación.
Cuando se modifica el tamaño de un ndarray se crea un nuevo array
y se elimina el antiguo.
Los elementos de un ndarray deben ser del mismo tipo y, por tanto,
ocupar el mismo espacio en memoria.
Los arrays de tipo ndarray facilitan la realización de operaciones
matemáticas sobre grandes cantidades de datos.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Caracterı́sticas de los arrays n-dimensionales
>>> import numpy as np
>>> data = np.array([[1, 2], [3, 4], [5, 6]])
>>> type(data)
<class 'numpy.ndarray'>
>>> data
array([[1, 2],
[3, 4],
[5, 6]])
>>> data.ndim
2
>>> data.shape
(3, 2)
>>> data.size
6
>>> data.dtype
dtype('int64')
>>> data.nbytes
48
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Atributos de un ndarray
Cualquier objeto de la clase ndarray además de tener asociado los
elementos en sı́ mismos, tiene los siguientes atributos que almacenan
algunas de las caracterı́sticas principales del array:
shape: es una tupla que contiene el número de elementos que
contiene el array en cada una de sus dimensiones.
size: número de elementos o datos que contiene el array.
ndim: número de dimensiones del array.
nbytes: número de bytes que se ocupan en memoria para almacenar
todos los elementos del array.
dtype: tipo de datos de los elementos del array.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Tipos de datos
dtype Variantes Descripción
int int8, int16, int32, int64 Números enteros
uint uint8, uint16, uint32, uint64 Números enteros sin signo
bool Bool Booleano (True o False)
float float16, float32, float64, float128 Números reales
complex complex64, complex128, complex256 Números complejos
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Tipos de datos
bool : Boolean (True or False) stored as a byte
int : Default integer type (same as C long; normally either int64 or int32)
intc: Identical to C int (normally int32 or int64)
intp: Integer used for indexing (same as C ssize t; normally either int32 or int64)
int8: Byte (-128 to 127)
int16: Integer (-32768 to 32767)
int32: Integer (-2147483648 to 2147483647)
int64: Integer (-9223372036854775808 to 9223372036854775807)
uint8: Unsigned integer (0 to 255)
uint16: Unsigned integer (0 to 65535)
uint32: Unsigned integer (0 to 4294967295)
uint64: Unsigned integer (0 to 18446744073709551615)
float : Shorthand for float64.
float16: Half precision float: sign bit, 5 bits exponent, 10 bits mantissa
float32: Single precision float: sign bit, 8 bits exponent, 23 bits mantissa
float64: Double precision float: sign bit, 11 bits exponent, 52 bits mantissa
complex : Shorthand for complex128.
complex64: Complex number, represented by two 32-bit floats
complex128: Complex number, represented by two 64-bit floats
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Especificación del tipo de datos
>>> import numpy as np
>>>
>>> np.array([1, 2, 3])
array([1, 2, 3])
>>>
>>> np.array([1, 2, 3], dtype=np.int)
array([1, 2, 3])
>>> np.array([1, 2, 3], dtype=np.float)
array([1., 2., 3.])
>>> np.array([1, 2, 3], dtype=np.complex)
array([1.+0.j, 2.+0.j, 3.+0.j])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Cambio del tipo de datos
Una vez creado un array no se puede cambiar el tipo de datos: hay que
hacer una copia a mano o usando el método astype.
>>> data = np.array([1, 2, 3], dtype=np.float)
>>> data
array([1., 2., 3.])
>>> data.dtype
dtype('float64')
>>> data = np.array(data, dtype=np.int)
>>> data
array([1, 2, 3])
>>> data.dtype
dtype('int64')
>>> data = data.astype(np.complex)
>>> data
array([1.+0.j, 2.+0.j, 3.+0.j])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Tipo de datos adecuados
Tipos de datos en el resultado de una operación o al crear el array:
>>> data = np.array([1, 2.0, 3+5j])
>>> data.dtype
dtype('complex128')
>>> data1 = np.array([1, 2, 3])
>>> data2 = np.array([4.2, 10.5, 5.1])
>>> result = data1 + data2
>>> result
array([ 5.2, 12.5, 8.1])
>>> result.dtype
dtype('float64')
Valor de los datos de entrada:
>>> np.sqrt(np.array([-1, 0, 1]))
__main__:1: RuntimeWarning: invalid value encountered in sqrt
array([nan, 0., 1.])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Creación de arrays n-dimensionales
>>> np.zeros((2, 3))
array([[0., 0., 0.],
[0., 0., 0.]])
>>> np.ones((2, 3))
array([[1., 1., 1.],
[1., 1., 1.]])
>>> np.ones(4)
array([1., 1., 1., 1.])
>>> np.ones(4, dtype=np.int64)
array([1, 1, 1, 1])
>>> x1 = 5.4 * np.ones(10)
>>> x1
array([5.4, 5.4, 5.4, 5.4, 5.4, 5.4, 5.4, 5.4, 5.4, 5.4])
>>> x2 = np.full(10, 5.4)
>>> x2
array([5.4, 5.4, 5.4, 5.4, 5.4, 5.4, 5.4, 5.4, 5.4, 5.4])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Creación de arrays n-dimensionales
>>> x1 = np.empty(10)
>>> x1
array([0.0e+000, 4.9e-324, 9.9e-324, 1.5e-323, 2.0e-323, 2.5e-323,
3.0e-323, 3.5e-323, 4.0e-323, 4.4e-323])
>>> x1 = np.empty(10, dtype=np.int)
>>> x1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> x1.fill(3.5)
>>> x1
array([3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5])
>>> x2 = np.full(10, 3.5)
>>> x2
array([3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Creación de arrays n-dimensionales
>>> np.arange(0, 10, 1)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(11)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> np.arange(0, 11, 0.5)
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ,
5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5, 10. , 10.5])
>>>
>>> np.linspace(0, 10, 25)
array([ 0. , 0.41666667, 0.83333333, 1.25 , 1.66666667,
2.08333333, 2.5 , 2.91666667, 3.33333333, 3.75 ,
4.16666667, 4.58333333, 5. , 5.41666667, 5.83333333,
6.25 , 6.66666667, 7.08333333, 7.5 , 7.91666667,
8.33333333, 8.75 , 9.16666667, 9.58333333, 10. ])
>>>
>>> np.logspace(0, 2, 5) # 5 data points between 10**0=1 to 10**2=100
array([ 1. , 3.16227766, 10. , 31.6227766 , 100. ])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Creación de arrays n-dimensionales
>>> np.identity(4, dtype=float)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
>>>
>>> np.eye(4, k=1, dtype=float)
array([[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.],
[ 0., 0., 0., 0.]])
>>>
>>> np.eye(3, k=-1, dtype=float)
array([[0., 0., 0.],
[1., 0., 0.],
[0., 1., 0.]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Creación de arrays n-dimensionales
>>> np.diag([1,2,3])
array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
>>> np.diag([1,2,3], k=1)
array([[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 3],
[0, 0, 0, 0]])
>>> np.diag(np.arange(0, 20, 5))
array([[ 0, 0, 0, 0],
[ 0, 5, 0, 0],
[ 0, 0, 10, 0],
[ 0, 0, 0, 15]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Creación de arrays n-dimensionales
>>> a = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float)
>>>
>>> np.zeros_like(a)
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>>
>>> np.ones_like(a)
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Creación de arrays n-dimensionales
>>> x = np.array([-1, 0, 1])
>>> y = np.array([-2, 0, 2])
>>> X, Y = np.meshgrid(x, y)
>>> X
array([[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]])
>>> Y
array([[-2, -2, -2],
[ 0, 0, 0],
[ 2, 2, 2]])
>>> Z = (X + Y) ** 2
>>> Z
array([[9, 4, 1],
[1, 0, 1],
[1, 4, 9]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Redimensionado de arrays n-dimensionales
>>> a = np.array(range(10), float)
>>> a
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
>>> a = a.reshape((5, 2))
>>> a
array([[ 0., 1.],
[ 2., 3.],
[ 4., 5.],
[ 6., 7.],
[ 8., 9.]])
>>> a.shape
(5, 2)
>>> a = a.reshape((5, 3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: total size of new array must be unchanged
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Redimensionado de arrays n-dimensionales
>>> a = np.arange(0, 12).reshape((2, 6))
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> a.reshape((6, 2)) # a is not modified
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Redimensionado de arrays n-dimensionales
>>> b = np.array(range(6), float).reshape((2, 3))
>>> b
array([[ 0., 1., 2.],
[ 3., 4., 5.]])
>>> b.flatten() # b is not modified
array([0., 1., 2., 3., 4., 5.])
>>> b
array([[0., 1., 2.],
[3., 4., 5.]])
>>> b.transpose()
array([[ 0., 3.],
[ 1., 4.],
[ 2., 5.]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Acceso a arrays n-dimensionales
>>> data = np.arange(11)
>>> data
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> data[0]
0
>>> data[-1]
10
>>> data[3]
3
>>> data[1:-1]
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> data[5:]
array([ 5, 6, 7, 8, 9, 10])
>>> data[:-5]
array([0, 1, 2, 3, 4, 5])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Acceso a arrays n-dimensionales
>>> data = np.arange(11)
>>> data
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> data[:]
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> data[0:-1:2]
array([0, 2, 4, 6, 8])
>>> data[::2]
array([ 0, 2, 4, 6, 8, 10])
>>> data[::-2]
array([10, 8, 6, 4, 2, 0])
>>> data[::]
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Acceso a arrays n-dimensionales
>>> x = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int)
>>> x[0, 0]
1
>>> x[1, 2]
6
>>> y = x[:, 1]
>>> y
array([2, 5])
>>> y[0]
2
>>> y[0] = 9
>>> y
array([9, 5])
>>> x
array([[1, 9, 3],
[4, 5, 6]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Acceso a arrays n-dimensionales
>>> a = np.array([[1, 2, 3], [4, 5, 6]], float)
>>> a[1, :]
array([ 4., 5., 6.])
>>> a[:, 2]
array([ 3., 6.])
>>> a[-1:, -2:]
array([[ 5., 6.]])
>>> len(a) # size in first dimension
2
>>> 0 in a
False
>>> 4 in a
True
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Acceso a arrays n-dimensionales
>>> b = np.arange(25).reshape((5, 5))
>>> b
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> b[:2, :2]
array([[0, 1],
[5, 6]])
>>> b[2:, 2:]
array([[12, 13, 14],
[17, 18, 19],
[22, 23, 24]])
>>> b[::2, ::-2]
array([[ 4, 2, 0],
[14, 12, 10],
[24, 22, 20]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Acceso a arrays n-dimensionales
>>> c = b[1:4, 1:4] # c is a view of b
>>> c
array([[ 6, 7, 8],
[11, 12, 13],
[16, 17, 18]])
>>> c[:, :] = 0
>>> c
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
>>> b
array([[ 0, 1, 2, 3, 4],
[ 5, 0, 0, 0, 9],
[10, 0, 0, 0, 14],
[15, 0, 0, 0, 19],
[20, 21, 22, 23, 24]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Copia de un array n-dimensional
>>> a = np.array([1, 2, 3], float)
>>> b = a
>>> c = a.copy()
>>> a[0] = 0
>>> a
array([0., 2., 3.])
>>> b
array([0., 2., 3.])
>>> c
array([1., 2., 3.])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Copia de un array n-dimensional
>>> b = np.arange(25).reshape((5, 5))
>>> c = b[1:4, 1:4].copy()
>>> c[:, :] = 0
>>> c
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
>>> b
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Acceso avanzado a arrays n-dimensionales
>>> data = np.linspace(0, 1, 11)
>>> data
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
>>> data[np.array([0, 3, 4, 7])]
array([0. , 0.3, 0.4, 0.7])
>>> data[[0, 3, 4, 7]]
array([0. , 0.3, 0.4, 0.7])
>>> data[[True, False, False, True, True, False, False, True, False, False, False]
array([0. , 0.3, 0.4, 0.7])
>>> data > 0.5
array([False, False, False, False, False, False, True, True, True, True, True]
>>> data[data < 0.5]
array([0. , 0.1, 0.2, 0.3, 0.4])
>>> data2 = data[data < 0.5] # is a new array not a view
>>> data2[0] = -1
>>> data2
array([-1. , 0.1, 0.2, 0.3, 0.4])
>>> data
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Acceso avanzado a arrays n-dimensionales
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Concatenación de arrays
>>> a = np.array([[1, 2], [3, 4]], float)
>>> b = np.array([[5, 6], [7,8]], float)
>>> np.concatenate((a,b))
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.]])
>>> np.concatenate((a,b), axis=0)
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.]])
>>> np.concatenate((a,b), axis=1)
array([[ 1., 2., 5., 6.],
[ 3., 4., 7., 8.]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Aumento de las dimensiones de los arrays
>>> data = np.arange(0, 5)
>>> column = data[:, np.newaxis]
>>> column
array([[0],
[1],
[2],
[3],
[4]])
>>> column.shape # new dimension with a size of 1
(5, 1)
>>> row = data[np.newaxis, :]
>>> row
array([[0, 1, 2, 3, 4]])
>>> row.shape # new dimension with a size of 1
(1, 5)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Eliminación de filas/columnas
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> np.delete(a, 0, axis=0)
array([[4, 5, 6],
[7, 8, 9]])
>>> np.delete(a, 1, axis=1)
array([[1, 3],
[4, 6],
[7, 9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Inserción de filas/columnas
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> np.append(a, [[10, 11, 12]], axis=0)
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a = np.append(a, [[10, 11, 12]], axis=0)
>>> a
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Inserción de filas/columnas
>>> a
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
>>> b = np.array([[0, 0, 0, 0]]).reshape((4, 1))
>>> b
array([[0],
[0],
[0],
[0]])
>>> a = np.append(a, b, axis=1)
>>> a
array([[ 1, 2, 3, 0],
[ 4, 5, 6, 0],
[ 7, 8, 9, 0],
[10, 11, 12, 0]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Conversión a lista o a cadena
>>> a = np.array([1, 2, 3], float)
>>> b = a.tolist()
>>> b
[1.0, 2.0, 3.0]
>>> type(b)
<type 'list'>
>>> list(a)
['1.0', '2.0', '3.0']
>>> s = a.tostring()
>>> s
'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00
\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@'
>>> np.fromstring(s)
array([ 1., 2., 3.])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Álgebra lineal: Vectorization
NumPy internamente lleva a cabo el bucle necesario para realizar la operación elemento
a elemento. Es lo que se denomina vectorization.
>>> a = np.arange(0, 5)
>>> a
array([0, 1, 2, 3, 4])
>>> a + 2
array([2, 3, 4, 5, 6])
>>> a * 2
array([0, 2, 4, 6, 8])
>>> a / 2
array([0, 0, 1, 1, 2])
>>> a % 2
array([0, 1, 0, 1, 0])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Álgebra lineal
>>> a = np.array([1,2,3], float)
>>> b = np.array([5,2,6], float)
>>> a + b
array([6., 4., 9.])
>>> a - b
array([-4., 0., -3.])
>>> a * b
array([5., 4., 18.])
>>> b / a
array([5., 1., 2.])
>>> a % b
array([1., 0., 3.])
>>> b**a
array([5., 4., 216.])
Todas estas operaciones se llevan a cabo elemento a elemento.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Álgebra lineal
>>> a = np.array([[1,2], [3,4]], float)
>>> b = np.array([[2,0], [1,3]], float)
>>> a * b
array([[2., 0.], [3., 12.]])
>>> a = np.array([1,2,3], float)
>>> b = np.array([4,5], float)
>>> a + b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes
(3,) (2,)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Álgebra lineal: Broadcasting
>>> a = np.array([[1, 2], [3, 4], [5, 6]], float)
>>> b = np.array([-1, 3], float)
>>> a
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]])
>>> b
array([-1., 3.])
>>> a + b
array([[ 0., 5.],
[ 2., 7.],
[ 4., 9.]])
El array de menor tamaño, será repetido en la medida de lo posible para permitir la
realización de la operación.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Álgebra lineal: Broadcasting
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Álgebra lineal: Broadcasting
>>> a = np.zeros((2,2), float)
>>> b = np.array([-1., 3.], float)
>>> a
array([[ 0., 0.],
[ 0., 0.]])
>>> b
array([-1., 3.])
>>> a + b
array([[-1., 3.],
[-1., 3.]])
>>> a + b[np.newaxis,:]
array([[-1., 3.],
[-1., 3.]])
>>> a + b[:,np.newaxis]
array([[-1., -1.],
[ 3., 3.]])
Podemos indicar en qué dimensión queremos
Gara Miranda Valladares que Tema
se haga el broadcast.
2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Operadores para aritmética vectorial
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Otras operaciones sobre arrays
>>> a = np.array([2, 4, 3], float)
>>> a.sum()
9.0
>>> a.prod()
24.0
>>> a.min()
2.0
>>> a.argmin() # index of the minimum value
0
>>> a.max()
4.0
>>> a.argmax() # index of the maximum value
1
>>> a.mean()
3.0
>>> a.std()
0.816496580927726
>>> a.var()
0.6666666666666666
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Otras operaciones sobre arrays
>>> a = np.array([[0, 2], [3, -1], [3, 5]], float)
>>> a.sum()
12.0
>>> np.sum(a)
12.0
>>> a.min(axis=0)
array([ 0., -1.])
>>> a.min(axis=1)
array([ 0., -1., 3.])
>>> a.sum(axis=0)
array([6., 6.])
>>> a.sum(axis=1)
array([2., 2., 8.])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Otras funciones matemáticas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Otras funciones matemáticas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Ordenación de arrays
>>> a = np.array([1, 5, -3, 7, 2], int)
>>> a.sort()
>>> a
array([-3, 1, 2, 5, 7])
>>> b = np.array([1, 5, -3, 7, 2], int)
>>> sorted(b)
[-3, 1, 2, 5, 7]
>>> b
array([ 1, 5, -3, 7, 2])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Otras operaciones sobre arrays
Ajustar elementos a un determinado intervalo:
>>> a = np.array([6, 2, 5, -1, 0], float)
>>> a.clip(0, 5)
array([ 5., 2., 5., 0., 0.])
Eliminar elementos duplicados:
>>> a = np.array([1, 1, 4, 5, 5, 5, 7], float)
>>> np.unique(a)
array([ 1., 4., 5., 7.])
Obtener la diagonal de una matriz:
>>> a = np.array([[1, 2], [3, 4]], float)
>>> a.diagonal()
array([ 1., 4.])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Iteradores
>>> a = np.array([1, 2, 3], int)
>>> for x in a:
... print(x)
...
1
2
3
>>> a = np.array([[1, 2, 3], [4, 5, 6]], int)
>>> for x in a:
... print(x)
...
[1 2 3]
[4 5 6]
>>> for (x, y, z) in a:
... print(x, y, z)
...
1 2 3
4 5 6
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Comparaciones
>>> a = np.array([1, 3, 0], float)
>>> b = np.array([0, 3, 2], float)
>>> a > b
array([ True, False, False], dtype=bool)
>>> a < b
array([False, False, True], dtype=bool)
>>> a >= b
array([ True, True, False], dtype=bool)
>>> a <= b
array([False, True, True], dtype=bool)
>>> a == b
array([False, True, False], dtype=bool)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Comparaciones
Haciendo broadcasting, se puede comparar un array con un número:
>>> a = np.array([1, 3, 0], float)
>>> a > 2
array([False, True, False], dtype=bool)
>>> b = np.array([-2, -1, 0, 1, 2])
>>> b > 0
array([False, False, False, True, True])
>>> 1 * (b > 0)
array([0, 0, 0, 1, 1])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Comparaciones
Determinar si todos o alguno de los elementos de un array booleano son
True:
>>> c = np.array([ True, False, False], bool)
>>> any(c)
True
>>> all(c)
False
Funciones lógicas aplicadas elemento a elemento:
>>> b = np.array([True, False, True], bool)
>>> np.logical_not(b)
array([False, True, False], dtype=bool)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Comparaciones
Funciones lógicas aplicadas elemento a elemento:
>>> a = np.array([1, 3, 0], float)
>>> np.logical_and(a > 0, a < 3)
array([ True, False, False], dtype=bool)
>>> b = np.array([True, False, True], bool)
>>> c = np.array([False, True, False], bool)
>>> np.logical_or(b, c)
array([True, True, False], dtype=bool)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Comparaciones
La función where crea, mediante la aplicación de un filtro, un nuevo
array a partir de dos arrays de tamaño equivalente:
>>> a = np.array([1, 3, 0], float)
>>>
>>> np.where(a != 0, 1 / a, a)
array([ 1. , 0.33333333, 0. ])
>>>
>>> np.where(a > 0, 3, 2)
array([3, 3, 2])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Comparaciones
>>> x = np.linspace(-4, 4, 9)
>>> x
array([-4., -3., -2., -1., 0., 1., 2., 3., 4.])
>>> np.where(x < 0, x**2, x**3)
array([16., 9., 4., 1., 0., 1., 8., 27., 64.])
>>> np.select([x < -1, x < 2, x >= 2], [x**2 , x**3 , x**4])
array([ 16., 9., 4., -1., 0., 1., 16., 81., 256.])
>>> np.choose([0, 0, 0, 1, 1, 1, 2, 2, 2], [x**2 , x**3 , x**4])
array([ 16., 9., 4., -1., 0., 1., 16., 81., 256.])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Comparaciones
La función nonzero devuelve la posición (ı́ndices) de los elementos que no son cero:
>>> a = np.array([[0, 1], [3, 0]], float)
>>> a.nonzero()
(array([0, 1]), array([1, 0])
>>> a = np.array([1, np.NaN, np.Inf], float)
>>> a
array([ 1., NaN, Inf])
>>> np.isnan(a)
array([False, True, False], dtype=bool)
>>> np.isfinite(a)
array([ True, False, False], dtype=bool)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Selección de elementos
>>> a = np.array([[6, 4], [5, 9]], float)
>>> a >= 6
array([[ True, False],
[False, True]], dtype=bool)
>>> a[a >= 6]
array([ 6., 9.])
El criterio de selección puede ser tan complejo como queramos:
>>> a = np.array([[6, 4], [5, 9]], float)
>>> sel = (a >= 6)
>>> a[sel]
array([ 6., 9.])
>>> a[np.logical_and(a > 5, a < 9)]
array([ 6.])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Selección de elementos
Los elementos a seleccionar también se pueden definir mediante un array o lista de
ı́ndices:
>>> a = np.array([2, 4, 6, 8], float)
>>> b = np.array([0, 0, 1, 3, 2, 1], int)
>>> a[b]
array([ 2., 2., 4., 8., 6., 4.])
>>> a[[0, 0, 1, 3, 2, 1]]
array([ 2., 2., 4., 8., 6., 4.])
>>> a = np.array([[1, 4], [9, 16]], float)
>>> b = np.array([0, 0, 1, 1, 0], int)
>>> c = np.array([0, 1, 1, 1, 1], int)
>>> a[b,c]
array([ 1., 4., 16., 16., 4.])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Almacenar en un fichero
>>> a = np.linspace(0, 10, 25)
>>> np.save("matriz.npy", a)
>>> b = np.load("matriz.npy")
>>> b
array([ 0. , 0.41666667, 0.83333333, 1.25 ,
1.66666667, 2.08333333, 2.5 , 2.91666667,
3.33333333, 3.75 , 4.16666667, 4.58333333,
5. , 5.41666667, 5.83333333, 6.25 ,
6.66666667, 7.08333333, 7.5 , 7.91666667,
8.33333333, 8.75 , 9.16666667, 9.58333333, 10.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Arrays estructurados
A veces es conveniente agrupar información relacionada:
>>> name = ['Ana', 'Carlos', 'Marta', 'Juan']
>>> age = [40, 25, 18, 65]
>>> weight = [65.5, 78.0, 50.4, 84.3]
>>> data = np.zeros(4, dtype={'names':('name', 'age', 'weight'),
'formats':('U10', 'i4', 'f8')})
>>> data
array([('', 0, 0.), ('', 0, 0.), ('', 0, 0.), ('', 0, 0.)],
dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])
>>> data['name'] = name
>>> data['age'] = age
>>> data['weight'] = weight
>>> print(data)
[('Ana', 40, 65.5) ('Carlos', 25, 78. ) ('Marta', 18, 50.4)
('Juan', 65, 84.3)]
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Arrays estructurados
Se indica el nombre de cada uno de los componentes de la estructura, ası́ como su tipo:
>>>> data2 = np.array([('Ana', 40, 65.5), ('Carlos', 25, 78. ),
('Marta', 18, 50.4), ('Juan', 65, 84.3)],
dtype=('U10, i4, f8'))
>>> data2
array([('Ana', 40, 65.5), ('Carlos', 25, 78. ), ('Marta', 18, 50.4),
('Juan', 65, 84.3)],
dtype=[('f0', '<U10'), ('f1', '<i4'), ('f2', '<f8')])
>>> data2.dtype.names
('f0', 'f1', 'f2')
>>> data2.dtype.names = ('name', 'age', 'weight')
>>> data2
array([('Ana', 40, 65.5), ('Carlos', 25, 78. ),
('Marta', 18, 50.4), ('Juan', 65, 84.3)],
dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Arrays estructurados
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Arrays estructurados
Se permite acceder a los diferentes campos, ası́ como realizar un filtrado de valores:
>>> print(data)
[('Ana', 40, 65.5) ('Carlos', 25, 78. ) ('Marta', 18, 50.4)
('Juan', 65, 84.3)]
>>> data[0]
('Ana', 40, 65.5)
>>> data[1]
('Carlos', 25, 78.)
>>> data[0][1]
40
>>> data[2][0]
'Marta'
>>> data[0:2]['name']
array(['Ana', 'Carlos'], dtype='<U10')
>>> data[data['age'] < 30]['name']
array(['Carlos', 'Marta'], dtype='<U10')
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Arrays estructurados
Si queremos cargar datos estructurados desde un fichero, por ejemplo, data.csv :
name, age, weight
Ana, 40, 65.5
Carlos, 25, 78.0
Marta, 18, 50.4
Juan, 65, 84.3
>>> data3 = np.genfromtxt('data.csv', delimiter=',', names=True,
dtype=('U10', 'i4', 'f8'))
>>> data3
array([('Ana', 40, 65.5), ('Carlos', 25, 78. ), ('Marta', 18, 50.4),
('Juan', 65, 84.3)],
dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Matrices
Por defecto, las variables de tipo ndarray no se operan como si fueran matrices:
>>> A = np.arange(0, 9).reshape(3, 3)
>>> A
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> B = np.ones((3, 3))
>>> B
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
>>> A * B
array([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Matrices
Si realmente queremos multiplicar los arrays como si fueran matrices:
>>> A = np.arange(0, 9).reshape(3, 3)
>>> A
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> B = np.ones((3, 3))
>>> B
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
>>> np.dot(A, B)
array([[ 3., 3., 3.],
[12., 12., 12.],
[21., 21., 21.]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Matrices
Otras operaciones con matrices o vectores:
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Matrices
Se puede crear explı́citamente un array de dos dimensiones que represente a una matriz
como tal:
>>> a = np.matrix('1 2; 3 4')
>>> a
matrix([[1, 2],
[3, 4]])
>>> a = np.matrix([[1, 2], [3, 4]])
>>> a
matrix([[1, 2],
[3, 4]])
>>> b = np.array([[1, 1], [2, 2]])
>>> c = np.asmatrix(b)
>>> type(b)
<class 'numpy.ndarray'>
>>> type(c)
<class 'numpy.matrix'>
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Matrices
Al operar con variables de tipo matriz, las operaciones se interpretarán
automáticamente como operaciones matriciales.
>>> a = np.matrix([[1, 2], [3, 4]])
>>> b = np.array([[1, 1], [2, 2]])
>>> c = np.asmatrix(b)
>>> a * b
matrix([[ 5, 5],
[11, 11]])
>>> a * c
matrix([[ 5, 5],
[11, 11]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Números aleatorios
>>> r0 = np.random.rand(10)
>>> r0
array([0.21179266, 0.9980622 , 0.0406992 , 0.6731243 , 0.41112216,
0.21450248, 0.38499485, 0.34496102, 0.41837576, 0.0337891 ])
>>> r1 = np.random.rand(2, 5)
>>> r1
array([[ 0.43881712, 0.40076767, 0.16694606, 0.79453119, 0.35543655],
[ 0.13325885, 0.27571725, 0.18867098, 0.27692127, 0.76566235]])
>>> r2 = np.random.randn(2, 5)
>>> r2
array([[-1.40747879, -1.78056755, 0.01586839, -1.10200732, 1.4022947 ],
[ 0.2203261 , 0.01470107, 0.40613766, 0.79373589, -0.56194122]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Números aleatorios
Array de 3x3 con valores aleatorios, normalmente distribuidos (media 0 y desviación 1):
>>> np.random.normal(0, 1, (3, 3))
array([[-0.73046105, -0.98843074, -0.99098311],
[ 0.35064933, 1.30521879, 3.08390613],
[ 1.16537305, 0.25516374, 0.91841094]])
Array de 4x4 con valores enteros en el intervalo [0, 10)
>>> np.random.randint(0, 10, (4, 4))
array([[3, 4, 4, 9],
[6, 3, 9, 8],
[0, 2, 0, 4],
[2, 0, 2, 4]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Números aleatorios
>>> data = np.arange(10)
>>> data
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> sample1 = np.random.choice(data, 5)
>>> sample1
array([2, 7, 2, 4, 5])
>>> data
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.random.shuffle(data)
>>> data
array([0, 1, 4, 5, 8, 3, 2, 6, 9, 7])
>>> data = np.arange(10)
>>> np.random.permutation(data)
array([9, 5, 8, 7, 6, 4, 1, 3, 2, 0])
>>> data
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Más funcionalidades
Array creation and manipulation routines
Binary operations
String operations
C-Types Foreign Function Interface (numpy.ctypeslib)
Datetime Support Functions
Data type routines
Optionally Scipy-accelerated routines (numpy.dual)
Mathematical functions with automatic domain (numpy.emath)
Floating point error handling
Discrete Fourier Transform (numpy.fft)
Financial functions
Functional programming
Indexing routines
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
Arrays n-dimensionales
NumPy
Arrays estructurados
Matplotlib
Matrices
SymPy
Números aleatorios
SciPy
Más funcionalidades
Pandas
Más funcionalidades
Input and output
Linear algebra (numpy.linalg)
Logic functions
Masked array operations
Mathematical functions
Matrix library (numpy.matlib)
Padding Arrays
Polynomials
Random sampling (numpy.random)
Set routines
Sorting, searching, and counting
Statistics
Test Support (numpy.testing)
Window functions
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Indice I
1 IPython
2 NumPy
3 Matplotlib
Introducción
Elementos básicos
Formato
Múltiples figuras
Imágenes y mapas de colores
Otros tipos de gráficos
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Indice II
4 SymPy
5 SciPy
6 Pandas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: visualización de datos
La visualización de datos es una fase común después de un proceso de
cómputo con datos, pues es de gran ayuda de cara a la comunicación o
análisis de los resultados.
Alternativas:
Interfaz gráfica para construir las visualizaciones y configurarlas de
manera visual.
Código que genere, de forma automatizada, las diferentes
representaciones que se necesiten.
Más información en:
http://matplotlib.org
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib
Matplotlib es la librerı́a de SciPy utilizada para visualización de datos y
dibujos de curvas.
Algunas caracterı́sticas
Excelente calidad.
Sencillez de uso.
Permite el desarrollo gradual y la visualización interactiva de datos.
Expresiones y texto en LATEX.
Mayor control sobre los elementos gráficos.
Exportación a múltiples formatos: PNG, PDF, SVG, y EPS.
Galerı́a con ejemplos: http://matplotlib.org/gallery.html
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: Ejemplo
Conjetura de Collatz
Conocida también como conjetura 3n + 1 o conjetura de Ulam
(entre otros nombres).
Fue enunciada por el matemático Lothar Collatz en 1937.
Enunciado
Sea la siguiente operación, aplicable a cualquier número entero positivo:
Si el número es par, se divide entre 2.
Si el número es impar, se multiplica por 3 y se suma 1.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: Ejemplo
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: Ejemplo
1 import numpy as np
2 import matplotlib . pyplot as plt
3
4 init_n = n = 27
5 narray = np . zeros (1000) # maximo 1000 iteraciones
6 narray [0] = n
7 count = 0
8 while n != 1:
9 if n % 2 == 1: # si n es impar
10 n = 3 * n + 1
11 else :
12 n = n / 2
13 count += 1
14 narray [ count ] = n # almacenar
15 plt . plot ( narray [ narray != 0] , '* - ')
16 plt . title ( f ' Iteracion de Collatz con semilla { init_n } ')
17 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: Ejemplo
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: Ejemplo
Al ejecutar se genera una nueva ventana con la figura generada y a
través de la cual se puede interactuar con la figura.
Opciones de la ventana de visualización
Reiniciar a la vista original.
Ir a la vista anterior/posterior.
Hacer zoom desde los ejes o bien seleccionando una zona de la figura.
Configurar los subplots.
Almacenar o exportar la figura.
Editar alguno de los parámetros de la figura.
NOTA: Esto no funcionarı́a desde CoCalc porque no se puede crear dicha ventana
auxiliar. Habrı́a que guardar la imagen para luego visualizarla o descargarla.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: Ejemplo
Si quisiéramos hacer algo similar desde un Jupyter Notebook:
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: Ejemplo
Obtendrı́amos una figura integrada en el propio Jupyter Notebook:
Se pierde la funcionalidad de interactuar con la ventana pero a cambio
tenemos el código integrado junto con el resultado de la visualización.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib: Importaciones
Para usar matplotlib
import matplotlib as mpl
import matplotlib.pyplot as plt
Y además, desde un Notebook
%matplotlib inline
Con esta última opción se integra la figura directamente en el cuaderno
en lugar de en una nueva ventana.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Objetos
El objeto Figure representa un lienzo en el que uno o más Axes pueden
ser posicionados.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Figure y Axes
Algunas caracterı́sticas de Figure
figsize
dpi
facecolor
edgecolor
frameon
Con Axes configuramos el sistema de coordenadas y elementos como:
Axis
Tick
Line2D or Polygon
Text
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Figure y Axes
1 import numpy as np
2 import matplotlib . pyplot as plt
3
4 x = np . linspace ( -5 , 2 , 100)
5 y1 = x **3 + 5* x **2 + 10
6 y2 = 3* x **2 + 10* x
7 y3 = 6* x + 10
8
9 fig , ax = plt . subplots ()
10 fig . suptitle ( ' Figura con varias funciones ')
11 ax . plot (x , y1 , color = " blue " , label = " y ( x ) " )
12 ax . plot (x , y2 , color = " red " , label = " y '( x ) " )
13 ax . plot (x , y3 , color = " green " , label = " y ' '( x ) " )
14 ax . set_xlabel ( " x " )
15 ax . set_ylabel ( " y " )
16 ax . legend ()
17 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Figure y Axes
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Elementos
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Tipos de representaciones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Visualización por defecto
1 import matplotlib . pyplot as plt
2 plt . plot ([1 ,2 ,3 ,4] , [1 ,4 ,9 ,16])
3 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Visualización por defecto
Si no se especifican subplots, ni ningún tipo de formato para las lı́neas o
los ejes, las propiedades de la figura obtenida serán las siguientes:
El tamaño del Axes encaja exactamente con el rango de los datos
de entrada.
No hay tı́tulo ni etiquetas para los ejes.
No hay leyenda.
Para conectar los puntos de la curva se utiliza una lı́nea simple de
color azul.
Las caracterı́sticas de la figura se pueden modificar, ajustando las
propiedades de las lı́neas, los ejes, etc.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Propiedades de las lı́neas
color: se indica el nombre del color o el color en formato RGB.
alpha: nivel de transparencia [0.0, 1.0].
linewidth, lw: grosor de lı́nea.
linestyle, ls: estilo de la lı́nea (continua, discontinua, etc.).
marker: sı́mbolo con el que se representa la posición en la que hay
un punto/dato (cruz, cı́rculo, triángulo).
markersize: tamaño del marcador.
markerfacecolor: color de relleno para el marcador.
markeredgewidth: tamaño de la lı́nea externa o borde del
marcador.
markeredgecolor: color del borde del marcador.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Propiedades de las lı́neas
1 import matplotlib . pyplot as plt
2 plt . plot ([1 ,2 ,4 ,2 ,1 ,0 ,1 ,2 ,1 ,4] , alpha =0.5 , linewidth =4.0 ,
color = " red " , marker = " o " , markerfacecolor = " green " ,
markersize =10.0)
3 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Propiedades de las lı́neas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Propiedades de las lı́neas
1 import numpy as np
2 import matplotlib . pyplot as plt
3 t = np . arange (0. , 5. , 0.2)
4 # red dashes , blue squares and green triangles
5 plt . plot (t , t , 'r - - ' , t , t **2 , ' bs ' , t , t **3 , 'g ^ ')
6 plt . show ()
120
100
80
60
40
20
0
0 1 2 3 4 5
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Propiedades de las lı́neas
1 import matplotlib . pyplot as plt
2 import numpy as np
3
4 x = np . arange ( -2* np . pi , 2* np . pi , 0.01)
5 y1 = np . sin (1* x ) / x
6 y2 = np . sin (2* x ) / x
7 y3 = np . sin (3* x ) / x
8
9 plt . plot (x , y1 , 'k - - ' , linewidth =3)
10 plt . plot (x , y2 , 'm -. ')
11 plt . plot (x , y3 , color = ' red ' , linestyle = ' -- ')
12
13 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Propiedades de las lı́neas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Tı́tulos
1 plt . axis ([0 ,5 ,0 ,20])
2 plt . title ( ' My first plot ' , fontsize =20 , fontname = ' Times New
Roman ')
3 plt . xlabel ( ' Counting ' , color = ' gray ')
4 plt . ylabel ( ' Square values ' , color = ' gray ')
5 plt . plot ([1 ,2 ,3 ,4] , [1 ,4 ,9 ,16] , ' ro ')
6 plt . show ()
Para más información sobre los parámetros de los métodos y el tipo de
propiedades que podemos modificar, consultar la documentación:
https://matplotlib.org
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Tı́tulos
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Texto
1 plt . axis ([0 ,5 ,0 ,20])
2 plt . title ( ' My first plot ' , fontsize =20 , fontname = ' Times New
Roman ')
3 plt . xlabel ( ' Counting ' , color = ' gray ')
4 plt . ylabel ( ' Square values ' , color = ' gray ')
5 plt . text (1 , 1.5 , ' First ')
6 plt . text (2 , 4.5 , ' Second ')
7 plt . text (3 , 9.5 , ' Third ')
8 plt . text (4 , 16.5 , ' Fourth ')
9 plt . plot ([1 ,2 ,3 ,4] , [1 ,4 ,9 ,16] , ' ro ')
10 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Texto
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Texto
Algunas de las propiedades del texto que pueden modificarse son:
fontsize: tamaño de la fuente (en puntos).
family or fontname: tipo de la fuente.
backgroundcolor: color para el fondo del texto.
color: color de la fuente.
alpha: nivel de transparencia de la fuente.
rotation: ángulo de rotación para el texto.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Fórmulas
1 plt . axis ([0 ,5 ,0 ,20])
2 plt . title ( ' My first plot ' , fontsize =20 , fontname = ' Times New
Roman ')
3 plt . xlabel ( ' Counting ' , color = ' gray ')
4 plt . ylabel ( ' Square values ' , color = ' gray ')
5 plt . text (1 , 1.5 , ' First ')
6 plt . text (2 , 4.5 , ' Second ')
7 plt . text (3 , 9.5 , ' Third ')
8 plt . text (4 , 16.5 , ' Fourth ')
9 plt . text (1.1 , 12 , r ' $y = x ^2 $ ' , fontsize =20 , bbox ={ '
facecolor ': ' yellow ' , ' alpha ' :0.2})
10 plt . plot ([1 ,2 ,3 ,4] , [1 ,4 ,9 ,16] , ' ro ')
11 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Fórmulas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Grid
1 plt . axis ([0 ,5 ,0 ,20])
2 plt . title ( ' My first plot ' , fontsize =20 , fontname = ' Times New
Roman ')
3 plt . xlabel ( ' Counting ' , color = ' gray ')
4 plt . ylabel ( ' Square values ' , color = ' gray ')
5 plt . text (1 , 1.5 , ' First ')
6 plt . text (2 , 4.5 , ' Second ')
7 plt . text (3 , 9.5 , ' Third ')
8 plt . text (4 , 16.5 , ' Fourth ')
9 plt . text (1.1 , 12 , r ' $y = x ^2 $ ' , fontsize =20 , bbox ={ '
facecolor ': ' yellow ' , ' alpha ' :0.2})
10 plt . grid ( True )
11 plt . plot ([1 ,2 ,3 ,4] , [1 ,4 ,9 ,16] , ' ro ')
12 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Grid
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Ejemplo: texto y tı́tulos
1 import numpy as np
2 import matplotlib . pyplot as plt
3
4 mu , sigma = 100 , 15
5 x = mu + sigma * np . random . randn (10000)
6 n , bins , patches = plt . hist (x , 50 , normed =1 , facecolor = 'g ' ,
alpha =0.75)
7 plt . xlabel ( ' Smarts ' , fontsize = ' 14 ' , fontweight = ' bold ' ,
color = 'b ')
8 plt . ylabel ( ' Probability ' , fontsize = ' 14 ' , color = 'r ')
9 plt . title ( ' Histogram ')
10 plt . suptitle ( ' IQ ')
11 plt . text (60 , .025 , r '$ \ mu =100 ,\ \ sigma =15 $ ')
12 plt . axis ([40 , 160 , 0 , 0.03])
13 plt . grid ( True )
14 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Ejemplo: texto y tı́tulos
IQ
0.030 Histogram
0.025 µ =100, σ =15
0.020
Probability
0.015
0.010
0.005
0.000
40 60 80 100 120 140 160
Smarts
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Ejes
1 import matplotlib . pyplot as plt
2 import numpy as np
3
4 x = np . arange ( -2* np . pi ,2* np . pi ,0.01)
5 y1 = np . sin (3* x ) / x
6 y2 = np . sin (2* x ) / x
7 y3 = np . sin ( x ) / x
8 plt . plot (x , y1 , color = 'b ')
9 plt . plot (x , y2 , color = 'r ')
10 plt . plot (x , y3 , color = 'g ')
11 plt . xticks ([ -2* np . pi , - np . pi , 0 , np . pi , 2* np . pi ] , [ r '$ -2\
pi$ ' ,r '$ -\ pi$ ' ,r ' $0$ ' ,r '$ +\ pi$ ' ,r '$ +2\ pi$ ' ])
12 plt . yticks ([ -1 ,0 ,1 ,2 ,3] , [ r '$ -1 $ ' ,r ' $0$ ' ,r '$ +1 $ ' ,r '$ +2 $ ' ,r '
$ +3 $ ' ])
13 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Ejes
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Spines
1 ...
2
3 ax = plt . gca ()
4 ax . spines [ ' right ' ]. set_color ( ' none ')
5 ax . spines [ ' top ' ]. set_color ( ' none ')
6 ax . xaxis . s et _t ic ks _p osition ( ' bottom ')
7 ax . spines [ ' bottom ' ]. set_position (( ' data ' ,0) )
8 ax . yaxis . s et _t ic ks _p osition ( ' left ')
9 ax . spines [ ' left ' ]. set_position (( ' data ' ,0) )
10
11 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Spines
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Ejes
1 import numpy as np
2 import matplotlib . pyplot as plt
3
4 t = np . linspace (0 , np . pi , 50)
5 y1 = np . cos (4 * np . pi * t ) + 2
6 y2 = np . sin (4 * np . pi * t ) + 2
7 area = np . pi * (10 * np . random . rand (50) ) **2
8
9 ...
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Ejes
1 # lw = linewidth , ms = markersize , mfc = markerfacecolor
2 plt . plot (t , y1 , 'ro - ' , lw =0.75 , ms =8 , mfc = ' white ')
3 plt . scatter (t , y2 , s = area , alpha =0.35)
4 plt . axis ([ -0.1 , 3.5 , 0.75 , 3.25])
5 plt . figtext (0.9 , 0.05 , r ' $x$ ' , color = ' red ' , size = 82)
6 plt . figtext (0.1 , 0.9 , r ' $y$ ')
7 plt . yticks ((1 ,2 ,3) , (1 ,2 ,3) , size = 22 , family = ' serif ' ,
rotation =25)
8 plt . xticks ((0 , np . pi /4 , np . pi /2 , np . pi ) , (0 , r '$ \ pi /4 $ ' , r '
$ \ pi /2 $ ' , r '$ \ pi$ ') )
9 plt . xlabel ( ' Abscisas ')
10 plt . ylabel ( ' Ord . ' , color = ' yellow ' , size = 27)
11 plt . grid ()
12 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Ejes
3
Ord.
x
1
0 π/4 π/2 π
Abscisas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Anotaciones
1 import matplotlib . pyplot as plt
2 import numpy as np
3
4 x = np . arange ( -2* np . pi ,2* np . pi ,0.01)
5 y1 = np . sin (3* x ) / x
6 y2 = np . sin (2* x ) / x
7 y3 = np . sin ( x ) / x
8 plt . plot (x , y1 , color = 'b ')
9 plt . plot (x , y2 , color = 'r ')
10 plt . plot (x , y3 , color = 'g ')
11 plt . xticks ([ -2* np . pi , - np . pi , 0 , np . pi , 2* np . pi ] , [ r '$ -2\
pi$ ' ,r '$ -\ pi$ ' ,r ' $0$ ' ,r '$ +\ pi$ ' ,r '$ +2\ pi$ ' ])
12 plt . yticks ([ -1 ,0 ,1 ,2 ,3] , [ r '$ -1 $ ' ,r ' $0$ ' ,r '$ +1 $ ' ,r '$ +2 $ ' ,r '
$ +3 $ ' ])
13 ...
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Anotaciones
1 ...
2
3 ax = plt . gca ()
4 ax . spines [ ' right ' ]. set_color ( ' none ')
5 ax . spines [ ' top ' ]. set_color ( ' none ')
6 ax . xaxis . s et _t ic ks _p osition ( ' bottom ')
7 ax . spines [ ' bottom ' ]. set_position (( ' data ' ,0) )
8 ax . yaxis . s et _t ic ks _p osition ( ' left ')
9 ax . spines [ ' left ' ]. set_position (( ' data ' ,0) )
10
11 plt . annotate ( r '$ \ lim_ { x \ to 0}\ frac {\ sin ( x ) }{ x }= 1 $ ' , xy
=[0 ,1] , xycoords = ' data ' , xytext =[60 ,30] , fontsize =16 ,
textcoords = ' offset points ' , arrowprops = dict ( arrowstyle =
" ->" , connectionstyle = " arc3 , rad =.2 " ) )
12
13 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Anotaciones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Leyenda
1 import numpy as np
2 import matplotlib . pyplot as plt
3
4 # evenly sampled time at 200 ms intervals
5 t = np . arange (0. , 5. , 0.2)
6
7 # red dashes , blue squares and green triangles
8 plt . plot (t , t , 'r - - ' , label = ' Test 1 ')
9 plt . plot (t , t **2 , ' bs ' , label = ' Test 2 ')
10 plt . plot (t , t **3 , 'g ^ ' , label = ' Test 3 ')
11 plt . legend ( loc = ' upper left ' , shadow = True )
12 plt . show ()
Hay que etiquetar con label si queremos poner leyenda en nuestra figura.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Leyenda
Location Code Location String
0 best
1 upper-right
2 upper-left
3 lower-right
4 lower-left
5 right
6 center-left
7 center-right
8 lower-center
9 upper-center
10 center
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Leyenda
120
Test 1
Test 2
100 Test 3
80
60
40
20
0
0 1 2 3 4 5
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Más sobre formato
1 import numpy as np
2 import matplotlib as mpl
3 import matplotlib . pyplot as plt
4
5 # rc sirve para modificar varios ajustes a la vez
6 mpl . rc ( ' text ' , usetex = True )
7 mpl . rc ( ' font ' , family = ' serif ' , size =16)
8 t = np . arange (0.0 , 1.0 + 0.01 , 0.01)
9 s = np . cos (2 * 2 * pi * t ) + 2
10 plt . plot (t , s )
11 plt . xlabel ( r '\ textbf { Time ( s ) } ')
12 plt . ylabel ( r '\ textit { Voltage ( mV ) } ')
13 plt . text (0.25 , 2 , r '$ \ sum_ { i =1}^{3} x_ { i }= x_ {1}+ x_ {2}+ x_ {3} $
' , color = 'r ' , fontsize =26)
14 plt . grid ( True )
15 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Más sobre formato
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Múltiples figuras
1 def f ( t ) :
2 return np . exp ( - t ) * np . cos (2* np . pi * t )
3
4 t1 = np . arange (0.0 , 5.0 , 0.1)
5 t2 = np . arange (0.0 , 5.0 , 0.02)
6 plt . figure (1)
7 plt . subplot (211)
8 plt . plot ( t1 , f ( t1 ) , ' bo ' , t2 , f ( t2 ) , 'k ')
9 plt . subplot (212)
10 plt . plot ( t2 , np . cos (2* np . pi * t2 ) , 'r - - ')
11 plt . show ()
Con subplot() se especifica el número de filas, el número de columnas, y el número
de la figura (que irá desde 1 hasta numrows * numcols).
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Múltiples figuras
1.0
0.8
0.6
0.4
0.2
0.0
−0.2
−0.4
−0.6
−0.8
0 1 2 3 4 5
1.0
0.5
0.0
−0.5
−1.0
0 1 2 3 4 5
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Múltiples figuras
1 def f ( t ) :
2 return np . exp ( - t ) * np . cos (2* np . pi * t )
3
4 t1 = np . arange (0.0 , 3.0 , 0.01)
5 ax2 = plt . subplot (221)
6 ax2 . margins (2 , 2) # Values >0.0 zoom out
7 ax2 . plot ( t1 , f ( t1 ) )
8 ax2 . set_title ( ' Zoomed out ')
9
10 ax3 = plt . subplot (222)
11 ax3 . margins ( x =0 , y = -0.25) # Values in ( -0.5 , 0.0) zooms in to
center
12 ax3 . plot ( t1 , f ( t1 ) )
13 ax3 . set_title ( ' Zoomed in ')
14
15 ax1 = plt . subplot (212)
16 ax1 . margins (0.05) # Default margin 0.05 , 0 means fit
17 ax1 . plot ( t1 , f ( t1 ) )
18 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Múltiples figuras
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Múltiples figuras
1 fig , axes = plt . subplots (2 , 2 , figsize =(6 , 6) , sharex = True ,
sharey = True , squeeze = False )
2
3 x1 = np . random . randn (100)
4 x2 = np . random . randn (100)
5 axes [0 , 0]. set_title ( " Uncorrelated " )
6 axes [0 , 0]. scatter ( x1 , x2 )
7 axes [0 , 1]. set_title ( " Weakly positively correlated " )
8 axes [0 , 1]. scatter ( x1 , x1 + x2 )
9 axes [1 , 0]. set_title ( " Weakly negatively correlated " )
10 axes [1 , 0]. scatter ( x1 , - x1 + x2 )
11 axes [1 , 1]. set_title ( " Strongly correlated " )
12 axes [1 , 1]. scatter ( x1 , x1 + 0.15 * x2 )
13 axes [1 , 1]. set_xlabel ( " x " )
14 axes [1 , 0]. set_xlabel ( " x " )
15 axes [0 , 0]. set_ylabel ( " y " )
16 axes [1 , 0]. set_ylabel ( " y " )
17 plt . su b pl ot s_ a dj us t ( left =0.1 , right =0.95 , bottom =0.1 , top =0.95 ,
18 wspace =0.1 , hspace =0.2)
19 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Múltiples figuras
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Cargar imágenes
1 import matplotlib . pyplot as plt
2 import matplotlib . image as mpimg
3
4 img = mpimg . imread ( ' canarias . jpg ')
5 plt . imshow ( img )
6 plt . axis ( ' off ')
7
8 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Cargar imágenes
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Generar imágenes
1 from scipy import *
2 from matplotlib . pyplot import *
3
4 x = linspace ( -2.5 , 0.6 , 1000) ;
5 y = linspace ( -1.25 , 1.25 , 1000) ;
6 X , Y = meshgrid (x , y )
7 C = X + 1j * Y
8 Z = X + 1j * Y
9 M = zeros ( Z . shape )
10 for k in range (50) :
11 Z = Z * Z + C
12 I = abs ( Z ) > 3
13 Z [ I ] = 0; C [ I ] = 0; M [ I ] = k
14 subplot (121)
15 imshow ( - abs ( Z ) , cmap = cm . copper )
16 axis ( ' Off ')
17 subplot (122)
18 imshow (M , cmap = cm . jet )
19 axis ( ' Off ')
20 show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Generar imágenes
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Guardar imágenes
1 import numpy as np
2 import matplotlib . pyplot as plt
3
4 t = np . arange (0. , 5. , 0.2)
5
6 # red dashes , blue squares and green triangles
7 plt . plot (t , t , 'r - - ' , t , t **2 , ' bs ' , t , t **3 , 'g ^ ')
8
9 # Saves the figure in the current directory
10 # The image format is determined by the file extension
11 # PNG is the default
12 plt . savefig ( ' figura . png ')
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Mapas de colores
1 from numpy import *
2 from matplotlib . pyplot import *
3
4 def func3 (x , y ) :
5 return (1 - x /2 + x **5 + y **3) * exp ( - x **2 - y **2)
6
7 x = linspace ( -3 , 3 , 100)
8 y = x
9 X , Y = meshgrid (x , y )
10 Z = func3 (X , Y )
11 pcolor (X , Y , Z )
12 colorbar ()
13 show ()
Los mapas de colores son útiles para representar gráficamente funciones de dos
variables: se utiliza un mapa de colores para codificar una dimensión de los datos.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Mapas de colores
3
1.0
0.8
2
0.6
0.4
0 0.2
0.0
−1
−0.2
−2 −0.4
−0.6
−3
−3 −2 −1 0 1 2 3
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Mapas de colores predefinidos
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Bar charts
1 import matplotlib . pyplot as plt
2 import numpy as np
3
4 # Source : https :// matplotlib . org / gallery
5 labels = [ ' G1 ' , ' G2 ' , ' G3 ' , ' G4 ' , ' G5 ']
6 men_means = [20 , 34 , 30 , 35 , 27]
7 women_means = [25 , 32 , 34 , 20 , 25]
8 x = np . arange ( len ( labels ) ) # the label locations
9 width = 0.35 # the width of the bars
10
11 fig , ax = plt . subplots ()
12 rects1 = ax . bar ( x - width /2 , men_means , width , label = ' Men ')
13 rects2 = ax . bar ( x + width /2 , women_means , width , label = ' Women ')
14 ax . set_ylabel ( ' Scores ')
15 ax . set_title ( ' Scores by group and gender ')
16 ax . set_xticks ( x )
17 ax . s e t_ xt ic k la be ls ( labels )
18 ax . legend ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Bar charts
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Pie charts
1 import matplotlib . pyplot as plt
2
3 # Pie chart , where the slices will be ordered and plotted counter
- clockwise
4 # Source : https :// matplotlib . org / gallery
5 labels = ' Frogs ' , ' Hogs ' , ' Dogs ' , ' Logs '
6 sizes = [15 , 30 , 45 , 10]
7 explode = (0 , 0.1 , 0 , 0) # only " explode " the 2 nd slice
8
9 fig1 , ax1 = plt . subplots ()
10 ax1 . pie ( sizes , explode = explode , labels = labels , autopct = ' %1.1 f % %' ,
11 shadow = True , startangle =90)
12 # Equal aspect ratio ensures that pie is drawn as a circle .
13 ax1 . axis ( ' equal ')
14
15 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Pie charts
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Box plots
1 import matplotlib . pyplot as plt
2 import numpy as np
3
4 # Source : https :// matplotlib . org / gallery
5 np . random . seed (19680801)
6 all_data = [ np . random . normal (0 , std , size =100) for std in range
(1 , 4) ]
7 labels = [ ' x1 ' , ' x2 ' , ' x3 ']
8
9 fig , ( ax1 , ax2 ) = plt . subplots ( nrows =1 , ncols =2 , figsize =(9 , 4) )
10 bplot1 = ax1 . boxplot ( all_data ,
11 vert = True , # vertical box alignment
12 patch_artist = True , # fill with color
13 labels = labels ) # used to label x - ticks
14 ax1 . set_title ( ' Rectangular box plot ')
15 bplot2 = ax2 . boxplot ( all_data , notch = True , vert = True ,
patch_artist = True , labels = labels )
16 ax2 . set_title ( ' Notched box plot ')
17 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Box plots
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Matplotlib Gallery
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Gráficos 3D
1 import matplotlib . pyplot as plt
2 import numpy as np
3 from matplotlib import cm
4 from mpl_toolkits . mplot3d . axes3d import get_test_data
5
6 fig = plt . figure ()
7 ax = fig . gca ( projection = '3 d ')
8 X = np . arange ( -5 , 5 , 0.25)
9 Y = np . arange ( -5 , 5 , 0.25)
10 X , Y = np . meshgrid (X , Y )
11 R = np . sqrt ( X **2 + Y **2)
12 Z = np . sin ( R )
13 surf = ax . plot_surface (X , Y , Z , rstride =1 , cstride =1 , cmap =
cm . coolwarm , linewidth =0 , antialiased = False )
14 ax . set_zlim ( -1.01 , 1.01)
15 fig . colorbar ( surf , shrink =0.5 , aspect =10)
16 plt . show ()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Introducción
NumPy Elementos básicos
Matplotlib Formato
SymPy Múltiples figuras
SciPy Imágenes y mapas de colores
Pandas Otros tipos de gráficos
Gráficos 3D
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
Indice I
1 IPython
2 NumPy
3 Matplotlib
4 SymPy
Importación e inicialización
Sı́mbolos y números
Funciones y expresiones
Simplificaciones y expansiones
Cálculo y álgebra
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
Indice II
Live shell y formato de salida
5 SciPy
6 Pandas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy
La librerı́a SymPy es una librerı́a para computación simbólica.
La computación simbólica se ocupa del cálculo de los objetos
matemáticos simbólicamente.
Esto significa que los objetos matemáticos están representados
exactamente, no aproximadamente, y expresiones matemáticas con
variables no evaluadas se dejan en forma simbólica.
Más información en:
http://www.sympy.org/es/index.html
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Console
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Jupyter Notebook
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Importación
>>> import math
>>> math.pi
3.141592653589793
>>> import sympy
>>> sympy.pi
pi
>>> sympy.init_printing()
>>> sympy.pi
>>> sympy.pi.evalf()
3.14159265358979
>>> sympy.pi.evalf(50)
3.1415926535897932384626433832795028841971693993751
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Sı́mbolos
Las variables matemáticas se representan mediante objetos de Python. Se
utiliza para ello la clase sympy.Symbol.
Cada sı́mbolo tiene asociado:
Un identificador
Un nombre
Un valor
Un conjunto de atributos que describen sus propiedades:
is real, is imaginary
is positive, is negative
is integer
is odd, is even
is prime
is finite, is infinite
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Sı́mbolos
>>> import sympy
>>> x = sympy.Symbol("x")
>>> y = sympy.Symbol("y", real=True)
>>> print(x.is_real)
None
>>> print(y.is_real)
True
>>> z = sympy.Symbol("var1")
>>> x + y
x + y
>>> x + y + z
var1 + x + y
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Sı́mbolos
>>> a, b, c = sympy.symbols("a, b, c", negative=True)
>>> d, e, f = sympy.symbols("d, e, f")
>>> print(a.is_integer)
None
>>> print(a.is_real)
True
>>> print(d.is_integer)
None
>>> print(d.is_real)
None
>>> x = a + b + c
>>> x
a + b + c
>>> print(x.is_real)
True
>>> print(x.is_integer)
None
>>> print(x.is_negative)
True
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Sı́mbolos
>>> import sympy
>>> x = sympy.Symbol("x")
>>> y = sympy.Symbol("y", positive=True)
>>> sympy.sqrt(x ** 2)
sqrt(x**2)
>>> sympy.sqrt(y ** 2)
y
Cuando no se tiene información sobre el valor de la variable, no se
pueden hacer simplificaciones.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Ejemplo
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Ejemplo
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Números
>>> i = sympy.Integer(19)
>>> i
19
>>> type(i)
<class 'sympy.core.numbers.Integer'>
>>> i.is_Integer, i.is_real, i.is_odd
(True, True, True)
>>>
>>> f = sympy.Float(1.5)
>>> f
1.50000000000000
>>> type(f)
<class 'sympy.core.numbers.Float'>
>>> f.is_Integer, f.is_real, f.is_odd
(False, True, False)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Números
>>> i_normal = int(i)
>>> i_normal
19
>>> type(i_normal)
<class 'int'>
>>> i_normal.is_odd
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'is_odd'
>>>
>>> i, f = sympy.sympify(19), sympy.sympify(1.5)
>>> type(i)
<class 'sympy.core.numbers.Integer'>
>>> type(f)
<class 'sympy.core.numbers.Float'>
>>> i == i_normal
True
>>> i == 19.0
True
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Números
>>> import sympy
>>> n = sympy.Symbol("n", integer=True)
>>> n.is_integer, n.is_Integer, n.is_positive, n.is_Symbol
(True, False, None, True)
>>> i = sympy.Integer(19)
>>> i.is_integer, i.is_Integer, i.is_positive, i.is_Symbol
(True, True, True, False)
>>> x = sympy.Symbol('x')
>>> x + i
x + 19
>>> x + n
n + x
El sı́mbolo representa algún entero, mientras que la instancia de
Integer representa a un entero especı́fico (conocemos su valor en este
preciso momento).
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Precisión
>>> i = sympy.Integer(19)
>>> i**50
8663234049605954426644038200675212212900743262211018069459689001
>>> sympy.factorial(100)
93326215443944152681699238856266700490715968264381621468592963895217599993
22991560894146397615651828625369792082722375825118521091686400000000000000
0000000000
>>> x = sympy.Symbol('x')
>>> sympy.factorial(x)
factorial(x)
Los enteros de SymPy tienen precisión arbitraria, es decir, no tienen valor
mı́nimo ni máximo, tal y como ocurre cuando tenemos un número de bits
fijo para la representación (como en NumPy ).
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Precisión
>>> sympy.Float(0.3)
0.300000000000000
>>> sympy.Float(0.3, 25)
0.2999999999999999888977698
>>> sympy.Float('0.3', 25)
0.3000000000000000000000000
Utilizar las inicializaciones a partir de cadenas si no queremos introducir
errores de representación.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Racionales
>>> sympy.Rational(11, 13)
11/13
>>> r1 = sympy.Rational(2, 3)
>>> r2 = sympy.Rational(4, 5)
>>> r1 * r2
8/15
>>> r1/r2
5/6
Se hace la simplificación de forma automática.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Constantes
Constante Sı́mbolo Descripción
sympy.pi π Relación entre la longitud de una circunfe-
rencia y su diámetro
sympy.E e Base de los logaritmos naturales
sympy.EulerGamma γ Constante de Euler
sympy.I i Unidad de la parte imaginaria
sympy.oo ∞ Infinito
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Funciones
>>> x, y, z = sympy.symbols("x, y, z")
>>> f = sympy.Function("f")
>>> type(f)
<class 'sympy.core.function.UndefinedFunction'>
>>> f(x)
f(x)
>>> g = sympy.Function("g")(x, y, z)
>>> g
g(x, y, z)
>>> g.free_symbols
{z, x, y}
>>> f(5)
f(5)
Estas funciones están sin definir. Pero hay muchas funciones estándar
que vienen predefinidas:
https://docs.sympy.org/latest/modules/functions/index.html
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Funciones
>>> sympy.sin
sin
>>> sympy.sin(x)
sin(x)
>>> import math
>>> sympy.sin(math.pi * 1.5)
-1.00000000000000
>>> sympy.sin(sympy.pi * 1.5)
-1
>>> n = sympy.Symbol("n", integer=True)
>>> sympy.sin(sympy.pi * n)
0
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Funciones lambda
>>> x = sympy.Symbol("x", integer=True)
>>> h = sympy.Lambda(x, x**2)
>>> h
Lambda(x, x**2)
>>> h(5)
25
>>> h(x + 1)
(x + 1)**2
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Expresiones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Expresiones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Expresiones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Expresiones
>>> import sympy
>>> x, y = sympy.symbols('x y')
>>> x
x
>>> expr = x + 2*y
>>> expr
x + 2*y
>>> expr + 1
x + 2*y + 1
>>> expr - x
2*y
>>> expr**2
(x + 2*y)**2
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Evaluaciones
>>> x = sympy.symbols('x')
>>> x = sympy.sqrt(8)
>>> x
2*sqrt(2)
>>> x.evalf()
2.82842712474619
>>> sympy.pi
pi
>>> sympy.pi.evalf(50)
3.1415926535897932384626433832795028841971693993751
>>> y, z = sympy.symbols('y z')
>>> z = sympy.cos(2 * y)
>>> z
cos(2*y)
>>> z.evalf(subs={y: 2.4})
0.0874989834394464
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Evaluaciones
>>> import sympy
>>> x, y, z = sympy.symbols('x y z')
>>> expr = x**3 + 4*x*y - z
>>> expr.subs([(x, 2), (y, 4), (z, 0)])
40
>>> str_expr = "x**2 + 3*x - 1/2"
>>> expr = sympy.sympify(str_expr)
>>> expr
x**2 + 3*x - 1/2
>>> expr.subs(x, 2)
19/2
>>> expr
x**2 + 3*x - 1/2
>>> expr.evalf(subs={x: 2})
9.50000000000000
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Simplificación
>>> x = sympy.Symbol("x")
>>> expr = 2 * (x**2 - x) - x * (x + 1)
>>> expr
2*x**2 - x*(x + 1) - 2*x
>>> sympy.simplify(expr)
x*(x - 3)
>>> expr
2*x**2 - x*(x + 1) - 2*x
>>> expr.simplify()
x*(x - 3)
>>> expr
2*x**2 - x*(x + 1) - 2*x
La simplificación no modifica la expresión.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Simplificaciones
>>> from sympy import *
>>> x, y, z = symbols('x y z')
>>>
>>> simplify(sin(x)**2 + cos(x)**2)
1
>>> simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
x - 1
>>> expand((x + 2)*(x - 3))
x**2 - x - 6
>>> factor(x**2*z + 4*x*y*z + 4*y**2*z)
z*(x + 2*y)**2
>>> cancel((x**2 + 2*x + 1)/(x**2 + x))
(x + 1)/x
>>> powsimp(x**y*x**z)
x**(y + z)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Expansiones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Factorizaciones
>>> x, y, z = sympy.symbols("x, y, z")
>>>
>>> sympy.factor(x**2 - 1)
(x - 1)*(x + 1)
>>> sympy.factor(x * sympy.cos(y) + sympy.sin(z) * x)
x*(sin(z) + cos(y))
>>>
>>> expr = x + y + x * y * z
>>> expr
x*y*z + x + y
>>> expr.collect(x)
x*(y*z + 1) + y
>>> expr.collect(y)
x + y*(x*z + 1)
>>> expr.collect(z)
x*y*z + x + y
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Otras simplificaciones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Ecuaciones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Ecuaciones
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Derivadas e integrales
>>> from sympy import *
>>>
>>> diff(cos(x), x)
-sin(x)
>>> integrate(cos(x), x)
sin(x)
>>> exp1 = Derivative(cos(x), x, 1)
>>> exp1
Derivative(cos(x), x)
>>> exp2 = Integral(cos(x), x)
>>> exp2
Integral(cos(x), x)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Derivadas e integrales
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Series y lı́mites
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Matrices
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy: Matrices
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy Live Shell
Más información:
http://live.sympy.org/
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy Live Shell
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
SymPy Live Shell
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Importación e inicialización
NumPy Sı́mbolos y números
Matplotlib Funciones y expresiones
SymPy Simplificaciones y expansiones
SciPy Cálculo y álgebra
Pandas Live shell y formato de salida
Exportar a LaTeX
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Indice I
1 IPython
2 NumPy
3 Matplotlib
4 SymPy
5 SciPy
6 Pandas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
SciPy
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
SciPy
La librerı́a SciPy es uno de los paquetes principales de SciPy Python.
SciPy es una colección de algoritmos matemáticos y funciones de
utilidad general implementadas sobre NumPy.
Añade un peso significativo a la sesión interactiva de Python,
proporcionando al usuario comandos de alto nivel y clases para la
manipulación y visualización de datos.
Con SciPy una sesión interactiva de Python se convierte en un
entorno de procesamiento de datos y de prototipado rivalizando con
entornos como: MATLAB, IDL, Octave, R-Lab y SciLab.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
SciPy
La librerı́a SciPy es uno de los paquetes principales de SciPy Python.
SciPy es una colección de algoritmos matemáticos y funciones de
utilidad general implementadas sobre NumPy.
Añade un peso significativo a la sesión interactiva de Python,
proporcionando al usuario comandos de alto nivel y clases para la
manipulación y visualización de datos.
Con SciPy una sesión interactiva de Python se convierte en un
entorno de procesamiento de datos y de prototipado rivalizando con
entornos como: MATLAB, IDL, Octave, R-Lab y SciLab.
Más información en:
http://scipy.org/scipylib/index.html
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Subpaquetes de SciPy
cluster: Clustering algorithms
constants: Physical and mathematical constants
fftpack: Fast Fourier Transform routines
integrate: Integration and ordinary differential equation solvers
interpolate: Interpolation and smoothing splines
io: Input and Output
linalg: Linear algebra
ndimage: N-dimensional image processing
odr: Orthogonal distance regression
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Subpaquetes de SciPy
optimize: Optimization and root-finding routines
signal: Signal processing
sparse: Sparse matrices and associated routines
spatial: Spatial data structures and algorithms
special: Special functions
stats: Statistical distributions and functions
weave: C/C++ integration
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Documentación o ayuda de SciPy
>>> import numpy as np
>>> import scipy as sp
>>> from scipy import linalg, optimize
>>>
>>> help(sp)
>>> sp.info(optimize)
Documentación
https://docs.scipy.org/doc/scipy/reference/index.html
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Álgebra lineal
Calculamos Aπ :
>>> import numpy as np
>>> import scipy as sp
>>> from scipy.linalg import *
>>> from math import pi
>>> a = np.array([[1,2], [2,3]])
>>> a
array([[1, 2],
[2, 3]])
>>> expm(pi*logm(a))
array([[ 25.76744888-0.00333897j, 41.70827061+0.0020636j ],
[ 41.70827061+0.0020636j , 67.47571949-0.00127537j]])
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Cuadratura numérica con funciones anónimas
>>> import numpy as np
>>> import scipy as sp
>>> from scipy.integrate import quad
>>> from math import pi, exp, sin
>>> a = float(input(`Extremo inf. a: '))
Extremo inf. a: 0
>>> b = eval(input(`Extremo sup. b: '))
Extremo sup. b: pi
>>> print(a, b)
0.0 3.14159265359
>>> aprox = quad(lambda x: exp(-x**2)*sin(x), a, b)
>>> aprox
(0.42443751077246467, 2.2123286753150863e-09)
>> print(`[aproximacion: %1.10f]' % aprox[0])
[aproximacion: 0.4244375108]
>>> print(`[estimacion error: %e]' % aprox[1])
[estimacion error: 2.212329e-09]
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Interpolación
>>> import numpy as np
>>> import scipy as sp
>>> import matplotlib.pyplot as plt
>>> from math import cos
>>> from scipy.interpolate import interp1d
>>> x = np.linspace(0, 10, 10)
>>> x
array([ 0. , 1.11111111, 2.22222222, 3.33333333,
4.44444444, 5.55555556, 6.66666667, 7.77777778,
8.88888889, 10. ])
>>> y = np.cos(-x**2/8.0)
>>> y
array([ 1. , 0.98811613, 0.81545357, 0.18090587, -0.78229363,
-0.7541536 , 0.74675295, 0.28811065, -0.89967788, 0.99779828])
>>> f = interp1d(x, y)
>>> f2 = interp1d(x, y, kind=`cubic')
>>> xnew = np.linspace(0, 10, 40)
>>> plt.plot(x, y, `o', xnew, f(xnew), `-', xnew, f2(xnew), `--')
[<matplotlib.lines.Line2D object at 0x7fdc5fe57cd0>, ..........
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Interpolación
1.0
0.5
0.0
−0.5
data
linear
cubic
−1.0
0 2 4 6 8 10
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
FFT
>>> import numpy as np
>>> import scipy as sp
>>> import matplotlib.pyplot as plt
>>> from scipy.fftpack import fft
>>>
>>> # Number of samplepoints
>>> N = 600
>>> # Sample spacing
>>> T = 1.0 / 800.0
>>> x = np.linspace(0.0, N*T, N)
>>> y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
>>> yf = fft(y)
>>> xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
>>> plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
>>> plt.grid()
>>> plt.show()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
FFT
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0.0
0 50 100 150 200 250 300 350 400
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Procesamiento de señales
>>> import numpy as np
>>> import scipy.signal as signal
>>> import matplotlib.pyplot as plt
>>>
>>> fs = 10e3
>>> N = 1e5
>>> amp = 2*np.sqrt(2)
>>> freq = 1270.0
>>> noise_power = 0.001 * fs / 2
>>> time = np.arange(N) / fs
>>> x = amp*np.sin(2*np.pi*freq*time)
>>> x += np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
>>> # Estimación de la densidad espectral
>>> f, Pper_spec = signal.periodogram(x, fs, `flattop', scaling=`spectrum')
>>> plt.semilogy(f, Pper_spec)
>>> plt.xlabel(`frequency [Hz]')
>>> plt.ylabel(`PSD')
>>> plt.grid()
>>> plt.show()
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython
NumPy
Matplotlib
SymPy
SciPy
Pandas
Procesamiento de señales
101
100
10-1
10-2
10-3
PSD
10-4
10-5
10-6
10-7
10-8 0 1000 2000 3000 4000 5000
frequency [Hz]
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indice I
1 IPython
2 NumPy
3 Matplotlib
4 SymPy
5 SciPy
6 Pandas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indice II
Series
DataFrame
Indices
Otras caracterı́sticas
Lectura/Escritura
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Pandas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Pandas
Caracterı́sticas
Librerı́a especializada en análisis de datos.
Librerı́a de referencia en Python para análisis estadı́stico en la toma
de decisiones.
Incluye los mecanismos necesarios para el procesamiento, la
extracción y la manipulación de los datos.
Para manejar los datos se basa en NumPy y a ello debe parte de su
eficiencia.
Maneja datos relacionales o etiquetados de forma similar a como se
manejan en bases de datos relacionales o en hojas de cálculo.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Pandas
El funcionamiento de Pandas se basa en dos estructuras básicas, con las
que se gestionan los datos durante el proceso de análisis:
Series: es la estructura de datos más sencilla que permite
almacenar una secuencia de datos uni-dimensionales.
DataFrame: es la estructura de datos más compleja que permite
almacenar datos con más de una dimensión.
En ambos casos, las estructuras permiten la indexación y la etiquetación
de los datos.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Pandas: Importación
Antes de comenzar a usar Pandas se deben realizar las importaciones
siguientes:
1 import pandas as pd
2 import numpy as np
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
El array principal contiene una secuencia de valores, cada uno de los
cuales tiene asociada una etiqueta a la que se denomina ı́ndice:
Index Value
0 12
1 -5
2 8
3 0
4 27
5 19
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Si no se especifican los ı́ndices, por defecto se asignan valores enteros
consecutivos, comenzando por el 0:
>>> s = pd.Series([12, -5, 8, 0, 27, 19])
>>> s
0 12
1 -5
2 8
3 0
4 27
5 19
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Normalmente, se especificarán unos ı́ndices concretos, pues facilitarán el
acceso a la información:
>>> s = pd.Series([12, -5, 8, 0, 27, 19],
index=['a','b','c','d', 'e', 'f'])
>>> s
a 12
b -5
c 8
d 0
e 27
f 19
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Atributos:
>>> s.values
array([12, -5, 8, 0, 27, 19])
>>> s.index
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Otros tipos de datos:
>>> x1 = pd.Series([1.2, 3.5, 4.7])
>>> x1
0 1.2
1 3.5
2 4.7
dtype: float64
>>> x2 = pd.Series([1.0, 3, 4])
>>> x2
0 1.0
1 3.0
2 4.0
dtype: float64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Otros tipos de datos:
>>> x3 = pd.Series(['hello', 'and', 'bye'])
>>> x3
0 hello
1 and
2 bye
dtype: object
>>> x4 = pd.Series(['hello', 0.5, 1])
>>> x4
0 hello
1 0.5
2 1
dtype: object
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Accesos con posición, con etiqueta, con rangos o con filtros:
>>> s[2]
8
>>> s['c']
8
>>> s[0:2]
a 12
b -5
dtype: int64
>>> s[['a', 'b']]
a 12
b -5
dtype: int64
>>> s[s > 10]
a 12
e 27
f 19
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
>>> s[1] = 0
>>> s
a 12
b 0
c 8
d 0
e 27
f 19
dtype: int64
>>> s[1] = 5.5
>>> s
a 12
b 5
c 8
d 0
e 27
f 19
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
>>> s['b'] = 5.5
>>> s
a 12
b 5
c 8
d 0
e 27
f 19
dtype: int64
>>> s[1] = 'a'
KeyError Traceback (most recent call last)
ValueError: invalid literal for int() with base 10: 'a'
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Inicializaciones a partir de otros arrays o series:
>>> a = np.array([1, 2, 3, 4])
>>> s1 = pd.Series(a)
>>> s1
0 1
1 2
2 3
3 4
dtype: int64
>>> s2 = pd.Series([1, 5, 10, 20], index=['a', 'b', 'c', 'd'])
>>> s3 = pd.Series(s2)
>>> s3
a 1
b 5
c 10
d 20
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Cuidado porque al inicializar a partir de otros arrays o series, no se hace
una copia sino que se trabaja con referencias:
>>> a[1] = 0
>>> s1
0 1
1 0
2 3
3 4
dtype: int64
>>> s2[2] = -1
>>> s3
a 1
b 5
c -1
d 20
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Operaciones matemáticas (devuelven una serie):
>>> s = pd.Series([1, 5, 10, 20])
>>> s / 2
0 0.5
1 2.5
2 5.0
3 10.0
dtype: float64
>>> np.sqrt(s)
0 1.000000
1 2.236068
2 3.162278
3 4.472136
dtype: float64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Elementos duplicados:
>>> ds = pd.Series([0, 10, 0, 5, 10, 0], index=['a', 'a', 'b', 'c', 'b', 'd'])
>>> ds
a 0
a 10
b 0
c 5
b 10
d 0
dtype: int64
>>> ds.unique()
array([ 0, 10, 5])
>>> ds.value_counts()
0 3
10 2
5 1
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Elementos en un rango de valores:
>>> ds = pd.Series([0, 10, 0, 5, 10, 0], index=['a', 'a', 'b', 'c', 'b', 'd'])
>>> ds.isin([0, 5])
a True
a False
b True
c True
b False
d True
dtype: bool
>>> ds[ds.isin([0, 5])]
a 0
b 0
c 5
d 0
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Valores nulos o no definidos:
>>> s = pd.Series([10, -5, np.NaN, 2])
>>> s.isnull()
0 False
1 False
2 True
3 False
dtype: bool
>>> s.notnull()
0 True
1 True
2 False
3 True
dtype: bool
>>> s[s.isnull()]
2 NaN
dtype: float64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Las series pueden entenderse como diccionarios:
>>> mydict = {'red': 2000, 'blue': 1000, 'yellow': 500, 'orange': 1000}
>>> myseries = pd.Series(mydict)
>>> myseries
red 2000
blue 1000
yellow 500
orange 1000
dtype: int64
>>> colors = ['red','yellow','orange','blue','green']
>>> myseries = pd.Series(mydict, index=colors)
>>> myseries
red 2000.0
yellow 500.0
orange 1000.0
blue 1000.0
green NaN
dtype: float64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Las series pueden entenderse como diccionarios:
>>> mydict = {'red': 2000, 'blue': 1000, 'yellow': 500, 'orange': 1000}
>>> colors = ['red','yellow','orange']
>>> myseries = pd.Series(mydict, index=colors)
>>> myseries
red 2000
yellow 500
orange 1000
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Series
Operaciones entre series (se opera con los valores que tengan las mismas
etiquetas):
>>> mydict1 = {'red': 2000, 'blue': 1000, 'yellow': 500, 'orange': 1000}
>>> myserie1 = pd.Series(mydict1)
>>> mydict2 = {'red':400, 'yellow':1000, 'black':700}
>>> myserie2 = pd.Series(mydict2)
>>> myserie1 + myserie2
black NaN
blue NaN
orange NaN
red 2400.0
yellow 1500.0
dtype: float64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame
Es una estructura de datos tabulados, muy similar a una hoja de cálculo.
Puede entenderse como una colección ordenada de columnas, cada una
con valores de diferente tipo: booleanos, numéricos, cadenas, etc.
Columns
Index Name Age Weight
0 Emma 25 60.5
1 Paolo 48 82.7
2 Eric 15 65.2
3 Alexia 18 50.0
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame
Inicialización de un dataframe:
>>> data = {'name': ['Emma', 'Paolo', 'Eric', 'Alexia'],
'age': [25, 48, 15, 18],
'weight': [60.5, 82.7, 65.2, 50.0]}
>>> frame = pd.DataFrame(data)
>>> frame
name age weight
0 Emma 25 60.5
1 Paolo 48 82.7
2 Eric 15 65.2
3 Alexia 18 50.0
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame
>>> frame1 = pd.DataFrame(data, columns=['name','weight'])
>>> frame1
name weight
0 Emma 60.5
1 Paolo 82.7
2 Eric 65.2
3 Alexia 50.0
>>> frame2 = pd.DataFrame(data, columns=['weight','name'])
>>> frame2
weight name
0 60.5 Emma
1 82.7 Paolo
2 65.2 Eric
3 50.0 Alexia
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame
>>> frame3 = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
>>> frame3
name age weight
a Emma 25 60.5
b Paolo 48 82.7
c Eric 15 65.2
d Alexia 18 50.0
>>> frame4 = pd.DataFrame(np.arange(16).reshape((4,4)),
index=['a', 'b', 'c', 'd'],
columns=['col1', 'col2', 'col3', 'col4'])
>>> frame4
col1 col2 col3 col4
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Atributos
>>> frame = pd.DataFrame(data)
>>> frame
name age weight
0 Emma 25 60.5
1 Paolo 48 82.7
2 Eric 15 65.2
3 Alexia 18 50.0
>>> frame.columns
Index(['name', 'age', 'weight'], dtype='object')
>>> frame.index
RangeIndex(start=0, stop=4, step=1)
>>> frame.values
array([['Emma', 25, 60.5],
['Paolo', 48, 82.7],
['Eric', 15, 65.2],
['Alexia', 18, 50.0]], dtype=object)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Atributos
>>> frame.name
0 Emma
1 Paolo
2 Eric
3 Alexia
Name: name, dtype: object
>>> frame['name']
0 Emma
1 Paolo
2 Eric
3 Alexia
Name: name, dtype: object
>>> type(frame.name)
<class 'pandas.core.series.Series'>
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Acceso
Se devuelve una serie en la que los nombres de las columnas se toman
como etiquetas o ı́ndices:
>>> frame.loc[0]
name Emma
age 25
weight 60.5
Name: 0, dtype: object
>>> type(frame.loc[0])
pandas.core.series.Series
Cuando seleccionamos más de una fila, se devuelve un dataframe:
>>> frame.loc[[0, 2]]
name age weight
0 Emma 25 60.5
2 Eric 15 65.2
>>> type(frame.loc[[0, 2]])
pandas.core.frame.DataFrame
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Acceso
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Acceso
Se indica primero el identificador de la columna y luego la posición del
elemento dentro de dicha columna:
>>> frame['name'][0]
'Emma'
>>> frame['age'][1]
48
>>> frame['weight'][3]
50.0
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Modificación
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Modificación
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Eliminación de columnas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Inserción y eliminación de filas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Filtrado
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Diccionarios anidados
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Transposición
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Operaciones aritméticas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Operaciones aritméticas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Operaciones aritméticas
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Operaciones sobre elementos
>>> df = pd.DataFrame([(1, 2), (3, 4), (5, 6)], columns=['a', 'b'])
>>> df
a b
0 1 2
1 3 4
2 5 6
>>> np.sqrt(df)
a b
0 1.000000 1.414214
1 1.732051 2.000000
2 2.236068 2.449490
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Operaciones sobre columnas o filas
>>> df = pd.DataFrame([(1, 2), (3, 4), (5, 6)], columns=['a', 'b'])
>>> df
a b
0 1 2
1 3 4
2 5 6
>>> df.apply(np.sum)
a 9
b 12
dtype: int64
>>> df.apply(np.sum, axis=1)
0 3
1 7
2 11
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
DataFrame: Operaciones sobre columnas o filas
>>> df = pd.DataFrame([(1,2),(3,4),(5,6)], columns=['a','b'])
>>> df
a b
0 1 2
1 3 4
2 5 6
>>> df.apply(lambda x: x.max() - x.min())
a 4
b 4
dtype: int64
>>> df.apply(lambda x: x.max() - x.min(), axis=1)
0 1
1 1
2 1
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indices
>>> s = pd.Series([12, -5, 8, 0, 27, 19],
index=['a', 'b', 'c', 'd', 'e', 'f'])
>>> s.index
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
>>> type(s.index)
pandas.core.indexes.base.Index
>>> s.idxmin()
'b'
>>> s.idxmax()
'e'
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indices
Si los ı́ndices están duplicados se devolverá una serie; si no están
duplicados se devolverá un único valor:
>>> s = pd.Series([12, -5, 8, 0, 27, 19],
index=['a', 'b', 'a', 'a', 'c', 'd'])
>>> s['a']
a 12
a 8
a 0
dtype: int64
>>> s['b']
-5
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indices
Atributo que nos indica si existen etiquetas duplicadas en la estructura
(serie o dataframe):
>>> s = pd.Series([12, -5, 8, 0, 27, 19],
index=['a', 'b', 'a', 'a', 'c', 'd'])
>>> s.index.is_unique
False
>>> data = {'name': ['Emma', 'Paolo', 'Eric', 'Alexia'],
'age': [25, 48, 15, 18],
'weight': [60.5, 82.7, 65.2, 50.0]}
>>> frame = pd.DataFrame(data)
>>> frame.index.is_unique
True
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indices: Reindexado
No se modifica la estructura original.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indices: Reindexado
>>> s = pd.Series([1, 5, 6, 3], index=[0, 3, 5, 6])
>>> s
0 1
3 5
5 6
6 3
dtype: int64
>>> s.reindex(range(6), method='ffill')
0 1
1 1
2 1
3 5
4 5
5 6
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indices: Dropping
>>> s = pd.Series(np.arange(4.0), index=['a', 'b', 'c', 'd'])
>>> s.drop('b')
a 0.0
c 2.0
d 3.0
dtype: float64
>>> s.drop(['a', 'c'])
b 1.0
d 3.0
dtype: float64
No se modifica la estructura original.
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indices: Dropping
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indexado jerárquico
>>> hs = pd.Series(np.random.rand(8),
index=[['white','white','white','blue','blue',
'red','red','red'],
['up','down','right','up','down',
'up','down','left']])
>>> hs
white up 0.908713
down 0.902358
right 0.073339
blue up 0.478994
down 0.293104
red up 0.798314
down 0.196260
left 0.551048
dtype: float64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indexado jerárquico
>>> hs.index
MultiIndex([('white', 'up'),
('white', 'down'),
('white', 'right'),
( 'blue', 'up'),
( 'blue', 'down'),
( 'red', 'up'),
( 'red', 'down'),
( 'red', 'left')],
)
>>> hs['white']
up 0.908713
down 0.902358
right 0.073339
dtype: float64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Indexado jerárquico
>>> hs[:,'up']
white 0.908713
blue 0.478994
red 0.798314
dtype: float64
>>> hs['white', 'down']
0.9023576401154444
>>> hs.unstack()
down left right up
blue 0.293104 NaN NaN 0.478994
red 0.196260 0.551048 NaN 0.798314
white 0.902358 NaN 0.073339 0.908713
El método stack se usa para convertir de DataFrame a Series (con
indexado jerárquico)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Operaciones entre estructuras
>>> frame = pd.DataFrame(np.arange(9).reshape((3, 3)),
index=['red', 'yellow', 'white'], columns=['pen', 'pencil', 'paper'])
>> frame
pen pencil paper
red 0 1 2
yellow 3 4 5
white 6 7 8
>>> s1 = pd.Series(np.arange(3), index=['pen','pencil','paper'])
>>> s1
pen 0
pencil 1
paper 2
dtype: int64
>>> s2 = pd.Series(np.arange(4), index=['pen', 'pencil', 'paper', 'ball'])
>>> s2
pen 0
pencil 1
paper 2
ball 3
dtype: int64
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Operaciones entre estructuras
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Rangos
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
I/O API
Readers Writers
read csv to csv
read excel to excel
read hdf to hdf
read sql to sql
read json to json
read html to html
read stata to stata
read clipboard to clipboard
read pickle to pickle
... ...
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Ficheros .csv
Fichero username.csv
Username;Identifier;First name;Last name
booker12;9012;Rachel;Booker
grey07;2070;Laura;Grey
johnson81;4081;Craig;Johnson
jenkins46;9346;Mary;Jenkins
smith79;5079;Jamie;Smith
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Ficheros .csv
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Ficheros .csv
>>> data = {'name': ['Emma', 'Paolo', 'Eric', 'Alexia'],
'age': [25, 48, 15, 18],
'weight': [60.5, 82.7, 65.2, 50.0]}
>>> frame = pd.DataFrame(data)
>>> frame.to_csv('example.csv', index=False)
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Ficheros .csv
Fichero example.csv
name,age,weight
Emma,25,60.5
Paolo,48,82.7
Eric,15,65.2
Alexia,18,50.0
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
IPython Series
NumPy DataFrame
Matplotlib Indices
SymPy Otras caracterı́sticas
SciPy Lectura/Escritura
Pandas
Bibliografı́a
Gara Miranda Valladares Tema 2: Bibliotecas cientı́ficas
Computación Avanzada
Grado en Matemáticas
Tema 3: Bases de datos
Curso 2021-2022
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Indice
1 Introducción a las bases de datos
2 Bases de datos relacionales
3 Lenguaje SQL
4 Bases de datos en Python
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Indice
1 Introducción a las bases de datos
2 Bases de datos relacionales
3 Lenguaje SQL
4 Bases de datos en Python
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Sistemas de información
Los sistemas de información actuales se basan en bases de datos
(BBDD) y sistemas gestores de bases de datos (SGBD) que se han
convertido en elementos imprescindibles en la vida cotidiana de la
sociedad moderna:
Nos conectamos a una red social
Escuchamos nuestra música favorita
Vamos al supermercado
Vemos una serie
Compramos un billete de avión
Consultamos nuestra cuenta bancaria
Obtenemos una ruta para alcanzar un destino
...
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
La era de los datos
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Data is the new oil
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Datos
En este contexto, un dato es un elemento de información que tiene
relevancia para un usuario.
Por lo tanto, es interesante almacenarlo, de forma que no se pierda, y
sea, además, accesible cuando necesitemos recuperarlo.
Desde su nacimiento, la Informática se ha encargado de proporcionar
herramientas que faciliten la manipulación de los datos:
Informática: tratamiento automatizado de la información.
Es una alternativa al almacenamiento y tratamiento manual de la
información:
Antes las empresas centralizaban toda su información en ficheros con
cajones, carpetas y fichas.
El coste del tratamiento de los datos era muy elevado.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Sistemas de archivos
En los sistemas de archivos (digitales) tradicionales la información está
dispersa en varios ficheros de datos.
Los programas acceden a los archivos para recuperar la información.
Supusieron un gran avance sobre los sistemas manuales pero tienen
algunas desventajas que no los hacen adecuado para manejo de grandes
cantidades de información:
Datos redundantes.
Coste de almacenamiento elevado.
Tiempos de procesamiento elevados.
Probabilidad alta de inconsistencia en los datos.
Difı́cil modificación de los datos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Sistemas de archivos: Ejemplo
ESTUDIANTES
Alu DNI Nombre Apellidos Fecha de nacimiento
alu010010 11222333X Juan Pérez Gil 10/05/2000
alu010020 12345678A Luisa Hernández Afonso 03/02/2001
... ... ... ... ...
ASIGNATURAS
Código Nombre Titulación Curso Cuatrimestre Créditos
20174 Computación Matemáticas 1 2 6
10020 Inglés Filologı́a 2 1 7.5
... ... ... ... ... ...
CALIFICACIONES
DNI Nombre Apellidos Código Asignatura Titulación Nota Curso
11222333X Juan Pérez Gil 20174 Computación Matemáticas 8.5 19-20
11222333X Juan Pérez Gil 10020 Inglés Filologı́a 9.5 19-20
... ... ... ... ... ... ... ...
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos
Como alternativa a los sistemas de archivos tradicionales, surgieron las
bases de datos.
Una base de datos es un conjunto estructurado de datos y almacenado
de forma sistemática con objeto de facilitar su posterior utilización.
Una base de datos se entenderá como una colección de datos que
representa entidades y sus interrelaciones:
Relaciones entre datos.
Ejemplo: en un acta se relaciona una calificación en un momento
dado con dos elementos, en principio independientes: un estudiante y
una asignatura.
Significado implı́cito de los datos.
Ejemplo: fecha para un acta o para un alumno pueden tener
significados implı́citos distintos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos: Ejemplo
ESTUDIANTES
Alu DNI Nombre Apellidos Fecha de nacimiento
alu010010 11222333X Juan Pérez Gil 10/05/2000
alu010020 12345678A Luisa Hernández Afonso 03/02/2001
... ... ... ... ...
ASIGNATURAS
Código Nombre Titulación Curso Cuatrimestre Créditos
20174 Computación Matemáticas 1 2 6
10020 Inglés Filologı́a 2 1 7.5
... ... ... ... ... ...
CALIFICACIONES
Estudiante Asignatura Nota Curso
11222333X 20174 8.5 19-20
11222333X 10020 9.5 19-20
... ... ... ...
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Ventajas de las bases de datos
Mayor independencia: los datos son independientes de las
aplicaciones que los usan, ası́ como de los usuarios.
Mayor disponibilidad: se facilita el acceso a los datos desde
contextos, aplicaciones y medios distintos, haciéndolos útiles para un
mayor número de usuarios.
Mayor seguridad: resulta más fácil replicar una base de datos para
mantener una copia de seguridad que hacerlo con un conjunto de
ficheros almacenados de forma no estructurada.
Mayor coherencia: al estar centralizado el acceso a los datos, existe
una verdadera sincronización de todo el trabajo que se haya podido
hacer sobre estos (modificaciones).
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Ventajas de las bases de datos
Menor redundancia: un mismo dato no se encuentra almacenado en
múltiples ficheros o con múltiples esquemas distintos, sino en una
única instancia en la base de datos.
Mayor eficiencia: en el acceso, captura, codificación y entrada de los
datos.
Mayor facilidad y sencillez de acceso: el usuario de la base de datos
se debe preocupar únicamente de usar los datos, disponiendo para
ello de las herramientas adecuadas y de una estructura solida sobre
la que apoyarse.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Modelos de bases de datos
Todo modelo de base de datos nos proporciona tres tipos de
herramientas:
Estructuras de datos con las que se puede construir la base de
datos: tablas, árboles, etc. En cualquier caso, deben permitirnos
representar la información que nos interesa del mundo real.
Diferentes tipos de restricciones (o reglas) de integridad y que
representan las condiciones que los datos deben cumplir: dominios,
claves, etc.
Una serie de operaciones para trabajar con los datos (consulta y
actualización). Será necesario la utilización de un lenguaje especı́fico
para llevar a cabo dichas operaciones.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Modelos de bases de datos
Bases de datos jerárquicas: las relaciones entre registros forman una estructura en
árbol en la que cada nodo puede tener un único padre y cero, uno o varios hijos.
Bases de datos en red: las relaciones son más complejas que en las jerárquicas
pues se permite la aparición de ciclos en la estructura.
Bases de datos relacionales: los datos se almacenan en tablas compuestas por
filas o registros (tuplas) y columnas o campos (atributos). Estas tablas pueden
estar conectadas entre sı́ por claves comunes. Constituyen el modelo de bases de
datos más utilizado en la actualidad.
Bases de datos orientadas a objetos: extienden las capacidades de las bases de
datos relacionales para que puedan contener objetos, permitiendo ası́ una
integración más fácil con la propia arquitectura de los programas orientados a
objetos. Constituye uno de los modelos más actuales.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Modelos de bases de datos
Fuente: https://upload.wikimedia.org/wikipedia/commons/3/3b/Database_models.jpg
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Sistemas gestores de bases de datos
Un sistema gestor de bases de datos (SGBD) es una aplicación que
permite a los usuarios definir, crear y mantener una base de datos,
proporcionando un acceso controlado a la misma.
El SGBD es la herramienta utilizada por quienes aprovechan los datos,
pero también por aquellos que se encargan de la propia gestión y
mantenimiento de la base de datos:
Permite definir la estructura de la base de datos, ası́ como el tipo de datos y las
restricciones sobre los mismos.
Permite la inserción, actualización, eliminación y consulta de datos.
Proporciona un acceso controlado a la base de datos asegurando el acceso sólo a
usuarios autorizados, manteniendo la integridad/consistencia de los datos y
controlando la concurrencia.
Proporciona una interfaz de comunicación entre el usuario y el servidor.
Generalmente, esta interfaz consiste en un lenguaje sencillo para la interacción.
Este lenguaje se denomina Structure Query Language (SQL).
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Gestión y diseño de bases de datos
Pueden distinguirse las siguientes fases en el proceso global de desarrollo
y gestión de una base de datos:
Diseño lógico: proceso independiente del SGBD empleado, es un
diseño conceptual que pretende modelizar el contenido de la base de
datos.
Diseño fı́sico: es la adaptación del diseño conceptual a las
particularidades del SGBD escogido.
Implementación: introducción de los datos en la base de datos.
Explotación: acceso a la base de datos para realizar consultas o
actualizar los datos.
Mantenimiento: monitorización de la actividad sobre la base de
datos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Indice
1 Introducción a las bases de datos
2 Bases de datos relacionales
3 Lenguaje SQL
4 Bases de datos en Python
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
Edgar F. Codd (1970), “A Relational Model of Data for Large Shared
Data Banks”, Communications of the ACM. Vol. 13(6), pp. 377-387.
Es el modelo de BBDD más extendido en la actualidad.
El principal objetivo del modelo de datos relacional es facilitar que la
base de datos sea percibida por el usuario como una estructura lógica
que consiste en un conjunto de relaciones y no como una estructura fı́sica
de implementación.
Una base de datos relacional se compone de varias tablas, denominadas
relaciones. Cada una de estas relaciones almacena información sobre una
entidad (entendiendo por entidad todo aquello sobre lo que interesa
almacenar información).
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
Ejemplo: Base de datos para almacenar información sobre los
estudiantes, las asignaturas y las calificaciones que el alumnado obtiene
en cada asignatura/convocatoria.
¿Qué entidades identificamos?
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
Ejemplo: Base de datos para almacenar información sobre los
estudiantes, las asignaturas y las calificaciones que el alumnado obtiene
en cada asignatura/convocatoria.
¿Qué entidades identificamos?
Estudiante
Asignatura
Calificación
Cada una de estas entidades se almacenará en una tabla o relación
independiente. Habrá que analizar qué información tiene sentido implı́cito
para cada una de estas relaciones:
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
Ejemplo: Base de datos para almacenar información sobre los
estudiantes, las asignaturas y las calificaciones que el alumnado obtiene
en cada asignatura/convocatoria.
¿Qué entidades identificamos?
Estudiante
Asignatura
Calificación
Cada una de estas entidades se almacenará en una tabla o relación
independiente. Habrá que analizar qué información tiene sentido implı́cito
para cada una de estas relaciones:
Nombre, apellidos, DNI, correo electrónico, etc.
Código, nombre, créditos, titulación, etc.
Estudiante, asignatura, calificación, convocatoria, etc.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
ESTUDIANTES
DNI Nombre Apellidos Alu Fecha de nacimiento
11222333X Juan Pérez Gil alu010010 10/05/2000
12345678A Luisa Hernández Afonso alu010020 03/02/2001
44123123R Antonio Gómez León alu010111 30/10/1999
ASIGNATURAS
Código Nombre Titulación Curso Cuatrimestre Créditos
20174 Computación Matemáticas 1 2 6
10020 Inglés Filologı́a 2 1 7.5
14345 Álgebra Informática 1 1 9
30164 Computabilidad Informática 1 2 6
CALIFICACIONES
Estudiante Asignatura Nota Curso
11222333X 20174 8.5 19-20
11222333X 10020 9.5 19-20
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
Cada tabla o relación tiene un conjunto de filas y un conjunto de
columnas.
Cada fila (registro o tupla) de una tabla o relación contiene una
colección de valores de datos relacionados entre sı́.
Cada columna (campo o atributo) contiene valores de un cierto dominio
y que representan un tipo de información intrı́nseca a la entidad
representada en la tabla.
Cada tabla y cada columna tiene un nombre que ayuda a entender el
significado de la información representada.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
Formalmente se dice que una relación se compone del esquema y de la
extensión:
El esquema de la relación consiste en un nombre de relación R y un
conjunto de atributos {A1 , A2 , ..., An }
Estudiantes(DNI, Nombre, Apellidos, Alu, Fecha de nacimiento)
La extensión de la relación de esquema R(A1 , A2 , ..., An ) es un
conjunto de tuplas ti (i = 1, 2, ..., m), donde cada tupla ti es, a su
vez un conjunto de pares
ti = {< A1 : vi1 >, < A2 : vi2 >, ... < An : vin >}
<11222333X, Juan, Pérez Gil, alu010010, 10/05/2000 >
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
Un atributo Ai es el nombre del papel que ejerce un dominio D en un
esquema de relación. El dominio D de un atributo Ai se denota como
dominio(Ai ) y es el conjunto de posibles valores para el atributo.
Dominios predefinidos, que corresponde a los tipos de datos que
normalmente proporcionan los lenguajes de bases de datos: enteros,
cadenas de caracteres, reales, etc.
Dominios definidos por el usuario, que pueden ser más especı́ficos.
Toda definición de un dominio debe constar, como mı́nimo, del
nombre del dominio y de la descripción de los valores que forman
parte de éste.
Si en una tupla ti el valor vij es un valor nulo, entonces el valor del
atributo Aj es desconocido para la tupla ti de la relación, o bien, no es
aplicable a la tupla en cuestión.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos relacionales
El grado de una relación es el número de atributos que pertenecen a su
esquema.
Ejemplo: el grado de la relación de esquema Estudiantes(DNI, Nombre,
Apellido, alu, Fecha de nacimiento) es 5.
La cardinalidad de una relación es el número de tuplas que pertenecen
a su extensión.
Ejemplo: la cardinalidad de la relación de esquema Estudiantes(DNI,
Nombre, Apellido, alu, Fecha de nacimiento) es 3.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Caracterı́sticas de las relaciones
Atomicidad de los valores de los atributos: los valores de los
atributos de una relación deben ser atómicos; es decir, no deben
tener estructura interna.
No-repetición de las tuplas: en un fichero clásico puede ocurrir que
dos de los registros sean exactamente iguales, en cambio, en el
modelo relacional no es posible que una relación contenga tuplas
repetidas (en un conjunto no puede haber elementos repetidos).
No-ordenación de las tuplas: de la definición de la extensión de una
relación como un conjunto de tuplas se deduce también que estas
tuplas no estarán ordenadas.
No-ordenación de los atributos: el esquema de una relación consta
de un nombre de relación R y un conjunto de atributos
{A1 , A2 , ..., An }, por lo que tampoco existe un orden entre los
atributos de un esquema de relación.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Superclaves y claves candidatas
Si no existe un orden entre las tuplas de la base de datos, ¿cómo
identificamos un registro particular dentro de una tabla?
Una superclave de una relación de esquema R(A1 , A2 , ..., An ) es un
subconjunto de los atributos del esquema tal que no puede haber dos
tuplas en la extensión de la relación que tengan la misma combinación de
valores para los atributos del subconjunto.
Una clave candidata de una relación es una superclave C de la relación
que cumple que ningún subconjunto propio de C es superclave.
Ejemplo: para la relación Estudiantes(DNI, Nombre, Apellido, alu, Fecha
de nacimiento) algunas superclaves son {DNI, Nombre, Apellidos},
{Nombre, Apellidos, alu}, {DNI, alu}, {DNI} o {alu}. Sin embargo,
claves candidatas sólo son {DNI} y {alu}.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Claves primarias y claves alternativas
La clave primaria es la clave candidata cuyos valores se utilizarán para
identificar unı́vocamente las tuplas de la relación.
Se utiliza la convención de subrayar los atributos que forman parte de la
clave primaria en el esquema de la relación.
Por ejemplo:
Estudiantes(DNI, Nombre, Apellido, alu, Fecha de nacimiento)
Las claves alternativas o secundarias son aquellas claves candidatas que
no han sido elegidas como clave primaria.
Por ejemplo: el atributo alu podrı́a ser una clave alternativa.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Claves ajenas (o foráneas)
Una base de datos estará formada por múltiples relaciones, entre las que
podrá existir cierto grado de vı́nculo o conexión.
Por ejemplo: en una asignatura estarán matriculados una serie de
estudiantes, cada calificación representa la nota de un estudiante en una
determinada asignatura, etc.
La forma de vincular una tupla de una determinada relación con la tupla
de otra relación es mediante una clave ajena. Para hacer la conexión, una
clave ajena (o foránea) tiene el conjunto de atributos que referencia la
clave primaria de otra relación (o incluso de la misma relación).
Las claves ajenas tienen por objetivo establecer una conexión con la clave
primaria que referencian. Por lo tanto, los valores de una clave ajena
deben estar presentes en la clave primaria correspondiente, o bien deben
ser valores nulos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Claves ajenas (o foráneas)
Dado el diseño anterior, ¿podrı́a un alumno tener dos calificaciones distintas para la
misma asignatura? ¿Cómo podrı́amos guardar el histórico de calificaciones de un
alumno en cada asignatura?
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Reglas de integridad
Se denomina integridad a la propiedad de los datos de corresponder a
representaciones plausibles del mundo real.
Podemos distinguir entre los tipos de reglas de integridad siguientes:
Las restricciones de integridad de usuario: son condiciones
especı́ficas de una base de datos concreta, pero que no son
necesariamente relevantes en otra base de datos.
Ejemplo: no tiene sentido una calificación mayor que 10.
Las reglas de integridad de modelo: son condiciones más generales,
propias de un modelo de datos, y se deben cumplir en toda base de
datos que siga dicho modelo.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Reglas de integridad
Las reglas de integridad del modelo relacional son:
Regla de integridad de unicidad de la clave primaria: toda clave
primaria que se elija para una relación no debe tener valores
repetidos.
Regla de integridad de entidad de la clave primaria: los atributos de
la clave primaria de una relación no pueden tener valores nulos.
Regla de integridad referencial: todos los valores que toma una clave
ajena deben ser valores nulos o valores que existen en la clave
primaria referenciada.
Regla de integridad de dominio: los valores de un atributo deben
pertenecer al dominio correspondiente y los operadores que pueden
aplicarse sobre los atributos dependen de sus dominios.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Diseño del modelo relacional
Hasta el momento hemos visto que:
Una base de datos relacional está compuesta de varias tablas, denominadas
relaciones.
Cada relación (tabla) es a su vez un conjunto de atributos (columnas) y tuplas o
registros (filas).
Los atributos son campos que toman valores de unos ciertos dominios.
Cada relación también tiene una clave primaria y puede tener una o más claves
foráneas.
La relación entre dos tablas se lleva a cabo por medio de las claves primarias y
claves ajenas (o foráneas).
Los lenguajes de los SGBD relacionales deben proporcionar la forma de
definir todos estos elementos para crear una base de datos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Operaciones del modelo relacional
Las operaciones del modelo relacional deben permitir manipular datos
almacenados en una base de datos relacional.
La manipulación de datos incluye:
La actualización de los datos
Inserción
Borrado
Modificación
La consulta de los datos
Consiste en la obtención de datos deducibles a partir de las relaciones
que contiene la base de datos y debe realizarse.
Debe realizarse a través de un lenguaje de consulta.
Un SGBD relacional tendrá que hacer cumplir las reglas de integridad del modelo (y
del usuario). Para ello, deberá efectuar comprobaciones cuando se produzcan
operaciones de actualización de los datos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Lenguajes relacionales
Una posible distinción entre los tipos de lenguajes relacionales es la
siguiente:
Los lenguajes declarativos (o implı́citos), con los que se especifica
qué se quiere hacer sin explicar cómo se debe hacer.
El SQL es el lenguaje estándar ANSI/ISO de definición, manipulación
y control de bases de datos relacionales.
Los lenguajes explı́citos o procedimentales, que nos exigen conocer
más cuestiones del funcionamiento del SGBD para detallar paso a
paso cómo se deben realizar las operaciones.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Gestores de bases de datos relacionales
Entre los gestores de bases de datos relacionales actuales más populares
podemos enumerar los siguientes:
Microsoft SQL Server
Oracle
MySQL
PostgreSQL
DB2
MariaDB
SQLite
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Más sobre modelos relacionales
Otros aspectos sobre bases de datos relacionales, pero que se escapan de
los objetivos de esta asignatura:
Diseño avanzado de bases de datos
Modelo entidad-relación (ER)
Transformación del modelo ER en el modelo relacional
Normalización
Álgebra relacional
Conocimiento avanzado de SQL.
Administración de SGBD.
...
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Ejercicio
https://www.ull.es/la-universidad/departamentos/
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Indice
1 Introducción a las bases de datos
2 Bases de datos relacionales
3 Lenguaje SQL
4 Bases de datos en Python
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Structure Query Language (SQL)
SQL (Structure Query Language) es un lenguaje de dominio especı́fico
utilizado en programación para definir, manipular y controlar bases de
datos relacionales.
Tal y como ya se ha mencionado, es un lenguaje declarativo que maneja
el álgebra y el cálculo relacional para efectuar consultas y ası́ recuperar,
de forma sencilla, información de bases de datos, ası́ como realizar
cambios en ellas.
SQL fue uno de los primeros lenguajes comerciales para el modelo
relacional de Edgar Frank Codd. A pesar de no adherirse totalmente al
modelo relacional descrito por Codd, pasó a ser el lenguaje de base de
datos más usado. Desde 1986 y 1987 es el estándar del Instituto Nacional
Estadounidense de Estándares (ANSI) y de la Organización Internacional
de Normalización (ISO), respectivamente.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Structure Query Language (SQL)
SQL está compuesto por:
Comandos
Cláusulas
Operadores
Funciones de agregación
Estos elementos se combinan en las instrucciones para, en conjunto,
proporcionar instrucciones para definir (crear y modificar el esquema),
mantener (insertar, actualizar, eliminar) y consultar bases de datos
relacionales.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Comandos SQL
Comandos DDL (Data Definition Language)
Permiten crear y definir nuevas bases de datos, campos e ı́ndices.
Estos comandos son:
CREATE: permite crear nuevas tablas, campos e ı́ndices.
DROP: permite eliminar tablas e ı́ndices.
ALTER: permite modificar las tablas agregando campos o cambiando
la definición de los campos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Comandos SQL
Comandos DML (Data Manipulation Language)
Permiten generar consultas para ordenar, filtrar y extraer datos de la base
de datos.
Estos comandos son:
SELECT: permite consultar registros de la base de datos atendiendo
a un determinado criterio.
INSERT: permite cargar datos en la base de datos.
UPDATE: permite modificar los valores de los campos y registros
especificados.
DELETE: permite eliminar registros de una tabla.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Cláusulas SQL
Las cláusulas son condiciones de modificación utilizadas para definir los
datos a seleccionar o manipular:
FROM: permite especificar la tabla de la cual se van a seleccionar los
registros.
WHERE: permite especificar las condiciones que deben reunir los
registros que se van a seleccionar.
GROUP BY: permite separar los registros seleccionados en grupos
especı́ficos.
HAVING: permite expresar la condición que debe satisfacer cada
grupo.
ORDER BY: permite ordenar los registros seleccionados de acuerdo
con un orden especı́fico.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Operadores
Operadores lógicos:
AND
OR
NOT
Operadores de comparación:
<, >, <>, <=, >=
BETWEEN: permite especificar un intervalo de valores.
LIKE: utilizado en las cláusulas WHERE para buscar un determinado
patrón en una columna.
IN: permite especificar registros de una base de datos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Funciones de agregación
Las funciones de agregación se usan dentro de una cláusula SELECT
para devolver un único valor que se aplica a un grupo de registros.
AVG: promedio de los valores de un campo determinado.
COUNT: devuelve el número de registros de la selección.
SUM: devuelve la suma de todos los valores de un campo
determinado.
MAX: devuelve el valor más alto de un campo especificado.
MIN: devuelve el menor valor de un campo especificado.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Indice
1 Introducción a las bases de datos
2 Bases de datos relacionales
3 Lenguaje SQL
4 Bases de datos en Python
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos en Python
Un Sistema Gestor de Bases de Datos (DataBase Management System,
DBMS) es un software especı́fico, orientado al manejo de base de datos,
cuya función es servir de interfaz entre la base de datos y los usuarios.
Como usuario podemos tener a alguien que accede directamente a la base
de datos relacional mediante SQL interactivo, o bien, puede tratarse de
una aplicación hecha en un lenguaje de programación cualquiera (y que
ofrezca mucha más potencia fuera del entorno de las bases de datos).
Para utilizar SQL desde un lenguaje de programación necesitaremos
sentencias especiales que nos permitan distinguir entre las instrucciones
del lenguaje de programación y las sentencias de SQL. La idea es que el
lenguaje de programación anfitrión pueda albergar SQL como si fuese un
huésped. Por este motivo, este tipo de SQL se conoce con el nombre de
SQL hospedado.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos en Python
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos en Python
La interfaz estándar para trabajar desde Python con bases de datos
relacionales es la DB-API.
Python Database API Specification v2.0:
https://legacy.python.org/dev/peps/pep-0249/
La DB-API constituye un conjunto de clases y funciones comunes,
estandarizadas y similares para los distintos motores de bases de datos.
De esta forma, se pretende ampliar las posibilidades de crear código
portable entre las distintas bases de datos.
Gara Miranda Valladares Tema 3: Bases de datos
Introducción a las bases de datos
Bases de datos relacionales
Lenguaje SQL
Bases de datos en Python
Bases de datos en Python
Lo que nosotros veremos:
SQL
DB-API
SQLite
MySQL
Otras alternativas:
Object Relational Mapping (ORM): modelo de programación que
permite mapear las estructuras de una base de datos relacional sobre
una estructura lógica de entidades con el objeto de simplificar y
acelerar el desarrollo de nuestras aplicaciones. De esta forma, las
acciones CRUD (Create, Read, Update, Delete) a ejecutar sobre la
base de datos fı́sica se realizan de forma indirecta por medio del
ORM, evitando la generación manual de código SQL.
SQLAlchemy
Gara Miranda Valladares Tema 3: Bases de datos