lenguaje Python Computadores El diccionario de la Real Academia define computador electrnico como Maquina electrnica, analgica o digital, dotada de una memoria de gran capacidad y de mtodos de tratamiento de la informacin, capaz de resolver problemas maten ticos y lgicos mediante la utilizacin automtica de programas informticos.La propia definicin nos da indicaciones acerca de algunos elementos bsicos del computador: la memoria, y algn dispositivo capaz de efectuar clculos maten ticos y lgicos.
La memoria es un gran almacn de informacin. En la memoria almacenamos todo tipo de datos: valores numricos, textos, imgenes, etc. El dispositivo encargado de efectuar operaciones maten ticas y lgicas, que recibe el nombre de Unidad Aritmetico- Logica(UAL), es como una calculadora capaz de trabajar con esos datos y producir, a partir de ellos, nuevos datos (el resultado de las operaciones). Otro dispositivo se encarga de transportar la informacin de la memoria a la UAL, de controlar a la UAL para que efectelas operaciones pertinentes y de depositar los resultados en la memoria: la Unidad de Control. El conjunto que forman la Unidad de Control y la UAL se conoce por Unidad Central de Proceso (o CPU, del inglesCentral Procesan Unir).Podemos imaginar la memoria como un armario enorme con cajones numerados y la CPU como una persona que, equipada con una calculadora (la UAL), es capaz de buscaroperandos en la memoria, efectuar clculos con ellos y dejar los resultados en la memoria. 2 De 29 1. Introduccin como obtener el lenguaje Python Codificacin de la informacin Una codificacin asocia signos con los elementos de un conjunto a los que denominamos significados. En occidente, por ejemplo, codificamos los nmeros de cero a nueve con el conjunto de signos {0 1 2 3 4 5 6 7 8 9}. Al hacerlo, ponemos en correspondencia estos smbolos con cantidades, es decir, con su significado: el smbolo 6 representa ala cantidad seis. El conjunto de signos no tiene por que ser finito. Podemos combinarlos dgitos en secuencias que ponemos en correspondencia con, por ejemplo, los nmeros naturales. La sucesin de dgitos 99 forma un nuevo signo que asociamos a la cantidad noventa y nueve. Los ordenadores solo tienen dos signos bsicos, {0 1}, pero se pueden combinar en secuencias, as que no estamos limitados a solo dos posibles significados. Una variable que solo puede tomar uno de los dos valores binarios recibe el nombre de bit (acrnimo del ingles binar digita). Es habitual trabajar con secuencias de bits de tamao fijo. Una secuencia de 8 bits recibe el nombre de byte (aunque en espaol extermino correcto es octeto, este no acaba de imponerse y se usa la voz inglesa). Con una secuencia de 8 bits podemos representar 256 (28) significados diferentes. El rango [0 255]de valores naturales comprende 256 valores, as que podemos representar cualquiera de ellos con un patrn de 8 bits. Podramos decidir, en principio, que la correspondencia entre bytes y valores naturales es completamente arbitraria. As, podramos decidir quela secuencia 00010011 representa, por ejemplo, el numero natural 0 y que la secuencia01010111 representa el valor 3. Aunque sea posible esta asociacin arbitraria, no es deseable, pues complica enormemente efectuar operaciones con los valores. Sumar, por ejemplo, obligara a tener memorizada una tabla que dijera cual es el resultado de efectuarla operacin con cada par de valores, y hay 65536 pares diferentes! 3 De 29 1. Introduccin como obtener el lenguaje Python Programas y lenguajes de programacin Antes de detenernos a hablar de la codificacin de la informacin estbamos comentando que la memoria es un gran almacn con cajones numerados, es decir, identificables con valores numricos: sus respectivas direcciones. En cada cajn se almacena una secuenciada bits de tamao fijo. La CPU, el cerebro del ordenador, es capaz de ejecutar acciones especificadas mediante secuencias de instrucciones. Una instruccin describe una accin muy simple, del estilo de suma esto con aquello, multiplica las cantidades que hay en tal y cual posicin de memoria, deja el resultado en tal direccin de memoria, hazaa copia del dato de esta direccin en esta otra direccin, averigua si la cantidad almacenada en determinada direccin es negativa, etc. Las instrucciones se representan mediante combinaciones particulares de unos y ceros (valores binarios) y, por tanto, se pueden almacenar en la memoria. Combinando inteligentemente las instrucciones en una secuencia podemos hacer que la CPU ejecute clculos ms complejos. Una secuencia de instrucciones es un programa. Si hay una instruccin para multiplicar pero ninguna para elevar un numero al cubo, podemos construir un programa que efectu este ultimo calculo a partir de las instrucciones disponibles. He aqu, grosso modo, una secuencia de instrucciones que calcula el cubo apartar de productos: 1. Toma el nmero y multiplcalo por s mismo. 2. Multiplica el resultado de la ultima operacin por el numero original. 4 De 29 1. Introduccin como obtener el lenguaje Python Hay una solucin intermedia: podemos disear lenguajes de programacin que, sin ser tan potentes y expresivos como los lenguajes naturales, eliminen buena parte de la complejidad propia de los lenguajes ensambladores y estn bien adaptados al tipo de problemas que podemos resolver con los computadores: los denominados lenguajes de programacin de alto nivel. El calificativo de alto nivel seala su independencia de un ordenador concreto. Por contraposicin, los cdigos de maquina y los lenguajes ensambladores sede nominan lenguajes de programacin de bajo nivel. He aqu el programa que calcula la media de tres nmeros en un lenguaje de alto nivel tpico (Python):
Las tres primeras lneas definen los tres valores y la cuarta calcula la media. Como puedes ver, resulta mucho ms legible que un programa en cdigo de maquina o en un lenguaje ensamblador. Para cada lenguaje de alto nivel y para cada CPU se puede escribir un programa queso encargue de traducir las instrucciones del lenguaje de alto nivel a instrucciones de cdigo de maquina, con lo que se consigue la deseada independencia de los programas con respecto a los diferentes sistemas computadores. Solo habr que escribir una versin del programa en un lenguaje de programacin de alto nivel y la traduccin de ese programaal cdigo de maquina de cada CPU se realizar automaticamente.
5 De 29 2. Una calculadora avanzada Cuando programamos utilizamos un conjunto de herramientas al que denominamos entorno de programacin. Entre estas herramientas tenemos editores de texto (que nos permiten escribir programas), compiladores o interpretes (que traducen los programas a cdigo de maquina), depuradores (que ayudan a detectar errores), analizadores de tiempo de ejecucin (para estudiar la eficiencia de los programas), etc. Los lenguajes interpretados suelen ofrecer una herramienta de ejecucin interactiva. Con ella es posible dar ordenes directamente al interprete y obtener una respuesta inmediata para cada una de ellas. Es decir, no es necesario escribir un programa completo para empezar a obtener resultados de ejecucin, sino que podemos dialogar con el interprete de nuestro lenguaje de programacin: le pedimos que ejecute una orden y nos responde con su resultado. El entorno interactivo es de gran ayuda para experimentaron fragmentos de programa antes de incluirlos en una versin definitiva. En esta seccin veremos como realizar sesiones de trabajo interactivo con Python.1 6 De 29 2.1 Tipos de datos Enteros y flotantes Cada valor utilizado por Python es de un tipo determinado. Hasta el momento solo hemos utilizado datos de tipo entero, es decir, sin decimales. Cuando se efecta una operacion,Python tiene en cuenta el tipo de los operando a la hora de producir el resultado. Silos dos operando son de tipo entero, el resultado tambin es de tipo entero, as que la divisin entera entre los enteros 3 y 2 produce el valor entero 1.Si deseamos obtener resultados de tipo real, deberemos usar operando reales. Losoperandos reales deben llevar, en principio, una parte decimal, aunque esta sea nula. 7 De 29 2.1 Tipos de datos Hay tres operadores lgicos en Python: la y lgica o conjuncin (and), la o lgica o disyuncin (ir) y el no lgico o negacin (nota).El operador and da como resultado el valor cierto si y solo si son ciertos sus despernados. Esta es su tabla de verdad: El operador ir proporciona True si cualquiera de sus operando es True, y False solaceando ambos operando son Falses. Esta es su tabla de verdad: El operador nota es unario, y proporciona el valor True si su operando es False y viceversa. He aqu su tabla de verdad: 8 De 29 2.2 Funciones predefinidas Hemos estudiado los operadores aritmticos bsicos. Python tambin proporciona funciones que podemos utilizar en las expresiones. Estas funciones se dice que estn predefinidas. La funcin ABS, por ejemplo, calcula el valor absoluto de un numero. Podemos usarla como en estas expresiones:
El numero sobre el que se aplica la funcin se denomina argumento. Observa que el argumento de la funcin debe ir encerrado entre parntesis: 9 De 29 3. Entrada y salida de datos, print, formatos, grficos Los programas que hemos visto en la seccin anterior adolecen de un serio inconveniente: cada vez que quieras obtener resultados para unos datos diferentes debers editar el fichero de texto que contiene el programa. Por ejemplo, el siguiente programa calcula el volumen de una esfera a partir de su radio, que es de un metro:
Aqu tienes el resultado de ejecutar el programa: 10 De 29 4. Estructuras de control Los programas que hemos aprendido a construir hasta el momento presentan siempre una misma secuencia de acciones: Se piden datos al usuario (asignando a variables valores obtenidos con raw_input). Se efectan clculos con los datos introducidos por el usuario, guardando el resultado en variables (mediante asignaciones). Se muestran por pantalla los resultados almacenados en variables (mediante la sentencia print).
11 De 29 4.1 Sentencias condicionales Veamos un ejemplo. Diseemos un programa para resolver cualquier ecuacin de primer grado de la forma ax + b = 0 donde x es la incgnita.
Antes de empezar hemos de responder a dos preguntas: 1. Cuales son los datos del problema? (Generalmente, los datos del problema se pedirn al usuario con raw_input.) En nuestro problema, los coeficientes y son los datos del problema 2. Que deseamos calcular? (Tpicamente, lo que calculemos se mostrar 'a al usuario mediante una sentencia print.)Obviamente, el valor de x.
Ahora que conocemos los datos de entrada y el resultado que hemos de calcular, es decir, los datos de salida, nos preguntamos: cmo calculamos la salida a partir de la entrada? En nuestro ejemplo, despejando x de la ecuacin llegamos a la conclusin de que x se obtiene calculando b/a.
12 De 29 4.1 Sentencias condicionales Siguiendo el esquema de los programas que sabemos hacer, procederemos as: 1. Pediremos el valor de a y el valor de b (que supondremos de tipo flotante). 2. Calcularemos el valor de como b/a. 3. Mostraremos por pantalla el valor de x. Escribamos el siguiente programa en un fichero de texto llamado primer- grado.py:
Las lneas se ejecutan en el mismo orden con el que aparecen en el programa. 13 De 29 4.2 Sentencias Iterativas A 'un vamos a presentar una ultima reflexin sobre el programa de los mens. Cuando el usuario no escoge correctamente una opcin del men el programa le avisa, pero finaliza inmediatamente. Lo ideal seria que cuando el usuario se equivocara, el programa le pidiera de nuevo una opcin. Para eso seria necesario repetir la ejecucin de las lneas 1121. Una aproximacin naif consistira, bsicamente, en aadir al final una copia de esas lneas precedidas de un if que comprobara que el usuario se equivoco. Pero esa aproximaciones muy mala: que pasara si el usuario se equivocara una segunda vez? Cuando decimos que queremos repetir un fragmento del programa no nos referimos a copiarlo de nuevo, sino a ejecutarlo otra vez. Pero, es posible expresar en este lenguaje que queremos queso repita la ejecucin de un trozo del programa? Python permite indicar que deseamos que se repita un trozo de programa de dos formas distintas: mediante la sentencia chile y mediante la sentencia for. La primera de ellas es ms general, por lo que la estudiaremos en primer lugar. 14 De 29 4.2 captura y tratamiento de excepciones 15 De 29 4.4 Algunos ejemplos grficos Nuestro objetivo ahora es utilizar las funciones graficas predefinidas para representar la funcin seno entre 2 y 2. Vamos a empezar definiendo el nuevo sistema de coordenadas con una llamada a window_coordinates(x1, y1, x2, y2). Esta claro que x1 valdr 2 y x2 valdr 2. Que valores tomaran y1 e y2? La funcin seno toma valores entre 1 y 1, as que esos son los valores que asignaremos a y1 e y2, respectivamente.
Recuerda que, en el sistema de coordenadas del lienzo, la esquina inferior izquierda es el punto (0,0) y la esquina superior derecha es el punto (1000,1000). Si dibujamos directamente valores de la funcin seno, no apreciaremos el aspecto ondulado que esperamos: el valor mximo del seno es 1, que sobre 1000 es un valor muy pequeo, y el valor mnimo es 1, que ni siquiera se mostrar en pantalla. 16 De 29 4.4 Algunos ejemplos grficos Hay una funcin predefinida que nos permite cambiar el sistema de coordenadas, window_coordinates, y otra que nos permite cambiar el tamao del lienzo, window_size. window_coordinates(x1, y1, x2, y2): Cambia el sistema de coordenadas del lienzo. La esquina inferior izquierda pasa a tener coordenadas (x1,y1) y la esquina superior derecha pasa a tener coordenadas (x2, y2). window_size(x , y): Cambia el tamao del lienzo, que pasa a tener una anchura de pxeles y una altura de pxeles. Empezaremos ajustando las dimensiones del lienzo, su sistema de coordenadas y dibujando algunos puntos de la funcin seno:
17 De 29 5. Tipos de estructurados: cadenas, listas, matrices Longitud de una cadena: numero de caracteres que la forman.
Hay una cadena que merece especial atencin, la cadena que denotamos abriendo y cerrando inmediatamente las comillas simples, , o dobles, "", sin ningn carcter entre ellas. Qu valor devuelve len()? La cadena se denomina cadena vaca y tiene longitud cero. No confundas la cadena vaca, , con la cadena que contiene un espacio en blanco, , pues, aunque parecidas, no son iguales. Fjate bien en que la segunda cadena contiene un carcter (el espacio en blanco) y, por tanto, es de longitud 1. Podemos comprobarlo fcilmente: 18 De 29 5. Tipos de estructurados: cadenas, listas, matrices El concepto de secuencia es muy potente y no se limita a las cadenas. Python nos permite definir secuencias de valores de cualquier tipo. Por ejemplo, podemos definir secuenciase nmeros enteros o flotantes, o incluso de cadenas. Hablamos entonces de listas. Enana lista podemos, por ejemplo, registrar las notas de los estudiantes de una clase, la evolucin de la temperatura hora a hora, los coeficientes de un polinomio, la relacin de nombres de personas asistentes a una reunin, etc. Python sigue una notacin especial para representar las listas. Los valores de analista deben estar encerrados entre corchetes y separados por comas. He aqu una lista con los nmeros del 1 al 3:
Podemos asignar listas a variables:
Los elementos que forman una lista tambin pueden ser cadenas. 19 De 29 5. Tipos de estructurados: cadenas, listas, matrices Las matrices son disposiciones bidimensionales de valores. En notacin maten tica, una matriz se denota encerrando entre parntesis los valores, que se disponen en filas y columnas. He aqu una matriz M:
Esta matriz tiene 4 filas y 3 columnas, lo cual abreviamos diciendo que es una matriz redimensin 4 3.Las listas permiten representar series de datos en una sola dimensin. Con una listada nmeros no se puede representar directamente una matriz, pero si con una lista de listas. 20 De 29 5. Tipos de estructurados: cadenas, listas, matrices En la notacin maten tica el elemento que ocupa la fila i-sima y la columna j-sima una matriz M se representa con M . Por ejemplo, el elemento de una matriz que ocupa la celda de la fila 1 y la columna 2 se denota con M12. Pero si deseamos acceder a ese elemento en la matriz Python M, hemos de tener en cuenta que Python siempre cuenta desde cero, as que la fila tendr ndice 0 y la columna tendr ndice 1:
Observa que utilizamos una doble indexacin para acceder a elementos de la matriz. Por que? El primer ndice aplicado sobre M devuelve un componente de M, que es una lista:
21 De 29 6. Funciones En captulos anteriores hemos aprendido a utilizar funciones. Algunas de ellas estn predefinidas (ABS, round, etc.) mientras que otras deben importarse de mdulos ntese poder ser usadas (por ejemplo, sin y coz se importan del modulo match). En este tema aprenderemos a definir nuestras propias funciones. Definiendo nuevas funciones estaremos enseando a Python a hacer clculos que inicialmente no sabe hacer y, incierto modo, adaptando el lenguaje de programacin al tipo de problemas que deseamos resolver, enriquecindolo para que el programador pueda ejecutar acciones complejas de un modo sencillo: llamando a funciones desde su programa. Ya has usado mdulos, es decir, ficheros que contienen funciones y variables de valor predefinido que puedes importar en tus programas. En este capitulo aprenderemos a crear nuestros propios mdulos, de manera que reutilizar nuestras funciones en varios programas resultara extremadamente sencillo: bastara con importarlas. 22 De 29 6. Funciones Denominaremos activar, invocar o llamar a una funcin a la accin de usarla. Las funciones que hemos aprendido a invocar reciben cero, uno o ms argumentos separados por comas y encerrados entre un par de parntesis y pueden devolver un valor o no devolver nada.
Podemos llamar a una funcin desde una expresin. Como el resultado tiene un tipo determinado, hemos de estar atentos a que este sea compatible con la operacin y tipo de los operando con los que se combina:
Ves? En el ultimo caso se ha producido un error de tipos porque se ha intentado sumar una cadena, que es el tipo de dato del valor devuelto por str, a un entero. Observa que los argumentos de una funcin tambin pueden ser expresiones: 23 De 29 6. Funciones Empezaremos definiendo una funcin muy sencilla, una que recibe un numero y devuelve el cuadrado de dicho numero. El nombre que daremos a la funcin es cuadrado. Observaste fragmento de programa:
Ya esta. Acabamos de definir la funcin cuadrado que se aplica sobre un valor al que llamamos y devuelve un numero: el resultado de elevar al cuadrado. En el programa aparecen dos nuevas palabras reservadas: def y return. La palabra def es abreviatura de define y return significa devuelve en ingles. Podramos leer el programa anterior como define cuadrado de como el valor que resulta de elevar al cuadrado.En las lneas que siguen a su definicin, la funcin cuadrado puede utilizarse del mismo modo que las funciones predefinidas: 24 De 29 7. Tipos estructurados: registros El conjunto de tipos de datos Python que hemos estudiado se divide en tipos escalares(enteros y flotantes) y tipos secuenciales (cadenas y listas). En este tema aprenderemos a definir y utilizar tipos de datos definidos por nosotros mismos agregando tipos de datos de diferente o igual naturaleza. Por ejemplo, podremos definir un nuevo tipo que rena un entero y dos cadenas o uno diferente con una lista y un flotante. Los datos de estos nuevos tipos reciben el nombre de registros. Los registros nos permiten modelar objetos del mundo real que deben describirse mediante una coleccin de informaciones, como personas (descritas por nombre, apellidos, DNI, edad, etc.), canciones (descritas por titulo, autor, interprete, estilo, etc.), fechas (descritas por da, mes y ao), etc. 25 De 29 7. Tipos estructurados: registros Supn que en un programa utilizamos el nombre, el DNI y la edad de dos personas. En principio, necesitaremos tres variables para almacenar los datos de cada persona: dos variables con valores de tipo cadena (el nombre y el DNI) y otra con un valor de tipo entero (la edad): Los datos almacenados en nombre, DNI y edad corresponden a la primera persona los datos guardados en otro nombre, otro ni u otra edad corresponden a la segunda persona, pero nada en el programa permite deducir eso con seguridad: cada dato est almacenado en una variable diferente y completamente independiente de las dems. 26 De 29 7. Tipos estructurados: registros El programador debe recordar en todo momento que variables estn relacionadas entre s para utilizarlas coherentemente. Diseemos un procedimiento que muestre por pantalla los datos de una persona y usmoslo: Al ejecutar el programa, por pantalla parecer 'a: 27 De 29 8. Archivos Desde el punto de vista de la programacin, los ficheros son objetos en los que podemos escribir y/o leer informacin. El trabajo con ficheros obliga a seguir siempre un protocolo de tres pasos: 1. Abrir el fichero indicando su ruta (relativa o absoluta) y el modo de trabajo. Hay varios modos de trabajo: Lectura: es posible leer informacin del fichero, pero no modificarla ni aadir nueva informacin. Escritura: solo es posible escribir informacin en el fichero. Por regla general, la apertura de un fichero en modo escritura borra todo el contenido previo del mismo. Lectura/escritura: permite leer y escribir informacin del fichero. Adicin: permite aadir nueva informacin al fichero, pero no modificar la ya existente.
2. Leer o escribir la informacin que desees. 3. Cerrar el fichero.
Es importante que sigas siempre estos tres pasos. Es particularmente probable que olvides cerrar el fichero, pues Python no detectara esta circunstancia como un fallo del programa. A 'un as, no cerrar un fichero se considera un grave error de programacin. Lee el cuadro Y por que hay que cerrar los ficheros? si quieres saber por que.
28 De 29 8. Archivos Puede interesarte en ocasiones leer una sola lnea de un fichero de texto. Pues bien, el mtodo readline hace precisamente eso. Este programa, por ejemplo, lee un fichero lnea lnea y las va mostrando por pantalla, pero haciendo uso de readline:
Observa cuando finaliza el bucle: al leer la cadena vaca, pues esta indica que hemos llegado al final del fichero. Como ves, es algo ms complicado que este otro programa equivalente:
De todos modos, no esta de ms que comprendas bien el mtodo ms complicado: es muy parecido al que usaremos cuando accedamos a ficheros con el lenguaje de programacin C.