curso de python inicial...¿qué es? •la librería estándar contiene varios tipos de componentes....

79
Curso de Python Inicial Librería estándar Logo IAA-CSIC Curso organizado por el Gabinete de Formación del CSIC

Upload: others

Post on 26-Apr-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Curso de Python Inicial

Librería estándar

Logo IAA-CSIC

Curso organizado por el Gabinete de Formación del

CSIC

Contenidos

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 2

¿Qué es?

¿Para qué sirve?

¿Cómo se usa?

¿Qué incluye?

• Interfaz con el sistema operativo

• Matemáticas

• Ficheros y directorios

• Búsqueda de patrones

• Fechas y horas

• Redirección de entrada salida y terminación de programas

• Persistencia

• Rutas

• Multiproceso

• Compresión

• Generación de números aleatorios

¿Qué es?

• La librería estándar contiene varios tipos de componentes. – Tipos de datos que pueden ser considerados como parte

del núcleo de Python (números y listas). – Funciones internas y excepciones. – La mayor parte de la librería está constituida por un amplio

conjunto de módulos que permiten expandir la funcionalidad de Python.

• Se distribuye junto con el intérprete. • Con cada nueva versión de Python, se mejora y amplía

la funcionalidad. http://docs.python.org/library/index.html

10/04/2013 César Husillos Víctor Terrón

3

¿Para qué sirve?

• Lo que hace diferente a Python de otros lenguajes de alto nivel es, además de su sencillez, su librería estándar.

• Los cientos de módulos que implementa lo hacen portable a cualquier ordenador (aunque ciertamente algunos son dependientes del Sistema Operativo) .

• La librería es de propósito general: sirve para cualquier desarrollo.

• Gran parte de nuestro trabajo está ya hecho (REUTILIZACIÓN).

• Los módulos ya han sido probados. • El tiempo que invirtamos en leer la documentación lo

recuperaremos con creces cuando programemos aplicaciones.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 4

¿Cómo se usa?

• Lo difícil es no perderse en la maraña de módulos existentes.

• Tras localizar el módulo que creemos que nos sirve para nuestra tarea, simplemente lo importamos a nuestro espacio de trabajo y utilizamos lo que necesitamos.

• Visite la web http://docs.python.org/py-modindex.html

Para echar un vistazo rápido a los módulos de la librería.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 5

USO DEL SISTEMA OPERATIVO Módulo sys

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 6

Módulo sys

Ya son conocidas sus capacidades para la gestión de parámetros de entrada a scripts Python

– propiedad argv

También se ha utilizado para modificar la ruta de búsqueda de módulos Python

– propiedad path

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 7

Módulo sys: Forzar fin de ejecución

Aunque no es programación de estilo, supongamos

que, en un momento dado,

• bien porque el script tarda demasiado en ejecutarse,

• O porque se da cierta condición crítica,

necesitamos terminar la ejecución de un script.

sys.exit([status])

donde status es un entero que sirve para informar del motivo de la finalización.

10/04/2013

César Husillos Rodríguez Víctor Terrón Salas

8

Módulo sys: Forzar fin de ejecución. Ejemplo.

Fichero: salida.py

import sys

if len(sys.argv) < 2:

sys.exit(1)

print sys.argv[1:]

Desde el intérprete

>>> import sys

>>> import subprocess

