Download cadenas - Universidad de Oviedo
Document related concepts
no text concepts found
Transcript
Universidad de Oviedo Grado en Física Curso 2013-14 Introducción a la Física Computacional Tema 4 Python como lenguaje algorítmico Tema 4. Python como lenguaje algorimico ● Introducción ● Usando Python ● Variables y tipos de datos. Operadores ● Estructuras de control de flujo: condicionales, bucles y excepciones ● Entrada y salida de datos ● Funciones y módulos Tema 4. Python como lenguaje algorimico ● Introducción ● Usando Python ● Variables y tipos de datos. Operadores ● Estructuras de control de flujo: condicionales, bucles y excepciones ● Entrada y salida de datos ● Funciones y módulos Introducción ● ● ¿Qué es Python? ● Lenguaje interpretado o de script ● Tipado dinámico y fuertemente tipado ● Multiplataforma y totalmente libre ● Orientado a objetos y a la vez de tipo funcional ● Módulos prefabricados (bibliotecas de programas) ¿Por qué Python? ● Ventajas de Python respecto a otros lenguajes ● Comparación con otros lenguajes ¿Qué es Python? ● ● Python es un lenguaje de programación creado por Guido van Rossum a principios de la década de 1990 cuyo nombre está inspirado en el grupo de cómicos ingleses Monty Python. Se trata de un lenguaje interpretado o de script, con tipado dinámico, fuertemente tipado, multiplataforma, libre y orientado a objetos. Lenguaje interpretado o de script ● ● Un lenguaje interpretado o de script es aquel que se ejecuta utilizando un programa intermedio llamado intérprete, en lugar de compilar el código a lengua máquina que pueda comprender y ejecutar directamente una computadora (lenguajes compilados). La ventaja de los lenguajes compilados es que su ejecución es más rápida. Sin embargo los lenguajes interpretados son más flexibles y más portables. Lenguaje interpretado o de script ● ● Python tiene, no obstante, muchas de las características de los lenguajes compilados, por lo que se podría decir que es semiinterpretado. En Python el código fuente se traduce en ocasiones a un código intermedio llamado bytecode la primera vez que se ejecuta (generando archivos .pyc o .pyo, que son los que se ejecutarán en sucesivas ocasiones). Tipado dinámico ● 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 le asigne, y el tipo de esta variable puede cambiar si se le asigna un valor de otro tipo: x = 3.0 # asigna a x un número real x = log # ahora asigna a x la función log Fuertemente tipado ● ● 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. Por ejemplo, si tenemos una variable que contiene un texto (tipo cadena) no podremos tratarla como un número (sumar la cadena “9” con el número 8 está prohibido). Multiplataforma ● El intérprete de Python está disponible en multitud de plataformas (Unix, Solaris, Linux, MS/Dos, Windows, Mac OS, etc.) por lo que si no utilizamos bibliotecas específicas de cada plataforma nuestro programa podrá correr en todos estos sistemas con pocos cambios. Python es software libre ● ● No hay una empresa comercial detrás, sino toda la comunidad internacional. Por ello, no está sujeto a los caprichos de una compañía. Eso no quiere decir que no podamos realizar desarrollos comerciales en Python: excepto que usemos una biblioteca de módulos que lo cite expresamente, una aplicación que desarrollemos en Python puede ser vendida y reportar beneficios. Orientado a objetos y funcional ● ● ● La orientación a objetos (OO) es un paradigma de programación en el que los conceptos del mundo real relevantes para nuestro problema se trasladan a clases y objetos en nuestro programa. La ejecución del programa consiste en una serie de interacciones entre los objetos. La programación funcional (FP de sus siglas en inglés) es otro paradigma avanzado de programación. En el presente curso no desarrollaremos los aspectos de OO ni la FP. Módulos prefabricados ● ● ● ● Python tiene una ventaja respecto a otros lenguajes: posee infinidad de módulos prediseñados (quizá sea el que más tiene). Cada módulo contiene herramientas de programación para realizar tareas relacionadas entre sí. Se puede usar un módulo (conociendo su funcionamiento) de una manera simple. El diseño de nuevos módulos es sencillo. Algunos módulos prefabricados ● Matemáticas (math, numpy, scipy, sympy, etc.) ● Estadística (stats, etc.) ● Representaciones gráficas 2D y 3D (matplotlib, visual, Gnuplot, etc.) ● Interfaces gráficas (tkinter, wxPython, etc.) ● Bases de datos (pySQLite, etc.) ● Tratamiento de imágenes (PIL, etc.) ● Manipulación de bases de datos científicas como (NetCDF, etc.) ● Servidor de aplicaciones web (zope) ---no es exactamente un módulo ¿Por qué Python? ● ● ● ● ● Es uno de los mejores lenguajes para comenzar a programar: su curva de aprendizaje es poco empinada. Su aprendizaje puede ser realizado incrementalmente de manera ventajosa (dejando, por ejemplo, la programación FP y OO para el final). Está disponible en muchas plataformas. Están disponibles bibliotecas de programas para casi cualquier tema que se nos ocurra. Puede combinarse fácilmente con lenguajes compilados (C, C++, Fortran) para las tareas que requieran velocidad de cálculo. Ventajas de Python ● ● ● ● Su sintaxis es tan sencilla y cercana al lenguaje natural que los programas elaborados en Python parecen pseudocódigo. El tipado es dinámico, lo que nos evita tener que estar continuamente definiendo variables y asignando memoria. El gestor de memoria simplifica el uso de variables (la memoria se libera automáticamente cuando no se necesita). La gran cantidad de bibliotecas disponibles y la potencia del lenguaje, hacen que desarrollar una aplicación en Python sea sencillo y muy rápido. Comparación con otros lenguajes ● ● ● Es un lenguaje completo y con sintaxis homogénea y coherente (a diferencia de Matlab y Octave, por ejemplo). Es más lento que los lenguajes compilados pero mucho más rápido desarrollar las aplicaciones. Es más fácil realizar el mantenimiento de programas que con otros lenguajes (con el paso del tiempo todos los programas tienen errores que eliminar). Tema 4. Python como lenguaje algorimico ● Introducción ● Usando Python ● Variables y tipos de datos. Operadores ● Estructuras de control de flujo: condicionales, bucles y excepciones ● Entrada y salida de datos ● Funciones y módulos Usando Python ● ● Existen dos maneras de usar el intérprete de Python: modo interactivo y modo no interactivo (modo script). En el modo interactivo se invoca: $ python >>> ● El intérprete nos indica con >>> (se denomina prompt en inglés) que está esperando una orden del usuario. Python en modo interactivo ● En el modo interactivo Python se puede usar como una calculadora: >>> 3+4 7 >>> r = 3; s = 3.1416*r**2 >>> s 28.2744 (Ctrl-D) # para salir en Unix (Ctrl-Z+Enter) # para salir en Windows Python en modo no interactivo ● ● Se usa indicándole al intérprete qué fichero queremos usar para ejecutar en Python. Supongamos que el fichero hola.py contiene: # ----- hola.py ---print('Hola amigo') $ python hola.py Hola amigo $ ● En el modo no interactivo Python no se puede usar como una calculadora (no imprime las operaciones directamente). Tema 4. Python como lenguaje algorimico ● Introducción ● Usando Python ● Variables y tipos de datos. Operadores ● Estructuras de control de flujo: condicionales, bucles y excepciones ● Entrada y salida de datos ● Funciones y módulos Variables y tipos de datos ● ● En la mayoría de los lenguajes el nombre de una variable representa un tipo y un valor almacenado en una posición fija de memoria. El valor puede cambiarse pero el tipo no. Esto no ocurre en Python donde ya hemos dicho que las variables tienen tipos dinámicos. Identificadores y palabras reservadas ● Los nombres de las variables en Python pueden contener letras (sin acentos ni la ñ), números y el carácter “_” (barra baja). Ejemplos: aviso, x, f7, fecha_de_nacimiento ● No pueden empezar por un número y es recomendable no empezarlos por “_”. No valdrían: 5solos, año, carbón, acel-gravedad ● Existen algunas palabras que no se pueden usar como nombres de variables. Se llaman palabras reservadas: if, while, for, try, ... Tipos de datos ● Números (enteros, reales, complejos) ● Valores booleanos ● Cadenas ● Operaciones con datos ● Colecciones de datos Enteros ● ● Los números enteros son aquellos números positivos o negativos que no tienen decimales (incluido el cero). En Python se pueden representar mediante: ● int (de integer, entero) ● long (largo). Enteros: tipo int ● En una variable de tipo int de Python podemos almacenar con 32 bits números de 31 31 −2 a 2 −1, o lo que es lo mismo, de −2.147.483.648 a 2.147.483.647. ● En plataformas de 64 bits, el rango es de −9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807. Enteros: tipo long ● ● El tipo long de Python permite almacenar números de cualquier precisión, estando limitados solo por la memoria disponible en la máquina. Al asignar un número entero a una variable esta pasará a tener tipo int, a menos que el número sea tan grande como para requerir el uso del tipo long. Reales: tipo float (I/II) ● ● Los números reales son los que tienen decimales. En Python se expresan mediante el tipo float. Python implementa su tipo float utilizando 64 bits y sigue el estándar IEEE 754: 1 bit para el signo, 11 para el exponente, y 52 para la mantisa. Esto significa que los valores que podemos representar van desde (aprox.) ±2,225x10 −308 308 hasta ±1,798×10 . Reales: tipo float (II/II) ● En realidad se pueden manejar números menores en valor absoluto (más cercanos a −324 cero), hasta 4,941x10 (números subnormalizados), pero en las operaciones aritméticas se comenten errores de redondeo y se recomienda evitarlos. Complejos ● ● Los números complejos son aquellos que tienen parte imaginaria. Este tipo se denomina complex en Python. complex se almacena usando dos valores float, debido a que estos números son una extensión de los números reales. Valores booleanos ● ● ● Una variable de tipo booleano (también denominado lógico) sólo puede tener dos valores: True (verdadero) y False (falso). Estos valores son importantes para las expresiones condicionales y los bucles, como veremos más adelante. Python también acepta como falso un valor entero 0 y como verdadero un valor entero diferente de 0 (como por ejemplo 1). Cadenas de caracteres (strings) ● ● Una cadena es una secuencia de caracteres entre comillas simples ' o dobles “. Dentro de las comillas se pueden añadir caracteres especiales como: ● \ (carácter de continuación) ● \n (carácter de nueva línea) ● \t (carácter de tabulación) Cadenas (ejemplos) >>> c = ”Hola mundo” # c es de tipo cadena >>> print(c) Hola mundo # podemos comprobarlo con la función type >>> type(c) Cadenas ● ● También es posible encerrar una cadena entre triples comillas (simples o dobles). De esta forma podremos escribir el texto en varias líneas, y al imprimir la cadena, se respetarán los saltos de línea que introdujimos sin tener que recurrir al carácter \n, así como las comillas sin tener que utilizar al carácter \. Una cadena es un objeto inmutable. Un carácter no puede ser modificado con una declaración, y tiene una longitud fija. El intento de violar su inmutabilidad dará un error. Algunas operaciones con cadenas ● ● ● Existen funciones para manejo de cadenas como upper (convierte a mayúsculas), lower (a minúsculas). La longitud de la cadena s se obtiene usando la función len(s). Los elementos de las cadenas se numeran empezando con 0 hasta len(s)-1 siempre. Algunas operaciones con cadenas ● ● El operador + se utiliza para unir (concatenar) cadenas. El operador : se utiliza para extraer una porción de cadena ● ● s[i:j] nos devuelve la subcadena desde i hasta j-1. Si i y/o j son negativos son índices desde el final de la cadena: si n es la longitud de la cadena, -1 es equivalente a n-1. Cadenas (ejemplos) >>> cadena1 = ’Presiona return para salir ’ >>> cadena2 = ’del programa’ >>> print cadena1 +’ ’+ cadena2 # concatenación Presiona return para salir del programa >>> print(cadena1[0:12]) # extracción Presiona return >>> cad = cadena1[-5:] # por el final >>> cad salir >>> cad.upper() SALIR # ojo con esta forma de invocar upper Cadenas (ejemplos) >>> s = ’Presiona return para salir’ >>> len(s) 26 >>> s[0] = ’p’ Traceback (most recent call last): File ’’<pyshell#1>’’, line 1, in ? s[0] = ’p’ TypeError: object doesn’t support item assignment Operadores ● Operadores aritméticos ● Operadores relacionales ● Operadores condicionales Operadores aritméticos Operador Descripción Ejemplo + Suma r = 2+3 #r es 5 - Resta r = 4-7 #r es -3 - Negación r = -7 #r es -7 * Multiplicación r = 2*6 #r es 12 ** Exponente r = 2**6 #r es 64 / División r = 3.5/2 #r es 1.75 División entera r = 3.5//2 #r es 1.0 Módulo r = 7%2 // % #r es 1 Operadores aritméticos ● Si una operación aritmética incluye números de diferentes tipos, los números se convierten automáticamente a un tipo común después de la operación: int → long → float → complex Operadores aritméticos (ejemplos) >>> b = 2 # b es de tipo entero >>> print(b) 2 >>> b = b * 2.0 # ahora es de tipo coma flotante >>> print(b) 4.0 # podemos comprobarlo con la función type >>> type(a) >>> type(b) Operadores aritméticos (ejemplos) ● ● ● La asignación b = 2 crea una asociación entre el nombre b y el valor entero 2. La siguiente declaración evalúa la expresión: b*2.0 y asocia el resultado con b eliminando la asociación original con el entero 2. Después de esta declaración b se refiere a un punto flotante de valor 4.0. El signo # indica que comienza un comentario. Todos los caracteres entre # y el final de línea son ignorados por el intérprete. Operadores aritméticos ● ● ● Algunas de estas operaciones también están definidas para cadenas, pero con otro significado. El operador + concatena dos cadenas (como ya hemos visto) y también listas. El operador * cuando un multiplicando es un entero y el otro una cadena hace que la cadena se repita. También se aplica a listas. Operadores aritméticos (ejemplos) >>> s = ’Hello ’ >>> t = ’to you’ >>> a = [1, 2, 3] >>> print(3*s) # Repetición Hello Hello Hello >>> print(3*a) # Repetición [1, 2, 3, 1, 2, 3, 1, 2, 3] >>> print(a + [4, 5]) # Añade elementos [1, 2, 3, 4, 5] >>> print(s + t) # Concatena Hello to you Operadores aritméticos (ejemplos) Pero cuidado: >>> print(3+s) # Esta suma no tiene sentido Traceback (most recent call last): File ’’<pyshell#9>’’, line 1, in ? print(n + s) TypeError: unsupported operand types for +: ’int’ and ’str’ Más operadores aritméticos ● Las versiones posteriores a Python 2.0 han aumentado la asignación de los operadores, de manera que resulten familiares a los usuarios de C. A la izquierda el operador, a la derecha la equivalencia a a a a a a += -= *= /= **= %= b b b b b b a a a a a a = a + b = a - b = a * b = a / b = a**b = a % b Operadores relacionales ● Los operadores relacionales devuelven True (1 en operaciones) si es cierto y False (0 en operaciones) si es falso. Operador Descripción Ejemplo < Menor que 5<3 False > Mayor que 5>3 True <= Menor o igual 5<=5 True >= Mayor o igual 5>=3 True == != Igual a Distinto a 5==3 False 5!=3 True Operadores relacionales (ejemplos) >>> a = 2 # Entero >>> b = 1.99 # Coma flotante >>> c = ’2’ # Cadena >>> print(a > b) True >>> print(a == c) False >>> print((a > b) and (a != c)) True >>> print((a > b) or (a == b)) True Operadores condicionales ● Los operadores condicionales devuelven True (1 en operaciones) si es cierto y False (0 en operaciones) si es falso. Operador Descripción Ejemplo and ¿se cumple a y b? 5>3 and 5<3 False or ¿se cumple a o b? 5>3 or 5<3 True not no not 5<=3 True Colecciones ● Además de los tipos básicos de datos que hemos visto, números, cadenas y booleanos, existen otros tipos de colecciones de datos: ● Tuplas ● Listas ● Diccionarios Tuplas ● ● ● Una tupla es una secuencia de objetos arbitrarios separados por comas y encerrados entre paréntesis. Si la tupla contiene sólo un objeto, se requiere una coma al final, por ejemplo, x=(2,). Los elementos de las tuplas se numeran empezando con 0 siempre y acaban en n-1 (siendo n la longitud de la tupla). Las tuplas soportan las mismas operaciones que las cadenas, son también inmutables. Tuplas (ejemplos) >>> t = (1) >>> type(t) <type 'int'> >>> t = (1,) >>> type(t) <type 'tuple'> Tuplas ● Para referirse a elementos de una tupla se usa el operador [] >>> t = (1, 2, 3) >>> type(t) <type 'tuple'> ● >>> mi_var = t[0] # mi_var es 1 >>> mi_var = t[0:2] # mi_var es (1, 2) Podemos utilizar el operador [] debido a que las tuplas, al igual que las cadenas, forman parte de un tipo de objetos llamados secuencias. Tuplas (ejemplos) >>> rec = (’Smith’, ’John’, (6, 23, 68)) # Esto es una tupla >>> apellido, nombre, fecha_nac = rec >>> print(nombre) John >>> anno_nac = fecha_nac[2] >>> print(anno_nac) 68 >>> nombre = rec[1] + ’ ’ + rec[0] >>> print(nombre) John Smith >>> print(rec[0:2]) (’Smith’, ’John’) # desempaquetando la tupla Listas ● ● ● ● ● Una lista es similar a una tupla, pero puede ser modificada, de manera que pueden cambiarse sus elementos y su longitud. Una lista se identifica encerrándola entre corchetes. Sería equivalente a lo que en otros lenguajes se conoce por arrays y vectores. Las listas pueden contener cualquier tipo de dato: números, cadenas, booleanos, etc., y también listas. Los elementos de las listas se numeran empezando con 0 siempre. Algunas operaciones con listas Si s es una lista: ● len(s) nos devuelve la longitud de la lista. ● s.append(x) añade x al final de la lista s. ● s.insert(k,x) inserta x en la posición k de la lista s. ● ● ● del s[k] elimina de la lista s el elemento en la posición k. s[i:j] nos devuelve una sublista desde el elemento i inclusive hasta el j-1. [x]*n genera una lista de longitud n cuyos elementos son x. Listas (ejemplos) >>> a = [1.0, 2.0, 3.0] >>> a.append(4.0) # Creamos una lista # Añadimos 4.0 a la lista >>> print(a) [1.0, 2.0, 3.0, 4.0] >>> a.insert(0, 'a') # Insertamos 'a' en la posición 0 >>> print(a) ['a', 1.0, 2.0, 3.0, 4.0] >>> print(len(a)) # Determinamos la longitud de la lista 5 >>> a[2:4] = [1.0, 1.0] # Modificamos los elementos seleccionados # la >>> print(a) ['a', 1.0, 1.0, 1.0, 4.0] Listas ● ● ● Si a es un objeto mutable, la declaración b = a no da como resultado un nuevo objeto b, simplemente crea una nueva referencia a a. cualquier cambio realizado a b se reflejará en a. Para crear una copia independiente de una lista a, usaremos la declaración c=a[:]. Para realizar copias de listas que incluyen listas u otras colecciones se deben utilizar funciones dentro del módulo copy. Listas (ejemplos) >>> a = [1.0, 2.0, 3.0] >>> b = a # ’b’ es un alias de ’a’ >>> b[0] = 5.0 # cambia ’b’ >>> print(a) [5.0, 2.0, 3.0] >>> c = a[:] # el cambio se refleja en ’a’ # ’c’ es copia independiente de ’a’ >>> c[0] = 1.0 # cambia ’c’ >>> print(a) [5.0, 2.0, 3.0] # ’a’ no está afectada Listas ● ● ● Podemos representar matrices mediante listas anidadas, donde cada fila se representa por una lista. Salvo algunas excepciones no utilizaremos listas para crear matrices numéricas. Para crear matrices es mas conveniente utilizar el módulo numpy (que veremos más adelante). Listas (ejemplos) Creemos una lista de listas >>> a = [[1, 2, 3], \ ... [4, 5, 6], \ ... [7, 8, 9]] >>> print(a[1]) # Imprime la segunda fila [4, 5, 6] >>> print(a[1][2]) # Imprime el tercer elemento # de la segunda fila 6 Listas (ejemplos) ● ● Recordemos que el símbolo \ al final de línea es el carácter de continuación de Python. Las secuencias en Python tienen un offset (desplazamiento) cero, de manera que a[0] representa la primera fila, a[1] la segunda y así sucesivamente. Operaciones con listas y cadenas ● Se puede romper una cadena y crear una lista: >>> s = 'esto es >>> s.split() una cadena' # rompe por los blancos ['esto', 'es', 'una', 'cadena'] ● Se pueden concatenar los elementos de una lista para formar una cadena: >>> l = ['a', 'b', 'c'] >>> '/=!'.join(l) # une separando con /=! a/=!b/=!c Diccionarios ● Los diccionarios, también llamados matrices asociativas, deben su nombre a que son colecciones que relacionan una clave y un valor. Por ejemplo, veamos un diccionario con algunas unidades derivadas del SI: UniSI = {“frecuencia”: “hercio”, “fuerza”: “newton”} ● Debemos fijarnos en las dos llaves, una al principio { y otra al final }. Diccionarios ● ● El primer valor se trata de la clave y el segundo del valor asociado a la clave. Como clave podemos utilizar cualquier valor inmutable, podríamos usar números, cadenas, booleanos, tuplas, etc., pero no listas o diccionarios, dado que son mutables. 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, utilizando de nuevo el operador [] d[“frecuencia”] # devuelve “hercio” Diccionarios ● ● Al igual que en listas y tuplas también se puede utilizar este operador para reasignar valores. d[“potencia”] = “vatio” Sin embargo en este caso no se puede utilizar slicing ('troceado', como hemos visto con las sublistas) entre otras cosas porque los diccionarios no son secuencias, si no 'mapeados' (o asociaciones). Tema 4. Python como lenguaje algorimico ● Introducción ● Usando Python ● Variables y tipos de datos. Operadores ● Estructuras de control de flujo: condicionales, bucles y excepciones ● Entrada y salida de datos ● Funciones y módulos Estructuras de control de flujo ● Condicionales ● Bucles ● Excepciones (control de errores) Condicionales ● ● Si un programa no fuera más que una lista de órdenes a ejecutar de forma secuencial, una por una, no tendría mucha utilidad. Los condicionales nos permiten comprobar condiciones y hacer que nuestro programa se comporte de una forma u otra, que ejecute un fragmento de código u otro, dependiendo de esta condición. Aquí es donde cobran su importancia el tipo booleano y los operadores lógicos y relacionales. Condicionales ● La forma más simple de una construcción condicional es un if (del inglés si) seguido de la condición a evaluar, dos puntos (:) y en la(s) siguiente(s) línea(s) e indentado, el código a ejecutar en caso de que se cumpla dicha condición: if condición: código a ejecutar Cómo se definen bloques ● Los bloques se identifican con dos puntos (:) y en la(s) siguiente(s) línea(s) e indentado, el código a ejecutar en caso de que se cumpla dicha condición: if condición: ►►►►Esta es la línea 1 del bloque ►►►►Esta es la línea 2 del bloque ►►Esta línea tiene mal el indentado Esta línea no pertenece al bloque anterior Ojo: el indentado debe ser el mismo en cada bloque Condicionales ● La construcción if ... else se utiliza cuando queremos que se ejecuten ciertas órdenes en el caso de que la condición no se cumpliera if condición: código a ejecutar else: código a ejecutar Condicionales ● La construcción if ... elif ... elif ... else se utiliza para condiciones múltiples (elif es una contracción de else if): if condición: código a ejecutar elif condición: código a ejecutar else: código a ejecutar Condicionales (ejemplos) def signo_de_a(a): if a < 0.0: signo = ’negativo’ elif a > 0.0: signo = ’positivo’ else: signo = ’cero’ return signo a = 1.5 print(’a es ’ + signo_ de_ a(a)) a es positivo Bucles ● Mientras que los condicionales nos permiten ejecutar distintos fragmentos de código dependiendo de ciertas condiciones, los bucles nos permiten ejecutar un mismo fragmento de código un cierto número de veces, mientras se cumpla una determinada condición. Bucles ● Construcción while while condición: código a ejecutar ● El código se ejecuta mientras la condición sea verdadera. Este proceso continuará hasta que la condición sea falsa. Bucles ● Construcción while while condición: código a ejecutar else: código a ejecutar ● Podemos utilizar un else para ejecutar un código alternativo cuando la condición sea falsa. Bucles (ejemplos) nMax = 5 n = 1 a = [] # Crea una lista vacía while n < nMax: a.append(1.0/n) # Añade elementos a la lista n = n + 1 print(a) [1.0, 0.5, 0.33333333333333331, 0.25] Bucles ● Construcción for ... in for elemento in secuencia: código a ejecutar Para cada elemento de la secuencia ejecuta las líneas de código. ● En Python for se utiliza como una forma genérica de iterar sobre una secuencia. Y como tal intenta facilitar su uso para este fin. Bucles ● Los for se utilizan en Python para recorrer secuencias (principalmente listas o tuplas), por lo que vamos a utilizar un tipo secuencia, como es la lista, para nuestro ejemplo. Bucles (ejemplos) nMax = 5 a = [] for n in range(1, nMax): a.append(1.0/n) print(a) Aquí la secuencia es la lista [1, 2, ..., nMax-1], que hemos creado llamando a la función range. Otra manera de hacerlo es con comprensión de listas: a = [1.0/n for n in range(1, nMax)] Bucles (ejemplos) También se puede iterar en una lista mediante el índice y el elemento usando la función de lista enumerate: >>> z = ['a', 5, (1.0, 2.0)] >>> for indice, elem in enumerate(z): ... print(indice, elem) ... (0, 'a') (1, 5) (2, (1.0, 2.0)) Bucles ● ● Cualquier bucle puede finalizarse con la sentencia break. En el ejemplo siguiente, para obtener lo que el usuario escriba en pantalla utilizamos la función raw_input (que luego veremos). Bucles (ejemplo) lista = [’Marta’, ’Juan’, ’Pedro’, ’Carmen’] nombre = raw_ input(’Escribe un nombre: ’) Encontrado = False for i in range(len(lista)): if lista[i] == nombre: print(nombre, ’es el número’, i+1, ’de la lista’) encontrado = True break if not encontrado: print(nombre, ’no está en la lista’) Bucles ● La sentencia continue. Esta sentencia salta directamente a la siguiente iteración del bucle. Bucles (ejemplos) x = [] # Crea una lista vacía for i in range(1,100): if i % 7 != 0: continue # un if de una sola línea # si no es divisible por 7 salta # a siguiente iteración x.append(i) print(x) [7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98] Excepciones ● La sentencia try ... except ... else ... finally ... nos permite controlar errores de ejecución sin que el programa aborte: try: sentencias que se prueban except: sentencias que se ejecutan en caso de error else: # opcional sentencias que se ejecutan si no hay error finally: # opcional sentencias que se ejecutan siempre al final Excepciones (ejemplo) # un ejemplo sencillo x = eval(raw_input('x ? ')) # se evalúa una expresión try: y = 1/x except: print('se divide por cero') else: print('no se divide por cero') finally: print('esto se ejecuta siempre al final') Comprobaciones (“aserciones”) ● Para comprobar una afirmación que si es falsa nos muestra un mensaje de error y aborta el programa, y si es verdadera se continua la ejecución, se usa assert: assert x >= 0, 'x debe ser no negativa' Tema 4. Python como lenguaje algorimico ● Introducción ● Usando Python ● Variables y tipos de datos. Operadores ● Estructuras de control de flujo: condicionales, bucles y excepciones ● Entrada y salida de datos ● Funciones y módulos Funciones de entrada y salida ● Entrada estándar ● Salida estándar ● Ficheros Entrada estándar ● ● La forma más sencilla de obtener información por parte del usuario es mediante la función raw_input. Esta función toma como parámetro una cadena a usar como prompt (texto a mostrar al usuario pidiendo la entrada) y devuelve una cadena con los caracteres introducidos por el usuario. nombre= raw_input(“¿Como te llamas?”) print(“Encantado, “ + nombre) Entrada estándar ● Si necesitamos un valor numérico (incluso una expresión matemática) como entrada en lugar de una cadena utilizaremos la función eval(cadena). Entrada estándar (ejemplo) a = raw_input(’Introduce a: ’) print(a, type(a)) # Muestra en pantalla el # valor de a y su tipo b = eval(a) print(b, type(b)) # Muestra en pantalla el # valor de b y su tipo Entrada estándar (ejemplo) Si ejecutamos el programa dos veces obtendremos: Introduce a: 10.0 10.0 <type ’str’> 10.0 <type ’float’> Introduce a: 11**2 11**2 <type ’str’> 121 <type ’int’> Entrada estándar ● Una forma de introducir una variable numérica es mediante la sentencia: a = eval(raw_input(prompt)) que es equivalente a: a = input(prompt) Salida estándar ● ● ● La forma más sencilla de mostrar algo en la salida estándar es mediante el uso de la función print. Nota: en Python v2 print es una instrucción y se puede usar también sin paréntesis. Es preferible usar paréntesis que funciona en Python v3. En su forma más básica a la función print le sigue una cadena, que se mostrará en la salida estándar al ejecutarse la sentencia. >>> print(“Hola mundo”) Hola mundo Salida estándar ● La función: print(objeto1, objeto2, ...) Convierte cada objeto en una cadena y los muestra por pantalla en la misma línea separados por espacios. ● Pueden usarse los caracteres especiales para cambiar la formar de mostrar los parámetros por pantalla. Salida estándar (ejemplo) >>> a = 1234.56789 >>> b = [2, 4, 6, 8] >>> print(a, b) 1234.56789 [2, 4, 6, 8] >>> print(’a =’+str(a)+’\nb =’+str(b)) a = 1234.56789 b = [2, 4, 6, 8] # se salta línea debido a \n Salida estándar ● ● El operador % puede utilizarse para construir una tupla. La sentencia de conversión es: '%format1 %format2 ...' % tupla Donde format1, format2, etc., son las especificaciones de formato de cada objeto dentro de la tupla. Salida estándar ● Las especificaciones para los formatos más utilizados son: wd Entero w.nf Coma flotante w.ne Notación exponencial Donde w es la anchura del campo y n es el número de dígitos después del punto decimal. Salida estándar (ejemplos) >>> a = 1234.56789 >>> n = 9876 >>> print(’%7.2f’ % a) 1234.57 >>> print(’n = %6d’ % n) n = 9876 # 2 espacios >>> print(’n = %06d’ % n) n = 009876 # 2 ceros >>> print(’%12.4e %6d’ % (a, n)) 1.2346e+003 9876 Ficheros ● Abrir y cerrar ficheros ● Leer datos de un fichero ● Escribir datos en un fichero Abrir y cerrar ficheros ● Antes de poder acceder a los datos de un fichero, debes crear un objeto fichero con el comando: objeto_fichero = open(nombre_fichero, acción) Siendo nombre_fichero la cadena que especifica el fichero que va a ser abierto, incluido su camino de búsqueda (path) si es necesario. Abrir y cerrar ficheros La acción es una de las siguientes cadenas: acción Definición 'r' Leer de un fichero existente (se usa por defecto si no se especifica la acción) 'w' Escribir en un fichero. Si el fichero no existe lo crea. 'a' Añade al final de un fichero. 'r+' Lee y escribe en un fichero existente. 'w+' Lo mismo que 'r+', pero si el fichero no existe, lo crea. 'a+' Lo mismo que 'w+', pero los datos son añadidos al final del fichero. Abrir y cerrar ficheros ● ● Es una buena práctica de programación cerrar el fichero si no se va a acceder a él durante un tiempo largo dentro del programa. Para ello ejecutamos el comando: objeto_fichero.close() Leer datos de un fichero ● Existen tres métodos para leer datos de un fichero. 1) S = objeto_fichero.read(n) Lee n caracteres y los devuelve como una cadena S. Si se omite n, se leerán todos los caracteres. Se puede crear una lista con las líneas: s.splitlines() Leer datos de un fichero 2) objeto_fichero.readline(n) Lee n caracteres de una línea y los devuelve como una cadena. Los caracteres los devuelve como cadena que termina con \n. Si se omite n se lee toda la línea. Leer datos de un fichero 3) objeto_fichero.readlines() Devuelve una lista de las líneas desde la primera línea a la última línea del fichero. Escribir datos en un fichero ● Para escribir una cadena en un fichero: objeto_fichero.write() ● Para escribir una lista de cadenas: objeto_fichero.writelines() Ninguno de los métodos añade el carácter '\n' al final de la linea. Escribir datos en un fichero ● La función print puede ser utilizada para escribir en un fichero de salida. print(objeto1, objeto2, . . ., file=objeto_fichero) Este método añade el carácter '\n' al final de la linea. ● NOTA: esta forma de usar print sólo es válida en python 3.x Tema 4. Python como lenguaje algorimico ● Introducción ● Usando Python ● Variables y tipos de datos. Operadores ● Estructuras de control de flujo: condicionales, bucles y excepciones ● Entrada y salida de datos ● Funciones y módulos Funciones ● Qué es una función ● Funciones de conversión de tipos ● Funciones matemáticas ● Funciones definidas por el usuario Qué es una función ● ● Una función es un fragmento de código con un nombre asociado que realiza una serie de tareas y devuelve un valor. A los fragmentos de código que tienen un nombre asociado y no devuelven valores se les suele llamar procedimientos. En Python no existen los procedimientos, ya que cuando el programador no especifica un valor de retorno la función devuelve el valor None (nada). Funciones de conversión de tipos ● ● Hemos visto que los números de diferentes tipos se convierten automáticamente a un tipo común después de la operación aritmética o una comparación. También se pueden cambiar los tipos con funciones. Funciones de conversión de tipos función int(a) Descripción Convierte a en un entero long(a) Convierte a en un entero largo float(a) Convierte a en un real de coma flotante complex(a) Convierte a en un complejo a+0j complex(a,b) Convierte a en un complejo a+bj Funciones de conversión de tipos ● ● Las funciones anteriores solo trabajan convirtiendo cadenas en números tan largos como las cadenas de manera que representen un número valido. La conversión de coma flotante a entero se realiza con un proceso de truncamiento, no por redondeo. Conversión de tipos (ejemplos) >>> a = 5 >>> print(float(d)) >>> b = -3.6 4.0 >>> d = ’4.0’ >>> print(int(d)) >>> print(a + b) # This fails: d is not int type 1.4 >>> print(int(b)) -3 >>> print(complex(a,b)) (5-3.6j) Traceback (most recent call last): File ’’<pyshell#7>’’, line 1, in ? print(int(d)) ValueError: invalid literal for int(): 4.0 Funciones matemáticas ● El núcleo de Python sólo contiene las siguientes funciones matemáticas. Función Descripción abs(a) Valor absoluto de a max(secuencia) El mayor elemento de una secuencia min(secuencia) El menor elemento de una secuencia round(a,n) Redondea a con n decimales cmp(a,b) Devuelve -1 si a<b 0 si a=b 1 si a>b Funciones matemáticas ● La mayoría de las funciones matemáticas se encuentran en el módulo math (luego lo analizaremos), por ejemplo: Función Descripción sin(a) Calcula el seno de a (en radianes) exp(a) Calcula e log(a) Calcula el logaritmo natural de a a Funciones definidas por el usuario ● En Python la definición (o declaración) de una función se realiza de la manera siguiente: def nombre_funcion (param1, param2, ...): sentencias return valor_devuelto donde param1, param2, …, son los parámetros (también denominados argumentos formales). En Python un parámetro puede ser cualquier objeto, incluida una función. Documentación sobre una función ● También podemos encontrarnos con una cadena de texto como primera línea del cuerpo de la función. Estas cadenas se conocen con el nombre de docstring (cadena de documentación) y, como su nombre indica, sirven de documentación de la función: def iden (p1, p2): “”” Esta funcion imprime los dos valores pasados como argumentos ””” print(p1) print(p2) Funciones definidas (ejemplo) >>> def iden (p1, p2): ... print(p1) ... print(p2) # definición ... >>> nombre = 'Sara' >>> apellido = 'Silva' >>> iden(nombre, apellido) Sara Silva # invocación Invocación de una función ● Al declarar la función lo único que hacemos es asociar un nombre al fragmento de código que conforma la función, de forma que podamos ejecutar dicho código más tarde referenciándolo por su nombre. Es decir, a la hora de escribir estas líneas no se ejecuta la función. Para llamar (o invocar) a la función (ejecutar su código) se escribiría: iden(“Sara”, “Silva”) ● Es decir, el nombre de la función a la que queremos llamar seguido de los valores que queramos pasar como argumentos entre paréntesis. Argumentos actuales ● ● Los argumentos que se pasan cuando se invoca la función se denominan argumentos actuales (o argumentos a secas). El número de valores que se pasan como argumentos actuales al llamar a la función tiene que coincidir con el número de argumentos formales que la función acepta según la declaración de la función. En caso contrario Python dará un error: >>> iden(“Sara”) Traceback (most recent call last): File “<stdin>”, line 1, in <module> TypeError: iden() takes exactly 2 arguments (1 given) Asociación de argumentos y parámetros ● Los argumentos de invocación se asocian a los parámetros de la definición por posición: def hacer (a, b, c, d): # definición hacer (“hola”, 3, abs, [1, 2]) # invocación ● Cuando se invoca hacer se asocia: a ← “hola” # una cadena b ← 3 # un entero c ← abs # la función abs d ← [1, 2] # una lista Argumentos con valores por defecto ● Los valores por defecto para los argumentos se definen situando un signo igual después del nombre del argumento y a continuación el valor por defecto: >>> def imprimir (texto, veces=1): ... print(veces * texto) >>> imprimir(“hola”) hola >>> imprimir(“hola”, 2) holahola Número variable de argumentos ● Es posible definir funciones con un número variable de argumentos. Para ello se usa un parámetro final cuyo nombre debe ir precedido del carácter *: >>> def varios (par1, par2, *otros): ● ... for valores in otros: ... print(valores) Esta sintaxis funciona creando una tupla (de nombre otros en el ejemplo) en la que se almacenan los valores de todos los parámetros extra pasados como argumento. Número variable de argumentos (ejemplo) >>> varios(1, 2) >>> varios(1, 2, 3) 3 >>> varios(1, 2, 3, 4) 3 4 >>> varios('a', 'b', 'c', 'd') c d Argumentos con nombre ● ● También se puede preceder el nombre del último argumento con **, en cuyo caso en lugar de una tupla se utilizaría un diccionario. Las claves de este diccionario serían los nombres de los argumentos indicados al llamar a la función y los valores del diccionario, los valores asociados a estos argumentos. Argumentos con nombre ● En el siguiente ejemplo se utiliza la función items de los diccionarios, que devuelve una lista con sus elementos, para imprimir los argumentos que contiene el diccionario. >>> def varios (par1, par2, **mas): ... ... for i in mas.items(): print i ... >>> varios(1, 2, tercero=3) ('tercero', 3) Paso de argumentos por valor y referencia ● ● No todos los cambios que hagamos a los parámetros dentro de una función Python se reflejarán fuera de esta. En Python existen objetos inmutables, como las tuplas, las cadenas y los números, por lo que si intentáramos modificar una tupla pasada como argumento lo que ocurriría en realidad es que se crearía una nueva instancia, por lo que los cambios no se verían fuera de la función (aunque sí dentro de ella). Paso de argumentos por valor y referencia (ejemplos) ● En este ejemplo se hace uso de la función append de las listas: >>> def f(x, y): ... x = x + 3 ... y.append(23) ... print('dentro de f', x, y) ... >>> x = 22 >>> y = [22] >>> f(x, y) >>> print('fuera de f', x, y) Paso de argumentos por valor y referencia (ejemplos) ● El resultado de la ejecución de este programa sería: ('dentro de f', 25, [22, 23]) ('fuera de f', ● 22, [22, 23]) Como vemos la variable x no conserva los cambios una vez salimos de la función porque los enteros son inmutables en Python. Sin embargo la variable y si los conserva, porque las listas son mutables. Retornando valores en una función ● La sentencia return permite devolver valores. >>> def sumar (x,y): ... return x+y ... >>> print(sumar(2, 3)) 5 Esta función suma los valores pasados como argumentos y devuelve el resultado como valor de retorno. Retornando valores en una función ● También podríamos devolver varios valores con return. >>> def cuadrados (x, y): ... return x**2, y**2 ... >>> cuadrados(2, 4) (4, 16) >>> Aquí Python crea una tupla cuyos elementos son los valores a devolver y esta tupla es la que se devuelve. Funciones definidas (ejemplos) (Mejor introducir este programa en un fichero difs.py) from math import atan def finite_diff (f, x, h = 0.0001): ''' aproxima la primera y segunda derivada de f en x; h tiene un valor por defecto''' fm, f0, fp = f(x-h), f(x), f(x+h) df, ddf = (fp-fm)/(2*h), (fp-2*f0+fm)/h**2 return df, ddf x = 0.5 df, ddf = finite_diff(atan, x) print(’Primera derivada = ’, df) print(’Segunda derivada = ’, ddf) Funciones definidas (ejemplos) ● ● La función arco tangente (atan) se pasa a finite_diff como argumento. La salida del programa será: ('Primera derivada = ', 0.79999999957308665) ('Segunda derivada = ', -0.63999999189157109) Sentencia lambda ● Si la función tiene la forma de una expresión, puede ser definida de forma sencilla con la sentencia lambda, que permite funciones de una sola línea: nombre-funcion = lambda arg1, arg2, ...: expresion ● lambda se utiliza normalmente en programación funcional. Sentencia lambda (ejemplo) >>> c = lambda x, y : x**2 + y**2 >>> print(c(3, 4)) 25 Módulos ● ● ● ● Funciones relacionadas entre sí se pueden agrupar en módulos. Hay muchos (cientos) módulos preparados por desarrolladores para realizar tareas relacionadas entre sí. Un módulo también puede contener submódulos. En ese caso el módulo principal se denomina paquete (package). Excepto en el caso de programas muy simples, es conveniente subdividir las tareas en funciones asociadas en módulos. Pidiendo ayuda sobre módulos ● Dentro de Python se obtiene una lista de módulos usando: >>> help(“modules”) (Ojo, es una lista muy larga.) ● La ayuda de un módulo concreto se obtiene así: >>> help(nombre_del_módulo) por ejemplo: >>> help(“time”) nos da ayuda acerca de funciones sobre tiempo y fecha. El diseño de módulos no es difícil ● ● ● ● Un programador puede diseñar un módulo juntando funciones en un mismo fichero. El nombre del fichero pasará a ser el nombre del módulo. En el ejemplo siguiente se tiene un fichero “aritmetica.py” que puede usarse como módulo. Define dos variables (cero y uno) y dos funciones (suma y resta). Ejemplo (fichero “aritmetica.py”) “””Define diversas funciones y variables””” uno = 1 cero = 0 def suma (x, y): “””suma variables””” return x+y def resta (x, y): “””resta variables””” return x-y Ejemplo (fichero “aritmetica.py”) >>> from aritmetica import * >>># la línea anterior hace conocido todo lo >>># definido en el fichero aritmetica.py >>>print(uno) 1 >>>print(cero) 0 >>>suma(3, 4) 7 >>>resta(3, 4) -1 Ejemplo (fichero “aritmetica.py”) >>> import aritmetica >>># la línea anterior hace conocido todo lo definido en >>># el fichero aritmetica.py pero la invocación >>># necesita ser precedida del nombre del módulo (aritmetica) >>>print(aritmetica.uno) 1 >>>print(aritmetica.cero) 0 >>>aritmetica.suma(3, 4) 7 >>>aritmetica.resta(3, 4) -1 Listar el contenido de un módulo ● ● El contenido de un módulo puede ser mostrado con la sentencia dir(modulo). En el ejemplo anterior: >>> import aritmetica >>> dir(aritmetica) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'cero', 'resta', 'suma', 'uno'] Ayuda sobre un módulo ● Se pide ayuda sobre contenido de un módulo mediante help(modulo). ● En el ejemplo anterior: >>> import aritmetica >>> help(aritmetica) # la salida siguiente es aproximada Help on module aritmetica: NAME aritmetica - Define diversas funciones y variables FILE aritmetica.py FUNCTIONS resta(x, y) resta variables (continua con más texto) Variables globales y locales ● Las variables definidas en un fichero fuera de una función son globales y se conocen a partir de su definición dentro del fichero (incluso dentro de las funciones): x = 3 def f (y): print(x, y) f('a') # imprime (3, 'a') Variables globales y locales ● Sin embargo si dentro de una función se asigna una variable de ese nombre se pierde el acceso a la vieja: x = 3 def f (y): x = 8 # crea una nueva variable local a la función print(x, y) # usa la nueva x; no hay acceso a la otra f('a') # imprime: (8, 'a') print(x) # fuera de la función, imprime 3 Variables globales y locales ● Si queremos asignar a una variable un valor dentro dentro de una función se debe usar la sentencia global: x = 3 def f (y): global x # esta x no es nueva, sino la definida antes x = 8 print(x, y) f('a') # imprime (8, 'a') print(x) # imprime 8 ● ● Se dice que existe un efecto lateral y debe tenerse especial cuidado. Se denomina función pura aquélla que no tiene efectos laterales (no usa variables globales, ni paso por referencia ni maneja ficheros). Algunos módulos estándar ● ● ● En Python la mayoría de las funciones matemáticas se encuentran en el módulo math. El módulo time nos da información sobre tiempo y fecha. El módulo sys nos permite interaccionar con el sistema operativo (también existe otro módulo os con más funciones). Módulo math ● ● En Python la mayoría de las funciones matemáticas se encuentran en el módulo math. Existen tres formas de acceder a las funciones dentro del módulo: ● ● ● Cargado todas las funciones del módulo from math import * Seleccionando las funciones from math import func1, func2 El utilizado por la mayoría de los programadores que consiste en tener habilitado el módulo import math Funciones dentro del módulo math ● Dentro de math tenemos las funciones: acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, erf, erfc, exp, expm1, fabs, factorial, floor, fmod, frexp, fsum, gamma, hypot, isinf, isnan, ldexp, lgamma, log, log10, log1p, modf, pow, radians, sin, sinh, sqrt, tan, tanh, trunc y las variables: e = 2.7182818284590451 pi = 3.1415926535897931 Módulo time ● Nos proporciona funciones para el manejo de fechas y del tiempo. Algunas interesantes son: ● ● ● ● time.time() nos devuelve el número de segundos desde un instante inicial (dependiente del SO). time.ctime(x) nos devuelve una cadena con la fecha que corresponde al tiempo x en segundos. Si no se indica x se usa la fecha y hora actuales. time.sleep(x) suspende la ejecución durante x segundos. time.clock() nos devuelve el tiempo de ejecución de CPU hasta ese momento del intérprete de Python. Ejemplo de uso de time.clock() Tecleemos el fichero pruebacos.py: import time, math t = time.clock() for i in range(1000000): math.cos(i) dt = (time.clock()-t)/1000000 print('un coseno tarda %e s de CPU' % dt) $ python pruebacos.py un coseno tarda 5.200000e-07 s de CPU Módulo sys ● Nos proporciona funciones para interaccionar con el sistema operativo. Algunas interesantes son: ● sys.platform es una cadena con el nombre del sistema operativo. ● ● sys.exit(n) acaba el programa, devolviendo un número entero n al sistema operativo como código de finalización. sys.argv es una lista con los argumentos que hemos utilizado al llamar al intérprete de Python. Sirve para pasar información a nuestro programa. El primer elemento de la lista es siempre el nombre de nuestro programa. Ejemplo de uso de sys.argv Tecleemos el fichero param.py: import sys for i, a in enumerate(sys.arg): print(i, a) $ python param.py 1.2 'y=2*log(x)' 'mi nombre' (0, 'param.py') (1, '1.2') (2, 'y=2*log(x)') (3, 'mi nombre')