>>> subprocess.call(['p

ython', 'salida.py'])

1

>>> subprocess.call(['p

ython', 'salida.py', 'p

arametro'])

['parametro']

0

10/04/2013

César Husillos Rodríguez Víctor Terrón Salas

9

Módulo sys: Forzar fin de ejecución. Ejemplo (II).

También sirve para salir del intérprete

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 10

Módulo sys: Redirección de entrada/Salida

Ejecutamos un script y nos vamos a tomar un café. Al regresar vemos por pantalla el resultado. (Lo normal) • ¿Y si quiero ejecutar varios de forma secuencial (o

simultánea)?. – Las salidas por pantalla se mezclarán o serán demasiado

largas para registrarse totalmente en la consola.

• En otras ocasiones puede ejecutar programas que pidan información de forma interactiva para poder llevar a cabo sus tareas. – ¿Tengo que estar presente para la interacción?

Solución: redirección sys.stdin, sys.stdout, sys.stderr

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 11

Módulo sys: Redirección de entrada/Salida. Ejemplo.

>>> import sys

>>> out = sys.stdout

>>> fout = open(‘saludo.out', 'w')

>>> sys.stdout = fout

>>> print ‘Hola mundo’

>>> sys.stdout = out

>>> fout.close()

>>> print ‘Hola mundo’

‘Hola mundo’

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 12

Módulo sys: Redirección de entrada/Salida. Ejemplo (II).

Abrimos con el block de notas el fichero saludo.out y encontramos:

Hola mundo

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 13

EJERCICIOS: 1 Y 2

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 14

PROCESOS Módulo subprocess

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 15

Ejecución de Procesos

Python se ha hecho popular por varias razones: • Sintaxis simple y legible. • Librerías estándar. • Gran cantidad de módulos disponibles para trabajo en

ciencia, ingeniería, comunicaciones, … • Fácil integración con otros lenguajes. • Abundante documentación. • Como lenguaje “pegamento” ya que, entre otras cosas,

permite el control de parámetros en la ejecución de “programa externos”.

Esto último es extremadamente sencillo mediante el uso del módulo subprocess.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 16

Ejecución de Procesos: call

subrocess.call (comando [,

shell=False, stdin=None, stdout=None, stderr=None])

• Comando, es la orden a ejecutar. Puede ser una lista o una cadena.

• stdin / stdout / stderr, son objetos fichero que representan a la entrada estándar, salida estándar y salida de error estándar

– stdin, es la entrada estándar (teclado). También podrá ser un objeto fichero abierto en modo lectura del que se llerán los parámetros de entrada que necesite el script.

– stdout y stderr, serán la salida estándar y salida estándar de mensajes de error. Pueden ser además, objetos ficheros abiertos en modo escritura donde se almacenará cualquier ‘print’ realizado en el código y cualquier mensaje de error (excepción) lanzado por nuestro programa.

• shell, es el formato del comando.

– shell = False, como lista

– shell = True, como cadena de caracteres.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 17

Ejecución de Procesos. Ejemplo.

● shell = False

>>> import subprocess

>>> subprocess.call([‘python', ‘saludo.py ', ’mundo’])

>>> Hola mundo

● shell = True

>>> subprocess.call(‘python saludo.py mundo’)

>>> Hola mundo

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 18

Ejecución de Procesos. Salida a fichero

Queremos que la salida de un programa llamado con subprocess.call se escriba en un fichero

>>> fd = open (‘fichero_salida’, ‘w’)

>>> subprocess.call([‘python', ‘saludo.py ', ’mundo’], stdout = fd)

>>> fd.close ()

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 19

EJERCICIOS: 3 Y 4

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 20

TRABAJO CON FECHAS Y HORAS Módulo datetime

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 21

Horas y Fechas

• En ocasiones necesito saber la hora a la que se ejecutó un script y/o el tiempo transcurrido.

• A veces necesito saber el intervalo temporal entre dos fechas.

• Quizá necesite parar la ejecución de un programa tras un intervalo de tiempo de espera (una petición web sin respuesta).

• Todo esto y más se puede realizar con el módulo

datetime

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 22

Horas y Fechas: Módulos

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 23

Clases del módulo datetime

date, time, datetime, timedelta

Se pueden crear objetos mediante sus constructores

datetime.date(año, mes, dia)

datetime.time(hora[, minuto[, segundo[, microsegundo[, tzinfo]]]])

datetime.datetime(año, mes, dia[, hora[, minuto[, segundo[, microsegundo[, tzinfo]]]]])

datetime.timedelta([dias[, segundos[, microsegundos[, millisegundos[, minutos[, horas[, semanas]]]]]]])

O se pueden crear a partir de la fecha y hora del sistema:

datetime.date.today()

datetime.datetime.now([tz])

datetime.datetime.combine(fecha, hora)

Horas y fechas: atributos

• Dato tipo datetime.datetime

– year, month, day, hour, minute, second,

microsecond

• Dato tipo datetime.time

– hour, minute, second, microsecond

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 24

Horas y Fechas: Creación alternativa

Podemos crear objetos tipo datetime.time y datetime.date a partir de objetos datetime.datetime

>>> import datetime

>>> now = datetime.datetime.now()

>>> d = now.date()

>>> t = now.time()

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 25

Horas y Fechas: Operaciones

Podemos realizar operaciones con fechas. El resultado es un objeto del tipo timedelta. Atributos de timedelta: days, seconds y microseconds. Métodos de timedelta: total_seconds ()

Entonces, estaríamos en condiciones de determinar, por ejemplo, la duración de nuestros programas o de fragmentos de código que sospechamos que ralentizan la ejecución.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 26

Operación Operador Ejemplo

Suma + t1 + t2

Resta - t1 – t2

Comparaciones ==, !=, <, <=, >, >= t1 < t2

Horas y Fechas: Ejemplo

Tiempo que tardo en ejecutar unas instrucciones >>> import datetime

>>> import time

>>> date1 = datetime.datetime.now()

# Esperamos unos segundos…

>>> date2 = datetime.datetime.now()

>>> datediff = date2 - date1

>>> datediff.days, datediff.seconds, datediff.microseconds

(0, 15, 829942)

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 27

EJERCICIOS: 5

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 28

FICHEROS Y DIRECTORIOS Módulos os y shutil

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 29

Ficheros y directorios

• ¿Cómo obtengo el directorio en el que estoy ejecutando órdenes en un script o intérprete?

• ¿Cómo creo y borro directorios y ficheros?

• ¿Cómo accedo al contenido de un directorio?

• ¿Cómo copio, muevo o borro un fichero?¿Cómo realizo esas operaciones de forma recursiva sobre un directorio?

Todo esto y más con los módulos

os y shutil

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 30

Directorio de trabajo

>>> import os

>>> os.getcwd()

‘E:\\presentaciones\\pyhon_inicial\\codigo'

>>> os.getcwd()

‘C:\\'

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 31

Método getcwd () del módulo os

• Devuelve el directorio actual de trabajo

Método chdir () del módulo os

• Cambia el directorio de trabajo

Directorios: Crear

Ejemplo:

>>> os.mkdir ('pruebaDir')

>>> os.mkdir ('pruebaDir\\subdir1\\subdir1_1')

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

OSError: [Errno 2] No such file or directory:

'pruebaDir\\subdir1\\subdir1_1'

>>> os.makedirs ('pruebaDir\\subdir1\\subdir1_1')

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 32

os.mkdir (path)

• crea el directorio 'path'.

os.makedirs (path)

• crea recursivamente los subdirectorios necesarios para generar 'path'.

Directorios: Eliminar

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 33

>> import os

>>> os.rmdir('pruebaDir\\subdir1\\subdir1_1')

Traceback (most recent call last):

File "<stdin>", line 1, in <module> OSError: [Errno 39] Directory not empty: 'pruebaDir\\subdir1\\subdir1_1'

os.rmdir(path)

• borra el directorio 'path'. Da error si no está vacío.

os.removedirs(path)

• borrado recursivo de subdirectorios hasta eliminar el directorio base de 'path'. Lanza OSError si no consigue su objetivo.

Directorios: Copiar

Usamos la función copytree del módulo shutil.

shutil.copytree(origen, destino[, symlinks = False])

• Copia recursivamente el contenido del directorio 'origen', en 'destino'.

• El directorio de destino NO DEBE existir. • Se creará 'destino', así como los directorios necesarios

hasta llegar hasta la ruta dada. • Si symlinks = False, se copian los enlaces simbólicos. Si es

True, se copia el contenido enlazado en el nuevo directorio.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 34

Directorios: Copiar. En el intérprete...

>>> import shutil

>>> shutil.copytree ('E:\\presentaciones\\python_inicial\\codigo',

'E:\\presentaciones\\python_inicial\\codigo_backup')

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 35

Directorios: Renombrar

Usamos la función rename del módulo os.

os.rename(origen, destino)

Falla cuando destino existe.

>>> os.rename('pruebaDir', 'probeDir')

Sirve también para ficheros. En este caso, si destino existe, lo reemplazará si se dispone de permisos.

>>> os.rename('probeDir\\subdir1\\subdir1_1\\readme',

'probeDir\\subdir1\\subdir1_1\\README')

donde se tiene ahora

C:\presentaciones\python_inicial> dir probeDir\subdir1\subdir1_1\

02/03/2012 12:13 303 README

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 36

Directorios: Contenido

• os.listdir(path) Devuelve una lista no ordenada de nombres y directorios contenidos en 'path'. • os.walk(path) Proporciona todos los nombres de ficheros y directorios que cuelgan del directorio 'path'.

>>> for i in os.walk ('E:\\presentaciones\\python_inicial\\ejercicios'):

print i

('E:\\presentaciones\\python_inicial\\ejercicios', [], ['ejercicio1.py', 'ejercicio2.py', 'ejercicio3.py', 'ejercicio4.py', 'ejercicio_noplanteado.py']) Para cada directorio encontrado a partir de 'path' produce una tupla

(directorio, subdirectorios, ficheros)

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 37

Directorios: Contenido. Ejemplo

Partimos de la estructura de ficheros probeDir -- subdir1 -- subdir1_1-- README

|-- subdir2 --- file1.txt

|-- file2.txt

|-- file3.txt

Ejecuto ambos métodos: >>> import os >>> os.listdir('probeDir')

['subdir2', 'subdir1']

>>> for path in os.walk('probeDir'):

... print path

...

('probeDir', ['subdir2', 'subdir1'], [])

('probeDir\\subdir2', [], ['file2.txt', 'file1.txt', 'file3.txt']) ('probeDir\\subdir1', ['subdir1_1'], [])

('probeDir\\subdir1\\subdir1_1', [], ['README'])

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 38

Ficheros: Copia y Borrado

• shutil.copy(origen, destino)

Copia, además, todos los permisos de un fichero a otro. >>> import shutil

>>> shutil.copy('pyregion1.0.1.tar.gz', 'pyregion1.0.1.copy.tar.gz')

• os.remove(path)

Borra el fichero dado por path >>> import os

>>> os.remove('pyregion1.0.1.copy.tar.gz')

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 39

Ficheros: Mover • os.rename(viejo, nuevo)

Ya vista en el caso de renombrado de directorios.

• shutil.move(origen, destino)

Mueve recursivamente un fichero o un directorio 'origen' a 'destino'.

>>> import shutil

>>> shutil.move('pyregion1.0.1.tar.gz',

‘C:\\Users\\cesar\\Documents')

>>> (Ctrl+D) # salimos del intérprete

C:\> dir C:\Users\cesar\Documents\*.tar.gz

C:\Users\cesar\Documents\pyregion1.0.1.tar.gz

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 40

MANEJO DE RUTAS Módulo os.path

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 41

Rutas

• Dada una ruta, ¿cómo separo el nombre del fichero y su directorio?

• Necesito la extensión de un fichero, ¿cómo? • Dado un fichero, ¿cómo determino la ruta absoluta? • ¿Cómo creo una nueva ruta a partir de rutas parciales? • Necesito comprobar que la ruta a un fichero o directorio

existe • ¿Cómo sé si una ruta es un fichero o un directorio? • Necesito conocer el tamaño que ocupa un fichero.

¿Cómo? Todo lo que necesitamos está en el módulo

os.path

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 42

Rutas: Separar directorio y nombre

• os.path.split (ruta)

Esta función descompone 'ruta' en forma de tupla de dos elementos: (directorio, nombre)

>>> import os.path

>>> os.path.splitext

(‘C:\\Users\\cesar\\curso_python\\herencia.py’)

(‘C:\\Users\\cesar\\curso_python’, ‘herencia.py’)

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 43

Rutas: Extensión de un fichero

• os.path.splitext (ruta) Esta función descompone 'ruta' en forma de tupla de dos elementos: (ruta2, extension) donde 'ruta2' contiene 'ruta' hasta el último punto que corresponde a la extensión. Ejemplo: >>> import os.path

>>> os.path.splitext ('C:\\Users\\cesar\\curso_python\\herencia.py')

('C:\\Users\\cesar\\curso_python\\herencia', '.py')

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 44

Rutas: Ruta absoluta

• os.path.abspath (path) Esta función obtiene la ruta absoluta ‘path’. Es equivalente concatenar la ruta absoluta del directorio actual con ‘path’. Ejemplo: >>> import os.path

>>> os.path.abspath ('herencia.py')

'C:\\Python27\\herencia.py'

>>> import os

>>> os.getcwd ()

'C:\\Python27'

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 45

Rutas: Concatenación

os.path.join (directorio, nombre)

Esta función compone y devuelve una nueva ruta dada por

directorio + nombre.

Ejemplo:

>>> os.path.join ('D:\\directorio_base\dir1', 'dir2\\fichero.extension')

'D:\\directorio_base\\dir1\\dir2\\fichero.extension'

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 46

Rutas: Validación

• os.path.exists (ruta) Si la ruta especificada por el parámetro existe, devuelve True. Si no existe, devuelve False. Ejemplo:

>>> import os

>>> os.path.exists ('D:\\directorio_base\\dir1\\dir2\\fichero.extension')

False

>>> os.path.exists ('C:\\Users')

True

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 47

Rutas: ¿Directorio o fichero?

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 48

os.path.isdir (ruta)

• Si la ruta especificada por el parámetro corresponde a un directorio, devuelve True. Si no existe, devuelve False.

• Sigue enlaces simbólicos.

os.path.isfile (ruta)

• Si la ruta especificada por el parámetro corresponde a un fichero, devuelve True. Si no existe, devuelve False.

• Sigue enlaces simbólicos.

Rutas: ¿Directorio o fichero?. Ejemplo.

>>> import os

>>> os.path.isdir ('C:\\Users')

True

>>> os.path.isfile ('C:\\Users')

False

>>> os.path.isdir ('C:\\Python27\\README.txt')

False

>>> os.path.isfile ('C:\\Python27\\README.txt')

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 49

Rutas: Propiedades de ficheros

• os.path.getsize (ruta) Devuelve el tamaño en bytes del fichero referenciado por 'ruta'.

Ejemplo:

>>> import os

>>> os.path.getsize ('C:\\Python27\\README.txt')

54967L

(1 kilobyte (KB) = 1024 bytes (B))

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 50

RUTAS: BÚSQUEDAS APROXIMADAS Módulo glob

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 51

Rutas: Búsquedas aproximadas

Usaremos la función glob del módulo glob. glob.glob (pathmodel)

Busca ficheros que verifique el patrón 'pathmodel'. El módulo glob reproduce la sintaxis de caracteres comodín de la shell.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 52

Comodín Descripción

* Reemplaza a 0 o muchos caracteres

? Reemplaza a un carácter simple

[caracteres] Reemplaza a cualquiera de los caracteres dentro de los corchetes

[!caracteres] Reemplaza a cualquiera de los caracteres excepto los dados

Rutas: Búsquedas aproximadas. Ejemplo

>>> import glob

>>> glob.glob ('C:\\Python27') ['C:\\Python27']

>>> glob.glob ('C:\\Python27\\*')

['C:\\Python27\\DLLs', 'C:\\Python27\\Doc', 'C:\\Python27\\include', 'C:\\Python27\\Lib', 'C:\\Python27\\libs', 'C:\\Python27\\LICENSE.txt', 'C:\\Python27\\NEWS.txt', 'C:\\Python27\\python.exe', 'C:\\Python27\\pythonw.exe', 'C:\\Python27\\README.txt', 'C:\\Python27\\Scripts', 'C:\\Python27\\share', 'C:\\Python27\\tcl', 'C:\\Python27\\Tools']

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 53

>>> glob.glob ('C:\\Python27\\[ps]*') ['C:\\Python27\\python.exe', 'C:\\Python27\\pythonw.exe', 'C:\\Python27\\Scripts', 'C:\\Python27\\share']

>>> glob.glob ('C:\\Python27\\[!ps]*') ['C:\\Python27\\DLLs', 'C:\\Python27\\Doc', 'C:\\Python27\\include', 'C:\\Python27\\Lib', 'C:\\Python27\\libs', 'C:\\Python27\\LICENSE.txt', 'C:\\Python27\\NEWS.txt', 'C:\\Python27\\README.txt', 'C:\\Python27\\tcl', 'C:\\Python27\\Tools']

>>> glob.glob ('C:\\Python27\\?EADME.txt') ['C:\\Python27\\README.txt'] 10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 54

EJERCICIOS: 6, 7, 8, 9, 10, 11, 12, 13

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 55

MATEMÁTICAS Módulo math

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 56

Matemáticas

Todo lo que necesitamos lo encontraremos en el módulo

math Contiene definiciones de constantes y funciones matemáticas básicas.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 57

Constantes

pi Número pi

e Número e (base del logaritmo neperiano)

Conversión angular

degrees (x) Transforma radianes a grados

radians (x) Transforma grados a radianes

Matemáticas (II)

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 58

Funciones trigonométricas

math.acos(x) devuelve el coseno del arco 'x' (en radianes)

math.asin(x) Seno del arco ‘x’

math.atan(x) arcotangente

math.sin(x) devuelve en seno de 'x'. ('x' en radianes)

Funciones hiperbólicas

math.tan(x) Tangente

math.acosh(x) Devuelve el coseno hiperbólico del arco ‘x’ (en rad)

math.asinh(x) Seno del arco hiperbólico ‘x’

math.atanh(x) Arcotangente hiperbólica

math.cosh(x) Devuelve el coseno hiperbólico de x.

math.sinh(x) Seno hiperbólico

Matematicas (III) Exponenciales y logarítmicas

math.exp(x) exponencial en base e

math.log(x[, base]) si no le damos una base, toma e (neperiano)

math.log1p(x) devuelve el logaritmo de 1+x (base e)

math.log10(x) logaritmo decimal

math.pow(x, y) eleva la base 'x' al exponente 'y'

math.sqrt(x) raíz cuadrada de 'x'

math.hypot(x, y) devuelve la norma euclídea (sqrt(x ** 2 + y ** 2))

Funciones de redondeo y caracterización

math.fabs(x) valor absoluto de x

math.factorial(x) factorial. Lanza ValueError si x no es entero o < 0

math.floor() devuelve el mayor entero <= x

math.ceil(x) devuelve el menor entero >= x

math.fmod(x) resto de la división entera (de acuerdo a C)

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 59

Matemáticas. Ejemplo >>> import math

>>> math.pi

3.1415926535897931

>>> math.e

2.7182818284590451

>>> math.degrees(math.pi)

180.0

>>> math.radians(360)

6.2831853071795862

>>> math.exp(1)

2.7182818284590451

>>> math.log(4,2)

2.0

>>> math.log10(1000)

3.0

>>> math.pow(3,2.5)

15.588457268119896

>>> math.hypot(1,1)

1.4142135623730951

>>> math.fabs(3.5)

3.5

>>> math.ceil(3.5)

4.0

>>> math.ceil(3.4)

4.0

>>> math.fmod(5,2)

1.0

>>> math.fmod(5.4,2)

1.4000000000000004

>>> math.ceil(3.5)

4.0

>>> math.ceil(3.4)

4.0

>>> math.fmod(5,2)

1.0

>>> math.fmod(5.4,2)

1.4000000000000004

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 60

EJERCICIOS: 14 Y 15

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 61

PERSISTENCIA DE OBJETOS Módulo Pickle

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 62

Persistencia de Objetos: Serialización

• Consiste en el almacenado rápido en fichero de cualquier objeto python para su posterior carga y uso. – Por ejemplo, un diccionario con valores o rangos de parámetros válidos para la

ejecución de un script, un conjunto de templates estelares o extragalácticos, …

• El módulo Pickle codifica y decodifica objetos de cualquier tamaño, por muy complicada que sea su estructura interna. Podemos usarlo como superclase de la que heredar.

• cPickle es otra de las posibilidades. Está implementado en C y se estima en unas 1000 veces más veloz que Pickle. El problema es que no es heredable.

• Ambos módulos implementan funciones similares.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 63

Persistencia de objetos (II)

Sólo necesitamos dos funciones de este módulo:

• pickle.dump(objeto, objeto_fichero_permiso_escritura)

Con dump, guardamos el ‘objeto’ en un ‘objeto_fichero’ con permisos de escritura. Tendremos que crearlo de esta forma: objeto_fichero = open (‘ruta_fichero’, ‘w’)

• pickle.load(objeto_fichero_permiso_lectura)

Abrimos un fichero en modo lectura y se lo pasamos a ‘load’. Retorna el objeto tal y como se guardó con ‘dump’.

10/04/2013

César Husillos Rodríguez Víctor Terrón Salas

64

Persistencia de objetos. Ejemplo. >>> import pickle

>>> data = {'entero': 3, 'float': 2.33, 'complejo': 1+3j, 'lista': range(100), 'tupla':

(1,2,3), 'diccionario': {'nombre': 'Sara', 'edad': 20}}

>>> fout = open('fichero.pick', 'w')

>>> pickle.dump(data, fout)

>>> data = {}

>>> fout.close()

>>> fin = open('fichero.pick', 'r')

>>> new_data = pickle.load(fin)

>>> new_data['entero']

3

>>> new_data

{'tupla': (1, 2, 3), 'float': 2.3300000000000001, 'complejo': (1+3j), 'entero': 3,

'lista': [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, 25, 26, 27,

28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,44, 45, 46, 47, 48, 49, 50, 51, 52, 53,

54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,

80, 81, 82, 83, 84, 85, 86, 87,88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], 'diccionario': {'edad': 20, 'nombre': 'Sara'}}

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 65

EJERCICIOS: 16 Y 17

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 66

NÚMEROS ALEATORIOS Módulo random

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 67

Números Aleatorios

El módulo random

implementa la generación de números pseudo-aleatorios para varias distribuciones (uniforme, normal, lognormal, …) La primera función que debe llamarse es la de la generación de la semilla de números aleatorios

random.seed ([x]) donde x es la semilla. Si no se especifica una, se utiliza el valor del tiempo actual del sistema. Semillas distintas, dan distintas secuencias de números aleatorios.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 68

Números aleatorios. Funciones Funciones para enteros

random.randrange([start], stop[, step])

Devuelve un número aleatorio entre start y stop, con intervalo entre valores step.

random.randint(a, b) Devuelve un número entero entre a y b (ambos inclusive)

Funciones para secuencias

random.choice(seq) Devuelve un elemento seleccionado al azar de la lista seq

random.shuffle(x) Baraja la lista x

random.sample(population, k) Devuelve una muestra de k elementos seleccionados al azar y sin repetición de la lista population

Funciones para distribuciones matemáticas

random.random() Devuelve un número float aleatorio en [0, 1)

random.uniform(a, b) Devuelve un número aleatorio en [a, b] (distribución uniforme)

random.gauss(mu, sigma) Devuelve un número aleatorio según una distribución gausiana de media mu y desviación estándar sigma

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 69

Números aleatorios. Ejemplo.

>>> random.random() # float aleatorio x, 0.0 <= x < 1.0

0.37444887175646646

>>> random.uniform(1, 10) # float aleatorio x, 1.0 <= x < 10.0

1.1800146073117523

>>> random.randint(1, 10) # Entero desde 1 a 10, extremos incluidos

7

>>> random.randrange(0, 101, 2) # Entero par desde 0 hasta 100

26

>>> random.choice('abcdefghij') # Elige aleatoriamente un elemento

'c'

>>> items = [1, 2, 3, 4, 5, 6, 7]

>>> random.shuffle(items)

>>> items

[7, 3, 2, 5, 6, 4, 1]

>>> random.sample([1, 2, 3, 4, 5], 3) # Elige 3 elementos

[4, 1, 5]

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 70

EJERCICIOS: 18, 19, 20 Y 21

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 71

FICHEROS EN FORMATO COMPRIMIDO

Módulo zipfile

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 72

Ficheros Comprimidos

Existen módulos para el trabajo con los formatos comunes de archivado y compresión, incluyendo:

• zlib

• gzip

• bz2

• zipfile

• tarfile

Nos centraremos en el módulo ‘zipfile’. Para satisfacer la curiosidad de alumnos inquietos, se recomienda la web

http://docs.python.org/py-modindex.html

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 73

Ficheros comprimidos: Módulo zipfile

Permite la lectura y escritura, agregar nuevos datos y listar el contenido de un fichero en formato estándar ZIP. Atributos Métodos zipfile.ZipFile (file[, mode]) donde mode será ‘r’ (lectura) , ‘w’ (escritura), ‘a’ (añadir o crear, si no existe). Tiene más parámetros opcionales, pero no serán tratados en este curso. zipfile.is_zipfile(filename) Devuelve True si filename es un fichero ZIP válido. False en caso contrario.

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 74

Métodos básicos del módulo zipfile

zipfile.ZipFile (file[, mode]) Clase de ficheros ZIP. mode será ‘r’ (lectura) , ‘w’ (escritura), ‘a’ (añadir o crear, si no existe).

zipfile.is_zipfile(filename) Devuelve True si filename es un fichero ZIP válido. False en caso contrario.

Métodos de la clase ZipFile

ZipFile.namelist() Devuelve la lista de nombres de elementos dentro del paquete ZIP.

ZipFile.getinfo(name) Devuelve un objeto ZipInfo con información del archivo miembro del paquete ZIP llamado name.

ZipFile.open(name[, mode[, pwd]]) Extrae el miembro llamado name del paquete ZIP. mode es el modo de extracción (‘r’ por defecto y siempre sólo lectura). pwd es la contraseña para ficheros encriptados.

ZipFile.close() Cierra el fichero ZIP

ZipFile.extract(member, [path[, pwd]]) Extrae el miembro member al directorio actual. path especifica un directorio alternativo de extracción

ZipFile.extractall([path[, members[, pwd]]]) Extrae todo el contenido del ZIP al directorio path. Por defecto path es el directorio actual (os.getcwd ())

ZipFile.printdir() Muestra el contenido del fichero por pantalla (stdout)

ZipFile.testzip() Comprueba el fichero ZIP. Devuelve el nombre del primer fichero corrupto del paquete. None si todo está bien.

ZipFile.write(filename[, arcname[, compress_type]])

Escribe el fichero filename en arcname. Si este último no se da, sobreescribe el primero. El paquete ZIP debió abrirse en formato ‘w’ o ‘a’. De no ser así se lanzará la exceptión del tipo RuntimeError.

Ficheros comprimidos. Ejemplo.

>>> fzip = zipfile.ZipFile ('cosa.zip','a')

>>> os.listdir (os.getcwd ())

['cosa.zip', 'ejercicio1.py', 'ejercicio2.py', 'ejercicio3.py', 'ejercicio4.py']

>>> fzip.write('ejercicio1.py')

>>> fzip.write ('ejercicio2.py')

>>> fzip.printdir ()

File Name Modified Size

ejercicio1.py 2012-03-07 20:59:22 681

ejercicio2.py 2012-03-08 00:02:45 207

>>> f = fzip.extract ('ejercicio1.py')'

>>> fzip.close ()

10/04/2013 César Husillos Rodríguez

Víctor Terrón Salas 75

EJERCICIOS: 22

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 76

PARA TERMINAR … Curiosidades …

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 77

Curiosidad

Recomiendo visitar esta dirección web.

https://pypi.python.org/pypi

• Encontrará 29841 paquetes a fecha del 10/04/2013 desarrollados por la comunidad Python.

– 19475 en febrero de 2012

• Es un aliciente para seguir trabajando en Python.

– SEGURO que existe algún paquete que es de tu interés.

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 78

FIN

10/04/2013 César Husillos Rodríguez Víctor Terrón Salas 79