67% encontró este documento útil (3 votos)
750 vistas

Python PDF

Cargado por

jimmy sanchez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
67% encontró este documento útil (3 votos)
750 vistas

Python PDF

Cargado por

jimmy sanchez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Está en la página 1/ 116
PY IRON Paso a paso Angel Pablo Hinojosa Gutiérrez aP Ra-Ma’* PYTHON PYTHON Paso a paso Paso a paso Angel Pablo Hinojosa Gutiérrez + Ra-Ma’ La ley prohibe Copiar o Imprimir est libro Python. Paso a Paso © Angel Pablo Hinojosa Gutigirez © De la Edicién Original en papel publicada por Editorial RA-MA ISBN de Edicién en Papel: 978-84-9964-611-4 ‘Todos los derechos reservados © RA-MA, S.A. Editorial y Publicaciones, Madrid, Espaiia. MARCAS COMERCIALES. Las designaciones utilizadas por las empresas para distinguir sus. productos (hardware, software, sistemas operativas, etc.) suelen ser marcas registradas. RA-MA ha intentado a lo largo de este libro’ distinguir las marcas comerciales de los términos descriptivos, siguiendo el estilo que utiliza el fabricante, sin intencién de infringir la marca y solo en beneficio del propietario de la misma. Los datos de los ejemplos y pantallas son ficticios a no ser que se especifique lo contrat, RAMA es una marca comercial registrada. Se ha puesto el méximo empeito en ofrecer al lector una informacién completa y precisa. Sin embargo, RA-MA Editorial no asume ninguna responsabilidad derivada de su uso ni tampaco de cualquier violacién de patentes ni otras derechos de terceras partes que pudieran ocurrir. Esta publicacién tiene por objeto proporcionar unos cconocimientos precisos y acreditados sobre el tema tratado. Su venta no supone para el editor ninguna forma de asistencia legal, administrativa o de ningtin otro tipo. En caso de precisarse asesoria legal u otra forma de ayuda cexperta, deben buscarse los servicios de un profesional competente Reservados todos los derechos de publicacién en cualquier idioma. Sogiin lo dispuesto en el Cédigo Penal vigente ninguna parte de este libro puede ser reproducida, grabada en sistema de almacenamiento o transmitida en forma alguna ni por cualquier procedimiento, ya sea electrénico, ‘mecénico, reprogrifico, magnético o cualquier otro sin autorizacién previa y por escrito de RA-MA; su contenido esté protegido por la Ley vigente que establece penas de prisién y/o multas a quienes, intencionadamente, reprodujeren o plagiaren, en todo o en parte, una obra literaria,artistica o cientifica, Editado por: RAMA, S.A. Editorial y Publicaciones Calle Jarama, 33, Poligono Industrial IGARSA. 28860 PARACUELLOS DE JARAMA, Madrid ‘Teléfono: 91 658 42 80 Fax: 91 662 81 39 Correo electrénico: [email protected] Internet: yewew.ra-ma.es y WWww.ra-ma.com Maquetacién y disefio portada: Antonio Garcia Tomé ISBN: 978-84.9964-612-1 E-Book desarrollado en Espafia en Marzo 2016 A Lidia SYNAPS PREMIUM INDICE CARTA AL LECTOR, CONVENCIONES USADAS EN ESTE LIBRO. CAPITULO 1. LENGUAJES DE PROGRAMACION 1.1 ALTO Y BAJO NIVEL. 1.2 LENGUAJES COMPILADOS E INTERPRETADOS 13 PARADIGMAS DE PROGRAMACION. 1.3.1 Programacién imperativa 1.3.2 Programacién orientada a objetos . 1.3.3. Programacién funcional... 1.4 {QUE HEMOS VISTO EN ESTE TEMA? AT CAPITULO 2. PYTHON 2.1 SOFTWARE LIBRE. 2.2 ELZEN DE PYTHON 2.3 PYTHON 2 VERSUS PYTHON 3.. 2.4 {QUE HEMOS VISTO EN ESTE TEMA? 2.4.1 Tareas sugeridas CAPITULO 3. ANTES DE EMPEZAR.. 3.1 INSTALAR PYTHON 3.1.1 Windows.. 3.1.2 Mac OS. 3.13 Linux 3.2. UNA VEZ INSTALADO. 30 3.21 ELIDLE... 8 PYTHON. PASO A PASO RAMA 33 CAPITULO 4. COMENZANDO A PROGRAMAR 41 42 43 CAPITULO 5. TRABAJANDO CON DATOS, 5.1 52 53 54 55 5.6 5.7 CAPITULO 6. ESTRUCTURAS DE CONTROL. 6.1 62 {QUE HEMOS VISTO EN ESTE TEMA? 33.1 Tareas sugeridas HOLA MUNDO... UTF . {QUE HEMOS VISTO EN ESTE TEMA‘ 43.1 Tareas sugeridas VARIABLES... TIPOS DE DATOS 5.2.1 Numeros enteros (int).. 5.2.2 Numeros enteros largos (long) . 5.2.3 Numeros en coma flotante (float). 34 5.2.4 Nimeros complejos (complex) 5.25 Notacién 5.2.6 Valores booleanos (bool) 5.2.7 Cadenas (str). 5.2.8 None 5.2.9 Manipular tipos de datos OPERADORES 53.1 Operadores matemiticos 53.2 Operadores de comparacién.. 53.3. Operadores de cadena. 53.4 Operadores ligico 53.5 Operadores de identidad. 5.3.6 Operadores de pertenencia 5.3.7 Operadores binarios. PRECEDENCIA ENTRE OPERADORES.. SECUENCIAS Y ESTRUCTURAS DE DATOS. 5.5.1 5.5.2 553 55.4 55.5 {QUE HEMOS VISTO EN ESTE TEMA? 5.7.1 Tareas sugeridas SALTO CONDICIONAL IF BUCLE WHILE. © RAMA 63 64 65 CAPITULO 7. FUNCIONES.. WW 72 73 1A 15 16 CAPITULO 8. OBJETOS Y CLASES 81 82 83 84 CAPITULO 9. MODULOS. 91 92 93 94 95 CAPITULO 10. TAREAS COMUNES 10.1 10.2 10.3 10.4 10.5 10.6 inDIce 9 BUCLE FOR.. CONTROL DE EXCEPCIONES .. {QUE HEMOS VISTO EN ESTE TEMA? 6.5.1 Tareas sugeridas AMBITO DE LAS VARIABLES... DOCSTRINGS .. GENERADORES. DECORADORES FUNCIONES LAMBDA... {QUE HEMOS VISTO EN ESTE TEMA? 7.6.1 Tareas sugeridas HERENCIA... CLASES NEW STYLE 8.2.1 Descriptores PYTHON Y LOS OBJETOS {QUE HEMOS VISTO EN ESTE TEMA? 8.4.1 Tareas sugeridas ESPACIOS DE NOMBRES...... PAQUETES LA LIBRERIA ESTANDAR..... INSTALAR NUEVOS MODULOS Y PAQUETES. 9.4.1 Python Package Index... 9.4.2 El médulo pip {QUE HEMOS VISTO EN ESTE TEMA? 9.5.1 Tareas sugerida CADENAS CON FORMATO MODULO MULTIUSO....... INTERACCION CON EL USUARIO . OBTENER PARAMETROS DE LA LINEA DE COMANDOS INTERFAZ GRAFICA CON TK .. MANEIO DE FICHEROS.. 10 PYTHON. PASO A PASO RAMA 10.7 ,QUE HEMOS VISTO EN ESTE TEMA‘ 10.7.1 Tareas sugeridas APENDICE I. FUNCIONES Y CLASES NATIVAS APENDICE II. MODULOS DE LA LIBRERIA ESTANDAR DE PYTHO! APENDICE III. DIFERENCIAS ENTRE PYTHON 2 Y PYTHON 3.. INDICE ALFABETICO.. SYNAPS PREMIUM CARTA AL LECTOR Estimado lector: Te agradezco la confianza que demuestras al leer este libro, y espero ser merecedor de ella. Este libro es una introduccién al lenguaje de programacién Python. He intentado ser exhaustivo sin perderme en complejidades ni sofisticaciones de menor utilidad. Python es un lenguaje muy amplio y un solo libro del tamafio de este es insuficiente para abarcar toda su extensién, por lo que ciertas ideas, necesariamente, se han quedado fuera. En este libro hablo en segunda persona del singular. He crefdo que es el tiempo verbal mas acorde con el tono de este libro. Pretendo que este texto sea un acompaiiamiento, un aprendizaje compartido. Los ejemplos estan diseftados de modo que puedan ser copiados y ejecutados sin necesidad de afiadir o quitar nada. No hay, en la medida de lo posible, ejemplos parciales 0 fuera de contexto, sino que hasta el ejemplo mas simple o trivial es un programa plenamente funcional. Te animo a que, durante el proceso de aprendizaje, copies esos ejemplos para ver cémo funcionan y los modifiques e introduzcas cambios y variaciones a tu gusto, para ver cémo cambia la respuesta del programa. Para facilitar esto, todos los ejemplos estin disponibles en Internet, en la direccién hitp://psicobyte.github.io/ejemplos-python. Todo el contenido de este libro est concebido sobre la base de que se parte sin conocimiento alguno en programacién, y he tratado de explicar cada concepto desde el nivel mas basico posible. 12 PYTHON. PASO A PASO RAMA Naturalmente, no es posible partir del cero absoluto, y se espera que el lector tenga un cierto conocimiento del funcionamiento de su sistema operativo. En particular, son necesarios unos conocimientos bisicos de cosas como abrir un terminal, el uso de la linea de comandos, instalar y ejecutar programas, conocer y saber moverse por la estructura de directorios de su sistema operativo, etc. Cuando ha sido posible, he acompafiado el texto con enlaces a la pagina oficial de Python y otros recursos online, para proveer de informacién ampliada sobre el concepto del que se habla en cada momento. Esos enlaces no son en ningiin caso necesarios para el seguimiento del libro, y solo se aportan para el lector que quiere llegar un poco més alla. Aunque se puede usar cualquier plataforma capaz de ejecutar un editor de textos y un intérprete de Python para seguir este libro, las instrucciones que dependan de un sistema operativo, cuando han sido necesarias, se han dado para Linux, Windows y Mac OS. En cualquier caso, este libro se ha escrito usando Linux; te recomiendo encarecidamente el uso de este sistema operativo, y a lo largo de todo el texto voy a suponer que estas usando alguna versién de Linux. {Por qué precisamente Linux? Primero porque probablemente has pagado por este libro, y no puedo obligarte a que gastes afin ms de tu dinero: Linux es una familia de sistemas operativos que, al igual que el propio Python, son software libre y casi siempre gratuitos. Segundo porque los sistemas Linux traen “de serie” todas las herramientas necesarias para la programacién. Al contrario que sistemas comerciales més orientados al usuario doméstico o de oficina, Linux es por si mismo una completa plataforma de desarrollo. Detodos modos, si prefieres usar otro sistema, Python funciona perfectamente en cualquiera de ellos y todos los ejemplos y explicaciones de este libro estan pensados para adecuarse perfectamente a todas las plataformas. SYNAPS PREMIUM CONVENCIONES USADAS EN ESTE LIBRO Cuando se mencione en el texto algin elemento del lenguaje, este apareceré resaltado como en este ejemplo con la funcién input (). Los ejemplos de cédigo, que pueden copiarse directamente para probarlos, se muestran del siguiente modo: #1 /usr/bin/python # -*- coding: utf-8 -*- def saluda(): retum "hola mundo" hola = saluda() print hola Salida del programa: Hola Mundo Siempre que sea posible, los ejemplos de cédigo van seguidos por la salida del programa (es decir, el resultado de ejecutar ese cédigo). Salvo que se diga lo contrario, en los ejemplos se supone que el nombre del programa es test .py. Las notas y aclaraciones siguen el siguiente formato: 14 PYTHON, PASO A PASO RAMA Cuando se adjunte un ink al texto, se mostrar como en este ejemplo que apunta a la pagina oficial de Python: https://docs.python.org. Al final de cada capitulo hay un pequefio resumen de los temas que se han visto, a modo de recordatorio, seguido de algunas tareas que se sugieren para practicar o ampliar lo aprendido. SYNAPS PREMIUM LENGUAJES DE PROGRAMACION Durante los iltimos afios, en apenas el espacio de una generacién, la informatica ha pasado de ser una simple curiosidad a dominar practicamente todos los aspectos de nuestra vida. Pese a que el ordenador personal es el primer dispositivo que nos viene a la mente cuando pensamos en computacién, hoy en dia es posible escribir programas para casi cualquier aparato imaginable, desde grandes mAquinas industriales hasta pequefios dispositivos. En todos nuestros electrodomésticos, automéviles, teléfonos, televisores, redes de comunicacién, cajeros... hay un ordenador programable que se ocupa de llevar a cabo las tareas que se le han encomendado. Hoy en dia, todo el mundo tiene una idea, aunque sea mAs 0 menos intuitiva, de lo que es un “programa”. ‘A grandes rasgos, un programa informatico no es mas que un archivo con un conjunto de instrucciones para que el ordenador haga algo. Ese algo puede ser una tarea simple como sumar dos digitos 0 algo muy complejo, como la gestién que hace un sistema operativo de todas las tareas que el ordenador ejecuta en un momento determinado. Los programas informaticos actiian sobre datos, sobre otros programas 0 sobre dispositivos fisicos. 1.1 ALTO Y BAJO NIVEL Los ordenadores (0, mas exactamente, sus procesadores) usan internamente un Ienguaje propio Hlamado cédigo maquina. De hecho, hay mas de un cédigo maquina, y el que reconoce un tipo de ordenadores no es reconocido por otros. El 16 PYTHON. PASO A PASO RAMA cédigo maquina no es mas que sucesiones de unos y ceros, y no esta pensado para ser escrito ni lefdo por personas. Pese a todo, originalmente, la gente literalmente programaba ordenadores escribiendo unos y ceros. Bien tecleéndolos en una consola, bien activando o desactivando interruptores, o bien perforando agujeros en una tarjeta de cartén. El nivel de abstraccién que esto requiere es desmesurado. Por ejemplo, para almacenar el mimero 150 en un determinado registro de memoria del procesador, la instruccién en cédigo maquina podria ser algo asi: 1011000010010110 Los primeros cuatro digitos son la orden de escribir el dato, la segunda serie de cuatro indica el registro de memoria en el que se quiere guardar, y el iltimo grupo de cuatro digitos se corresponde con el niimero 150 en representacién binaria. Como escribir instrucciones asi es aburrido, dificil, y propenso a errores, se inventé el lenguaje ensamblador. EI lenguaje ensamblador, mas que un lenguaje de programacién en si, es un simple sistema nemotécnico. En lugar de escribir largas ristras de mimeros, se escribian algunas instrucciones cortas que, posteriormente, un programa traducia a estas ristras de mimeros. Por ejemplo: en lugar de usar “1011” como instruccién para guardar un dato en la memoria, se podia usar la palabra MOV. Cada registro de memoria del procesador tenia un nombre (AX, en el ejemplo que hemos visto) y los nimeros se podian escribir en hexadecimal, que es ms corto y facil de recordar que el binario. Asi, nuestra instruccién quedaria mas 0 menos asi (96h es 150 escrito en notacién hexadecimal): Mov AX 96h Esto era un avance, pero atin se sigue trabajando con instrucciones limitadas a registros de memoria, muy préximas a la forma de trabajar del ordenador, pero muy lejos de la légica humana. Naturalmente, conforme se iban escribiendo programas més complejos, esto se volvié impracticable. Hubo que inventar lenguajes de programacién propiamente dichos, mAs sofisticados que el ensamblador. © RAMA Capitulo 1. LENGUAJES DE PROGRAMACION 17 Estos lenguajes permiten usar instrucciones que ya no se traducen a una sola instruceién de cédigo maquina, sino a complejos conjuntos de ellas. Por ejemplo, para sumar varios mimeros ya no hacia falta operar paso a paso moviendo bits entre distintos registros de memoria, teniendo en cuenta la longitud de los digitos, controlando el acarreo, moviendo el resultado a cierta zona de memoria, etc., sino que, simplemente, se podia escribir algo como “5000 +745 + 46”. Hoy en dia existen multitud de lenguajes de programacién pero, aunque los lenguajes ensambladores se siguen usando para ciertas tareas muy concretas, con el tiempo los lenguajes de programacién se han ido aproximando més a nuestro propio lenguaje natural (0, para ser exactos, al inglés) y a la forma de pensar de los seres humanos. En esto, como en casi todo, hay grados, y Ilamamos lenguajes de bajo nivel a aquellos que se acercan al modo de trabajar del ordenador, y lenguajes de alto nivel a los que se parecen mas al modo de trabajar de los seres humanos. 1.2 LENGUAJES COMPILADOS E INTERPRETADOS Para salvar el escollo entre lenguajes que entiende el procesador y lenguajes que entienden los humanos hay dos perspectivas: los lenguajes compilados y los interpretados. Un lenguaje compilado es el que, tras escribir el programa, debe ser pasado por un programa especial (Ilamado compilador) que lo lee y crea a partir de él una versién en cédigo maquina que es comprensible por el procesador. Al cédigo escrito en el lenguaje de programacién se le llama cddigo fuente y a la version compilada se le lama normalmente binario. Si hacemos algin cambio en el cédigo fuente es necesario volver a compilarlo para obtener un nuevo programa. Entre sus ventajas estan el que suelen ser més rapidos que los lenguajes interpretados y que, una vez compilados, funcionan auténomamente, sin un programa, que los interprete. Por otro lado, al ser binarios, dependen de la plataforma en la que se ejecutan (procesadores distintos usaran binarios distintos), hay que compilar versiones distintas para cada plataforma y, cada vez que se modifican, necesitan ser compilados de nuevo. Los lenguajes compilados més conocidos son el lenguaje C y sus variantes (CH. cH. 18 PYTHON. PASO A PASO RAMA Un lenguaje interpretado, sin embargo, es el que se puede ejecutar sin necesidad de ser compilado. Para ello, en lugar de un compilador, tenemos lo que se Hama un intérprete, que lee el cédigo y ejecuta las instrucciones en él contenidas. Al no haber compilacién no existe un binario, y los programas escritos en lenguajes interpretados se suelen llamar scripts. Como ventajas tienen el que son portables entre plataformas (siempre que dispongan del intérprete adecuado) y que no necesitan ser compilados cada vez que se modifican. Como desventajas, el que suclen ser mas lentos que sus contrapartidas compiladas (aunque no siempre) y que necesitan de un intérprete. Algunos de los lenguajes interpretados mas famosos serian Perl, Ruby y, por supuesto, Python. 1.3 PARADIGMAS DE PROGRAMACION Otra cosa que distingue a unos lenguajes de programacién de otros es el paradigma de programacién en el que se basan. Un paradigma de programacién es “una forma de hacer las cosas”. Existen muchos paradigmas, pero los ms populares hoy en dia son estos: 1.3.1 Programacién imperativa Es el paradigma més basico, el que subyace en cierto modo a cualquier otro paradigma, y el mas usado. En la programacién imperativa el lenguaje se expresa a través de instrucciones, que son érdenes que cambian el estado de los datos sobre los que ‘trabaja el programa. 1.3.2 Programacién orientada a objetos La programacién orientada a objetos (POO) es probablemente el paradigma mas de moda hoy en dfa, y el que ha supuesto algunos de los mayores avances en los ailtimos tiempos. En este paradigma se trabaja con objetos, que son estructuras que permiten tanto almacenar como manipular datos de forma coherente e identificada. © RAMA Capitulo 1. LENGUAIES DE PROGRAMACION 19 1.3.3 Programaci6n funcional Este paradigma opera sobre los datos por medio de funciones que describen esos datos, de un modo muy parecido a como se opera con funciones matematicas. 1.4 {QUE HEMOS VISTO EN ESTE TEMA? Qué son los lenguajes de programacién, para qué sirven, cémo se clasifican y las distintas formas (paradigmas) de usarlos. SYNAPS PREMIUM PYTHON Python es un lenguaje interpretado, de alto nivel y enfocado principalmente a la legibilidad y facilidad de aprendizaje y uso. Como veremos a lo largo de este libro, Python es un lenguaje orientado a objetos, aunque soporta otros paradigmas como la programacién funcional y, por supuesto, la programacién imperativa. Python es un lenguaje multiplataforma, lo que significa que puede usarse en multitud de sistemas distintos. Funciona en ordenadores con sistemas operativos Linux, BSD, Apple, Windows y muchos otros, pero también hay versiones para otros dispositivos, como terminales telefénicos inteligentes, etc. Naturalmente, Python dispone, por medio del uso de bibliotecas, de herramientas para aprovechar las posibilidades concretas que le brinda cada plataforma, pero también es posible escribir programas evitando el uso de esas bibliotecas especificas, de modo que esos programas funcionen indistintamente en cualquier ordenador. Python es software libre, y se distribuye bajo la licencia “Python Software Foundation License”. Esto, entre otras cosas, significa que se distribuye gratuitamente ynno necesita del pago de licencias o royalties para su uso, ya sea privado o comercial. Guido van Rossum es el creador y BDLF (Benevolent Dictator for Life, benevolente dictador de por vida) de Python; y la filosofia que quiso darle es que el cédigo debe ser limpio y legible, evitando “atajos” o construcciones que dificulten la comprensién del programa. Python es simple sin ser limitado. Estas caracteristicas hacen que Python sea un lenguaje ideal para aprender ¢ iniciarse en la programacién. 22 PYTHON. PASO A PASO RAMA Apesar de que Python es una muy buena eleccién para aprender a programar, no es un lenguaje disefiado para aprender a programar. Python es un lenguaje completo perfectamente funcional, muy potente, y viene acompaiiado por una serie de paquetes que facilitan funciones para el trabajo con casi cualquier cosa. A este respecto, se dice que Python viene con “pilas incluidas”. 2.1 SOFTWARE LIBRE Ya hemos mencionado un par de veces que Python es software libre. Aunque a menudo se interpreta equivocadamente como “software gratuito”, el software libre es una filosofia que afirma que el software debe ser accesible a los usuarios, En particular, los defensores del software libre afirman que hay una serie de derechos 0 “libertades del software” que todo usuario de un programa deberia tener. Segin las propias palabras de la Free Software Fundation (hitp://www.gnu. org/philosophy/free-sw.es. html), las cuatro libertades del software libre son: V La libertad de ejecutar el programa como se desea, con cualquier propésito (libertad 0). 7 La libertad de estudiar cémo funciona el programa, y cambiarlo para que haga lo que usted quiera (libertad 1). El acceso al cédigo fuente es una condicién necesaria para ello. V La libertad de redistribuir copias para ayudar a su projimo (libertad 2). M La libertad de distribuir copias de sus versiones modificadas a terceros (libertad 3). Esto le permite ofrecer a toda la comunidad la oportunidad de beneficiarse de las modificaciones. El acceso al cddigo fuente es una condicién necesaria para ello. A lo largo de los tiltimos tiempos, la filosofia del software libre se ha extendido por todo el mundo, hasta tal punto que el software libre esta detras de la mayor parte de los grandes logros de la informatica, desde la propia Internet hasta el sistema operativo Linux pasando por el propio Python. © RAMA Capitulo 2. PYTHON 23 2.2 EL ZEN DE PYTHON El zen de Python (htip://www.python.org/dev/peps/pep-0020/) viene a ser la carta de principios del lenguaje, su filosofia. Describe una serie de reglas que deberian seguirse tanto en el desarrollo del propio lenguaje, como en los programas que se hagan con él. V Bello es mejor que feo. ¥ Explicito es mejor que implicito. V Simple es mejor que complejo. ¥ Complejo es mejor que complicado. V Plano es mejor que anidado. V Disperso es mejor que denso. Y La legibilidad importa. V Los casos especiales no son lo suficientemente especiales como para romper las reglas. V7 Aunque la practicidad gana a la pureza. ¥ Los errores nunca deberian pasar en silencio. ¥ A menos que se silencien explicitamente. V Frente a la ambigiiedad, evita la tentacién de adivinar. ¥ Deberia haber una (y preferiblemente solo una) manera obvia de hacerlo. ¥ Aunque puede no ser obvia al principio, salvo que seas holandés. ¥ Ahora es mejor que nunca ¥ Aunque nunca es mejor que el ahora correcto. Y Sila implementacion es dificil de explicar, es una mala idea. Y Sila implementacion es facil de explicar, podria ser una buena idea. V Los espacios de nombres son una idea genial. ;Hagamos més de eso! 2.3 PYTHON 2 VERSUS PYTHON 3 Actualmente, existen dos versiones de Python conviviendo, ambas en desarrollo y con actualizaciones. Por un lado, esta la serie de “Python 2”, que se encuentra en su version 2.7 (en el momento de escribir este libro, la ultima version estable es la 2.7.10, coneretamente). Simultaneamente, existe “Python 3”, que se encuentra en su version 3.4 (concretamente, en la 3.4.3). 24 PYTHON. PASO A PASO RAMA Ambas versiones son muy similares, pero lo suficientemente diferentes para que un script escrito en Python 2 no sea compatible con Python 3, y viceversa. Aunque, en el futuro, se espera que Python 3 sea la tinica versién que se mantenga, actualmente conviven las dos. De hecho, la actual versién de Python 2 es posterior a la actual versién de Python 3. Desafortunadamente para las aspiraciones de Python 3, este no ha tenido una aceptacién tan rapida como se esperaba. Una gran parte de las aplicaciones y librerias que se usan hoy en dia existen para Python 2 pero aiin no estin portadas a Python 3 0 solo Jo estan parcialmente. Probablemente por esta raz6n, Python 2 sigue siendo hoy en dia mucho més popular que Python 3. Y, por esta razén, en este libro vamos a usar Python 2 en lugar de Python 3. {Significa eso que vamos a aprender una versién de Python destinada a quedarse anticuada? Nada de eso. Por fortuna, las diferencias en la sintaxis de ambos Ienguajes son minimas, y aprender Python 2 es también aprender Python 3, si se tienen en cuenta unos aspectos minimos. Al final de este libro hay un apéndice en el que se da una pequefia lista de diferencias y algunos consejos para convertir nuestros scripts entre una version y otra. 2.4 jQUE HEMOS VISTO EN ESTE TEMA? Las caracteristicas de Python y sus variantes. La filosofia que tiene detras y el modo de enfocar la programacién implicito en este lenguaje. 24.1 Tareas sugeridas Quizas es pronto para comenzar con tareas, pero no serfa mala idea consultar la pagina de Wikipedia dedicada a Python, para empezar a conocer algo de este lenguaje de programacién. SYNAPS PREMIUM ANTES DE EMPEZAR Antes de poder trabajar con Python necesitamos algunas herramientas. La programacién puede ser una labor muy compleja que requiera muchas herramientas pero, para comenzar a trabajar, nos bastard con el propio intérprete de Python y un editor de texto adecuado. 3.1 INSTALAR PYTHON Como hemos visto, Python es un lenguaje interpretado por lo que, para poder ejecutar un programa escrito en este lenguaje, hace falta instalar un intérprete. Instalar el intérprete de Python es muy simple y, en general y dependiendo del sistema operativo que estemos usando, se hace igual que cualquier otro programa. 3.1.1 Windows EI primer paso, naturalmente, es obtener el programa instalador. La forma mis habitual para ello es descargarlo de Internet. Como ya hemos visto, Python es software libre, lo que significa que podemos descargarlo gratuitamente y usarlo sin tasas ni licencias. 26 PYTHON. PASO A PASO RAMA Looking for a specific clease? Figura 3.1. Web de descarga de Python La pagina oficial de descargas de la Python Software Foundation, donde se encuentra la iltima versién, es https:/Avww.python.org/downloads/. Esta pagina detecta el sistema operativo que estamos usando, y nos muestra en un lugar destacado el enlace a la descarga adecuada para nuestro sistema. Si por alguna razén este enlace no se muestra, o si queremos descargar una versi6n distinta, (una versi6n anterior o para otro sistema operativo), esa misma pagina dispone de un listado de enlaces a las descargas de otras versiones (ordenados por fecha). © RAMA Capitulo 3. ANTES DE EMPEZAR 27 Como ya hemos visto, en los ejemplos de este libro se va a usar la version 2.7.*, asi que, tanto si es en la pagina principal como si preferimos la lista de enlaces, clegiremos la tiltima versién que comience con esos dos nimeros. Si hemos decidido elegir nosotros mismos la versién del instalador, el enlace del listado nos dirigira a la pégina de descargas, donde se encuentran las versiones para los distintos sistemas operativos. Los dos enlaces fundamentales para Windows son Windows x86 MSI installer para ordenadores de 32 bits, y Windows x86-64 MST installer para maquinas mas modernas, de 64 bits. Una vez descargado el instalador (que ocupa unos 20 MB) slo es necesario ejecutarlo y seguir las instrucciones, como cualquier otro programa de instalacién. Select whether to install Python 2.7.10 for all users of this computer. @ instal for all users O Install just for me (not available on Windows Vista) Figura 3.2. Instalador de Windows 28 PYTHON. PASO A PASO RAMA EI instalador nos permite configurar, si asi lo deseamos, el directorio de instalacién y los paquetes adicionales. Las opciones que da por defecto son perfectamente validas y no es necesario cambiar nada. 3.1.2 Mac OS Mac OS X, a partir de la versién 1.8 Yosemite, ya tiene Python 2 preinstalado, por lo que no es necesario instalarlo. Si, por alguna razén, no estuviese disponible o hiciera falta una reinstalacién, la pagina oficial de descargas de la Python Software Foundation est en hitps://www.python.org/downloads/. En principio, la pagina deberfa detectar nuestro sistema operativo y mostrar en un lugar destacado el enlace a la descarga. Si por alguna razén este enlace no se muestra, 0 si queremos descargar una versién distinta (una versién anterior o para otro sistema operativo), esa misma pagina dispone de un listado de enlaces a las descargas de otras versiones (ordenados por fecha). Como ya hemos visto, en los ejemplos de este libro se va a usar la versién 2.7.*, asi que, tanto si es en la pagina principal como si preferimos la lista de enlaces, clegiremos la tiltima versién que comience con esos dos nimeros. Siguiendo los enlaces de ese listado encontraremos los archivos Mac OS X 32-bit i386/PPC installer y Mac OS X 64-bit/32-bit installer para arquitecturas de 32 y 64 bits, respectivamente. Se trata de archivos de instalacién pkg que solo hay que ejecutar para que se inicien y seguir los pasos que indica la instalacién, y que nos permiten configurar el directorio de instalacién y los paquetes adicionales. Las opciones que da por defecto son perfectamente validas y no es necesario cambiar nada. © RAMA Capitulo 3. ANTES DE EMPEZAR 29 3.1.3 Linux Python 2 (que, recordemos, es la versién que se usard en este libro) viene instalado por defecto en la mayoria de sistemas Linux. Si a pesar de todo es necesario instalarlo, se puede hacer facilmente con el propio gestor de paquetes del sistema, ya sea en modo grifico o en Ifnea de comandos. Probablemente lo mas simple (y mAs adecuado a la filosofia de este libro) sea usar un gestor de paquetes en linea de comandos, ya que todo el proceso se ejecuta con una sola orden: En sistemas tipo Debian (Debian, Ubuntu, Mint...) se puede hacer con el comando apt-get. Al ser una instalacién, se necesitan permisos de superusuario, por Jo que hace falta “logarse” con root o usar sudo: apt-get install python En sistemas basados en Redhat (Redhat, Fedora...) se puede instalar con el comando yum (de nuevo, se requieren permisos de root): yum install python En ArchLinux, se debe usar el gestor pacman (con permisos de root): pacman -S python2 Si, a pesar de todo, se prefiere un gestor de paquetes grifico como Synaptic 0 ‘Yumex, el procedimiento dependeré de cual exactamente se trate, pero basicamente consiste en buscar el paquete de nombre “python” o “python2.7” ¢ instalarlo por el procedimiento habitual. 30. PYTHON. PASO A PASO RAMA 3.2 UNA VEZ INSTALADO EI intérprete no es lo tinico que necesitaremos. Para escribir programas hace falta un editor de texto. Es importante distinguir un editor de texto, que es un programa para crear 0 modificar fexto plano (esto es, sin formato ni caracteristicas especiales) de un procesador de textos que genera documentos complejos, con diversos tipos de letra, titulos, negritas, etc. Windows dispone del Bloc de notas, al igual que Mac tiene el TextEdit. Ambos permiten guardar documentos en texto plano o (también llamado a veces texto simple o texto normal), que es lo que necesitamos para nuestros scripts en Python. Lo malo es que son editores muy limitados. Para que un editor de texto sea una herramienta de programacién cémoda, Jo minimo que necesita es caracteristicas como mostrar el nimero de linea, iluminar el cédigo (poner automaticamente en distintos colores los diferentes clementos del lenguaje), utilidades para autocompletar el cédigo mientras se escribe o para pegar snipets (pequefios pedazos de cddigo predefinidos), etc. En el caso de Linux, casi cualquier editor de texto que tenga preinstalado tu distribucién es adecuado para iniciarse en la programacién. Casi todos ellos disponen de las caracteristicas esenciales sin ser demasiado complicados. Para la redaccién de este libro y sus ejemplos se ha usado Gedit (https://wiki. gnome.org/Apps/Gedit), que es software libre; es el editor de texto predefinido del escritorio Gnome y tiene versiones para Linux, Windows y Mac. En el wiki oficial de Python hay un extenso listado de editores para todas las plataformas y sus caracteristicas (https://wiki.python.org/moin/PythonEditors). Los editores més especializados, conocidos como IDE (Integrated Development Environments), disponen ademés de herramientas mas avanzadas como control de versiones, explorador de archivos, debugger (para buscar y gestionar errores), gestor de proyectos, consola virtual, etc. Aunque todo ello es a costa de ser mas complejos de instalar, configurar y usar, y no se recomiendan para el usuario menos avanzado. Probablemente los dos IDE més conocidos hoy en dia, que son ademas software libre y multiplataforma, son Eclipse (hitp:/A»ww.eclipse.org/users/) y Netbeans (hitps.//netbeans.org), aunque existen algunos otros mas especializados en Python como Ninja-IDE (hitp://ninja-ide.org/). © RAMA Capitulo 3. ANTES DE EMPEZAR 31 Naturalmente, en el wiki oficial de Python también hay un extenso listado de IDE, sus caracteristicas y ayuda para la configuracién (hétps://wiki.python.org/moin/ IntegratedDevelopmentEnvironments). 3.2.1 EL IDLE Sino tenemos especial preferencia por ningiin editor de texto, es posible que queramos usar el IDLE (https://docs. python.org/2/ibrary/idle.html). En Windows y Mac, al instalar Python, se afiade automdticamente una aplicacién llamada IDLE. En sistemas Linux no tiene porqué estar instalada por defecto, pero se puede instalar facilmente con cualquier gestor de paquetes como, por ejemplo: apt-get install idle yum install python-tools El IDLE (Integrated Development and Learning Environment) es un programa con interfaz gréfica (y escrito en Python) que contiene varias utilidades para Python, como un intérprete en tiempo real (en el que podemos escribir instrucciones de Python y ver sus resultados sobre la marcha), un editor de texto sencillo y algunas otras herramientas; y es probablemente la mejor manera de comenzar a usar Python. Para iniciar el IDLE en sistemas UNIX solo hay que ejecutar la orden idle en un terminal, aunque la mayoria de sistemas tiene ademds un icono en sus mentis de herramientas con la misma finalidad. En sistemas Windows existe un icono en el ment Inicio para ejecutar el IDLE. Aliniciar el IDLE por primera vez se nos mostrar una ventana con un shell interactivo de Python (esto puede cambiarse en la configuracién del programa, por medio de la opcién Configure IDLE del ment Options). Python 2.7.10+ Shell x File Edit Shell Debug Options Window Help Python 2.7.10+ (default, Oct 10 2015, 09:1. (ecc 5.2.1 20151003] on’ Linux2 Type "copyright", "credits" or “License()" for more information. 224) Figura 3.3. Shell del IDLE 32 PYTHON. PASO A PASO RAMA En esta ventana se muestra informacién de nuestra versién de Python y se nos presenta un prompt consistente en tres simbolos de “mayor que” (>>>) en el que podemos escribir instrucciones de Python y ejecutarlas una a una. Cada vez que se ejecuta una orden (pulsando la tecla ENTER tras escribirla) Python nos muestra el retorno de esa instruccién, el resultado de su ejecucién. El shell de Python del IDLE puede ser muy itil para ejecutar comandos y ver su resultado, pero lo que mas usaremos seré el editor de texto. Para comenzar a escribir un nuevo programa, tenemos la opcién New file del menii File. Esto nos abrir una ventana del editor vacia. También podemos abrir una ventana conteniendo un programa ya existente con la opcidn Open... test py ~ /home/allan/test.py (2.7.10+) x Elle Edit Format Run Options Window Help “Bi 7asr/bin/python #*- coding: utf-a -*- import Tkinter def saludar(): textol'text'] = "Hola amigo” def despedir() textol‘text'] = ‘Hasta la vista # Ventana principal principal = Tkinter.1k() # Titulo de La ventana principal.wn_title(*Programitta") # Texto que se muestra texto = Tkinter.Label (principal, text="Saluda") # Botones boton saluda = Tkinter.Button(principal, boton despide ~ Tkinter.autton(principat, jola”, conmand=saludar) ‘Adios", conmand-despedir) texto.pack() boton_saluda. pack() boton_despide.pack() principal naintoop() [Enza [ear 29} Figura 3.4. Editor del IDLE © RAMA Capitulo 3. ANTES DE EMPEZAR 33 La ventana del editor es muy similar a la del shell, aunque algunos meniis de la barra superior cambian entre una y otra. El primero de estos mentis, comin a ambas ventanas, es File. Este meni, como hemos visto, contiene opciones como Open..., que sirve para abrir un nuevo fichero (lo que, como veremos un poco mas adelante, inicia el editor de textos del IDLE) y Open module..., que abre un archivo ya existente. La opcién Recent files, por su parte, abre un desplegable con los iiltimos archivos que se han editado (la primera vez, légicamente, no muestra nada) y también permite abritlos. EI navegador de clases Class Browser es una herramienta muy ttil, ya que dispone de un buscador que nos permite abrir cualquier médulo de Python conociendo su nombre y nos lo muestra acompafiado de una ventana con sus clases, funciones, etc. La opcién Path Browser es similar, pero explorando un arbol de directorios en lugar de un buscador. ‘Tenter.py~ fusrbfpython2.7b-s/Tidnter py (2.7.10) x Fla Eat Format Run Optons Window Help "ssyrapper functions for Tel/Tk Tkinter provides classes which allow the display, positioning and widgets are Frane, Label, Entry, Text, Canvas, Button, Radiobutton, {abet Frame and Pandeindon Claes Browaer = Thinter Properties of the widgets are spacified with keyword a] @ 2) disse Engrs nrgenents have the tans! hans aa the corvospendl OY cas yen tinder Te (a cs Wen uidgets are positioned with one of the geometry manage) A class THMsc, Wm) available in every Midge. eri) Actions are bound to events by resources (1.9. keyword) |-y del puck consgurt.) omand) er with the method Bind FS vetpackereled Example {HetTa, World) ef pack in inportTancer: as Pace Foe i oaa aes oak ee Foomo't ThiniarsFrae(ih,_rolioFRI06E, tordorwidthea)| +22 css Sasewdgetse) {rane pack(*11L-boTH expand) Di cls Widgellsetge, Pak, Pace id) {abet Eikinterstabel Cfrare, toxt=rHetta, World") Label. packi IUL-X, expandet| bottone Thitee Button (tm) trtoPEse” inmates) Batton-pack side:s0rTo) Somntoont |_version__ = "snevision: sto00 $° sport sys Pays pat torm — “vin32" Patceage"Ty congure Tel without requiring Part SF port tkint Figura 3.5. Class Browser 34 PYTHON. PASO A PASO RAMA Los siguientes tres elementos del meni, Save, Save as y Save copy as, permiten guardar el trabajo realizado, guardarlo asignandole un nombre y guardar una copia con un nombre distinto al que tiene. Print imprimiré el contenido de la ventana y, por iltimo Close y Exit cerrarfn la ventana con la que estamos trabajando y todas las ventanas abiertas, respectivamente. EI siguiente ment, también presente tanto en el shell como en el editor, es Edit. Sus dos primeros elementos, Undo y Redo, sirven para deshacer la altima aceién y para volver a hacerla, respectivamente. Cut y Copy sirven, respectivamente, para cortar un texto seleccionado y para copiarlo, mientras que Paste sirve para pegar un texto previamente copiado en la posicién actual del cursor. Select all selecciona todo el contenido de la ventana. Find abre un meni de didlogo que nos permite buscar el texto que deseemos en la ventana, Find again repite la iltima busqueda realizada. Find selection busca el texto que tengamos scleccionado en ese momento, y Find in Files permite buscar en miltiples archivos. Replace funciona igual que Find, pero permite reemplazar el texto buscado por otro. Go to Line mueve automaticamente el cursor a la linea indicada. Show completions muestra una lista con posibles opciones de funciones y clementos del lenguaje, para terminar el texto que se est escribiendo, para poder autocompletar este y agilizar la escritura de érdenes. Un efecto similar tiene pulsar la tecla TAB mientras se esta escribiendo, y es una de las herramientas més iitiles que el programador puede encontrar en un editor de texto. Expand word tiene un efecto similar, pero trata de autocompletar a partir de palabras ya presentes en la ventana. Show call tip muestra un pequefio texto contextual de ayuda que se despliega cuando el puntero esté en los paréntesis de una funcién o método. Show surrounding parens resalta el espacio entre paréntesis donde se encuentre el cursor. El ment Shell, que solo se encuentra en la ventana del shell y no en la del editor, tiene dos opciones: View last restart, que hace scroll en la pantalla hasta retomnar a la diltima vez que se reinicié el shell, y Restart Shell, que reinicia el shell borrando las variables y estados que hubiese en memoria. El mema Debug también es exclusivo de la ventana de shell, y permite controlar la ejecucién de las instrucciones para depurar errores. El primer elemento, Go to File/Line, busca en torno al cursor un nombre de archivo y un mimero de linea © RAMA Capitulo 3. ANTES DE EMPEZAR 35 y, si lo encuentra, abre una ventana del editor conteniendo ese archivo y mostrando resaltado el contenido de esa linea, El formato para indicar fichero y linea debe ser parecido a este: File “test.py", line 15 Este es el mismo formato en el que Python devuelve los mensajes de error, por lo que resulta muy cémodo para encontrar problemas y errores en nuestro cédigo. La opcién Debugger abre una ventana en la que podemos ver en tiempo real, mientras ejecutamos instrucciones, el estado de las variables, los médulos cargados y otros parimetros del programa en ejecucién. Stack viewer muestra un diagrama en drbol con el estado de la pila de excepciones. Este diagrama permite acceder a las variables globales y locales del programa en ejecucién. Auto open Stack viewer hace que Stack viewer se abra autométicamente cuando haya algan error. Python 2.7.10+ Shell Ele Edit shell Debug Options window Help lpython 2.7.10+ (default, oct 10 2015, es;tiay Python 2.7-10+ (defautt, Oct 10 2015, 09:11:24) B [Gce'§.2.1" 201520031 on’ Tinux2 Type “copyright”, "credits" or “License()* for more information poe print a [Traceback (most recent call last) Fite "epyshelts0>", Line 1, in print a NaneError: name ‘a' is not defined idle x [Ea Namek ror: name ais nat defined a Ey ldlkibcun.runcodel., ne 325: exec code in self loa 2) _main_cemodule>(.) ine Figura 3.6. Stack viewer 36 PYTHON. PASO A PASO RAMA El mena Format aparece solo en el editor, y tiene herramientas para formatear el cédigo de una forma mas cémoda. Indent region indenta el cddigo seleccionando un nivel, justo lo contrario de lo que hace Dedent region. Comment out region comenta un bloque de cédigo afiadiéndole los simbolos # delante, mientras que Uncomment region quita los signos de comentario del érea seleccionada. Tabify region convierte el indentado con espacios en tabulaciones, y Untabify region hace lo contrario, mientras que Togle tabs cambia el indentado por defecto entre espacios y tabuladores. En Python se recomienda olvidarse del caracter tabulador y usar en su lugar cuatro espacios para tabular el cédigo, por lo que esa es la configuracién por defecto del editor. De todos modos, en el siguiente elemento del ment New indent width, se puede cambiar el ntimero de espacios que el editor usa cada vez que se pulsa la tecla TAB. Format paragraph reformatea el parrafo actual para que se adectie al ancho estindar predefinido (72 caracteres de ancho, por defecto). Por tiltimo, Strip trailing whitespace climina los espacios en blanco sobrantes al final de las lineas. El mena Run, que también es exclusivo del editor, tiene solo tres opciones. La primera de ellas es Python Shell, que abre una ventana de shell. La segunda es Check module, que comprueba la sintaxis de programa que haya en el editor en ese momento, avisando si hay algin error. La altima es Run module, que ejecuta el programa en un shell. Cuando estemos programandoy queramos probar si nuestro programa funciona correctamente, esta opcién nos permitira ejecutar el programa sin tener que abrir un terminal ni buscar donde sea que lo tengamos guardado. El ment Options tiene dos elementos, Configure IDLE y Configure extensions, que sirven para cambiar la configuracién por defecto de los distintos componentes del IDLE, tales como qué ventana se abre al inicio, la tipografia o los colores, aspectos del autocompletado y un amplio etcétera. El mena Window permite aumentar el tamafio de la ventana y, cuando hay més de una ventana abierta, pasar de una a otra cémodamente. © RAMA Capitulo 3. ANTES DE EMPEZAR 37 Y, por tiltimo, el meni Help provee de informacién legal sobre el propio IDLE por medio del elemento de meni About IDLE, una pequefia ayuda de uso en IDLE Help y acceso a la documentacién online de Python en Python Docs. ‘Ademés de lo visto, el editor del IDLE ilumina el cédigo, destacando con distintos colores cada elemento del lenguaje (estos colores también pueden configurarse). Probablemente la herramienta ms util del IDLE es su capacidad de autocompletado. Si, mientras estamos escribiendo una sentencia o un elemento del Ienguaje, pulsamos la tecla TAB, el IDLE intentaré completar la palabra. Si hay varias opciones posibles, se mostrar una lista con ellas. Casi con total seguridad, el IDLE no es el mejor ni el mas completo editor de cédigo para Python. Pero es una herramienta muy atl y facil de usar, que nos va a servir de mucha ayuda para aprender Python. 3.3 {QUE HEMOS VISTO EN ESTE TEMA? Dénde puede obtenerse Python. La forma de instalarlo dependiendo de nuestro sistema operative. Qué més programas necesitamos para poder trabajar cémodamente con Python. El IDLE. 3.3.1 Tareas sugeridas v Instalar Python. ¥ Instalar un editor de texto que nos resulte cémodo (el IDLE es una buena idea para empezar). ¥ Explorar nuestro editor de texto para familiarizarnos con él. SYNAPS PREMIUM “COMENZANDO A PROGRAMAR 4.1 HOLA MUNDO Es una especie de tradicién comenzar a mostrar el funcionamiento de un Ienguaje de programacién haciendo un programa que muestre el texto “Hola Mundo”. Hacer esto en Python es muy sencillo: solo es necesario un programa de una linea: print "Hola Mundo" Hola Mundo En este ejemplo la palabra print es una instruccién propia de Python (mis propiamente, una sentencia) que sirve para mostrar un texto en la pantalla, y el texto “Hola Mundo” entrecomillado es lo que se llama una cadena de texto o, simplemente, cadena. En conjunto, la expresién resultante significa algo asi como “imprime en la pantalla el texto ‘Hola Mundo””. Usaremos nuestro editor de texto para escribir eso en un archivo y lo guardaremos con el nombre miscript.py. En sistemas tipo UNIX (como Linux y Mac OS X) el nombre que le pongamos no es especialmente relevante (més allé de que sea reconocible y facil de escribir). En sistemas tipo Windows ser necesario que el nombre que elijamos acabe siempre en “.py”, porque esa es la forma que tiene Windows de reconocer que el archivo es un script de Python. 40 PYTHON. PASO A PASO © RAMA Ahora debemos abrir un terminal. En nuestro terminal podremos ver lo que se llama una “linea de comandos” (0 linea de érdenes). Su apariencia varia de un sistema a otro, pero consiste en una interfaz de interaccién con los programas a través de instrucciones en modo texto. En esa linea de comandos, usando las instrucciones del sistema, debemos desplazarnos al directorio donde esté el script, y ejecutarlo escribiendo: python miscript.py © RAMA Capitulo 4. COMENZANDO A PROGRAMAR 41 Esto, si no nos hemos equivocado en nada, hard que se nos muestre el texto “Hola Mundo” en la terminal en la que estamos ejecutando el programa. allan@pecera: ~ x Tennent Figura 4.1. Ejecucién en Linux ree) Ke) 2013 Microsoft Corporation. Todos los derechos res eben ant) Figura 4.2. Ejecucién en Windows 42. PYTHON. PASO A PASO RAMA {Qué hemos hecho? Con esta orden lo que hacemos es ejecutar el intérprete de Python, pero esta vez paséndole como pardmetro el nombre del programa que hemos escrito, para que lo ejecute directamente en lugar de iniciar una sesién interactiva como vimos anteriormente. Ejecutar: “invocar” a un programa para que haga lo que sea que debe hacer: En entornos grificos los programas se ejecutan haciendo doble clic sobre su icono; en linea de comandos se hace escribiendo su nombre. Podemos probar a cambiar el texto (sin olvidar las comillas) y guardar de nuevo el archivo con los cambios y veremos que, al ejecutar de nuevo el script, se imprime en pantalla lo que le indiquemos. Si queremos ejecutar nuestros programas directamente, sin tener que llamar al intérprete de Python, tendremos que hacer unos pequefios cambios, dependiendo de nuestro sistema operativo. En sistemas tipo UNIX como Linux o Mac O$ X, los scripts deben comenzar por una linea que indique qué intérprete debe ejecutar ese script. Esa linea, Hamada shebang, debe ser la primera del programa (no puede haber caracteres, espacios en blanco o lineas vacias delante) y, en nuestro caso, tendré una forma parecida a esto: #1/usr/bin/python Los signos “#!” son los que indican que se trata de un script y que debe ser leido por un intérprete, y el texto “/usr/bin/python” es la ruta en el sistema donde se ubica ese intérprete. En Windows esto no es necesario pero tampoco es perjudicial y, si existe un shebang, el sistema simplemente lo ignorara como si no estuviera abi. © RAMA Capitulo 4. COMENZANDO A PROGRAMAR 43 Otra opcién es usar el shebang “#!/ust/bin/env python”, que es mas genérico y sirve en casi cualquier sistema tipo UNIX. ‘Ademés, como es normal en los sistemas tipo UNIX, es necesario darle permisos de ejecucién a nuestro programa. La forma mis facil de hacer esto es, de nuevo, desde la linea de érdenes, abriendo un terminal y escribiendo: chmod +x miscript.py La orden chmod sirve para cambiar permisos de archivos. El modificador +x Ie indica que el permiso que le queremos dar es el de ejecucién y, por ultimo, debe ir el nombre del archivo al que le queremos dar ese permiso. Una vez hecho esto, para ejecutar nuestro script, solo es necesario escribir (sin tener que invocar expresamente al intérprete de Python): miscript.py ‘También podremos ejecutar el script desde el entomno gréfico haciendo doble clic sobre su icono. En algunas plataformas Windows, al ejecutar el programa haciendo doble clic sobre su icono, se abre un terminal con el resultado de la ejecucién y se cierra instantaneamente, sin darnos tiempo a ver nada. Una solucién, no muy elegante pero ttil, es afiadir la linea raw_input () al final del programa, con lo que este esperar a que se pulse la tecla ENTER antes de que se cierre la ventana: #1/usr/bin/python print "Hola Mundo" vaw_input () Salida del programa: Hola Mundo 44 PYTHON. PASO A PASO RAMA Ahora, afiadiendo el shebang, nuestro programa deberia tener un aspecto parecido al siguiente: #1/usr/bin/python print "Hola Mundo" Salida del programa: Hola Mundo Naturalmente, podemos ejecutar mas de una instruccién ubicéndolas en lineas consecutivas. El intérprete de Python las ejecutard una a una de arriba abajo: #1/usr/bin/python print "Hola" print "Mundo" Salida del programa: Hola Mundo La linea en blanco entre el shebang y las instrucciones (0 entre las instrucciones, si hay més de una) est ahi simplemente por claridad. El programa funcionaré exactamente igual sin ella, 0 afladiendo varias. Python ignora las lineas en blanco y, a la hora de programar, nosotros deberiamos usarlas como sea necesario para que el programa sea mis legible. Este es un tema mas importante de lo que parece a primera vista. A menudo, al escribir un programa, nos olvidamos de que llegar el dia en que queramos leerlo © modificarlo de nuevo, o de que puede que otras personas quieran leer ese cédigo. Por eso debemos hacer que sea siempre lo mas legible y comprensible posible. © RAMA Capitulo 4. COMENZANDO A PROGRAMAR 45 ‘Una herramienta para ayudarnos en esto son los comentarios. Se puede afiadir comentarios a un programa, que serin completamente ignorados por el intérprete, pero que pueden ser muy ttiles para que los seres humanos entiendan el cédigo. Un comentario se pone precedido del simbolo “almohadilla” (#) de este modo: #1/usr/bin/python # Esto imprime la cadena "Hola mundo" print "Hola Mundo" Salida del programa: Hola Mundo Todo lo que haya después de la almohadilla sera ignorado por el intérprete, de modo que se puede poner un comentario a continuacién de una linea de cédigo de este modo: #1/usr/bin/python print "Hola Mundo" # Esto imprime la cadena "Hola mundo" Salida del programa: Hola Mundo Es importante hacer notar que el comentario sera ignorado aunque se trate de cédigo de Python, lo que a veces puede ser muy itil cuando estamos haciendo pruebas y queremos “desactivar” alguna orden: #1/usr/bin/python # Esto imprime 1a cadena "Hola mundo" print "Hola Mundo" # Pero esto no imprime nada, porque est4 marcado como comen- tario #print "Chao Mundo" Salida del programa: Hola Mundo 46 PYTHON. PASO A PASO RAMA 4.2 UIF Cuando empieza a leer un programa para ejecutarlo, el intérprete de Python espera que el texto se encuentre codificado en formato ASCII. ASCII es una codificacién que usa siete bits para codificar hasta 128 caracteres (32 de ellos no imprimibles). Es una codificacién antigua pero reconocida por pricticamente cualquier ordenador. El problema es que, al estar tan limitada en cuanto al nimero de caracteres y estar orientada al alfabeto inglés, la codificacién ASCII no permite usar cosas como nuestra letra “i” o los caracteres acentuados por lo que, si tratamos de ejecutar un script que contenga alguno de estos caracteres, Python nos dard un aviso de error y detendré la ejecucién del programa. Para poder escribir en espafiol necesitamos usar la codificacién UTF-8 y, ademis, decirle a Python que la estamos usando. UTF-8, al contrario que ASCTI, usa un tamaiio variable para representar cada, caracter. Se trata de un subconjunto de Unicode que puede representar cualquier caracter de esta codificacién, lo que significa casi cualquier cardcter imaginable. Normalmente, cualquier sistema operative modero usa UTF-8 por defecto © permite usarlo, Suele haber un ment desplegable para ello en la ventana Guardar del editor de texto que estemos empleando. El IDLE tiene una opcién en el apartado Configure IDLE del mena Options para configurar la codificacién por defecto. Para indicarle a Python que nuestro script contiene caracteres UTF-8 se le afiade la siguiente linea, justo debajo del shebang: 7 coding: uté-8 - De este modo, nuestro “Hola Mundo” ahora tendria este aspecto: #1/usr/bin/python # -*- coding: utf-a -*- print "Hola Mundo" Salida del programa: Hola Mundo Como hemos visto, estrictamente hablando, las dos primeras lincas no forman parte de Python (por eso van precedidas de una almohadilla a modo de comentario), sino que son una forma de describir informacién sobre el archivo en si. © RAMA Capitulo 4. COMENZANDO A PROGRAMAR 47 4.3 QUE HEMOS VISTO EN ESTE TEMA? Los pasos necesarios para escribir y ejecutar nuestro primer programa. 4.3.1 Tareas sugeridas ¥ Para empezar, deberiamos (si no lo hemos hecho ya) probar a escribir nuestro primer “Hola Mundo”, para después ejecutarlo y ver el resultado. ¥ Podemos probar a escribir varios textos diferentes y a afiadir al programa varias érdenes print diferentes. v¥ (Se muestran correctamente los acentos y otros caracteres especiales? Puede que tengamos que asegurarnos de guardar el archivo como UTF-8 y de advertirlo en la cabecera del archivo como hemos visto. SYNAPS PREMIUM TRABAJANDO CON DATOS 5.1 VARIABLES A los textos o valores numéricos que escribimos directamente en nuestro cédigo, como hemos hecho en los ejemplos anteriores, se les llama Jiterales. Si solo pudiésemos hacer operaciones con literales, estariamos bastante limitados. Para conseguir que Python haga por nosotros tareas mas complejas necesitamos usar las Ilamadas variables. Una variable se puede ver como un contenedor en el que podemos guardar informacién y usarla posteriormente. Casi todas las operaciones que hagamos en un. programa las haremos sobre valores guardados en variables. Para asignar un valor a una variable se usa el signo igual (=). #1 /usr/bin/python # -*- coding: utf-@ -*- variable = 5 print variable # Esto imprimira 5 5 50 PYTHON. PASO A PASO RAMA ‘También en una suerte de taquigrafia, se pueden asignar valores a variables separandolas por comas de este modo: #1/usr/bin/python # -*- coding: utf-8 primera_variable, segunda_variable, tercera_variable = 1, "dos", 3 print primera_variable print segunda_variable print tercera_variable Salida del programa: L dos 3 En Python no es necesario declarar las variables explicitamente antes de usarlas, sino que se crean automaticamente y adoptan un tipo de contenido (veremos esto mas adelante) al asignarles un valor por primera vez. Esto es lo que técnicamente se lama un lenguaje “de tipado dindmico”. Como su propio nombre indica, el valor de las variables puede cambiar (y, de hecho, es normal que cambie) a lo largo de un programa. Por ejemplo: #1/usr/bin/python # -*- coding: utf-a -*- mi_primera_variable = "Hola Mundo" mi_segunda_variable = "Adiés Mundo" © RAMA Capitulo 5. TRABAIANDO CON DATOS 51 print mi_primera_variable # Esto imprimiraé "Hola Mundo" mi_primera_variable = mi_segunda variable print mi_primera_variable # Esto ahora imprimiré "Adiés Mundo" Salida del programa: Hola Mundo Adiés Mundo El nombre de una variable no puede contener espacios, debe comenzar por una letra o por un guidn bajo (_), no puede comenzar por un miimero, pero si puede contener mimeros. Como hemos dicho, en Python se distingue entre maytisculas y minisculas, por lo que “Variable”, “variable” y “VARIABLE” son nombres distintos y Python las considerara variables distintas. ‘Ademés, légicamente, no podemos usar palabras reservadas de Python (aquellas que, como print, tienen un significado especial para Python) como nombre de variable. Afortunadamente, las palabras reservadas de Python no son muchas: and, assert, break, class, continue, def, del, elif, else, except, exec, finally, for, from, global, if, import, in, is, lambda, not, or, pass, print, raise, return, iry, while. ‘Naturalmente, podemos mezclar variables y literales en nuestros programas: #1/usr/bin/python # -*- coding: utf-8 52 PYTHON. PASO A PASO RAMA numero = 5 resultado = numero + 7 print resultado # Mostraré 12 Salida del programa: 2 Hemos dicho antes que Python es un lenguaje de tipado dinamico. Al asignar un valor a una variable, decidimos implicitamente el tipo de dato que esta contendra. No es lo mismo que una variable contenga un ntimero a que contenga un texto y, cuando sea necesario, Python se comportaré de modo distinto segiin el tipo de dato que estemos usando. Por ejemplo: el signo “+” usado en un contexto numérico suma los valores pero, como veremos mas adelante, si se aplica a cadenas de texto sirve para concatenar esas cadenas: #1/usr/bin/python # -*- coding: utf-8 primer_numero = 5 segundo_numero = & suma = primer_numero + segundo_numero print suma # Mostraré 13 primera_cadena awolas segunda_cadena = "Mundo" union = primera_cadena + segunda_cadena print union # Mostraré HolaMundo ‘Salida del programa: 13 HolaMundo © RAMA Capitulo 5. TRABAIANDO CON DATOS 53 Ademés, Python es también un lenguaje “fuertemente tipado”, lo que significa que no permite mezclar tipos de datos libremente. Si, por ejemplo, intentamos “sumar” un texto con una variable numérica, Python no lo permitira y dard un aviso de error. Esto significa que el siguiente cédigo es invalido y fallara: #1/usr/bin/python # uté-8 -*- # Este ejemplo mezcla tipos y dara error numero = 5 cadena = "Hola" union = numero + cadena print union Salida del programa: Traceback (most recent call last): File "test.py", line 10, in union = numero + cadena TypeError: unsupported operand type(s) for +: ‘int! and ‘str’ 5.2 TIPOS DE DATOS Aunque se pueden usar médulos y otras caracteristicas de Python para definir nuestros propios tipos de datos, Python tiene sus propios tipos predefinidos basicos, que son los siguientes (y los que usaremos normalmente en nuestros programas): 5.2.1 Nuimeros enteros (int) Un entero es un niimero sin decimales, positivo o negativo. En Python el tamafio maximo que puede tener un entero depende de la plataforma pero, como minima, sera de 32 bits, lo que permite manejar un rango de néimeros entre el -2147483647 y el 2147483647. En ordenadores de 64 bits el rango sube hasta -9223372036854775807 y 9223372036854775807. 54 PYTHON. PASO A PASO RAMA Para asignar un néimero entero a una variable solo tenemos que hacer: #1/usr/bin/python # -*- coding: utf-8 un_aumero = 75 otro_numero = -134 Por supuesto, no es necesario asignar el valor a una variable directamente. Un niimero también puede ser el resultado de una operacién, aunque eso lo veremos con mas detalle un poco més adelante: #1/usr/bin/python # -*- coding: utf-a -*- numero = 5 + 14 5.2.2 Nimeros enteros largos (long) Si el entero no es suficiente disponemos del entero largo, cuya longitud es arbitraria y no tiene limite superior ni inferior. Para especificar que queremos que un nimero se almacene como tipo long y no como tipo int le afiadimos detras una letra “L” de este modo: #1/usr/bin/python # -*- coding: utf-a -*- entero largo = 145L Un mismo nimero ocupa mas memoria guardado como tipo Jong que como tipo int, de modo que es mejor usar este iiltimo siempre que sea posible. 5.2.3 Niimeros en coma flotante (float) Llamamos mimeros en coma flotante a los nimeros racionales. Es decir, a los que tienen expansién decimal. El maximo néimero que permite este tipo es 1.7976931348623157¢+308, y el minimo 2.2250738585072014e-308. En Python los decimales se separan con un punto (.). © RAMA Capitulo 5. TRABAIANDO CON DATOS 55 #1 /usx/bin/python # -*- coding: uté-8 coma_flotante = 2.5 5.2.4 Numeros complejos (complex) Los mimeros complejos son una abstraccién matemitica, ideada para resolver el problema de las raices de nimeros negativos. Son aquellos que tienen parte real y parte imaginaria, el formato numérico mas exético de los que hemos visto y, probablemente, el que menos usaremos. Para usar un nimero complejo hay que indicar su parte real normalmente y su parte imaginaria seguida de la letra “‘j” de este modo: #1/usr/bin/python # -*- coding: utf-8 numero = 34 + 53 5.2.5 Notacién Para indicarun néimero, normalmente usamos la notacién decimal (en base 10) a la que estamos acostumbrados, pero no es la ‘tnica que Python nos permite. No es algo que vayamos a usara menudo pero, aparte de las diferencias en tipos numéricos, Python nos permite usar las notaciones binaria, octal, hexadecimal y cientifica. Es importante sefialar que esto afecta solo a la forma de representar el néimero, no al tipo de dato ni a cémo se almacena internamente. Por ejemplo, para representar un niimero en base 8 (notacién octal) se haria indicando un cero delante, del siguiente modo: #1 /usr/bin/python # -*- coding: utf-8 numero = 0165 print numero # Bl miimero 165 en base octal equivale al 117 en base decimal Salida del programa: 7 56 PYTHON. PASO A PASO RAMA © RAMA Capitulo 5. TRABAIANDO CON DATOS 57 Si, en este ejemplo, le indicamos que nos muestre el mimero con un print print numero numero, mostrard 117, que es ese mismo en base decimal. # equivale a 12 X 10*5 = 1200000 Para usar la base binaria (base 2), que solo usa unos y ceros, se antepone al otro_numero = 456767 niimero el cédigo Ob, como se puede ver en este ejemplo: print otro_numero #1 /usr/bin/python # equivale a 4567 X 10°7 = 45670000000 # -*- coding: utf-8 -#- numero = 0b1001 Salida del programa: 1200000.0 print numero 45670000000.0 # El nfimero 1001 en binario es equivalente al 9 en base decimal Salida del programa: 5.2.6 Valores booleanos (hool) 9 El tipo booleano sirve para mostrar valores légicos. Solo puede tener dos valores, Verdadero 0 Falso, que en Python se indican mediante las palabras True ‘Det naismo modoj(para indicar-un-njmero-en: base hexadesamal (base/10)3¢ y False. Veremos los valores légicos y su uso con ms detenimiento més adelante. antepondremos Ox, de esta forma: #1!/usr/bin/python #1 /usr/bin/python # -*- coding: utf-@ # -*- coding: utf-a -*- valor_verdadero = True numero - oxB16A, Valor_falso = False print numero ~ # El ntimero 0xB16A be base octal equivale al 45418 en base Ambos deben estar escritos en miniscula, con la primera letra en mayiscula. decimal Salida del programa: asaie De nuevo, como en los casos anteriores, si hacemos un print numero, mostrard 45418, que es el mismo en base decimal. Python también nos permite usar notacién cientifica. La notacién cientifica es especialmente itil para mimeros muy grandes, muy pequefios o con largas expansiones decimales, y se usa affadiendo una letra “e” tras el mimero seguida de la 5.2.7 Cadenas (str) potencia de 10 que queramos indicar. Por ejemplo: Los tipos vistos hasta ahora son todos numéricos, pero no son los tinicos que #1 /usx/bin/python hay. Probablemente, el tipo de dato que més usaremos sean las Ilamadas cadenas. # -¥- coding: utf-8 -*- numero = 12e5 58 PYTHON. PASO A PASO RAMA Una cadena es un trozo de texto (también puede contener nimeros y todo tipo de caracteres, claro, pero serdn tratados como texto). Indicamos una cadena encerrndola entre comillas simples (+) o dobles (*): #1/usr/bin/python # -*- coding: utf-8 una_cadena = "Hola mundo" otra_cadena = 'Hola de nuevo! Si nuestra cadena contiene saltos de linea Python dara un aviso de error ya que, por defecto, una instruccién no puede ocupar més de una linea. Podemos usar tres comillas seguidas, tanto simples (‘+ *) como dobles (** *) para acotar una cadena de varias lineas: #1/usr/bin/python # -*- coding: utf-a -*- cadena = """Esta cadena ocupa m4s de una linea. y més de dos por eso le ponemos triples comillas.""" Da completamente igual usar comillas simples o dobles. Légicamente, para evitar problemas, si tratamos de guardar un texto que ya contenga comillas dentro de una cadena, debemos usar unas comillas distintas a las que ya use ese texto: #1/usr/bin/python # -*- coding: utf-8 cadena_con_comillas = 'el signo "comillas" (") se usa en python para acotar cadenas' También se puede hacer que Python no trate de interpretar las comillas anteponiéndoles el cardcter de barra invertida (\) de este modo: #1/usr/bin/python # -*- coding: utf-8 cadena_con_comillas = "el signo \"comillas\" (\") se usa en Python para acotar cadenas de texto" Acesto se le llama escapar un cardcter (en este caso las comillas) y no es el inico caso en que tendremos que hacerlo. En general, cualquier cardcter que tenga © RAMA Capitulo 5. TRABAIANDO CON DATOS 59 algin significado especial para Python puede ser escapado de este modo para evitar que sea interpretado. Algunos caracteres precedidos de una barra invertida tienen un significado especial. Por ejemplo, el simbolo “\n” representa una nueva linea (hace que la linea termine en ese punto y contintia escribiendo en la siguiente) y el signo “\t” representa un tabulador. En particular, el propio cardcter “\” puede ser escapado anteponiéndole otra barra “\\”. \W Barra invertida (\) Me Comilla simple (*) \" Comnilla doble (*) \a ‘Campana (BEL) \b Retroceso (BS) \E Salto de pagina (FF) \n ‘Nueva linea (LF) \r Retorno de carro (CR) \t ‘Tabulador (TAB) Ww ‘Tabulador vertical Tab (VT) #1/usr/bin/python # -*- coding: utf-a -*- cadena = "Esto va en una linea.\ny esto en la siguiente." print cadena Salida del programa: Esto va en una linea. y esto en la siguiente. ‘Aveces tenemos una cadena en la que no queremos que se interprete ningin caracter especial. Para ello podemos usar el caracter “t” antepuesto a la cadena (justo antes de abrir las comillas) de este modo: #1 /usr/bin/python # -*- coding: utf-8 -*- 60. PYTHON. PASO A PASO RAMA cadena_raw = r"los signos como \n y \t no serén interpretados y se mostraran tal y como estén" Otro modificador interesante es el cardcter “u”, con el que le decimos a Python que esa cadena debe ser tratada como Unicode, y puede contener cosas como acentos y caracteres que no aparecen en ASCII. #1/usr/bin/python # -*- coding: utf-8 - cadena_unicode = u"Texto de la cadena" 5.2.8 None Un tipo especial de Python es wone, que indica la ausencia de valor. No es Jo mismo una variable que contiene una cadena vacia (**) o el mimero cero, que una variable que no contiene ningiin valor. None se usa para representar esa ausencia de valor. Python pone a nuestra disposicién la funcién type () para averiguar el tipo de una variable o de un literal: #1/usr/bin/python # -*- coding: utf-8 - texto = "Hola Mundo" entero = 21 print type (texto) # Tipo str print type("Hola") # Tipo str print type (14.5) # Tipo float print type (entero) # Tipo int print type (181) # Tipo long © RAMA Capitulo 5. TRABAIANDO CON DATOS 61 print type (True) # Tipo bool Salida del program ctype ‘str'> 5.2.9 Manipular tipos de datos Python dispone de algunas funciones que nos pueden servir para transformar datos de un tipo a otro. Por ejemplo, la funcién int (numero) toma un mimero (0 una cadena que contenga un numero) y retorna un entero: #1 /usr/bin/python # -*- coding: utf-8 texto = "10" decimal = 21.15 un_entero = int (texto) print type (texto) print type (decimal) print type (un_entero) print type (int (decimal) ) Salida del programa: ctype 'str'> ctype 'float'> ctype 'int'> 62 PYTHON. PASO A PASO RAMA © RAMA Capitulo 5. TRABAIANDO CON DATOS 63 De modo similar, 1ong (numexo) toma un nimero (0 una cadena que contenga cadena_entero = str (entero) un nimero) y retorna un entero largo: cadena_decimal = str (decimal) #1 /usr/bin/python # -*- coding: utf-8 -*- print type (cadena_entero) corte = 10 print type (cadena_decimal) large = Jong (corto! j a Bi {ScEre) ‘Salida del programa: print type(corto) etype ‘str's ctype ‘str'> print type (largo) De un modo parecido, las funciones hex: (xe) y oct (x) toman un valor entero y retornan una cadena, En el primer caso con la representacién hexadecimal de ese Salida del programa: mamero, y en el segundo con la representacién octal: ctype ‘int'> #1/usr/bin/python # -*- coding: utf-a -*- Para convertir un numero en otro en coma flotante, se usa la funcién float (numero): entero = 500 #1!/usr/bin/python hexadecimal = hex(entero} # -*- coding: utf-8 -*- octal = oct (entero) flotante = float (4) print hexadecimal print flotante print octal print type (flotante) Salida del programa: Salida del programa: coara 4.0 0764 Por otro lado, para obtener una cadena a partir de otros valores, tenemos la 5.3 OPERADORES funcién str (x): s #1 /usr/bin/python Un operador es un elemento del lenguaje que representa una accién sobre los # -*- coding: utf-2 datos, como una suma o una concatenacién. A los elementos sobre los que se aplica el operador (como los néimeros de una suma, por ejemplo) se les llama operandos. entero = 5 decimal = 21.15 64 PYTHON. PASO A PASO RAMA 5.3.1 Operadores matematicos Los operadores matemiticos se aplican a valores numéricos, consignan las operaciones matematicas basicas y son los siguientes: + (suma) - (resta) + (multiplicacién) / (divisién) ++ (exponente) // (division entera) % (médulo) NUT Como hemos visto antes, el operador suma (+) hace exactamente eso, sumar dos nimeros. El operador resta (-) sustrae uno del otro, y la multiplicacién (*) y divisién (/), como era de esperar, multiplican y dividen respectivamente. El exponente ("**) eleva el primer mimero a la potencia indicada en el segundo. #1/usr/bin/python # -*- coding: utf-a -*- primer_numero = 10 segundo_numero = 5 suma = primer_numero + segundo_numero #15 xesta = primer_numero - segundo_numero 5 multiplicacion = primer_numero * segundo_numero #50 division = primer_numero / segundo_numero #2 potencia = primer_numero ** segundo_numero # 100000 Las operaciones divisién entera y médulo probablemente necesiten una explicacién mas detallada. © RAMA Capitulo 5. TRABAIANDO CON DATOS 65 La divisi6n entera es el resultado de una divisién del que descartamos la parte decimal. O dicho de otro modo, una divisién redondeada hacia abajo. El resultado, por ejemplo, de 7 // 2 serd 3, porque siete dividido (sin decimales) entre dos es tres y nos sobra uno (que la divisién entera ignora). EI médulo es la operacién complementaria a la anterior, es el resto de una divisién, lo que sobra de dividir dos mimeros sin usar decimales. Por ejemplo: el resultado de 7 & 2 seria 1, porque siete dividido (sin decimales) entre dos es tres y nos sobra uno, que es el médulo. #1 /usr/bin/python # -*- coding: utf-8 primer_numero = 10 segundo_numero = 3 division_entera = primer_numero // segundo_numero #3 module = primer numero % segundo_numero #1 Para todos estos operadores existe una versién con asignacién, cuyo simbolo es el mismo pero seguido de un signo igual (= += (suma con asignacién) == (resta con asignacién) += (multiplicacién con asignacién) /= (divisién con asignacién) ++= (exponente con asignacién) //= (divisién entera con asignacién) = (médulo con asignacién) NUTTY Su funcionamiento es el mismo que el del operador original, pero asignando el valor resultante de la operacién a la primera variable. Se trata de una especie de taquigrafia que nos evita tener que poner cosas como primer_nunero = primer_ numero + segundo_numero! #1 /usr/bin/python # -*- coding: utf-8 -*- primer_numero = 10 segundo _numero = 5 66 PYTHON. PASO A PASO RAMA primer_numero += segundo_numero print primer_numero # Ahora primer_numero vale 15 primer_numero -= segundo_numero print primer_numero # Ahora primer_numero vale 5 primer_numero *= segundo_numero print primer_mumero # Ahora primer_numero vale 50 Salida del programa: 15 10 50 Todos los operadores aritméticos operan sobre nimeros y retornan un valor numérico. El tipo concreto de dato retornado dependers del tipo o tipos usados en la operacién. Si los tipos de mimero usados en una operacién aritmética son iguales, el resultado de esta tendra ese mismo tipo. Si los tipos usados son diferentes, Python usard el tipo que contenga ms informacién. Por ejemplo, si sumamos un int y un £1oat el resultado sera otro £1oat, para no perder los decimales. 5.3.2 Operadores de comparacion Los operadores de comparacién sirven para comparar mimeros, cadenas, objetos y, en general, cualquier cosa en Python, Devuelven siempre un valor logico (crue si se cumple la condicién o raise si no se cumple) y son los siguientes: (igualdad) = (desigualdad) <> (desigualdad) > (mayor que) < (menor que) >= (mayor o igual que) <= (menor o igual que) NUTTY © RAMA Capitulo 5. TRABAIANDO CON DATOS 67 Laigualdad (=) se cumplira (y retornaré true) si las dos cosas a comparar son iguales. La desigualdad (que se puede representar con los signos t= y <>, totalmente equivalentes) hace la operacién contraria, y devuelve true si los operandos son distintos y raise si son iguales. El operador “mayor que” > devuelve true si el operando de la izquierda es mayor que el de la derecha; y “menor que” < hace justo lo contrario. Los operadores “mayor o igual que” >= y “menor o igual que” <= son muy parecidos a los anteriores, con la salvedad de que estos tiltimos retornan True también si ambos operandos son iguales. #1/usr/bin/python # -*- coding: utf-a -*- numero = 7 texto “Hola Mundo" print 3 print 3 > 2 print "Hola Mundo" print 7 >= 6 Salida del programa: False True True True 5.3.3 Operadores de cadena Los operadores de cadena son: V + (concatenacién) V * (multiplicacién) La coneatenacién + une dos cadenas, una a continuacién de la otra, para formar una nueva. 68 PYTHON. PASO A PASO RAMA La multiplicacién + permite multiplicar una cadena por un mimero, para formar una nueva cadena, resultante de repetir la cadena original tantas veces como el mimero indicado. #1 /usr/bin/python # -*- coding: utf-8 saludo “Hola "+ "Mundo" gallina = 4 * "Co" print saludo print gallina Salida del programa: Hola Mundo Cococeco Al igual que los operadores numéricos, las cadenas también disponen de operadores con asignacién: #1/usr/bin/python # -*- coding: utf-a -*- saludo = "Hola * gallina = "co" saludo += "Mundo" gallina *= 4 print saludo # Muestra "Hola Mundo" print gallina # Muestra CoCoCoCo Salida del programa: Hola Mundo cococeco © RAMA Capitulo 5. TRABAIANDO CON DATOS 69 5.3.4 Operadores légicos Son aquellos que nos sirven para efectuar operaciones con valores légicos, y retornan siempre un valor booleano True 0 False. Son las operaciones: Wand (y logica) F ox (0 logica) ¥ not (negacién) El operador and equivale a la conjuncién “y légica”, y retorna un valor true solo si ambos operandos son también True. Tabla del operador and: Pn ee OM Ce Cy Sterner True ‘True ‘True True False False False True False False False False El operador l6gico or equivale a la conjuncién “o légica”, y retorna un valor true siempre que no sean falsos ambos operandos. Tabla del operador or: er eC Ret) Berner cy True ‘True ‘True True False ‘True False ‘True ‘True False False False Al contrario que los dos anteriores, el operador not se aplica sobre un solo operando, ¢ invierte el valor lagico de este. Si el operando es True devolvera False, y viceversa. Tabla del operador not: ‘True False False True 70 PYTHON. PASO A PASO RAMA © RAMA Capitulo 5. TRABAIANDO CON DATOS 71 #1 /usr/bin/python 5.3.6 Operadores de pertenencia # -*- coding: utf£-8 resultado = 2 Los operadores de pertenencia in ynot in sirven para indicar si un elemento eine veaureaas pertenece 0 no a una secuencia (las secuencias son estructuras de datos que veremos #3 no es igual a 2, por lo que es falso un poco mas adelante). El operador in retorna un valor true si el elemento indicado ala izquierda del operador esté en la secuencia indicada a la derecha del operador. El print True and True : : i : 4 alge cue en iciarde qiGlavee da sieves operador not. in hace lo contrario, y da True si el elemento no esté en la secuencia False si lo esta. print True and resultado y # algo que es "cierto y falso" es falso #1 /usr/bin/python print not True # -*- coding: utf-8 # "no cierto" es falso print False or resultado lista = ["silla","mesa", "armario", "taburete"] # algo que es "falso 0 falso" es falso print "silla" in lista # Mostrard "True", porque "silla" est en la lista Salida del programa: False print "sofa" in Lista True # Mostrara "False", porque "sof4" no esta en la lista False False print "mesa" not in lista False # Mostrara "False", porque "mesa" esta en la lista 5.3.5 Operadores de identidad EAE Daur true Un caso especial son los operadores de identidad is y is not. wares False Ambos sirven para comparar elementos. El operador is devuelve true si ambos elementos comparados son el mismo objeto (poscen la misma id), y False si no lo son (tienen id distintas). El operador is not hace justo lo puesto. 5.3.7 Operadores binarios ‘Més adelante entraremios en detalles sobre > (desplazamiento ldgico a la derecha) print variablel is variable2 NUTTY Salida del programa: False 72 PYTHON. PASO A PASO RAMA El operador AND binario « compara las representaciones binarias de los mimeros proporcionados, y devuelve un mimero que tiene unos en las posiciones donde alguno de los operandos tiene un uno, y ceros en las posiciones donde ninguno de ellos tiene un uno: Petty ty) [te PO et et eon nutty (op) Se] i | we | a eCPM (1) 9 899 Ot #1/usz/bin/python # -*- coding: utf-8 -*- mumerol = 0b1011 obio1 mumero2 print numerol #12 print numero2 #5 print numerol & numero2 # Muestra 1 Salida del programa: ul 5 L El operador OR binario | retorna un nimero tal que su representacién binaria contenga un uno si al menos uno de los operandos tiene un uno en esa posicién, y un cero si ambos tienen un cero en ella: amet cy O)s)| ete oo enon nut) (ey |b | | ee | a Resultado de OR () (ey || |e | we | a #1/usr/bin/python # -*- coding: utf-a -*- Capitulo 5. TRABAIANDO CON DATOS 73 numerol = 0b1001 numero2 = 0b1100 print numerol #9 print numero2 #12 print numerol | numero2 # Muestra 13 Salida del programa: 9 12 13 El operador XOR binario * retorna un mimero tal que su representacién binaria contenga un cero si los operandos tienen distinto ntimero en esa posicién, y un uno si ambos comparten el mismo mimero en ella: egy rt ty nae eC arnt od Era Ee Resultado de XOR (*) w]e | @ | a #1/usr/bin/python # -*- coding: utf-8 mumerol = 0b1001 mumero2 = 0b1100 print numerol #9 print numero2 #12 print numerol * numero2 # Muestra 5 Salida del programa: 9 12 5 74 PYTHON. PASO A PASO RAMA EI “desplazamiento légico a la derecha” mueve los bits del operando de la izquierda tantos espacios como indique el operando de la derecha. Los bits menores que el primero son descartados. EI “desplazamiento a la izquierda” desplaza los bits del operando de la izquierda tantos espacios como indique el operando de la derecha. El espacio que deja este desplazamiento se rellena con ceros. La operacién “complemento a uno” actia sobre la representacién binaria de un mimero, y retorna otro nimero en el que los unos del original han sido reemplazados por ceros, y los ceros por unos. 5.4 PRECEDENCIA ENTRE OPERADORES En Python las expresiones se evaltian normalmente de izquierda a derecha. La excepcién son las asignaciones ya que, lgicamente, la parte derecha de una asignacién debe resolverse antes de hacer dicha asignacién. Dentro de cada expresién, se evaliian las operaciones segiin la siguiente lista, de arriba abajo: ** (potencia) ~ (complemento a uno) * (multiplicacién), / (divisién), / (divisién entera), % (médulo) + (suma), - (Festa) ‘<< (desplazamiento légico a la izquierda), >> (desplazamiento ldgico a la derecha) & (AND binario) * (XOR binario) (OR binario) > (mayor que), < (menor que), >= (mayor o igual que), <= (menor o igual que), — (igualdad), <> (desigualdad), “is” y “not is” (operadores de identidad) “in” y “not in” (operadores de pertenencia) “not” (negacién) “and” (y Logica) “or” (0 légica) © RAMA Capitulo 5. TRABAIANDO CON DATOS 75 Naturalmente, se puede usar paréntesis para cambiar el orden de las operaciones: #1/usr/bin/python # -*- coding: utf-a -*- resultado = 5 +4 *7 resultado2 = (5 + 4) * 7 print resultado # Mostraré 33 print resultado2 # Mostraré 63 Salida del programa: 33 63 5.5 SECUENCIAS Y ESTRUCTURAS DE DATOS Las variables que hemos visto hasta ahora pueden contener un dato simple, como un nimero o una cadena de texto. Pero a menudo necesitaremos usar estructuras de datos més sofisticadas. Si una variable puede ser considerada como un contenedor donde almacenamos un elemento (mas tarde yeremos que esto no es exacto), las secuencias son colecciones o conjuntos de estos elementos. 5.5.1 Listas Una lista (también conocidas como vectores 0 arrays) es una variable que, en lugar de contener un valor, contiene una secuencia ordenada de estos, a los que se puede acceder por su indice o posicién. Se declaran indicando sus elementos, separados por comas, entre corchetes (): #1/usr/bin/python # -*- coding: utf-a -*- 76 PYTHON. PASO A PASO RAMA © RAMA Capitulo 5. TRABAIANDO CON DATOS 77 lista = ["primero", "segundo", "tercero", "cuarto"] Salida del programa: eee w8eR Para climinar un elemento de una lista se usa la instruccién de1, de este modo: Salida del programa: #1 /ust/bin/python [‘primero', 'segundo', 'tercero', 'cuarto'] Heossceoding: urt-B ss Si es necesario, se puede crear una lista vacia usando unos corchetes sin lista = ["primero", "segundo", "tercero", "cuarto"] ningiin elemento en su interior. print lista #1/usr/bin/python # -*- coding: utf-a -*- del lista(2] lista = (1 # Esto creara una lista vacia print lista Una lista también se puede crear explicitamente, con la funcién 1ist () : Salida del programa: #1 /usr/bin/python ('primero', ‘segundo’, ‘tercero', ‘cuarto'] # -*- coding: utf-8 -*- ['primero', ‘'segundo', 'cuarto'] Lista = list (("Hola", "mundo", "palabra") ) Una lista puede contener datos de todo tipo, lo que incluye cadenas, mimeros y hasta otras listas. Ademds, dentro de una lista se puede mezclar tipos de datos. print lista Para acceder al contenido de una lista dentro de otra, se pone un indice a Gi nere continuacién del otro: primero el de la lista inicial, seguido de la lista contenida en esta: ['Hola', ‘mundo’, ‘palabra'] #1 /usr/bin/python Para acceder a un elemento de la lista, ya sea para leerlo o para modificarlo, # -* coding: utf-8 es necesario indicar entre corchetes el indice (la posicién) de ese elemento, teniendo en cuenta que se comienza a contar desde cero, por lo que el primero es el 0, el lista = [(2, 2, 31, [ta", "bY, "o*]] segundo es el 1, etc. print lista[1] [0] #1 /usr/bin/python # Imprimira "a" # -*- coding: utf-@ -*- print lista[0] [2] lista = ["primero", "segundo", "tercero", "cuarto"] # Imprimira "3" print lista [2] # Mostraré "tercero" Salida del programa: a lista[2] = "Nuevo Blemento" 3 print lista(2] Naturalmente, es posible anidar listas dentro de otras con tantos niveles de # Ahora mostraré "Nuevo Elementot profundidad como sea necesario. 78 PYTHON. PASO A PASO RAMA #1/usr/bin/python # -*- coding: uté-8 lista ["primero", 2, "tercero", ["a", "b", "c"]] print lista(2] print lista[3] [0] Salida del programa: tercero a Se puede acceder a los elementos de una lista en sentido inverso (de atrés adelante) indicando el indice como un niimero negativo. [-1] indicaré el altimo elemento, [-2] el peniiltimo, ete. También se puede acceder a un fragmento de la lista original usando el signo dos puntos (:) para indicar dos mimeros, del modo Lista {numero:numero). Esto retornaré una seccién de la lista comenzando por el primer mimero indicado y terminando por el miimero anterior al segundo indicado. A esta forma de extraer sublistas se la conoce como siicing (rebanado). Si se omite el primer naimero, la lista resultante comenzaré al principio de la lista original. Si se omite el segundo, el final de la lista resultante coincidird con el final de la lista original. Si se omiten ambos, el resultado serd una copia de la cadena original. #1/usr/bin/python # -*- coding: utf-a -*- lista = ["primero", "segundo", "tercero", "cuarto", "quinto", "sexton] lista2 = lista[1:4] print lista2 # Mostraré "['segundo', 'tercero', 'cuarto']" Lista2(0:2] = ["otro", "Y otro") print lista2 # Mostraré "[‘otro', '¥ otro’, ‘cuarto']" © RAMA Capitulo 5. TRABAIANDO CON DATOS 79 Salida del programa: ['segundo', ‘tercero', ‘cuarto'] ['otro', '¥ otro’, '‘cuarto'] Por tiltimo, se puede afiadir un tercer niimero, también separado por dos puntos (:), para que no nos retorne todos los mimeros del rango indicado, sino que devuelva uno de cada dos, de cada tres, 0 el mimero que le indiquemos. #1/usr/bin/python # -*- coding: utf-8 lista = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] print lista [2:15] # Mostraré "[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)" print lista(2:15:2] # Mostraré "[3, 5, 7, 9, 11, 13, 15]" print lista [2:15:31 # Mostraré "[3, 6, 9, 12, 15]" Salida del programa: (3, 4, 5, 6, 7, 8 9, 10, 11, 12, 13, 14, 15] (3, 5, 7, 9, 11, 13, 15] (3, 6, 9, 12, 15] 5.5.2 Tuplas ‘Una tupla es similar a una lista, con la salvedad de que no puede modificarse. Una vez que se crean no se les puede afiadir, quitar ni cambiar elementos. Decimos que las tuplas son objetos inmutables, mientras que las listas son objetos mutables. Mis adelante, en este mismo capitulo, veremos algo mas sobre las diferencias entre objetos mutables ¢ inmutables. Las tuplas se declaran simplemente separando con comas los elementos que las componen: #1/usr/bin/python # -*- coding: utf-a -*- tupla = "primero", "segundo", "tercero", "cuarto", "quinto", "sexto" 80 PYTHON. PASO A PASO RAMA print tupla # Mostrara "('primero', 'segundo', 'tercero', 'cuarto', 'quinto', 'sexto!)" Salida del programa: ('primero', 'segundo', 'tercero', 'cuarto', 'quinto', 'sexto') Para distinguir una tupla constituida por un solo elemento de una variable, se debe poner una coma detrs de ese elemento: #1 /usr/bin/python # -*- coding: utf-8 variable = 5 tupla = 5, print variable # Mostrara "5" print tupla # Mostraré "(5,)" Salida del programa: 5 (5,) Al imprimir las tuplas, Python las muestra entre paréntesis. Los paréntesis se usan en Python para agrupar operaciones y es posible declarar una tupla entre paréntesis. De hecho, es una costumbre muy recomendable, ya que permite reconocer las tuplas de un vistazo y hace el cédigo mas legible. #1/usr/bin/python # -*- coding: utf-a -*- tupla = ("primero", "segundo", "tercero", "cuarto", "quinto", "sexto") print tupla # Mostraré "('primero', 'segundo', ‘tercero', ‘cuarto', tquinto', ‘sexto')" © RAMA Capitulo 5. TRABAIANDO CON DATOS 81 Salida del programa: (tprimero', 'segundo', 'tercero', 'cuarto', 'quinto', 'sexto') De manera similar al caso de las listas, se puede iniciar una tupla vacia usando paréntesis del modo tupla = (). Para acceder a los elementos de una tupla se hace exactamente igual que con las listas (con la salvedad ya mencionada de que no pueden modificarse), usando corchetes. #1/usr/bin/python # -*- coding: utf-8 tupla = ("primero", 2, True, "Otro") print tupla([2] # Mostraré "True" print tupla[1:3] # Mostraré "(2, True)" Salida del programa: true (2, True) 5.5.3 Cadenas como secuencias Un aspecto interesante de Python es que las cadenas se pueden comportar como una lista de caracteres (0, como yeremos, mas bien como una tupla de caracteres), por lo que se puede acceder a sus caracteres como si de elementos de lista se tratara. Naturalmente, también se puede hacer slicing para extraer caracteres 0 grupos de caracteres, usando la misma notacién que hemos visto para tuplas y listas. 82 PYTHON. PASO A PASO RAMA #1/usr/bin/python # -*- coding: uté-8 cadena = "Hola mundo" print cadena [1] # Mostraré "0" print cadena [2:7] # Mostraré "la mu" Salida del programa: ° la ma Al igual que en el caso de las tuplas, las cadenas son inmutables, y el slicing se puede usar solo para leer y no para introducir caracteres, por lo que no se puede modificar la cadena de este modo. Existen también otros dos tipos de conjuntos de datos, los diccionarios y los sets que no son secuencias, pero que tienen algunas caracteristicas comunes con estas. 5.5.4 Diccionarios Un diccionario es un conjunto de valores emparejados. En cierto modo un diccionario es parecido a una lista, con la diferencia de que los indices no tienen porqué ser numéricos sino que, ademas, pueden ser cadenas (lo mas habitual), tuplas una mezela de ellos. Al definir un diccionario, los valores de cada par se separan entre ellos con dos puntos (:), y de los otros pares por comas (,). El conjunto debe estar acotado por Haves ({}). Para acceder a un valor conereto, se pone el nombre del diccionario seguido del indice entre corchetes ([]) como hemos hecho con las listas, con la salvedad de que aqui ese indice no tiene porqué ser un mimero. Del mismo modo se puede agregar un nuevo par de valores 0 actualizar uno existente: #1/usr/bin/python # -*- coding: utf-a -*- diccionario = {"animal": "gato", "cosa": "piedra", "planta": “Lechuga"} © RAMA Capitulo 5. TRABAIANDO CON DATOS 83 print diccionario # Mostraré {‘planta': 'lechuga', ‘cosa': 'piedra', ‘animal’: "gato'} print diccionario["animal"] # Mostraré "gato" print diccionario["planta"] # Mostraré "lechuga" diccionario["planta"] = "coliflor" print diccionario ["planta"] # Ahora mostraré "coliflor" Salida del programa: {'planta': ‘lechuga', 'cosa': ‘piedra', ‘animal’: ‘gato'} gato lechuga coliflor Para crear un diccionario yacio se puede usar Ilaves vacias: diccionario Los diccionarios también se pueden crear explicitamente usando la funcién #1 /usr/bin/python # -*- coding: utf-8 diccionario = dict (animal="perro", plant: "tomate") print diccionario Salida del programa: {‘planta': ‘tomate’, ‘animal': ‘perro') Un diccionario puede contener cualquier tipo de dato (incluidas listas u otros diccionarios), pero las claves de un diccionario deben ser objetos inmutables (ver mis abajo). Dado que son la referencia para identificar cada elemento, las claves de un diccionario no pueden repetirse. Si se crea un diccionario con claves repetidas, la iiltima siempre reemplazaré a cualquiera anterior: 84 PYTHON. PASO A PASO RAMA #1/usr/bin/python # -*- coding: uté-8 diccionario = {"Nombre": "Clark Kent", "Nombre": "Superman", "Ciudad": "Metropolis"} print diccionario # Mostrara {'Nombre': 'Superman', ‘Ciudad’: 'Metropolis'} Salida del programa: {'Nombre': ‘Superman’, ‘Ciudad’: 'Metropolis'} 5.5.5 Sets Un set 0 conjunto es una coleccién no ordenada de objetos. No posee un indice como las listas 0 los diccionarios, y no puede contener objetos repetidos. Se declara usando laves ({}) como un diccionario pero, dado que no tiene pares clave-valor, simplemente se separan sus elementos por comas. ‘Un set también puede declararse explicitamente usando la funcién set (). #1/usr/bin/python # -*- coding: utf-a -*- cubiertos = {"tenedor","cuchara","cuchillo", "cucharilla"} vajilla set (["plato", "taza", "copa"]) print cubiertos # Mostraré "set ({'cucharilla', ‘tenedor', ‘cuchillo', ‘cucha- ra'})" print vajilla # Mostraré "set(('taza', 'plato', 'copa'])" Salida del programa: set (['cucharilla', 'tenedor', ‘cuchillo', 'cuchara']) set (['taza', 'plato', ‘copa']) © RAMA Capitulo 5. TRABAIANDO CON DATOS 85 ‘No se puede crear un set vacio usando Ilaves porque se crearia un diccionario. Para crearlo es necesario hacerlo explicitamente, simplemente con conjunto set (). Un set no puede contener valores mutables (ver més abajo). 5.6 MUTABLE E INMUTABLE El funcionamiento interno de las variables en Python es algo diferente al de otros lenguajes. En Python, una variable es una referencia a un dato. Es decir, es como si fuera una etiqueta que esta enlazada a ese dato. El dato en si tiene su propio nombre interno asignado por Python y que es accesible con la funcién 14) - Cuando copiamos una variable en Python, lo que hacemos es crear una nueva etiqueta apuntando a ese mismo dato. Es decir, en realidad se trata de la misma variable con dos nombres distintos. #1 /usr/bin/python # -*- coding: utf-8 variablel = "Hola" variable2 = variablel variable3 = "Adiés" print id(variable1) print id(variable2) # la id de variablel y variable2 serén la misma print id(variable3) # la id de variable3 es distinta Salida del programa: 14n694944690896 140694944690896 140694944691040 Python lo hace asi porque es muy eficiente en términos de memoria y velocidad: Es mucho més répido y econémico crear una referencia que copiar el contenido de la variable. 86 PYTHON. PASO A PASO RAMA Si posteriormente modificamos el contenido de la variable, lo que en realidad hace Python internamente es crear otra nueva (con un nuevo id) y hacer que cl nombre que habiamos asignado a la original ahora apunte a ella. Simple y elegante. Lo que hemos dicho es cierto para los mimeros, los valores légicos, las cadenas y las tuplas. En Python decimos de estos tipos de datos que son inmutables. Sin embargo, las listas, los sets y los diccionarios son mutables: si que pueden modificarse realmente sin que cambie su id. Es decir, que podemos agregar, quitar 0 modificar sus elementos sin que Python tenga que reescribir toda la lista 0 diccionario. Python no crea una lista nueva cada vez que modificamos alguno de sus elementos. #1/usr/bin/python # -*- coding: utf-a - lista = ["Hola", "mundo", "palabra"] print id(lista) lista[2] = "cosa" print id(lista) # El id no ha cambiado ‘Salida del programa: 139828317300208 139828317300208 Este comportamiento de los tipos mutables (que pueden ser modificados sin que cambie su referencia) tiene una consecuencia inesperada. Ya hemos visto que, si hacemos una copia de un elemento inmutable, esto no afecta al original (y viceversa) porque, en realidad, estamos creando un nuevo objeto. Pero si copiamos un elemento mutable (como, por ejemplo, una lista) y modificamos el original, esas modificaciones se mostrarn también en la copia. Tgualmente, si modificamos la copia, también cambiaré el original. © RAMA Capitulo 5. TRABAIANDO CON DATOS 87 Esto ocurre porque, al ser un tipo mutable, no se crea uno nuevo como ocurre con los inmutables y, por tanto, no cambian las referencias y ambos objetos siendo el mismo. #1/usr/bin/python # -*- coding: utf-8 Lista = ["Hola", "mundo", "palabra"] copia_de_lista = lista listal2] = "cosa" print copia_de_lista [2] # jimprimira "cosa"! Salida del programa: cosa Si necesitamos copiar una variable con un contenido de tipo mutable, como una lista o un diccionario, debemos hacerlo explicitamente: #1/usr/bin/python # -*- coding: utf-a -*- lista = ["Hola", "mundo", "palabra"] lista2 = list (lista) print id(lista) print id(lista2) # Los id son distintos diccionario = {"nombre": "Pablo", "Apellido": "Hinojosa"} diccionario2 = dict (diccionario) print id(diccionario) print id(diccionario2) # Los id son distintos Salida del programa: 140627068982768, 140627069009504 140627069076936 140627069118736 88. PYTHON. PASO A PASO RAMA 5.7 QUE HEMOS VISTO EN ESTE TEMA? Las variables y los distintos tipos de datos que usa Python. Que Python es muy estricto con la forma en la que debemos usar los tipos de datos y que no podemos mezclarlos. Hemos visto formas de usarlos con operadores y cémo convertir datos de un tipo en otro. Hemos visto estructuras de datos mas complejas, como las listas 0 los diccionarios, que pueden contener otros datos. ‘También hemos visto las peculiaridades del uso interno de las variables en Python, y las diferencias entre los objetos mutables ¢ inmutables. 5.7.1 Tareas sugeridas ¥ A estas alturas deberiamos ser capaces de mejorar nuestros simples ejemplos de “Hola Mundo”. Y Seria interesante practicar las conversiones de tipo de dato, en especial a cadena, porque es algo que acabaremos usando mucho. ¥ Unprograma que haga un cAlculo matematico con dos ntimeros contenidos en sendas variables, y muestre por pantalla un texto del tipo “El resultado de la operacién es 14” deberia ser ya algo facil. ¥ Un programa que haga varias operaciones sobre variables y muestre el resultado de cada una de ellas usando cadenas también deberia ser facil. ¥ Lo mismo para otros tipos de datos distintos del numérico. ¥ Seguramente, cuando hagamos operaciones complejas con mas de un operador necesitemos usar paréntesis para forzar la precedencia entre operaciones. No es mala idea practicarlo un poco ahora. ¥ Estos ejercicios se podrian combinar con el acceso a estructuras de datos, especialmente listas y diccionarios, porque es algo que seguramente usaremos mucho en el futuro. ¥ Agregar, quitar 0 modificar elementos en cualquiera de estas estructuras seguramente va a ser parte de muchos de nuestros programas posteriores, y deberiamos practicarlo bastante. SYNAPS PREMIUM ESTRUCTURAS DE CONTROL EI flujo normal de un programa es, en principio, linea a linea y de arriba abajo. Primero se ejecuta la primera sentencia y después las siguientes, una a una, hasta terminar el programa. Se puede poner mas de una instruccién por linea separandolas por el signo punto y coma (;): #1/usr/bin/python # -*- coding: utf-8 -*- print "Hola"; print "Y hola"; print "¥ hola de nuevo" Hola ¥ hola ¥ hola de nuevo Ponerlas asi tiene exactamente el mismo resultado que ponerlas una debajo de otra. Pero es mejor no hacer esto a menos que contribuya a la legibilidad del cédigo. Por la misma razén que, como ya hemos visto, las lineas en blanco son ignoradas por Python pero se deben usar para hacer el programa més facil de leer. Pero, como veremos més adelante en este capitulo, las sentencias pueden “anidarse”. Es decir, pueden incluirse unas dentro de otras para hacer dependiente su ejecucién, Esto se usa, segiin el caso, para repetir un grupo de instrucciones varias 90 PYTHON. PASO A PASO RAMA ‘veces (en lo que se llama un bucle) o para condicionar la ejecucién de una sentencia al resultado de otra. En otros lenguajes de programacién es habitual agrupar o anidar las sentencias por medio de simbolos como Ilaves o similares: instruceién_principal { una_instruccién_anidada otra_instruccién_anidada } instruceién_independiente En este ejemplo las sentencias que dependen de instruccién_principal estan encerradas entre Haves. Ademés, se encuentran indentadas un nivel de tabulacién (cuatro espacios, en nuestro caso), pero esta tabulacién no es necesaria para el programa, sino que se pone deliberadamente para hacer més clara la lectura del programa a los seres humanos. La sentencia instruccién_independiente se ejecuta normalmente después de las anteriores. Python esta disefiado para ser legible, y hace esto de forma mis inteligente. En Python, el anidamiento de sentencias no se hace con Haves ni otros simbolos contenedores, sino por medio de la propia indentacién. Las sentencias con un nivel de tabulacién (digamos que un tabulador, ver més abajo) estén contenidas en las que no estin indentadas que les preceden; las sentencias con dos tabuladores estan inchuidas en las anteriores, etc. instruceién_principal: una_instruccién_anidada otra_instruccién_anidada instruceién_independiente Se recomienda encarecidamente que no se use realmente el carécter tabulador (ASCII 09) para indentar, sino que se usen espacios. Lo aconsejable, segin el manual de estilo de Python es usar cuatro espacios por cada nivel de indentado. © RAMA Capitulo 6. ESTRUCTURAS DE CONTROL 91 6.1 SALTO CONDICIONAL IF Como apuntabamos antes, un programa medianamente ‘til no puede limitarse a ser una sucesién de sentencias. Necesita reaccionar ante cambios en su “entorno”, tomar decisiones, de modo que se efectien distintas operaciones y se ejecuten distintas secciones del cédigo en distintas circunstancias. Para ello existen las estructuras condicionales. Las estructuras condicionales son constructos de software que se encargan de comparar valores (ya sea de variables, constantes, o casi cualquier cosa en Python) y, en funcién del resultado de esa comparacién, ejecutar o no un determinado bloque de cédigo. La estructura basica para el control del flujo de un programa es el “si condicional” i£, que permite la ejecucién de un segmento de cédigo dependiendo de las condiciones concretas y tiene el siguiente aspecto: #1/usr/bin/python # -*- coding: utf-a -*- if expresion_a_evaluar: ejecutar_si_cierto La sentencia inicial (la correspondiente al i) debe ir seguida de dos puntos, y todas las que dependen de ella van indentadas un nivel. Cuando el flujo del programa llega a esa sentencia, la expresién que sigue a la orden if es evaluada y, si retorna un valor True, se ejecutan las expresiones del bloque que contiene. Si la expresién que sigue al if devuelve un valor raise, ese bloque no se ejecuta y el programa continia por la primera instruccién que le siga. Por ejemplo: #1/usr/bin/python # -*- coding: utf-8 variable = 7 if variable > 5: print "la variable es mayor que cinco" print "Qué cosa mas notable" print "esto se muestra siempre" usar la orden pass que, simplemente, no hace nat 92 PYTHON. PASO A PASO RAMA ‘Salida del programa: la variable es mayor que cinco Qué cosa mas notable esto se muestra siempre Si, en el ejemplo anterior, cambiamos el valor de variable por un nimero menor que cinco, las dos instrucciones dentro del bloque se ignoraran y solo se podra ver el texto “esto se muestra siempre”. La sintaxis de Python no permite un i£ que no contenga instrucciones, por lo que el siguiente ejemplo dara error: #1/usr/bin/python # -*- coding: utf-a -*- # Bjemplo de cédigo erréneo variable = 7 if variable > 5: # Este if est& vacio y dara error print "esto se muestra siempre" Salida del programa: File "test.py", line 11 print "esto se muestra siempre" IndentationError: expected an indented block Si es necesario dejar una instruccién vacia como la del ejemplo, se puede #1/usr/bin/python # -*- coding: utf-a - variable = 7 if variable > 5: pass # Este if, aunque no hace nada, ya no dard error print "esto se mestra siempre" Capitula 6. ESTRUCTURAS DE CONTROL 93, Salida del programa: esto se muestra siempre Se puede usar la instruccién e1se para indicar las expresiones que se ejecutardn si la condicién del i£ no se cumple: #1/usr/bin/python # -*- coding: utf-8 variable = 2 if variable > 3: print "La variable es mayor que tres" else: print "La variable no es mayor que tres" print "Esto se muestra siempre" Salida del programa: La variable no es mayor que tres Esto se muestra siempre También se puede hacer construcciones mas elaboradas gracias a la orden e14£ (que es una contraccién de else if) y que nos permite afiadir un bloque que se ejecutard si se cumple una condicién y no se cumplen las anteriores: #1 /usr/bin/python # -*- coding: utf-8 variable = 2 if variable > 3: print "La variable es mayor que tres" print "No esté mal" elif variable < print "La variable es menor que tres" print "Me parece poco" else: print "La variable es tres" print "Justo tres, ni més ni menos" print "Esto se mestra siempre" 94 PYTHON. PASO A PASO RAMA ‘Salida del programa: La variable es menor que tres Me parece poco Esto se muestra siempre En este ejemplo, se comprueba si el valor contenido en la variable mi_ variable es mayor que tres y, si lo es, se imprime un texto diciéndolo. En caso de que no sea mayor que tres pero si sea inferior a tres (lo que indicamos en el e1i£) mostramos otro texto y, si ninguna de esas condiciones es cierta, se ejecuta el bloque indicado por e1se, donde se dice que el valor es tres (porque, si un mimero no es mayor ni menor que tres, debe ser tres). 6.2 BUCLE WHILE Un bucle (ciclo, Joop) es un bloque de cédigo que se ejecuta repetidas veces mientras se cumpla una condicién determinada. La instruccién white crea un bucle que se ejecutaré mientras su condicién sea cierta, Cuando la condicién deje de ser cierta el curso del programa continuard normalmente. Si la condicién es falsa desde el principio, ese bloque no se ejecutard (como si fuera un i). La estructura de while es la siguiente: while condicion: instruccién_a_ejecutar Por ejemplo: #1 /usr/bin/python # -*- coding: utf-@ -*- azo while a < 10: asad. print a Salida del programa: © RAMA Capitula 6. ESTRUCTURAS DE CONTROL 95, 10 Este ejemplo imprimira el nimero contenido en la variable “a” y, después, incrementard el valor de este en uno, mientras ese valor sea menor de 10. While, al igual que vimos en i£, también permite una sentencia else que se ejecutara cuando la condicién del bucle no sea cierta (es decir, fuera del bucle) de este modo: #1 /usr/bin/python # -*- coding: utf-8 while condicion: instruccién_a_ejecutar else: instruceién_fuera_del_bucle En un bucle while también se puede usar la instruccién break, que corta el discurrir del bucle en ese punto y continia la ejecucién del script por la primera instruccién posterior al bucle. Si hubiese una cléusula else, esta tampoco se ejecutaria. #1/usr/bin/python # -*- coding: utf-8 azo while a < 10: asad ifass 3: break print a 96 PYTHON. PASO A PASO RAMA ‘Salida del programa: L 2 En este ejemplo hemos puesto un if anidado dentro del while que, cuando la variable “a” vale 3, provoca un break. Aunque el bucle esta disefiado para llegar hasta 10, el break detiene el bucle y la variable nunca se incrementa hasta ese valor. Una opcién parecida es continue, que también interrumpe el bucle pero solo en el ciclo en el que se ejecuta, volviendo al principio del bloque. #1/usr/bin/python # -*- coding: utf-a -*- ifa continue print a Salida del programa: 10 En este ejemplo, que solo se diferencia del anterior por haber cambiado el break por un continue, el bucle se recorre entero imprimiendo los mimeros del uno al diez, pero se omite el tres porque la orden continue evita que llegue a ejecutarse el print. Naturalmente, puede anidarse bucles dentro de bucles para conseguir resultados mAs complejos. Por ejemplo, el siguiente cédigo imprimiré las tablas de multiplicar del tres al siete: © RAMA Capitulo 6. ESTRUCTURAS DE CONTROL 97 #1 /usx/bin/python # -*- coding: uté-8 primero = 3 while primero <= 7: print "Tabla del * + str(primero) segundo = 1 while segundo <= 10: print str(primero) +" X "+ str(segundo) +" =" + str(primero * segundo) segundo += 1 primero += 1 print "##HeHHdBauaHAHBRES Salida del programa: Tabla del 3 x HOMER Oe x Tabla del 4 axis4 4x2 [Nos saltamos esto para ahorrar espacio] 6 X 10 = 60 Tabla del 7 XK 4 = 28 35 = 42 49 56 63 70 MOM Pe 98 PYTHON. PASO A PASO RAMA 6.3 BUCLE FOR El bucle for de Python es bastante diferente del de otros lenguajes como C, y ms parecido al bucle foreach de Perl. Se usa para recorrer listas, diccionarios y, en general, los objetos que en Python se denominan iteradores. #1/usr/bin/python # -*- coding: utf-a -*- lista = ["calcetin","pantalén", "camisa", "camiseta", "otro calcetin", "gorra"] for prenda in lista: print "La lavadora se ha comido mi " + prenda Salida del programa: La lavadora La lavadora La lavadora La lavadora La lavadora La lavadora Con cadenas: se se se se se se ha ha ha ha ha ha #1/usr/bin/python # -*- coding: utf-a - comido comido comido comido comido comido saludo = "Hola mundo" for letra in saludo[: print letra Salida del programa: pro a calcetin pantalén camisa camiseta otro calcetin gorra Capitula 6. ESTRUCTURAS DE CONTROL 99 a ° De un modo muy parecido, es posible usar for para recorrer un diccionario. #1 /usr/bin/python # -*- coding: utf-8 datos = ("Nombre "1,80") "José", "Apellido": "Gonzalez", “Altura for concepto in datos: print concepto Salida del programa: Nombre Apellido Altura Como podemos ver en el ejemplo de arriba, el bucle que hemos escrito nos retorna cada una de las claves del diccionario, pero no sus valores. Naturalmente, nada nos impide tomar el valor de cada elemento del diccionario a partir de su clave haciendo algo parecido a esto: #1 /usr/bin/python # -*- coding: utf-8 datos = ("Nombre "1,B0") "José", "Apellido": "Gonzalez", "Altura": for concepto in datos: print concepto +": " + datos [concepte] Salida del programa: Nombre: José Apellido: Gonzalez Altura: 1,80 Pero Python nos permite simplificarlo, tomando tanto la clave como el valor de cada elemento en el mismo for, usando el método iteritems() de este modo: 100 PYTHON. PASO A PASO RAMA #1/usr/bin/python # -*- coding: uté-8 datos = {"Nombre": "sosé", "Apellido": "Gonzalez", "Altura": "1,80"} for concepto, valor in datos.iteritems(): print concepto + ": " + valor Salida del programa: Nombre: José Apellid Altura: 1,80 Gonzalez Podemos ver que, para recoger dos variables en cada ciclo del bucle gor, las ponemos separadas por comas. 6.4 CONTROL DE EXCEPCIONES Cosas como la clisica divisién por cero o el tratamiento de tipos de datos incompatibles (sumar cadenas, por ejemplo) provocarin errores en tiempo de ejecucién (excepciones) que darn al traste con el programa. Para facilitar el manejo de este tipo de cosas tenemos la estructura try. Dicho de un modo simple, lo que hace iry es ejecutar un bloque de sentencias en un “entorno controlado”, para que el error generado (si se da) no detenga el programa, sino que se retorne de modo que pueda manejarse. ‘Vedmoslo con un ejemplo. En el siguiente bloque: #1 /usr/bin/python # -*- coding: utf-8 - © RAMA Capitulo 6. ESTRUCTURAS DE CONTROL 101 dividendo = 1 divisor = 0 resultado = dividendo/divisor print "La divisién resulta: ", resultado print "Hemos terminado" Salida del programa: Traceback (most recent call last): File "“test.py", line 7, in resultado = dividendo/divisor ZeroDivisionError: integer division or modulo by zero Como el divisor tiene el valor “0” el programa fallard estrepitosamente, dard un error y se interrumpird en ese punto de su ejecucién, con lo que el mensaje “Hemos terminado” (0 cualquier cosa que nuestro programa hiciese a partir de ese punto) nunca Hegaré a ejecutarse. Para prevenir esa posibilidad se puede modificar asi: #1/usr/bin/python # -*- coding: utf-a -*- dividendo = 1 divisor = 0 try: resultado = dividendo/divisor print "La divisién resulta: ", resultado except: if divisor : print "No puedes dividir por cero, animal" print "Hemos terminado" Salida del programa: No puedes dividir por cero, animal Hemos terminado El blogue dentro de txy: es ejecutado y, si retorna cualquier error, entonces ejecuta el bloque contenido en except: y contintia su ejecucién. En caso de que no haya ningan error el programa se ejecuta correctamente ignorando ese bloque. 102 PYTHON. PASO A PASO RAMA Dado que existen muchos tipos de errores distintos, seria deseable una forma algo mis sofisticada y concreta de manejarlos. En el caso de arriba, por ejemplo, el programa puede dar un error si divisor es cero o si es una cadena, y seria deseable manejar ambos casos de distinta manera. Para ello, except: puede ser escrito de modo que indique el tipo de error conereto al que responde, de la siguiente forma: except Tipo_de Error: donde tipo _de_zrror debe ser el tipo de error concreto que queremos “interrumpir”. Ademés, pueden colocarse tantos bloques except como sean necesarios, por lo que nuestro ejemplo se podria mejorar haciendo mas o menos asi: #1/usr/bin/python # -*- coding: utf-a -*- = "Re divisor = 2 try: resultado = dividendo/divisor print "La divisién resulta: ", resultado except ZeroDivisionmrror: if divisor == 0: print "No puedes dividir por cero, animal" except TypeError: print "Hay que ser bruto: eso no es un niimero" Salida del programa: Hay que ser bruto: eso no es un nimero Cada uno de los bloques except se ejecuta solo si se da el tipo de error especificado. © RAMA Capitulo 6. ESTRUCTURAS DE CONTROL 103 Si pensamos que esto se parece a un if un tanto sofisticado, tenemos razén. De hecho, esta estructura permite también una sentencia e1se, que se ejecuta cuando no hay errores. De este mod, el ejemplo anterior seria mAs correcto escrito as #1 /usr/bin/python # -*- coding: utf-8 dividendo = "A" divisor = 2 try resultado = dividendo/divisor except ZeroDivisionBrror: if divisor : print "No puedes dividir por cero, animal" except TypeError: print "Hay que ser brute: eso no es un niimero" else: print "La divisién resulta: ", resultado Salida del programa: Hay que ser bruto: eso no es un nimero Es importante hacer notar que dentro delt ry hemos dejado solo la instruccién que requiere que verifiquemos, dejando el print en el e1se final. 6.5 jQUE HEMOS VISTO EN ESTE TEMA? Estructuras de control, que nos permiten cambiar el funcionamiento del programa dependiendo de los datos que esté manejando. 104 PYTHON. PASO A PASO RAMA 6.5.1 Tareas sugeridas ¥ Las estructuras de control son la base de la programacién estructurada, y nos permiten hacer gran cantidad de cosas. ¥ Deberfamos ser capaces de imprimir una tabla de multiplicar anidando dos bucles white. v¥ También deberiamos poder hacer lo mismo con dos bucles for. ¥ {Cudl seria el mejor método para mostrar una tabla solo de los mimeros pares? ¥ {Intentamos hacer un programa que nos diga si un nimero es primo? v¥ Muy probablemente, este tiltimo programa necesite un control de errores para aseguramnos de que no se introducen datos no numéricos. ¥ Este iltimo aspecto (el del control de excepciones) es algo que no vamos a volver a ver en este libro (porque dificultaria los ejemplos), pero es sumamente importante y deberiamos practicarlo y conocerlo a fondo. Practicamente todos los programas que hagamos en el futuro tendran que usar sentencias try. SYNAPS PREMIUM FUNCIONES Ya hemos visto algunas funciones de Python como type () 0 str(), y dentro de poco veremos mas, pero Python nos permite también crear nuestras propias funciones. A efectos practicos, una funcién no es mas que un bloque de cédigo que se puede usar varias veces en varios puntos distintos de nuestro programa. Nos evita tener que repetir cédigo y facilita la lectura y el mantenimiento de! programa. Para declarar una funcién usamos la palabra reservada det seguida del nombre de la funcién, un paréntesis (del que luego hablaremos) y dos puntos. A continuacién de esto, ¢ indentado un nivel, se encuentra el cédigo en si de la funcién. #1 /usr/bin/python # -*- coding: uté-8 -*- def saluda(): print "Hola Mundo" print "es bueno saludar" print "resulta elegante" 106 PYTHON. PASO A PASO RAMA Este ejemplo, tal como esta, no hace nada: una funcién debe ser invocada para que se ejecute. Para invocar a la funcién se usa su nombre seguido de un paréntesis. Cada vez que se llama de este modo a la funcién, se ejecuta su cédigo: #1/usr/bin/python # -¥- coding: utf-8 -#- def saluda(): print "Hola Mundo" print "es bueno saludar" print "resulta elegante" saluda() Salida del programa: En este ejemplo, cada vez que invoquemos en nuestro programa a la funcién saluda (), se imprimirdn esas tres lineas. Si hemos de hacerlo varias veces, nos ahorramos escribir esos tres print cada vez, lo que redunda ademas en un cédigo mas limpio, claro y legible. Ademias, una funcién puede retornar un resultado usando la orden return, #1 /usx/bin/python # -*- coding: uté-8 -*- def dame_pi(): numero_pi = 3.14159 return numero pi pi = dame_pi() print pi Salida del programa: 3.14159 © RAMA Capitulo 7. FUNCIONES 107 El valor retornado por una funcién se puede usar como cualquier otro valor (como si fuera una variable, por ejemplo), de modo que el ejemplo anterior puede simplificarse asi: #1/usr/bin/python # -*- coding: utf-8 def dame_pi(): numero_pi = 3.14159 return numero_pi print dame_pi() Salida del programa: 3.14159 Se puede hacer que una funcién retorne més de un valor separando estos por comas, lo que retornard una tupla con tantos elementos como hayamos incluido en nuestro return. #1 /usr/bin/python # -*- coding: utf-8 -*- def saluda(): return "hola", "mundo" hola = saluda() # hola contiene una tupla de dos elementos print hola Salida del programa: (‘hola', 'mundo') Sin duda, lo que da realmente utilidad a las funciones es la capacidad de recibir pardmetros 0 argumentos. Un argumento o pardmetro es un valor que se le pasa a la funcién y que esta puede usar como variable para operar con él. Los pardmetros que puede recibir una fancién deben asignarse al definir esta, situandolos entre los signos de paréntesis. Ese nombre actita como una variable interna a la funcién. 108 PYTHON. PASO A PASO RAMA Del mismo modo, al llamar a la funcién, se le debe pasar el valor que tendrd esa variable (el argumento) en el paréntesis. #1 /usx/bin/python # -*- coding: uté-8 def cuadrado (numero) : cuadrado = numero * munero return cuadrado resultado = cuadrado(5) print resultado Salida del programa: 25 Una funcién puede aceptar més de un argumento, Para ello, al definirla, se enumeran por orden, separandolos por comas. Al llamar a la funcién, los argumentos deben pasarse en el mismo orden en el que se han definido. #1/usr/bin/python # -*- coding: utf-a - def saluda (nombre, sexo) : print "Hola " + nombre if sexo == "M" or sexo print "ZCémo te va, hombre?" elif sexo == "F" or sexo == "f" print "2Cémo te va, mujer?" else: print "2Cémo te va?" saluda("Paco", "M") © RAMA Capitulo 7. FUNCIONES 109 Salida del programa: Hola Paco ecémo te va, hombre? Se puede dar un valor por defecto a un pardmetro en la definicién de la funcién. Para hacerlo solo hay que asignarselo usando el signo igual “=” tras el nombre del parametro. #1/usr/bin/python # -*- coding: utf-a -*- def tabla_multiplicar(nombre, numero = 1): print "Tabla de multiplicar del * + str (numero) print "Impresa autom&ticamente por " + nombre while i < 11: print str(numero) + "xX "+ str(i) + "= "+ str(numero * 4) dae. tabla_multiplicar ("Pablo") Salida del programa: Tabla de multiplicar del 1 Impresa autométicamente por Pablo KO= MORRO MOO Pe beeraneunn o = 10 Como se puede ver en el ejemplo, si al llamar a la funcién no se le pasa ese argumento, se usard el valor por defecto predefinido. De este modo, ese argumento es opcional, y el intérprete de Python no dara un error si no se le pasa un valor al Hamar a la funcién. 110 PYTHON. PASO A PASO RAMA Como los valores de los pardmetros se asignan a estos por orden, si en una funcién hay pardmetros con valor por defecto junto con otros que no lo tienen, deben ponerse por orden: primero los que no tienen valor por defecto (y, por tanto, son obligatorios) y luego los que si lo tienen (y son opcionales). A veces tenemos funciones de las que no sabemos cudntos argumentos van a recibir. Cuando queremos que una funcién acepte un néimero arbitrario de argumentos usamos los Ilamados args. Un arg no es mas que un parametro que se define como cualquier otro, pero con un asterisco delante del nombre. Python interpreta eso, en lugar de como una variable, como una lista en la que se almacenaran todos los argumentos que se reciban. #1/usr/bin/python # -*- coding: utf-a -*- def imprime_lista(nombre lista, *cosas): print "Lista de " + nombre lista for cosa in cosas: print cosa imprime_lista("Piezas", "tornillo", "tuerca", "otro torni- llo", "cable") Salida del programa: Lista de Piezas tornillo tuerca otro tornillo cable Siuna funcién debe aceptar argumentos fijos junto con args, los argumentos fijos deben ponerse antes que los args ya que, al ser una lista, estos ‘ltimos “capturarian” todos los valores y los fijos no llegarian a tener ningin valor. Un refinamiento a esto son los **kwargs (keyword arguments). Se trata de argumentos que pasan pares de clave-valor, y se reciben como un diccionario: #1/usr/bin/python # -*- coding: utf-a -*- def imprime_datos(nombre, **datos) : © RAMA Capitulo 7. FUNCIONES 111 print "Datos de " + nombre for clave in datos: print clave + ": " + datos [clave] imprime_datos("Pablo", edad = "mucha", estado = "enloqueci- do", guapo = "no") Salida del programa: Datos de Pablo edad: mucha guapo: no estado: enloquecido 7.1 AMBITO DE LAS VARIABLES Cuando tenemos varias funciones con sus propias variables, puede darse el caso de que existan nombres de variable repetidos entre esas funciones 0 con el cuerpo principal del programa. Para prevenir conflictos entre ellas Python separa los dmbitos de las variables, de forma que unas no sobrescriban a las otras. El Ambito de una variable es la parte del cédigo desde la que esta es accesible, ya sea para leer su valor o para modificarlo. En principio, el Ambito de una variable en Python es el lugar donde ha sido asignada por primera vez. Si tenemos un nombre de variable en el cuerpo de nuestro programa (es decir, fuera de cualquier funcién) y el mismo nombre dentro de una funcién, Python las identifica como variables distintas: #1/usr/bin/python # -*- coding: utf-8 variable= "fuera de la funcién" def una_funcion(): variable = "dentro de la funcién" print variable una_funcion() print variable 112 PYTHON. PASO A PASO RAMA ‘Salida del programa: dentro de la funcién fuera de la funcién Las variables creadas fuera de las funciones se Ilaman “globales” y las que estan dentro de funciones “locales”. Sin embargo, hay una estructura jerérquica en la que, si no se ha definido una variable local en una funcién, se recurre a las variables globales, si es que existe una con ese nombre: #1/usr/bin/python # -*- coding: utf-a -*- variable= "fuera de la funcién" def una_funcion(): # No asignamos valor a "variable" en la funcién print variable una_funcion() print variable ‘Salida del programa: fuera de la funcién fuera de la funcién Es decir: las variables globales son visibles desde cualquier lugar de nuestro programa, pero las variables locales solo pueden ser accedidas desde la propia funcién en la que han sido creadas. Una consecuencia importante de esto es que, en principio, cualquier intento de cambiar el valor de una variable global dentro de una funcién asignandole un nuevo valor, solo serviré para crear una variable local con el mismo nombre, dejando la variable global sin modificar. Sin embargo, podemos declarar variables globales desde una funcién con la orden gioba1 seguida del nombre de la funcién (antes de asignarle algin valor): #1/usr/bin/python # -*- coding: utf-a -*- © RAMA Capitulo 7. FUNCIONES 113 #1 /usx/bin/python # -*- coding: uté-8 variable= "fuera de la funcién" def una_funcion(): global variable variable = "dentro de la funcién" print variable una_funcion() print variable Salida del programa: dentro de la funcién dentro de la funcién De este modo, la variable asi declarada puede ser accedida desde otras funciones 0 desde el cuerpo del programa como cualquier otra variable global o, si ya era global antes, su valor puede ser modificado desde la propia funcién. 7.2 DOCSTRINGS La primera linea de una funcién en Python siempre deberia ser una cadena de texto (definida por tres dobles comillas seguidas, para poder poner varias lineas) en la que se describa la funcién y su uso. A esta cadena se la conoce como docstring (del inglés documentation string). #1 /usr/bin/python # -*- coding: utf-8 def compara_numeros(n1, 2): 114 PYTHON. PASO A PASO RAMA Recibe como paraémetros dos niimeros retorna: 1 si el primero es mayor 2 si el segundo es mayor 0 si son iguales if (nl > n2): return 1 elif (nl < 2): return 2 else: return 0 def tabla_multiplicar (numero) : "w"Recibe un nimero e imprime su tabla de miltiplicar""" print "Tabla del " + str(numero) dea while i < 11: print str(numero) +" xX "+ ste(i) +" = "+ str(i * m- mero) dasa Una doestring debe ser tan larga y detallada como sea necesario, pero no mis de eso. Estas cadenas sirven para afiadir metainformacién al cédigo, y pueden ser usadas por programas de documentacién para describir el uso de las funciones. El ejemplo mas simple es el programa de Python pydoc, que viene incluido en la propia distribucién de Python y se puede usar desde la linea de comandos simplemente escribiendo “pydoc nombre _del_médulo”, donde “nombre_del_ médulo” es el nombre de nuestro programa sin la extensién “.py”. © RAMA Capitulo 7. FUNCIONES 115 7.3 GENERADORES Un tipo especial de dato muy atil son los iteradores. Un iterador es un objeto que retorna una secuencia, En lugar de retornar un resultado o una serie de ellos una ‘vez, un iterador retorna un valor cada vez que se le solicita. La forma mis usual de crear nuestros propios iteradores es por medio de los Hamados generadores. Los generadores no son mas que funciones que usan la orden yield en lugar de return. Para ver esto mas claramente y entender su utilidad, vamos a mostrar una serie de ejemplos, Comencemos con un bucle for sencillo: #1 /usr/bin/python # -*- coding: utf-8 lista = [1, 2, 3, 4, 5] for i in lista: print i Salida del programa: Este bucle, simplemente, imprime los mimeros del uno al cinco. Si quisiéramos que imprimiese cien, 0 mil, o un millén de nimeros, seria terriblemente ineficiente, tanto en cédigo escrito como en uso de memoria y tiempo de proceso. Para solucionar este inconyeniente podemos escribir una funcién que nos genere la lista, en lugar de tener que escribirla a mano, con algo como lo siguiente: 116 PYTHON. PASO A PASO RAMA #1/usr/bin/python # -*- coding: uté-8 def genera_lista(num): lista = 1) aed while i <= num: lista.append(i) dasa return lista for i in genera_lista(5): print i Salida del programa: been Esto nos resuelve el problema de tener una larga lista en el cédigo, pero no nos soluciona la cuestién del uso de memoria y tiempo de proceso, ya que primero es necesario generar toda la lista y, una vez hecho esto, se retorna al for que la vuelve a iterar de nuevo entera. Un generador viene a solucionar esto retornando, en lugar de una lista, una serie de valores individuales que se van calculando sobre la marcha y que pueden iterarse. Es decir, en vez de calcular toda una lista y usarla como iterador, nuestra fancién devuelve un valor cada vez. Para ello, en vez de retornar el valor con return, usamos la orden yield de este modo: #1/usr/bin/python # -*- coding: utf-a -*- © RAMA Capitulo 7. FUNCIONES 117 def genera_lista(num): lista = 1] ied while i <= num: yield i dasa lista = genera_lista(5) for 4 in genera_lista(5): print i Salida del programa: Ahora, en lugar de esperar al final del bucle while para retornar toda la lista, con un return, la funcién retorna cada valor en el mismo momento de generarlo, usando un yield dentro del propio bucle. Como podemos ver, los generadores son muy eficientes en cuanto a uso de recursos porque no requieren de tanta memoria como una lista 0 soluciones parecidas. ‘Ademés, como cada elemento se calcula en el momento en que es necesario y solo si es necesario, también se optimiza el tiempo y se reduce el uso de procesador. 7.4 DECORADORES ‘A veces podemos encontrarnos con que necesitamos hacer varias funciones distintas pero que comparten partes importantes de cédigo. Para ello podemos usar los decoradores. 118. PYTHON. PASO A PASO RAMA Un decorador es una funcién que acepta como pardmetro a otra funcién y retorna una tercera funcién. En la prictica, es una forma de afiadir cédigo o funcionalidad a otra funcién. Los decoradores se crean como cualquier otra funcién, pero sin olvidar que cl parmetro que aceptan y lo que retornan son funciones. Para aplicar un decorador a una funcién se pone el nombre de este decorador, precedido de una arroba “@”, antes de la definicién de esa funcién: #1/usr/bin/python # -*- coding: utf-a - Ejemplo de decorador def decorador (funcion_entrada) : def funcion_salida(): funcion_entrada() print "Esto no estaba en la funcién original" return funcion_salida @decorador def saludo(): print "Hola" saludo () Salida del programa: Hola Esto no estaba en la funcién original Como se puede ver al ejecutar este ejemplo, al Hamar a la funcién saludo () en realidad estamos ejecutando la funcién retornada por el decorador. Por supuesto, las funciones de un decorador pueden admitir argumentos, pero en este caso es importante recordar que la funcién decorada y la funcién que la reemplaza deben admitir el mismo nimero de argumentos. #1 /usr/bin/python # -*- coding: utf-8 - Ejemplo de decorador © RAMA Capitulo 7. FUNCIONES 119 def decorador (funcion_entrada) : def funcion_salida (param) : if param == "Lidia": print "Buenos dias, guapa" elif param == "Pablo": print "Buenos dias, guapo" else: funcion_entrada (param) print "Que tengas un buen dia" return funcion_salida @decorador def saludo (nombre) : print "Hola " + nombre saludo ("Pablo") Salida del programa: Buenos dias, guapo Que tengas un buen dia 7.5 FUNCIONES LAMBDA Las fanciones lambda son la aproximacién de Python al paradigma de la programacién funcional. Se trata de un tipo de funcién anénima que consta de una sola expresién, No se crean mediante de¢, por lo que no tienen nombre y normalmente se deben asignar a una variable, que ser la que se use para llamarlas. Una funcién lambda se crea mediante la palabra reservada lambda, tras la que se indican los parametros (si los hay) y, separada de estos por dos puntos, la expresién que forma la funcién en si. 120 PYTHON. PASO A PASO RAMA Vedmoslo con un ejemplo: #1 /usr/bin/python # -*- coding: uté-2 cuadrado = lambda x: x**2 resultado = cuadrado(2) print resultado Salida del programa: 4 En este caso, la variable cuadrado contiene la funcién x**2 que acepta un solo valor, la x, como argumento. Una funcién lambda tiene, como cualquier otra funcién, su propio espacio de nombres, por lo que el valor de x no es directamente accesible desde fuera de esta. Las funciones lambda no tienen ningiin tipo de declaracién return, y simplemente retornan el propio resultado de la sentencia que las constituye. Una funcién lambda puede aceptar mas de un argumento: #1/usr/bin/python # -*- coding: utf-8 suma = lambda x, y: x+y resultado = suma(2,4) print resultado Salida del programa: 6 Dado que se puede usar funciones lambda como argumentos para otras funciones lambda, es posible concatenar funciones para hacer operaciones més complejas: #1/usr/bin/python # -*- coding: utf-a -*- © RAMA Capitulo 7. FUNCIONES 121 cuadrade = lambda x: x**2 suma= lambda x, y: x + ¥ resultado= cuadrado (suma(cuadrado(2) ,5)) print resultado Salida del programa: a1 7.6 QUE HEMOS VISTO EN ESTE TEMA? Hemos visto cémo crear y usar nuestras propias funciones, ademés de las que tiene Python, Ademés de las funciones usuales en otros lenguajes de programacién, hemos visto versiones mAs sofisticadas, como los decoradores 0 las funciones lambda. Los generadores son una herramienta especialmente potente en conjuncién con las estructuras de datos y los bucles. Es muy importante conocer y manejar bien el Ambito de las variables, para ahorrarnos mas de un problema. También hemos visto las docstrings, que deberiamos usar siempre para documentar nuestros programas. 7.6.1 Tareas sugeridas ¥ Casi cualquier ejemplo de los que hemos hecho en anteriores capitulos puede ser mejorado usando funciones, para asi hacer nuestro cédigo mucho mis reutilizable. ¥ Alguno de los ejercicios que anteriormente hicimos con listas se podria hacer ahora con generadores. ¥ Deberiamos ir pensando qué tipo de tareas repetimos con mas 0 menos frecuencia para convertirlas en funciones que podamos usar una y otra vez. SYNAPS PREMIUM OBJETOS Y CLASES La aproximacién a la programacién mas popular y exitosa de los ‘lltimos tiempos es la llamada “Programacién Orientada a Objetos” (POO o, en inglés, OOP). Un objeto es una estructura de datos compleja y flexible, que permite almacenar tanto informacién como la forma de operar con ella. Los objetos se definen mediante una plantilla llamada “Clase”. Decimos que un objeto pertenece a una clase determinada cuando se ha creado (instanciado) a partir de ella. En esa clase podemos definir variables que perteneceran al objeto (Ilamadas propiedades 0 atributos) y fanciones que usaremos para trabajar con él (Ilamadas métodos). Dos objetos que pertenezcan a la misma clase (es decir, que hayan sido instanciados a partir de ella) tendrdn los mismos atributos, pero los valores de estos no tienen porqué ser los mismos. Una clase se define mediante la palabra reservada class seguida del nombre de la clase y dos puntos: #1 /usr/bin/python # -*- coding: utf-8 -*- class Producto: nw" Bjemplo de clase con la cantidad y el precio de un pro- duetow=w def __init__(sel£, producto, precio, unidades) : 124 PYTHON. PASO A PASO RAMA self.producto = producto self.precio = precio self.unidades = unidades def costo_total (self): costo = self.precio * self.unidades return costo mi_objeto producto = Producto("corbata", 35,67) print mi_objeto_producto.producto print mi_objeto_producto.precio print mi_objeto_producto.unidades print mi_objeto_producto.costo_total () Salida del programa: 35 67 2345 En este ejemplo, se define la clase Producto y, dentro de ella, dos métodos Mamados init _y costo_total. Los métodos se definen exactamente igual que las funciones, con la salvedad de que su primer parimetro debe ser siempre se1£. ‘Como veremos mas adelante, se1£ es un nombre que se refiere siempre al propio objeto. De este modo “se1£ producto” quiere decir “la propiedad producto de este mismo objeto”. El valor del pardmetro se1e cs asignado autométicamente, por lo que no es necesario indicar ese argumento al llamar al método. Por eso, como se ve en el método costo_total del ejemplo, si un método tiene un solo pardmetro (que, necesariamente, debe ser se1£), no sera necesario indicar ninguno al Ilamarlo. El método_init_ es un método especial, también llamado “constructor”. Se ejecuta siempre al instanciar una clase, y es al que se pasan los argumentos al crear nuestro objeto. Comienza y termina con dos guiones bajos por convencién. © RAMA Capitulo 8. OBJETOS Y CLASES 125, Elmétodo_init_ de nuestro ejemplo inicia tres propiedades (0 atributos) que son producto, precio y unidades. Todas ellas van precedidas de la palabra this seguida de un punto para indicar que son propiedades del objeto y no variables privadas del propio método. El método costo_total simplemente retorna el resultado de multiplicar el precio por las unidades. Para instanciar un objeto de una clase, solo hay que asignarlo como se ve en cl ejemplo, pasandole los valores necesarios como si fuese una funcién. Una vez instanciado un objeto, para acceder a sus atributos y métodos, solo hay que hacerlo de la forma nombre _objeto.atributo 0 nombre objeto. método(), en un caso particular de espacios de nombres. Naturalmente, un objeto puede tener cuantos atributos y métodos sean necesarios. Los métodos pueden usarse para asignar o cambiar el valor de los atributos, retornar valores, ejecutar acciones, y, en general, para cualquier cosa que pueda hacer una funcién. En el siguiente ejemplo, un poco mas complejo, podemos ver como se crean dos instancias de la clase Producto (mi_producto! y mi_producto2), cada una con sus valores, y cémo se puede acceder a sus atributos (producto, precio y unidades) y métodos (__costo_total(), nuevo_precio(), agrega()_, saca() ¢ informe()). #1/usr/bin/python # -*- coding: utf-a -*- class Product nw" Bjemplo de clase con la cantidad y el precio de un pro- ductown™ def __init__(sel£, producto, precio, unidades) : self.producto = producto self.precio = precio self.unidades = unidades 126 PYTHON. PASO A PASO RAMA def __costo_total (self): costo = self.precio * self.unidades return costo def nuevo_precio(sel£,precio) : self.precio = precio def agrega(sel£, cantidad): self.unidades = self.unidades + cantidad def saca(self,cantidad): if cantidad <= self.unidades: self.unidades = self.unidades - cantidad els print "No hay suficientes" def informe (self) : print "Producto: " + self.producto print "Precio: " + str(self.precio) print "Unidades: " + str(self.unidades) print "Precio Total: "+ str(self.__costo_total()) mi_producto1 Producto ("Pantalén",100,6) mi_producto2 Producto ("Camiseta", 50,5) print mi_productol.precio print mi_producto2.unidades mi_producto2 .agrega (5) print mi_producto2.unidades mi_producto2. informe () Salida del programa: 100 5 10 Product: Camiseta Precio: 50 Unidades: 10 Precio Total: 500 © RAMA Capitulo 8. OBJETOS Y CLASES 127 En este ejemplo, el nombre del método _costo_total () comienza con dos guiones bajos. Esto hace que ese método sea privado, y no pueda ser accedido desde el exterior. Si en ese ejemplo intentamos hacer algo como print mi_producto2.__ costo_total() Python nos retornara un error. Todos los métodos que comiencen con dos guiones bajos (y que no terminen con dos guiones bajos) son considerados como privados, y no pueden ser accedidos desde fuera del propio objeto. 8.1 HERENCIA Podemos hacer que una clase herede métodos y atributos de otra. Esto puede ser muy itil por cuestiones de organizacién del cédigo y facilidad de mantenimiento o, simplemente, por mantener la coherencia. Ala clase que hereda de otra se le llama clase derivada, clase hija o subclase y, a aquella de la que se hereda, clase base, clase madre o superclase. Para crear una clase que herede de otra solo hay que especificarlo en su definicién afiadiendo, tras su nombre y entre paréntesis, el nombre de la clase base de la que queremos heredar. En el ejemplo siguiente, definimos la clase base Animal, y después la clase Perro como hija de esta: #1 /usr/bin/python # -*- coding: utf-8 class Animal: "u"Clase base para mostrar la herencia""" def init__(self, nombre, patas): self.nombre = nombre self.patas = patas def saluda (self): print "B1 animal llamado " + str(self.nombre) + " saluda" 128 PYTHON. PASO A PASO RAMA class Perro (animal) : "Clase hija para mostrar la herencia""" # Simplemente, no hacemos nada pass mi_mascota = Perro("Rufo",4) mi_mascota.saluda () Salida del programa: El animal llamado Rufo saluda Como podemos ver, la clase Perro ha heredado las propiedades y métodos de la clase Animal, por lo que es basicamente una copia de esta. Pero podemos agregar un nuevo método a la clase Perro para que nos resulte ms til: #1 /usr/bin/python # -*- coding: utf-8 - class Animal: "u"Clase base para mostrar la herencia""" def init__(self, nombre, patas): self.nombre = nombre self.patas = patas def saluda (self): print "B1 animal llamado " + str(self.nombre) + " saluda" class Perro(animal) : nwnClase hija para mostrar la herencia""" def ladva (self) : print "Guau" mi_mascota = Perro("Rufo",4) mi_mascota.saluda () mi_mascota.ladra() © RAMA Capitulo 8. OBJETOS Y CLASES 129 Salida del programa: El animal llamado Rufo saluda Guau De este modo, la clase Perro es igual que la clase Animal, pero con un método “ladra” adicional. Podriamos crear diversas clases para diversos animales, cada una con sus diferencias, pero haciendo heredar de la clase base Animal lo que sea comin a todas ellas: #1 /usr/bin/python # -*- coding: utf-8 class Animal: "u"Clase base para mostrar la herencia""" def _init__ (self, nombre, patas) self.nombre = nombre self.patas = patas def saluda (self): print "Bl animal llamado " + str(self.nombre) + " saluda" class Perro(animal) : nwnClase hija para mostrar la herencia""" def ladra(selé print "Guau" class Gato(Animal) : swnClase hija para mostrar la herencia""" def maulla(sel£) print "Miau miau" mi_mascota = Perro("Rufo",4) mi_mascota.saluda () mi_mascota.1ladra() mi_otra_mascota = Gato("Azrael",4) mi_otra_mascota.saluda() mi_otra_mascota.maulla() 130 PYTHON. PASO A PASO RAMA ‘Salida del programa: El animal llamado Rufo saluda Guau El animal llamado Azrael saluda Miau miau Igual que podemos afiadir métodos nuevos a una clase hija, también podemos modificar métodos que ha heredado de su clase madre. Si definimos un método en una clase con el mismo nombre que uno heredado de su clase madre, la clase hija usara el nuevo método en lugar del heredado: #1/usr/bin/python # -*- coding: utf-a -*- class Animal: "unClase base para mostrar la herencia""" def init__(self, nombre, patas): self.nombre = nombre self.patas = patas def saluda (self): print "E1 animal llamado " + str(self.nombre) + " saluda" class Perro(animal) : "usClase hija para mostrar la herencia""" def Ladva(sel£) : print "Guau" class Gato(Animal) : "wnClase hija para mostrar la herencia""" def maulla(sel£) : print "Miau miau" def saluda (self): print "Bl gato " + str(self.nombre) +" te mira fijamen- ten mi_mascota Perro("Rufo",4) mi_mascota.saluda () © RAMA Capitulo 8 OBJETOS Y CLASES 131 mi_mascota.ladra() mi_otra_mascota = Gato("Azrael",4) mi_otra_mascota.saluda() mi_otra_mascota.maulla() ‘Salida del programa: El animal llamado Rufo saluda Guau El gato Azrael te mira fijamente Miau miau En este ejemplo, la clase Gato tiene un método saluda distinto al de su clase madre. Una clase puede heredar de més de una clase madre, con lo que heredaria todos sus atributos y métodos. Para ello solo es necesario indicar todas las clases de las que hereda, separadas por comas. El orden en el que se ponen estas clases es importante: si dos clases tienen métodos o atributos con el mismo nombre se usard el de aquella que se haya indicado primero. #1/usr/bin/python # -*- coding: utf-8 class Animal: "u"Clase base para mostrar la herencia""" def init__(self, nombre, patas): self nombre = nombre self.patas = patas def saluda (self): print "Bl animal llamado " + str(self.nombre) + " saluda" class Amigo: nunClase base para mostrar la herencia""" def _init__ (self, nombre) : self.nombre = nombre 132 PYTHON. PASO A PASO RAMA def salir(self, num): 4£ mum print "Vamos a pasear" elif num == 1: print "Vamos a jugar" else: print "Vamos al parque" class Perro (Animal, Amigo) : wnClase hija para mostrar la herencia""" def ladra (self): print "Guau" mi_mascota = Perro("Rufo",4) mi_mascota.saluda () mi_mascota.salir(1) Salida del programa: El animal llamado Rufo saluda Vamos a jugar Una clase puede ejecutar los métodos de sus superclases (incluso aquellas que comienzan con doble guidn bajo) del modo NonbreDeLasuperClase nombre _ de1_método (self, argumentos). Esto es util, por ejemplo, cuando sobrescribimos sun método pero queremos ejecutar también el cédigo que contenia el método original. #1/usr/bin/python # -*- coding: utf-a -*- class Animal: "wnClase base para mostrar la herencia""" def init__(self, nombre, patas): self.nombre = nombre self.patas = patas def saluda (self) : print "B1 animal llamado " + str(self-nombre) + " saluda" class Perro(animal) : wnClase hija para mostrar la herencia""" © RAMA Capitulo 8. OBJETOS Y CLASES 133, def __init__ (self, nombre): Animal. init__(self, nombre, 4) self.sonido = "Guau" def ladra (self print self.sonido mi_mascota = Perro("Chucho") mi_mascota.saluda () mi_mascota.ladra() Salida del programa: El animal llamado Chucho saluda Guau Eneste ejemplo vemos como el método_init __de la clase Perro llama al mismo método de la clase anima1, con lo que se crean los atributos self nombre y self -patas como si estuviesen definidos en la propia clase Perro. El método __init _ no es el ‘nico método especial de que disponemos. Hay una infinidad de métodos “magicos” que nos permiten modificar cada aspecto del comportamiento de nuestros objetos y clases. La mayoria tiene un uso muy restringido, pero hay algunos que pueden resultar ttiles, por ejemplo: ¥ _ del _(se1¢) se ejecuta al borrar un objeto. y _str_(sel£) se ejecuta cuando se genera una cadena a partir del objeto con la funcién sxe () 0 al hacer un print. 7 _1en _(se1¢) se ejecuta al pedir la longitud del objeto con la funcién eng). y _ cmp (self, otro), al comparar el objeto con el indicado en el pardmetro “otro” por medio de los operadores de comparacién se ejecutard el cédigo contenido en este método. Python espera que este método retorne un niimero negativo si el objeto es menor, uno positivo si es mayor y cero si es igual. 134 PYTHON. PASO A PASO RAMA #1/usr/bin/python # -*- coding: uté-8 class Palabra: "w"Clase para mostrar el método _cmp_""" def _init__(sel£, contenido): self.contenido = contenido def _cmp__(self, otro): 4£ self.contenido > otro.contenido: return 1 elif self.contenido < otro.contenido: return -1 else: return 0 larga = Palabra ("supercalifragilisticoespialidoso") corta Palabra ("bah") if (larga > corta): print larga.contenido + " es mayor que " + corta.contenido els print larga.contenido + " NO es mayor que " + corta.conte- nido Salida del programa: supercalifragilisticoespialidoso es mayor que bah En este ejemplo hemos usado el razonable criterio de la longitud de palabra como comparacién, pero podriamos haber usado cualquiera que nos imaginemos. Aunque son menos usados, existen varios métodos que permiten controlar con mas detalle el comportamiento de los operadores de comparacién: __eq_(sel£, otro) se ejecuta al usar el operador =- con el objeto. “ne__(self, otro) se ejecuta al usar el operador 1= con el objeto. __1t__(se1£, otro) se ejecuta al usar el operador < con el objeto. __gt__(sel£, otro) se ejecuta al usar el operador > con el objeto. “le (self, otro) se ejecuta al usar el operador <= con el objeto. __ge__(self, otro) se ejecuta al usar el operador >= con el objeto. NU © RAMA Capitulo 8. OBJETOS Y CLASES 135, Y, naturalmente, existen también métodos “mégicos” para el resto de operadores: __add_(sel£, otro) para el operador +. __sub__(sel£, otro) para el operador -. __mul__(sel£, otro) para el operador *. _div__(sel£, otro) para el operador /. __floordiv__(sel£, otro) para el operador //. __mod__(sel£, otro) para el operador %. _divmod_(self, otro) se ejecuta al usar la funcién divmod(). __pow_ para el operador **. __lshift__(self, otro) para el operador <<. __rshift__(self, otro) para el operador >>. __and__(sel£, otro) para el operador &. _or_(sel£, otro) para el operador |. __xor__(sel£, otro) para el operador *. NU UU UU UU 8.2 CLASES NEW STYLE Las clases que hemos estado usando hasta ahora son las llamadas clases Old Style o de Viejo estilo. Al principio era el tnico tipo de clases disponibles, pero fueron sustituidas por un nuevo tipo de clases, llamadas New Style o de Nuevo estilo. Por defecto, cuando creamos una clase en Python, esta es del viejo estilo. Para hacer que una clase sea de nuevo estilo, simplemente debemos hacerla heredar de la clase object: (0 de otra clase que ya sea de nuevo estilo). #1/usr/bin/python # -*- coding: utf-8 class Mensaje (object) : nw" Bjemplo de clase New Style (hereda de object) """ def _init__(sel£): self.texto = "Soy una clase de nuevo estilo, porque soy hija de ‘object'" def mostrar (self): print self.texto mi_objeto = Mensaje () mi_objeto.mostrar () 136 PYTHON. PASO A PASO RAMA ‘Salida del programa: Soy una clase de nuevo estilo, porque soy hija de ‘object! Las clases de viejo y nuevo estilo se usan exactamente del mismo modo. La diferencia fundamental entre unas y otras es que en las primeras los objetos siempre son de tipo instance, mientras que en las segundas los objetos pertenecen a un tipo propio que coincide con la clase a la que pertenecen, y que se muestra con el formato Nonbre_del_médulo.Nombre_de_la clase. De este mods, las clases de nuevo estilo son una forma de crear nuestros propios tipos. #1 /usx/bin/python # -*- coding: utf-8 - class Viejo_Bstilo: un Ejemplo de clase Old Style""" def _init (self, cadena): self.texto = cadena def mostrar (self): return self.texto class Nuevo Estilo (object): "0" Bjemplo de clase New Style (hereda de object) "™"" def _init (self, cadena): self.texto cadena def mostrar (self): return self.texto vieja = Viejo_Estilo("hola") nueva = Nuevo_Estilo("hola") print type (vieja) # Mostraraé "ctype ‘instance'>" print type (nueva) # Mostraré © RAMA Capitulo 8. OBJETOS Y CLASES 137 Salida del programa: Las clases de nuevo estilo estin coneebidas para ofrecer un mejor y mas fiexible sistema de tipos de datos. Ademds, como veremos en breve, nos permiten usar herramientas que las clases de viejo estilo no admiten, Las clases de viejo estilo se mantienen solo por razones de compatibilidad por lo que, por lo general, deberiamos crear todas nuestras clases de nuevo estilo. 8.2.1 Descriptores Un problema que puede surgimos cuando asignamos un valor a un atributo €s que no tenemos control sobre su contenido. No podemos controlar el tipo de dato que permitimos, ni rangos de valores ni, en general, ejecutar ninguna accién en el momento de la asignacién. Del mismo modo, no podemos ejecutar ningun cédigo en la lectura o el borrado de los atributos. Por ejemplo, en la siguiente clase Animal asignamos el mimero de patas al atributo patas, pero no tenemos una forma facil de controlar que se introduzca realmente un mimero entero. #1/usr/bin/python # -*- coding: utf-8 class Animal (object) : def init__(self, nombre, patas): self.nombre = nombre self.patas = patas def muestra (self): print "El "+ self.nombre + " tiene "+ self.patas + " patas." # Besta asignacién funciona chucho = Animal("perro", 4) chucho muestra () # Pero esta fallaré error = Animal("perro", “A") error.mestra() 138 PYTHON. PASO A PASO RAMA ‘Salida del programa: File "test.py", line 15, in chucho. muestra () File "test.py", line 11, in mestra print "El " + self.nombre + " tiene "+ self.patas + " pa- tas." TypeBrror: cannot concatenate ‘str’ and ‘int! objects La solucién més habitual a esto es no usar directamente los valores de nuestros atributos, sino hacerlo por medio de métodos preparados al efecto. Pero Python dispone de los Hlamados “Descriptores”, una solucién mucho mis interesante y i Los descriptores permiten crear una clase especial que podemos usar para controlar el funcionamiento de un atributo. La idea es que esta clase acti como “filtro” y ejecute el cédigo que sea necesario antes de interactuar con el atributo. Para ello disponemos de tres métodos especiales, _get_, _set__ y _delete_, en los que podemos describir el comportamiento de nuestro atributo al asignarle un valor, leer el valor o borrarlo, respectivamente. Estos métodos, ademas del acostumbrado argumento se1, reciben algunos mas dependiendo del método en concreto: Fy _set_(sel£, objeto, valor): el identificador del objeto al que pertenece el atributo al que asignamos el valor y el propio valor que asignaremos al atributo. VF _get_(sel£, objeto, clase): el identificador del objeto al que pertenece el atributo que leemos y la clase a la que pertenece ese objeto. V _delete_(sel£, objeto) ; el identificador del objeto al que pertenece el atributo que queremos borrar. © RAMA Capitulo 8. OBIETOS Y CLASES 139 ‘Veémoslo con un ejemplo: #1 /usr/bin/python # -*- coding: utf-8 -*- class Descriptor (object): def init__(self): self.var = "" def __set__(self, objeto, valor): print "Asignando un valor al atributo" self.var = valor def __get__(self, objeto, clase): print "Obteniendo el valor del atributo" return self.var def _delete_(self, objeto) print "Borrando el atributo" del self.var class Mi_Clase (object): mi_atributo = Descriptor () def _init_ (self, texto): self.mi_atributo texto mi_objeto = Mi_Clase ("hola") texto = mi_objeto.mi_atributo mi_objeto.mi_atributo = "adios" del mi_objeto.mi_atributo print texto Salida del programa: Asignando un valor al atributo Obteniendo el valor del atributo Asignando un valor al atributo Borrando el atributo hola 140 PYTHON. PASO A PASO RAMA En el ejemplo anterior, hemos creado una clase vescriptor que tiene métodos que se ejecutaran en el momento de asignar un valor a un atributo (_ set_), enel de leerlo(_get__) yenel de borrarlo(_delete_). Posteriormente, para usar este descriptor con uno de los atributos de la clase Mi_Clase (en nuestro caso, mi_atributo), debemos crear el atributo como una instancia de la clase (es decir, hacer mi_atributo = Descriptor ()). A partir de este momento, en lugar de actuar sobre el atributo en sf al asignarle un valor o leerlo, se ejecutardn los métodos correspondientes de la clase Descriptor. En la prictica, lo que hace Python es mapear la asignacién, la lectura y el borrado de nuestro atributo, Ilamando en su lugar al método correspondiente del descriptor. Naturalmente, podemos usar un mismo descriptor para varios atributos, ya sea en la misma o distinta clase. Aunque en este ejemplo nuestro descriptor se limita a mostrar unos textos, podemos aplicar descriptores a nuestro problema con la clase Animal y el nimero de patas: #1/usr/bin/python # -*- coding: utf-8 class Patas (object): def _init__(sel£): self.patas = 0 def __get__(self, objeto, owner): return self.patas def _set__(self, objeto, value): try: self.patas = int (value) except ValueBrror: print ("No es un entero") def _delete_(self, objeto): del self.patas class Animal (object): patas = Patas() © RAMA Capitulo 8 OBJETOS Y CLASES 141 def init__(self, nombre, patas): self.nombre = nombre self.patas = patas def muestra (self) : print "El "+ self.nombre + " tiene " + str(self.patas) + " patas." chucho = Animal("perro", "A") chucho. muestra () Salida del programa: No es un entero El perro tiene 0 patas. Ahora, gracias a nuestro descriptor Patas(), tenemos un manejo de excepciones al asignar un valor al atributo patas de la clase animal que impide introducir valores no enteros. 8.3 PYTHON Y LOS OBJETOS Python no solo es un lenguaje orientado a objetos, sino que en Python todos los elementos del lenguaje son objetos. Las funciones, los médulos 0 los distintos tipos de datos son objetos, lo que quiere decir que todos ellos poseen sus propios métodos y atributos que nos permiten manipularlos y trabajar con ellos. Para saber en profundidad de qué herramientas disponemos para cada clase, podemos usar el programa pydoe, escribiendo la orden pydoc nombre _de_la_clase (donde nombre_de_la_clase es el nombre de la clase sobre la que queremos saber mis) en un terminal. Esto nos dara una descripcién de la clase junto con un listado de sus métodos y para qué sirven. Por ejemplo, algunos de los métodos que se pueden aplicar a las listas son los siguientes: V append (elemento) agrega un nuevo elemento al final de la lista. F count (elemento) retorna el nimero de veces que aparece el elemento indicado en Ia lista. 142 PYTHON. PASO A PASO RAMA V extend (secuencia) afiade los elementos de la secuencia indicada (por ejemplo, otra lista o tupla) a la lista. Y index (elemento) retorna el indice de la primera aparicién del elemento enla lista. V insert (posicién, elemento) inserta el elemento en la posicién indicada de la lista. Y pop(elemento) elimina y retorna el elemento de la lista indicado. Si no se indica ninguno, usa el ultimo de la lista. V remove (elemento) elimina el elemento indicado de la lista. vy xeverse() invierte el orden de los elementos de la lista. ¥ sort () ordena los elementos de la lista. Si se le pasa una funcién como parametro, usara esa funcién como criterio de ordenacién. Y pueden ser usados, como con cualquier objeto, de este modo: #1/usr/bin/python # -*- coding: utf-a -*- mi_lista = ["Pato", "Gallina", "Pollo", "Pato", "Pavo"] print mi_lista mi_lista. append ("Avestruz") print mi_lista print mi_lista.count ("Pato") mi_lista.extend(["Gato", "Perro"]) print mi_lista mi_lista.index ("Pato") © RAMA Capitulo 8. OBJETOS Y CLASES 143, print mi_lista mi_lista.insert (3, "Lechuga") print mi_lista print mi_lista.pop() print mi_lista mi_lista. remove ("Lechuga") print mi_lista mi_lista.reverse() print mi_lista mi_lista.sort () print mi_lista Salida del programa: ['Pato', 'Gallina', 'Pollo', 'Pato', 'Pavo'] {'Pato', 'Gallina', 'Pollo', 'Pato', 'Pavo', 'Avestruz'] 2 {'Pato', 'Gallina', 'Pollo', 'Pato', 'Pavo', 'Avestruz', ‘Gato', 'Perro') {'Pato', 'Gallina', 'Pollo', 'Pato', 'Pavo', 'Avestruz', 'Gato', 'Perro') ['Pato', ‘Gallina’, 'Pollo', ‘Lechuga', ‘Pato’, ‘Pavo', ‘Avestruz', 'Gato', 'Perro') Perro ['Pato', 'Gallina', 'Pollo', ‘Lechuga', 'Pato', 'Pavo', ‘Avestruz', 'Gato') {'Pato', 'Gallina', 'Pollo', 'Pato', 'Pavo', 'Avestruz', "Gato') ['Gato', 'Avestruz', 'Pavo', 'Pato', 'Pollo', 'Gallina', "Pato') ['Avestruz', ‘Gallina’, ‘Gato’, 'Pato', ‘Pato’, 'Pavo', 'Pollo'] 144 PYTHON. PASO A PASO RAMA 8.4 jQUE HEMOS VISTO EN ESTE TEMA? La programacién orientada a objetos, que es el paradigma de programacién més en boga hoy en dia. Hemos visto qué son y cémo se usan los objetos, tanto los de “Viejo estilo” como los de “Nuevo estilo”. Hemos visto el concepto de herencia y su utilidad, y hemos descubierto que, en Python, todos los elementos del lenguaje son objetos y pueden ser tratados como tales. 8.4.1 Tareas sugeridas ¥ Todo lo que hemos estado haciendo hasta ahora se puede hacer con objetos. Deberiamos probarlo. {Qué tal un objeto que tenga un método que retorne la tabla de multiplicar de un nimero? ¥ Crearuna clase “Libro” que tenga atributos y métodos para caracteristicas tales como titulo, autor, editorial, paginas totales, paginas lefdas... y que nos sirva para administrar nuestra biblioteca personal. ¥ Quizés necesitemos una clase “Cémic” que herede métodos y atributos de Libro. SYNAPS PREMIUM MODULOS ‘A menudo querremos usar las mismas funciones (0 cualquier otro tipo de cédigo) en diferentes programas. Podriamos copiar y pegar la funcién cada vez que fuera necesario, pero eso, aparte de incémodo, es poco practico. Cosas como modificar una misma funcién en muchos archivos diferentes se pueden convertir en tareas casi imposibles en proyectos minimamente complejos. ‘También ayudaria a organizar mejor el cédigo si pudiéramos tener en un solo archivo todas las funciones relacionadas con un tema determinado, y usarlas en nuestros scripts cuando nos resultasen necesarias. Para este tipo de cosas Python dispone de los médulos. Un médulo no es mas que un trozo de cédigo en un archivo que puede ser importado en nuestros programas para ser usado. En realidad, cualquier archivo .py es un médulo, y puede ser importado usando import. El cuerpo de nuestro programa, el archivo que ejecutamos, es el médulo principal 0__nain_. Elresto de los médulos tienen un nombre que coincide con el nombre de su archivo, sin la extensién “.py”. Por ejemplo, este es el contenido del archivo “nates .py” que vamos a usar como ejemplo simplificado de médulo: #1 /usr/bin/python # -*- coding: utf-8 -*- # mates.py es un médulo de ejemplo con operaciones matemati- cas variable = "Esto est4 en el médulo" 146 PYTHON. PASO A PASO RAMA def multiplica(num1, num2): nv" Funcién que miltiplica dos nimeros """ return numl * num2 def suma (num, num2) : nw" puncién que suma dos ntimeros """ return numl + num2 Para usar este médulo en nuestro programa debemos inyocarlo con la cldusula import: seguida del nombre del médulo (recordemos: el nombre del médulo es el mismo que el nombre del archivo, sin la extensién “.py”). Como en nuestro ejemplo hemos guardado el archivo con el nombre “nates py”, tendremos que Hamarlo con import mates. Al importar un médulo este se incluye (y se ejecuta) como parte de nuestro programa, y podemos usar las variables, funciones, etc., que contenga normalmente. Sin embargo, como veremos mas adelante, para ello debemos Iamarlas usando su nombre precedido por el nombre del médulo y un punto, del modo “nonbre_de_ médulo.nombre_de_funcién()”. #1/usr/bin/python # -*- coding: utf-a -*- import mates variable = "Esto esté en el cuerpo del programa" print mates.variable print variable resultado mates. suma (3,2) print resultado resultado = mates.multiplica (3,2) print resultado Salida del programa: 5 6 © RAMA Capitulo 1. LENGUAJES DE PROGRAMACION 147 La importacién de médulos debe hacerse al principio del programa, antes de definir nuestras propias variables, funciones, etc. Se puede lamar a mas de un médulo en sucesivas cléusulas import, o usar una sola seguida de todos los médulos que queramos separados por comas. Cuando se importa un médulo, Python busca un archivo .py del mismo nombre en el mismo directorio donde se halla el programa que lo importa. En caso de que no lo encuentre, lo buscard en una serie de directorios por defecto, que dependen del sistema operativo y de la ruta donde hayamos hecho la instalacién de Python. El médulo sys que acompafia a toda distribucién de Python tiene una variable sys.path que contiene una lista con los valores concretos de estas rutas en el sistema: #1 /usr/bin/python # -*- coding: ut£-8 import sys print sys.path Salida del programa: ['/nome/usuario', '/usr/lib/python2.7', '/usr/1ib/python2.7/ plat-x86_64-1inux-gnu', */usr/1ib/python2.7/lib-tk', '/usr/lib/python2.7/1ib-old', * /usr/1ib/python2.7/1ib-dynload', '/usr/local/1ib/python2.7/ dist-packages', ' /usr/1ib/python2.7/dist-packages', '/usr/1ib/python2.7/ dist-packages/PILcompat', * /usr/1ib/python2.7/dist-packages/gtk-2.0', '/usr/1ib/pymo- dules/python2.7'] 148. PYTHON. PASO A PASO RAMA 9.1 ESPACIOS DE NOMBRES Los espacios de nombres 0 namespaces son la técnica que usa Python para mantener los nombres de variables, funciones, clases y objetos (lo que, en general, Hamamos identificadores) aislados unos de otros y asi evitar conflictos entre las distintas partes de un programa. Como hemos visto, para que distintos médulos puedan tener los mismos identificadores sin que ello cause problemas, Python solo permite acceder directamente a estos identificadores desde el médulo que los contiene. De este modo, si dos médulos tienen funciones con el mismo nombre, cada uno acceder a la suya. Cada médulo tiene su propio entorno global independiente, de modo que las variables globales de un médulo no son directamente accesibles desde otro. Para poder acceder a un identificador de otro médulo es necesario hacerlo usando el nombre de ese médulo del modo “nombre _de_médulo.identificador”, donde “nonbre_de_médulo” es el nombre del médulo ¢ “identificador” es la variable, funcién, etc., que queremos llamar. Veimoslo con un ejemplo. Supongamos que tenemos dos médulos. El primero de ellos sera “primero.py”: #1 /usr/bin/python # -*- coding: utf-@ -*- # primero.py es un médulo de ejemplo variable = "Estoy en el médulo 'primero'" def funcion_ejemplo(): nw" Funcién que muestra un texto """ print variable © RAMA Capitulo 9. MODULOS 149 El segundo, muy similar, se lamara “segundo.py”: #1 /usr/bin/python # -*- coding: utf-8 # segundo.py es un médulo de ejemplo variable "Estoy en el médulo 'segundo'" def funcion_ejemplo(): nw" Funcién que muestra un texto """ print variable Salida del programa: Ahora los usamos en nuestro programa, para lo cual tenemos que importarlos: #1 /usr/bin/python # -*- coding: utf-8 # Importamos los médulos import primero, segundo variable = "Estoy en el cuerpo principal" def funcion_ejemplo( nw" Funcién que muestra un texto """ print variable print "Llamamos a la funcién de este mismo médulo:" funcion_ejemplo() print 'Llamamos a la funcién del médulo "primero":! primero. funcion_ejemplo() print 'Llamamos a la funcién del médulo "segundo":! segundo. funcion_ejemplo() print "También podemos acceder a las variables:" 150 PYTHON. PASO A PASO RAMA print variable print primero.variable print segundo. variable Salida del programa: Llamamos a la funcién de este mismo médulo: Estoy en el cuerpo principal Llamamos a la funcién del médulo "primero": Estoy en el médulo ‘primero! Llamamos a la funcién del médulo "segundo": Estoy en el médulo ‘segundo! También podemos acceder a las variables: Estoy en el cuerpo principal Estoy en el médulo ‘primero! Estoy en el médulo ‘segundo! Todo médulo tiene una variable reservada__name__ (con dos guiones bajos al principio y otros dos al final del nombre) que almacena el nombre de ese médulo. Si es el médulo principal, su contenido sera siempre main _ (también con dos guiones bajos al principio y otros dos al final). También es posible importar todo o parte del contenido de un médulo dentro del espacio de nombres del médulo principal, para evitar tener que usar el nombre del médulo en todas las Ilamadas a los identificadores. Para ello se usa la misma instruccién import pero en la forma from MODULO import IDENTIPICADOR. Veimoslo con un ejemplo. Supongamos que tenemos un médulo “ni_ modulo.py” que contiene una variable y dos funciones: #1/usr/bin/python # -*- coding: utf-a -*- # mi_modulo.py es un médulo de ejemplo numero pi = 3.14159 def multiplica(uno, dos): new Puncién que mltiplica dos nimeros y retorna el resultado" return uno * dos def suma(uno, dos): n" Puncién que miltiplica dos nimeros y retorna el resultado" return uno + dos © RAMA Capitulo 9. MODULOS 151 Importamos la funcién m11tiplica () de este médulo: #1/usr/bin/python # -*- coding: utf-a -*- # Importamos la funcién "multiplica" del médulo "mi_modulo" from mi_modulo import multiplica # Ya no es necesario hacer "mi_modulo.multiplica(2, 3)" resultado = multiplica(2, 3) print resultado Salida del programa: 6 De este mods, la funcién multiplica esta en el espacio de nombres del médulo principal y podemos Iamarla sin hacer referencia al médulo del que proviene. Sin embargo, no podemos hacer lo mismo con la funcién “suma()” la variable “pumero_pi” del mismo médulo porque estas no las hemos importado. Podemos importar varios identificadores de un mismo médulo poniendo sus nombres separados por comas, de este modo: #1 /usr/bin/python # -*- coding: utf-8 -*- # Importamos las funciones "mltiplica" y "suma" from mi_modulo import multiplica, suma print suma(21, 10) print mltiplica(21, 10) Salida del programa: 31 210 152 PYTHON. PASO A PASO RAMA Si quisiégramos importar todos los identificadores de un médulo a nuestro espacio de nombres (algo que no es demasiado recomendable), podriamos hacerlo usando como nombre un asterisco, del siguiente mod #1 /usr/bin/python # -*- coding: utf-8 -*- # Importamos las funciones "multiplica" y "suma" from mi_modulo import * print suma(21, 10) print multiplica(21, 10) print numero_pi ‘Salida del programa: 31 210 3.14159 Importar nombres de este modo tiene el riesgo de que se den conflictos si los nombres de distintos identificadores coinciden. Podemos encontrarnos en la situacién de creer que estamos usando una funcién de un médulo determinado cuando, en realidad, estamos usando otra del mismo nombre pero de un médulo distinto. 9.2 PAQUETES En ocasiones, por razones de organizacién, es conveniente ordenar los médulos agrupandolos de forma légica en paquetes. Un paquete no es mas que un directorio que contiene varios médulos que, en principio, estén relacionados. Para crear un paquete solo hay que guardar los médulos que queramos en un mismo directorio. Ademds de esos médulos, el directorio debe contener un archivo de nombre“ init.py_”. Aunque este archivo se puede usar para cosas como iniciar los médulos, no hace falta que este archivo contenga nada, solo es necesario para informar a Python de que ese directorio es un paquete. © RAMA Capitulo 9. MODULOS 153 Por ejemplo, un médulo dedicado a las matematicas podria constar de un directorio llamado “matematicas” que contuviese un archivo “_init.py_” en blanco, otro “constantes . py” con declaraciones de variables y otro “operaciones. py” con algunas funciones matemiticas. #1 /usr/bin/python # -*- coding: utf-8 -*- constantes.py es un médulo con constantes mateméticas forma parte del paquete de ejemplo "matematicas" pi = 3.14159 e = 2.71828 zeta = 1.64493 #1 /usr/bin/python # -*- coding: utf-@ -*- operaciones.py es un médulo con operaciones matematicas forma parte del paquete de ejemplo "matematicas" def miltiplica(uno, dos ne» Puncién que miltiplica dos nimeros y retorna el resultado" return uno * dos def suma(uno, dos): ne» Puncién que mltiplica dos nimeros y retorna el resultado" return uno + dos def cuadrado (num) : nwn Funcién que retorna el cuadrado de un ntimero"™"" return num * num 154 PYTHON. PASO A PASO RAMA Suponiendo, como hemos dicho, que estos médulos se encuentran en el directorio “matematicas” acompaiiados de un archivo “init .py_” en blanco, debemos importarlos del siguiente modo: #1 /usr/bin/python # -*- coding: utf-8 -*- usando el paquete de ejemplo "matematicas" import matematicas.constantes, matematicas.operaciones radio = 14 vadio_cuadrado = matematicas.operaciones.cuadrado (radio) circunferencia = matematicas.operaciones. multiplica (matematicas.constantes.pi, radio_cuadrado) print circunferencia Salida del programa: 615.75164 Como puede verse, cuando importamos 0 usamos un médulo de un paquete, debemos hacerlo siguiendo su espacio de nombres completo, con el nombre del paquete seguido de un punto y el nombre del médulo, del modo “PAQUETE. MODULO”. Este mismo espacio de nombres debera usarse para invocar cualquier identificador del médulo, como variables o funciones. En nuestro ejemplo vemos que hemos tenido que llamar a cada submédulo independientemente. Si importamos simplemente “matematicas”, sin usar ningin nombre de médulo, estos submédulos no se importarén (no se importara nada, de hecho). ‘A veces puede ser conveniente permitir que, al importar directamente al paquete, se cargue una serie de identificadores por defect. Podemos hacerlo afiadiendo las cléusulas de importacién necesarias al archivo “_init.py_”. Por ejemplo, si nuestro paquete de ejemplo tuviera lo siguiente en su“_init.py_”: from .constantes import e from .operaciones import suma © RAMA Capitulo 9. MODULOS 155 Esto harfa que la variable e y la funcién suma () fueran llamadas al importar directamente a “matematicas”. Los paquetes pueden contener a su vez otros paquetes en una estructura jerarquica, por lo que habria que llamar al médulo y sus componentes indicando toda la ruta de directorios separada por puntos, del modo “PAQUETE.SUBPAQUETE. MODULO?” en tantos niveles como constara el paquete. Dado que puede Iegar a ser muy engorroso manejar nombres tan largos, la clausula import permite usar alias. Un alias es un nombre que asignamos en una importacién para reemplazar a la ruta del espacio de nombres. Su principal utilidad es poder usar nombres cortos y cémodbs en lugar de largas rutas o nombres complejos. Para ello se afiade el alias que queramos a la cléusula de importacién, haciendo import MODULO as ALIAS. Por ejemplo, podrfamos haber importado los médulos de nuestro paquete “matematicas” de este modo: #1/usr/bin/python # -*- coding: utf-8 usando el paquete de ejemplo "matematicas", con alias import matematicas.constantes as cons, matematicas.operacio- nes as ope vadio = 14 radio_cuadrado ope .cuadrado (radio) circunferencia = ope.multiplica(cons.pi, radio_cuadrado) print circunferencia Salida del programa: 615. 75164 En este ejemplo vemos como podemos usar el alias cons en lugar de matematicas.constantes y ope en lugar de matematicas operaciones. 156 PYTHON. PASO A PASO RAMA 9.3 LA LIBRERIA ESTANDAR Cualquier instalacién de Python dispone de cientos de médulos (unos quinientos) ya preparados para ser importados y usados en nuestros scripts. Estos médulos incluyen desde herramientas para el tratamiento de datos hasta sistemas para el manejo de protocolos de red, pasando por operaciones matemiticas, herramientas de criptografia o fanciones dependientes del sistema operativo. Los médulos que usemos en un momento dado dependerdn, naturalmente, de las necesidades del proyecto en el que estemos trabajando. Sin embargo, algunos de los médulos mas usados serdn, seguramente, algunos de los siguientes: el médulo os para interactuar con el sistema operativo, manipular rutas de archivos y ese tipo de cosas; sys para acceder a pardmetros del propio intérprete de Python; random para generar nimeros scudoaleatorios; re para el manejo de expresiones regulares; math, que contiene funciones para cdlculos matemiticos; decimal para efectuar clculos mateméticos sin las complicaciones del redondeo en coma flotante; el médulo sqlite, como interfaz con el sistema de bases de datos ligero SQLite; 0 ‘Tieinter, del que hablaremos un poco mis adelante, que sirve para crear interfaces grificas de ventanas y botones. Se puede encontrar un listado orientativo de todos los médulos de la libreria est4ndar en un apéndice al final de este libro. Para obtener informacién detallada sobre cada uno de ellos y las funciones, variables y objetos que contienen, se puede usar el programa pydoc (que también es un médulo de la libreria estindar de Python), escribiendo la orden pydoc nombre_de2_médulo en la linea de comandos. 9.4 INSTALAR NUEVOS MODULOS Y PAQUETES Si necesitamos instalar un médulo que no esta disponible en la libreria estandar, podemos hacerlo de varios modos. Como hemos visto en los ejemplos anteriores, la forma més simple de instalar un médulo 0 un paquete es copiarlo al mismo directorio donde se encuentra el programa que necesita usarlo. Pero ahi solo sera accesible por ese programa (y, naturalmente, los que se encuentren en ese mismo directorio), y normalmente es mas interesante elegir una ubicacién desde donde sea accesible a todos nuestros scripts. Como hemos dicho antes, los directorios donde Python busca los médulos estén en la lista sys.path. Si guardamos nuestro médulo en uno de los directorios indicados enesa lista, este ser accesible para cualquier programa, independientemente del lugar de nuestro sistema donde esté instalado. © RAMA Capitulo 9. MODULOS 157 #1 /usx/bin/python # -*- coding: uté-8 Imprime sys.path import sys print sys.path Salida del programa: ['/home/usuario', '/usr/1ib/python2.7', '/usr/1ib/python2.7/ plat-x86_64-1inux-gnu', * /usr/1ib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', * /usr/1ib/python2.7/1ib-dynload', '/usr/local/1ib/python2.7/ dist-packages', ‘ /usr/1ib/python2.7/dist-packages', '/usr/1ib/python2.7/ dist-packages/PILcompat', ' /usr/1ib/python2.7/dist-packages/gtk-2.0', '/usr/1ib/pymod- ules/python2.7'] EI problema es que, a menudo, los médulos de terceros requieren de una instalacién compleja, ya sea porque necesitan que otros médulos estén instalados para funcionar (a eso se llama dependencia de un médulo respecto a otro) 0 porque requieren de programas externos o tienen otros requisitos, y no basta con copiarlos en la ruta de sys.path. Afortunadamente, los programadores de esos médulos los suelen acompafiar de un programa de instalacién que se ocupa de todo (0 casi todo) lo necesario para instalar el médulo y sus dependencias. Estos médulos suelen estar también acompafiados de un archivo (normalmente llamado README 0 algo parecido) con las instrucciones necesarias para su instalacién. Ademis, si estamos trabajando con Linux, normalmente es posible instalar la mayor parte de los médulos con el gestor de paquetes del propio sistema operativo (del mismo modo que instalamos Python al principio de este libro). 9.4.1 Python Package Index Un lugar interesante para encontrar nuevos médulos es el Python Package Index: hitps://pypi.python.org. 158 PYTHON. PASO A PASO RAMA ve PyPI - the Python Package Index “Tne yun Package noe epany a sctware rte Pan Toearesc thePyptaiins, pees ue te Span or Bn par Undated Package Description 2181297 sabsevelemon? NE Orle sesame Figura 9.1. Python Package Index EI Python Package Index es un sitio web que mantiene un repositorio con casi siete mil paquetes y médulos de Python listos para descargar ¢ instalar. En el Python Package Index es posible buscar médulos por palabras clave, leer su descripcién, ver instrucciones y ejemplos de uso, y descargar ¢ instalar aquellos que deseemos. Sin embargo, también es posible instalar médulos del Python Package Index desde la propia linea de comandos gracias a pip. 9.4.2 El médulo pip El médulo pip forma parte de la libreria esténdar de Python, y nos ayuda a gestionar la instalacién, mantenimiento, actualizacién y desinstalacién de paquetes. Instalar un paquete es tan simple como escribir pip install nombre_ de1_médulo en la linea de comandos de nuestro sistema operativo. Naturalmente, “nombre_del_médulo” debe ser el nombre del médulo que queremos instalar. © RAMA Capitulo 9. MGDULOS 159 Por ejemplo, para instalar el médulo Pymysgu3, que sirve para acceder a bases de datos MySQL, deberfamos escribir lo siguiente: pip install Pymyson3 EI programa pip se encarga de buscar el médulo que queremos instalar, descargarlo ¢ instalarlo, junto con todas las dependencias que sean necesarias, de forma automitica. Mientras lo instala (a veces puede tardar, dependiendo de la complejidad y del tamafio del médulo) pip va mostrando informacién detallada de los pasos que efectia. Pero, {cémo encontramos el médulo que necesitamos en primer lugar? Para ello pip dispone de la opcién search, que permite buscar por términos en la base de datos del Python Package Index. Por ejemplo, busquemos por el término mysql: pip search mysql Si queremos actualizar un paquete que ya esta instalado, podemos hacerlo con instaii, del mismo modo que lo instalamos, pero afiadiéndole el argumento --update de este modo: pip install --update PymysoL3 Por iltimo, pip también permite desinstalar médulos con la opcién uninstall: pip uninstall PymysoL3 160 PYTHON. PASO A PASO RAMA 9.5 QUE HEMOS VISTO EN ESTE TEMA? Los médulos y paquetes y lo tremendamente titiles que son (Python no seria ni una centésima parte de lo potente que es sin ellos). Cémo crear nuestros propios médulos y paquetes y cémo instalar los de otros programadores. 9.5.1 Tareas sugeridas ¥ Convirtamos en médulos las funciones y clases que hemos estado haciendo hasta ahora, para que asi sean realmente usables desde cualquier programa. ¥ En particular, esa biblioteca que estabamos creando con la clase “Libro” se puede convertir en un médulo, para usar tanto en un programa de gestién de una libreria como en el de la biblioteca de un hogar. ¥ Probemos a usar pydoe para explorar algunos médulos de Ia libreria estindar y ver lo que nos muestra. Seguramente acabe siendo una herramienta muy atil para descubrir nuevas posibilidades de Python. SYNAPS PREMIUM 10 TAREAS COMUNES En este capitulo vamos a ver algunos ejemplos de tareas con Python simples pero iitiles, que nos permitiran aumentar las posibilidades y dar fiexibilidad a nuestros programas. 10.1 CADENAS CON FORMATO Podemos formatear cadenas con distintos tipos de datos usando una plantilla que contenga marcadores que serin reemplazados por el contenido que queremos introducir. Los marcadores en una plantilla comienzan siempre con un simbolo de porcentaje (%). Por ejemplo, *s es el marcador que sirve para introducir una cadena: #1/usr/bin/python # -*- coding: utf-8 -*- 162 PYTHON. PASO A PASO RAMA nombre = "Pablo" cadena_formateada = "jHola #s!" % nombre print cadena_formateada Salida del programa: iHola Pablo! Como se ve en el ejemplo, el simbolo de porcentaje seguido del carécter “s” dentro del texto es un marcador, que indica que en ese lugar se introduciré un valor que serd formateado como una cadena. Después del texto, y separado por otro simbolo de porcentaje ponemos el valor que queremos introducir. Si el contenido no es una cadena, Python lo convertiré al introducirlo, de modo que nosotros no debemos preocupamos de ello: #1 /usr/bin/python # -*- coding: utf-8 -*- print "Esto es una A: $s" & "A" print "Esto es un tres: ¢s" % 3 print "Esto es una lista: $s" % [1, 2, 3] Salida del programa: Esto es una A: A Esto es un tres: 3 Esto es una lista: [1, 2, 3] Podemos introducir en la plantilla tantos valores como queramos, poniéndolos entre paréntesis. Solo hay que recordar que el mimero de marcadores dentro de ella debe ser igual al niimero de valores que le proporcionemos a continuacién. #1/usr/bin/python # -*- coding: utf-8 - nombre "pablo" nombre2 = "Lidia" print "[Hola, $s y $s!" % (nombrel, nombre2) © RAMA Capitulo 10. TAREAS COMUNES 163, Salida del programa: iHola, Pablo y Lidia! Podemos fijar el ancho minimo que ocupara el valor introducido en la plantilla indicdndolo entre el signo de porcentaje y la letra “s”. Si el texto es mas corto, se completara con espacios en blanco delante de este. Si ponemos un némero en negativo, los espacios en blanco se afiadiran detras del texto: #1 /usr/bin/python # -*- coding: utf-8 -*- meses = ["Enero","Febrero", "Marzo", "Abril", "Mayo", "Junio", "gulio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciemb re"] for i in meses: print "* #10s * %-10s *" % (i,4) Salida del programa: * Enero * Enero * * Febrero * Febrero * * Marzo * Marzo * * Abril * Abril * * Mayo * Mayo * * gunio * Junio * * gulio * Julio * * Agosto * Agosto * * Septiembre * Septiembre * * Octubre * Octubre * * Noviembre * Noviembre * * Diciembre * Diciembre * Si necesitamos formatear nimeros enteros, podemos hacerlo con ¢a: #1 /usr/bin/python # -*- coding: utf-8 -*- print "El lenguaje de programacién ts nacié en el afio $a" % ("python", 1991) Salida del programa: El lenguaje de programacién Python nacié en el afio 1991 164 PYTHON. PASO A PASO RAMA © RAMA Capitulo 10. TAREAS COMUNES 165, Si el mamero introducido no es un entero, se convertiré (quitindole los tercio = 1.0/3 decimales si es necesario) antes de afiadirlo a la cadena. print "Un tercio (sin decimales) es #d" % tercio #1 /usr/bin/python # -*- coding: utf-8 - print "Un tercio es $f" & tercio hexadecimal = 0XA0 decimal = 10.5 ISRAEL DONT ERIGS Un tercio (sin decimales) es 0 print "El niimero hexadecimal es $d y el decimal es $d" & Un tercio es 0.333333 (hexadecimal, decimal) Si tras el signo de porcentaje aftadimos un punto seguido de un mimero y : la letra “f”, esto indicara el mimero maximo de digitos decimales que queremos ida del prog ae mostrar: Bl néimero hexadecimal es 160 y el decimal es 10 #1/usr/bin/python Del mismo modo, usando %x 0 %x podemos representar mimeros en # -*- coding: utf-8 -*- notacién hexadecimal, con los caracteres alfabéticos en mayiisculas 0 minisculas, respectivamente. También podemos usar los cédigos ve y ¢# para usar la notacion exponencial y to para mostrar el nimero en octal. tercio = 1.0 /3 print "Un tercio es $f" % tercio #1/usr/bin/python # -*- coding: utf-e - print "Un tercio es %.2£" % tercio numero = 1000 Salida del programa: print "$d en hexadecimal (mindsculas) es $x" % (numero, numero) Un tercio es 0.333333 Un tercio es 0.33 print "$d en hexadecimal (mayGsculas) es $x" % (numero, numero) print "$d en exponencial (mindsculas) es te" $ (numero, numero) print "$d en exponencial (maydsculas) es $B" % (numero, numero) Salida del programa: 1000 en hexadecimal (minisculas) es 3e8 1000 en hexadecimal (mayisculas) es 3E8 1000 en exponencial (minGsculas) es 1.000000e+03 10.2 MODULO MULTIUSO 1000 en exponencial (mayisculas) es 1.000000E+03 Para poner mimeros con decimales se usa ¥£. Un caso bastante habitual es el de un script que puede ejecutarse independientemente, pero que también puede usarse como un médulo. En estos #1 /usr/bin/python casos, a menudo, es necesario que el médulo ejecute ciertas tareas cuando es # ~*~ coding: utf-8 -*- Hamado independientemente (como, por ejemplo, leer los argumentos de la linea de comandos), pero no cuando se ejecuta como médulo importado. 166 PYTHON. PASO A PASO RAMA Esto se consigue gracias a que, como ya vimos al hablar de los médulos, el atributo_name__ del médulo principal siempre es _main_. #1/usr/bin/python # -*- coding: utf-8 def del_uno_al_cinco(): print range (5) if name main": print "Soy un script" print "Esto no se muestra como médulo” del_uno_al_cinco() Salida del programa: Soy un script Esto no se muestra como médulo [o, 1, 2, 3, 4] Este tipo de construccién también es itil si queremos evitar que un médulo se ejecute como script independiente. 10.3 INTERACCION CON EL USUARIO Hasta ahora, todos los ejemplos que hemos visto son estaticos y no permiten ningiin tipo de interaccién con el usuario. raw input () es una funcién que muestra un texto al usuario (si se le ha pasado alguno como argumento), y detiene la ejecucién del programa mientras espera una respuesta del teclado. raw_input () recogerd todo lo que se escriba en el teclado hasta que se pulse la tecla ENTER. El texto recibido (sin contar la pulsacién de la tecla ENTER) sera retornado por la funcién como una cadena de texto, que podemos usar 0 manipular como nos interese. #1/usr/bin/python # -*- coding: utf-a -*- nombre = raw_input("Escriba su nombre, por favor: print "Hola " + nombre © RAMA Capitulo 10. TAREAS COMUNES 167 Salida del programa: Escriba su nombre, por favor: Pablo Hola Pablo 10.4 OBTENER PARAMETROS DE LA LINEA DE COMANDOS Otra forma util de recibir datos del usuario es por medio de la linea de érdenes. A menudo, los comandos o programas que se ejecutan en la linea de érdenes admiten pardmetros. Por ejemplo, el comando de UNIX cp, que permite copiar un archivo, necesita que se le dé el nombre del archivo que se va a copiar y el del nuevo archivo. Esto se hace escribiendo algo como cp original.txt copia.txt. EI programa toma los nombres de esos ficheros y opera sobre ellos. Nuestros scripts en Python también pueden leer de la linea de érdenes, Para ello tenemos que usar el atributo argv del médulo sys, que sera necesario importar. Python almacena en sys.argv una lista con los elementos de la linea de érdenes. EI primero de estos elementos sera el propio nombre del script, y el resto serdn los pardmetros que hayamos puesto a continuacién. Podemos verlo con el siguiente ejemplo, que recoge y muestra el contenido de sys.argv: #1/usr/bin/python # -*- coding: utf-a -*- import sys numero_argumentos = len(sys.argv) print "Argumentos (" + str(numero_argumentos) + "):" for argumento in sys.argv: print '- ' + argumento 168 PYTHON. PASO A PASO RAMA ‘Salida del programa: Argumentos (1): - test.py La salida anterior se muestra si se ejecuta sin argumentos (asumiendo que el script se lama “test .py”). Si se ejecuta pasindole como argumentos los valores “argumentol” y “argumento2” del modo test.py argumentol argumento2, la salida serd la siguiente: Salida del programa: - test.py - argumentol - argumento2 10.5 INTERFAZ GRAFICA CON TK Todos los ejemplos de interaccién con el usuario que hemos visto hasta ahora se ejecutan en linea de érdenes. Pero la forma mas popular de hacerlo en los tiltimos tiempos es a través de una Interfaz de Usuario Grafica (GUI, por sus siglas en inglés). Todos los sistemas operatives modernos cuentan con una serie de herramientas como ventanas, botones, mentis desplegables, casillas de seleccién y otros elementos graficos (conocidos globalmente como widgets) que sirven como una forma muy simple y a la vez intuitiva de interaccionar con los programas. Como era de esperar, cualquier distribucién de Python dispone de varios médulos que nos permiten crear interfaces grificas y usarlas en nuestros scripts. La mas popular de ellas es Tkinter. ‘Tkinter es la herramienta mas usada para crear interfaces graficas en Python. Posee clases para construir cualquier tipo de widget, como botones, entradas de texto 0 de contrasefia, etiquetas, iconos e imagenes, y muchos més. Explicarlo detalladamente se encuentra mas alld de las posibilidades de este libro, y aqui solo mostraremos un par de ejemplos, pero puede encontrarse mucha informacién en su pagina oficial: hitp://tkinterunpythonic.net/wiki/. © RAMA Capitulo 10. TAREAS COMUNES 169 El ejemplo mas basico de uso de Tkinter es el de una ventana con el texto “Hola Mundo”: #1 /usr/bin/python # -*- coding: utf-8 -*- import Tkinter principal = Tkinter.Tk() texto = Tkinter.Label (principal, text="Hola Mundo") texto.pack() principal .mainloop() Tras importar la libreria, creamos el gestor de la ventana usando Tkinter. ‘k(). El objeto rkinter.babel () es el que nos permite crear una etiqueta de texto, gue tiene un método pack () al que luego Ilamaremos para “empaquetar” ese texto en la ventana. Para finalizar, lamamos al método maintoop() para iniciar la ventana. Internamente, mainioop() mantiene un bucle de ejecucién que recoge nuestras acciones sobre los distintos widgets y ejecuta las acciones que hayamos programado. Al detener este bucle (normalmente haciendo clic en el botén de Cerrar ventana), la ventana desaparece. Figura 10.1. “Hola Mundo” en Tkinter 170. PYTHON. PASO A PASO RAMA Normalmente, el orden tipico al construir una interfaz en Tkinter es el mismo: Y Crear la ventana principal. V Crear cada widget (algunos widgets pueden ir dentro de otros, lo que complica este paso un poco). V Empaquetar los widgets. V Iniciar el mainloop. Un ejemplo un poco mas complejo y con algo de interaccién lo tenemos en el siguiente script, que genera una ventana con dos botones, los cuales activan sendas funciones para modificar el texto de otro widget: #1 /usr/bin/python # -*- coding: utf-8 -*- import Tkinter def saludar(): texto['text'] = "Hola amigo" def despedir(): texto['text'] = "Hasta la vista" # Ventana principal principal = Tkinter.Tk() # Titulo de la ventana principal .wm_title("Programilla") # Texto que se muestra texto = Tkinter.Label(principal, text="Saluda") # Botones boton_saluda = Tkinter.Button (principal, text="Hola", command=saludar) boton_despide = Tkinter.Button (principal, text="Adios", command=despedir) texto.pack() boton_saluda.pack () boton_despide. pack () principal .mainloop() © RAMA Capitulo 10. TAREAS COMUNES 171 En este ejemplo, hemos asociado un par de funciones (caludar() y despedix ()) a sendos botones, por medio del argumento command de los objetos Button para que, al pulsarlos, se ejecuten las acciones de cada una (en nuestro caso, simplemente cambiar un texto). Pa X Saluda Hola Adios | Figura 10.2. Ciclo de ejecucién de nuestro programa Como se puede comprobar, Tkinter se ocupa de colocar los distintos widgets, empaquetarlos en la yentana y ajustar el tamafio de cada uno de ellos de forma dindmica, incluso cuando el tamaiio de alguno cambia. Un detalle interesante de Tkinter es que usa los propios recursos del sistema operativo en el que se ejecuta para construir las ventanas, por lo que estas tienen una apariencia acorde con la del resto de aplicaciones de la interfaz grafica en la que se encuentre. Saluda Hota| Adios Figura 10.3. | mismo programa anterior, pero bajo Windows 8 10.6 MANEJO DE FICHEROS Python nos permite acceder a los ficheros por medio de la funcién nativa open(). Esta funcién admite como argumento una cadena conteniendo un nombre de fichero, y retorna un objeto cite. La clase £i1e es una clase predefinida de Python que dispone de métodos y atributos a través de los que podemos acceder, leer y manipular el contenido de un fichero. 172 PYTHON. PASO A PASO RAMA Adicionalmente, open () admite un segundo argumento opcional en el que podemos indicar el modo de acceso al archivo. Si el modo indicado es x, se accedera al archivo en modo lectura, Cualquier intento de escribir en el archivo retornaré un error. Este es el modo por defecto y, si no tenemos intencién expresa de escribir en el archivo, es el modo en el que debemos abrirlo. Si el archivo no existe, también recibiremos un error. Si le pasamos el argumento w, el archivo se abriré en modo escritura. Todo Jo que escribamos en el archivo sobrescribird su contenido, con lo que se perder lo que ya hubiera antes en el archivo. Si el archivo que se le pasa como argumento no existe, serd creado autométicamente. Si el argumento es a, el archivo se abrird en modo “actualizacién”. Este es un modo similar al modo escritura, con la salvedad de que lo que escribamos en el archivo, en lugar de sobrescribir el contenido anterior, se afiade a continuacién de lo que ya hubiera. Igual que en el modo escritura, si el archivo no existe se crea uno nuevo. Si se quiere abrir en modo lectura y escritura, se le debe pasar el argumento Los sistemas Windows diferencian entre archivos con contenido binario y de texto, Por defecto, open() abrird el archivo en modo texto. Si se desea abrir el archivo en modo binario, se le debe afiadir la letra b al final del argumento de modo; con lo que quedarfan como rb para modo lectura binaria, wb para modo escritura binaria, ab para modo actualizacién binaria y x+b para lectura y escritura binaria. open() abre el archivo y retorna un objeto £i1e, pero no hace nada mis. Para manipular el archivo necesitamos trabajar sobre el objeto que nos ha retornado. EI primer método que tenemos para ello es reaa(), que nos retoma el contenido del archivo. Para ver esto, vamos a abrir un archivo de texto con el siguiente contenido, que guardaremos con el nombre de “Lista. txt” y ubicaremos en el mismo directorio que nuestro script: Primera linea Texto un poco m&s largo en la segunda linea esta es la Tercera cuarta linea ¥ con esto ya es suficiente © RAMA Capitulo 10. TAREAS COMUNES 173, Ahora vamos a escribir un pequefio programa que lea nuestro archivo y muestre su contenido: #1/usr/bin/python # -*- coding: utf-8 #Abrimos el fichero en modo lectura fichero = open("lista.txt","x") contenido = fichero.read() print contenido fichero.close() Salida del programa: Primera linea Texto un poco més largo en la segunda linea esta es la Tercera Cuarta linea ¥ con esto ya es suficiente Al final de nuestro ejemplo hemos usado el método close () , que sirve para cerrar el fichero. Este método se ocupa de que el fichero sea cerrado debidamente y de que se libere la memoria que ocupaba. Un fichero se cierra cuando ya no se va a usar mds, y es especialmente importante hacerlo cuando se ha escrito en él, para asegurarnos de que todos los cambios se han guardado correctamente. El método read) admite un mimero entero como argumento en el que se le indica el tamafio maximo de la entrada en bytes. Para un acceso mas cémodo tenemos el método readi ine () . Este método es muy parecido al anterior, con la diferencia de que retorna una linea del archivo cada vez. que es llamado, hasta que llega al final del archivo. #1 /usr/bin/python # -*- coding: utf-8 #Abrimos el fichero en modo lectura fichero = open("lista.txt","x") print fichero.readline() 174 PYTHON. PASO A PASO RAMA © RAMA Capitulo 10. TAREAS COMUNES 175, print fichero.readline() Pero, sin duda, el modo mas simple y eficiente de obtener linea a linea el print fichero.readline() contenido de un fichero es acceder a él usando una interesante propiedad del objeto file: £ichero.close() #1 /usr/bin/python EET # -*- coding: utf-8 -*- primera linea #Abrimos el fichero en modo lectura fichero = open("Lista.txt","2") Texto un poco més largo en la segunda linea for linea in fichero: esta es la Tercera print linea Naturalmente, readline () se puede usar dentro de un bucle para leer el archivo completo linea a linea. fichero.close() Dado que cada linea del fichero termina en un retorno de carro, y la orden - print afiade otro, las lineas aparecen separadas en la salida de este programa. Salida del programa: Otra forma de acceder por lineas al contenido del fichero es con el método Primera Linea xeadlines (), que retomna una lista conteniendo cada una de las lineas del archivo. ceRANRGRORSTMANARENS Ga, AewEgURAN LeREN #1/usr/bin/python # -*- coding: utf-8 - esta es la Tercera #Abrimos el fichero en modo lectura Cuarta linea fichero = open("Lista.txt","r") ¥ con esto ya es suficiente distasliness = fleterosresdisnes() En este ejemplo vemos como el objeto £i1¢ acttia como un iterador que, en cada Hamada, nos retorna la siguiente linea del archivo, por lo que se puede usar en rint lista_lineas [1] x . ‘ zs 2 = un bucle gor u otra estructura similar para obtener el contenido de dicho archivo. print lista_lineas [3] print sta lnees [4] Para escribir en un archivo (que debe haber sido abierto en modo escritura con w, a 0 r+) tenemos el método write (). Este método escribe cadenas de texto en el archivo, por lo que debemos tener en cuenta que cualquier otro tipo de dato debe ser convertido a cadena antes de poder ser usado. fichero.close() Salida del programa: #1/usr/bin/python Texto w as lai la segunda linea in poco m4s largo en la segunda line: [ocasceoding; avessices cuarta linea un_texto = "Hola mundo" cos otro_texto = "Adiés mundo" ¥ con esto ya es suficiente = # Abrimos el fichero en modo escritura # Si el archivo ya existe, se borraré el contenido 176 PYTHON. PASO A PASO RAMA £ichero = open("nuevo.txt", "w") fichero.write(un_texto) fichero.write (otro_texto) £ichero.close () Si después de ejecutar este ejemplo abrimos el archivo “nuevo.txt”, ‘veremos lo siguiente: Hola mundoAdiés mundo Como podemos ver, el método write () afiade al final del archivo el contenido que se le pasa como argumento. No introduce un retomno de carro (ni ningun otro signo) al final del contenido introducido por lo que, si queremos agregar contenido linea a linea, debemos recordar afiadirlo expresamente (con el simbolo \x): #1 /usr/bin/python # -*- coding: utf-8 # Abrimos el fichero en modo escritura # Si el archivo ya existe, se borraré el contenido fichero = open("nuevo.txt","w") for i in range (1,5): texto = "Linea i\n" % i fichero.write (texto) fichero.close() Tras ejecutar el programa de este ejemplo, el contenido del archivo “nuevo. ext” serd el siguiente: Linea Linea Linea Linea Otra forma de escribir en un archivo es con el método writelines(), que opera exactamente igual que write() pero con la diferencia de que nos permite afiadir el contenido de una secuencia (como, por ejemplo, una lista) al archivo: #1/usr/bin/python # -*- coding: utf-8 © RAMA Capitulo 10. TAREAS COMUNES 177 mi_lista = ["Primera", "Segunda", "Tercera"] #Abrimos el fichero en modo escritura £ichero = open("nuevo.txt", "w") fichero.writelines(mi_lista) fichero.close() Internamente, Python usa un puntero que indica la posicién actual en el fichero para todas las operaciones de escritura, Es por eso que en cada llamada a write() se contimia por el mismo punto en que qued6 en la anterior llamada. El valor en bytes de ese puntero en un momento dado puede obtenerse con el método tell(). Ademés, la posicién del puntero puede ser modificada usando el método seek(). Este método admite dos argumentos. El primero (obligatorio) indica la posicién en bytes en la que se situard el puntero. Como veremos enseguida, se pueden usar valores negativos para indicar esa posicién. El segundo argumento es opcional y puede valer 0, 1 0 2. Si es 0, la nueva posicién del puntero se calculara desde el principio del archivo (este es el comportamiento por defecto). Si vale 2, se contard desde la posicién actual del puntero. Y si es 3, se contard desde el final del archivo. Si movemos el puntero a una posicién que ya tiene contenido, este seri sustituido por el nuevo cuando lo escribamos. #1 /usr/bin/python # -*- coding: utf-8 # Abrimos el fichero en modo escritura # Si el archivo ya existe, se borraré el contenido fichero = open("nuevo.txt","w") £ichero.write ("1234567890") # movemos el puntero a 5 bytes # desde el principio del fichero fichero.seek(5) £ichero.write ("XXX") fichero.close() 178 PYTHON. PASO A PASO © RA-MA Tras ejecutar este ejemplo, el fichero “nuevo. txt” contendra lo siguiente: 12345xxx90 El método truncate () reduce el tamafio del archivo al nimero de bytes indicado como argumento. Si no se le indica ningiin tamafio borra todo el contenido del archivo. 10.7 jQUE HEMOS VISTO EN ESTE TEMA? Algunos aspectos practicos que aplicar a nuestros programas, como diversas interfaces con el usuario, lectura y escritura de archivos o tratamiento de cadenas. 10.7.1 Tareas sugeridas ¥ Ajiadir interaccién con el usuario abre un mundo de posibilidades. En especial Tkinter y las interfaces graficas son una herramienta muy lamativa. Aunque en este libro no vamos a profundizar ms, lo visto deberia ser suficiente para empezar. ¥ Si nuestro médulo de biblioteca va viento en popa, quizis seria buena idea programar una interfaz. para introducir libros en el programa. ¥ Claro que, bien mirado, no sirve de nada introducir los datos de nuestra biblioteca si se van a perder al cerrar el programa. {Qué tal si guardamos los libros en un archivo de texto, en forma de campos de texto separados por comas (CSV)? ¥ Para hacerlo més facil, la libreria estindar tiene un médulo especialmente disefiado para manejar archivos CSV. SYNAPS PREMIUM Apéndice | FUNCIONES Y CLASES NATIVAS Python Heva incorporadas una serie de funciones que podemos usar y que no es necesario importar de ningin médulo. Se enumeran aqui junto con una descripcién de su funcionamiento. En el caso de las clases més habituales, especialmente en los tipos de datos, se han afiadido sus principales métodos. Si es necesario, pueden verse més detalles en la propia ayuda de Python, con el programa pydoc, mediante la orden pydoc nombre_de_la_ funcién. V abs() e Uso abs (x) © Descripcién Retorna el valor absoluto del nimero que se le pasa como argumento. Si es un namero complejo, retorna su magnitud. y alld © Uso all (iterable) 180 PYTHON. PASO A PASO RAMA © Descripcién Retorna True si todos los elementos de iterabie son True (0 si el iterable est yacio). y any() e Uso any (iterable) © Descripcién Retorna True si algin elemento de iterable es True. Si el iterable esta vacio retorna False. V basestring), © Uso basestring() © Descripcién Tipo de dato abstracto que sirve como superclase de etry unicode. No puede ser invocado o instanciado pero se puede usar para comprobar si un objeto es una instancia de str 0 unicode. isinstance (objeto, basestring) ¢s equivalente a isinstance (objeto, (str, unicode) ). 7 bind © Uso bin (x) © Descripcién Convierte un mimero entero en una cadena binaria. M class bool) © Uso bool () © Descripcién Clase para el tipo de dato booleano. Puede valer False 0 True. Es una subclase de int. V class bytearray() e Uso bytearray({origen[, codificacién[, errores}]1) © RAMA Apéndice |, FUNCIONES ¥ CLASES NATIVAS 181 © Descripcién Retorna un bytearray. Se trata de una secuencia mutable de bytes con un valor entre 0 y 255 (ambos incluidos). Admite la mayoria de los métodos del objeto str. F callable) © Uso callable (object) © Descripcién Retorna un valor true si el objeto es callable (“Ilamable”) y aise si no lo es. Son “llamables” las funciones, los métodos, las clases y, en general todo aquello que puede ser invocado, normalmente pasandole unos pardmetros, para obtener un resultado. Como norma general, todo aquello cuyo nombre termina en paréntesis “()” es callable. No se pueden llamar, por ejemplo, las cadenas, las listas o las tuplas. Las instancias de una clase son “Ilamables” si tienen un método_cal1_ QO. V chr © Uso chr (i) © Descripcién Retorna una cadena con el carécter cuyo valor ASCII es el entero i, que debe estar en el rango [0...255]. Ver unichr (). V classmethodQ, © Uso clagsmethod (function) © Descripcién Retorna un método de clase para una funcién. Los métodos de clase reciben implicitamente la clase como primer pardmetro (class), al igual que los métodos de los objetos reciben el propio objeto (self). @classmethod actisa como un decorador que, al pasar automaticamente la propia clase como parametro, convierte la funcién a la que decora en un método de clase. Puede ser llamado tanto desde una clase como desde un objeto, pero el método creado sera siempre de clase. 182 PYTHON. PASO A PASO RAMA © RAMA Apéndice |, FUNCIONES Y CLASES NATIVAS 183, #1 /usr/bin/python El argumento mode es una cadena de texto que especifica el tipo de # -*- coding: utf-2 -*- cédigo que se compilard (dependiendo del uso que queramos darle): “exec” para un bloque de cédigo de tamafio arbitrario (y que podrd ser ejecutado con exec () ), “eval” para una sola expresién (que puede ser usada para evaluarla con eval ()), 0 “single” para compilar una sola sentencia (que también puede ejecutarse con exec ()). class MiClase: variable = 10 @classmethod def metodo (cls) return cls.variable #1/usr/bin/python # -*- coding: utf-a -*- cédigo = """ def funcion(): print "Aqui pasan cosas" objeto = MiClase print objeto.metodo() funcion() Salida del programa: oe 30 compilado = compile (cédigo,"", "exeo") 7 cmpQ) print compilado ° ie ( lado) exec (compilado emp (x,y) ° © Descripcién ‘a P x lida del programa: Retorna un entero en funcién de la comparaci6n de x ¢ y. E valor retornado sera positivo si x > y, negativo six < y,y cero six == y. at Ox7fec3dcs8cbo, file "", line a Aqui pasan cosas 7 compile() © Uso Y class complex() compile(source, filename, mode[, flags[, dont_inherit]]) = © Uso © Descripcién complex ({real[, imag] ]) Compila el cédigo fuente que se le pasa como parametro, en un formato ejecutable o en forma de AST. Un AST (Abstract Syntax Tree) es un diagrama en rbol (en modo texto) que resume la estructura sintactica © Descripcién Clase para los mimeros complejos. del cédigo. © Métodos Segin el modo de compilacién, el cédigo puede ser ejecutado con la conjugate() retorna el conjugado del mimero complejo. funeién exec () 0 evaluado con eval (). El argumento £i1ename deberia contener el nombre del archivo del V delattrd) que procede el cédigo, pero solo est4 ahi para algunos mensajes de error y, si el cédigo no procede de ningun archivo, puede ponerse cadena vacia o un nombre arbitrario (se suele usar el texto , entre comillas). © Uso delattr (object, name) 184 PYTHON. PASO A PASO RAMA Descripcién Recibe como argumentos un objeto y cl nombre de un atributo de ese objeto. Borra el atributo indicado de ese objeto (para la funcién opuesta, ver setattr(}). M class dict() Uso dict (kwarg) dict (mapping, kwarg) dict (iterable, **kwarg) Descripcién Crea un diccionario. Métodos — clear() borra todos los elementos del diccionario. — copy |) retorna una copia del diccionario. — fromkeys (claves [,valores]) crea un diccionario a partir del iterable con las claves que se le pasan como argumento. Admite un segundo argumento opcional que se usar para asignar valores. — get (clave [,defecto}) retorna el valor del diccionario indicado por la clave que se le pasa como argumento. Si no existe, devuelve None a menos que se asigne un valor por defecto como segundo argumento. — has_key(clave) retorna un valor booleano true si la clave pasada como argumento existe en el diccionario. — items () retorna las claves y valores del diccionario en forma de dos tuplas. — iteritems() es un iterador que retorna, uno a uno, los pares (clave, valor) del diccionario. — iterkeys() es un iterador que retorna, una a una, las claves del diccionario. — itervalues() es un iterador que retorna, uno a uno, los valores del diccionario. — keys () retorna una lista con las claves del diccionario. — pop (clave [,defecto} } elimina la clave especificada y retorna el valor asociado. Si no existe, se genera un error Keyzrror, a menos que se haya asignado un segundo argumento con el valor a retornar por defecto. Apéndice |, FUNCIONES Y CLASES NATIVAS 185, — popitem() elimina del diccionario y retorna un par (clave, valor) en forma de tupla. Si el diccionario esta vacio se genera un error keyError. — setdefault (clave [,defecto}) retorna el valor del diccionario indicado por la clave que se le pasa como argumento. Sila clave no existe, la afiade al diccionario asignandole el valor que se le pasa como segundo argumento 0 nuit si este no existe. — update (diccionario) afiade elementos al diccionario a partir de uno o ms diccionarios que se le pasan como argumento. — values () retorna una lista con los valores del diccionario. — viewitems () retorna un objeto tipo set con los pares (clave, valor) del diccionario. — viewkeys () retorna un objeto tipo set con las claves del diccionario. — viewvalues() retorna un objeto tipo set con los valores del diccionario. V dir © Uso dix ([object]) © Descripcién Si se le pasa un objeto como pardmetro, retorna una lista con los atributos de ese objeto ordenados alfabéticamente. Si no se le pasa ningfin argumento, retornara una lista (ordenada alfabéticamente) de todas las variables accesibles localmente (ver el capitulo dedicado a los espacios de nombres). V enumerated © Uso enumerate(sequence, start=0) © Descripcién Retora un objeto enumerate. El argumento sequence debe ser una secuencia (como una lista o una tupla), un iterador (como un generador) o algin otro tipo de objeto que soporte iteracién. El objeto enumerate retorna un iterador que, para cada elemento de la secuencia, contiene una tupla con un nimero y el propio elemento de la secuencia. El nimero se incrementa en cada elemento, con lo que actiia como un contador. En el argumento opcional tart se puede indicar el nimero correspondiente a la primera tupla (por defecto es cero). 186 PYTHON. PASO A PASO RAMA #1/usr/bin/python # -*- coding: utf£-8 -*- lista = ["uno", "dos", "tres", "cuatro"] enumeracion = enumerate (lista) print enumeracion print list (enumeracion) Salida del programa: cenumerate object at 0x7£2899¢81780> ((0, ‘uno'), (1, 'dos'), (2, 'tres'), (3, ‘cuatro')] 7 eval() © Us0 eval (expression[, globals[, locals]]) © Deseripcién Evaliia la expresién pasada como argumento y retorna el resultado. EI argumento globals, si se usa, debe ser un diccionario con los nombres globales. locals puede ser cualquier objeto de tipo mapping (normalmente otro diccionario). La expresién pasada como argumento debe ser una cadena que ser interpretada como cédigo Python, usando globals y locals como espacios de nombres global y local respectivamente. Si no se pasa ningiin espacio de nombres se usar el mismo donde se encuentre la propia funcién eval(). Esta funcién también puede ejecutar un objeto de cédigo como el generado por compile(). #1/usr/bin/python # -*- coding: utf-a -*- instruceion = "5 + 6" print eval (instruccion) Salida del programa: n Apéndice |, FUNCIONES Y CLASES NATIVAS 187 V execfile() e Uso execfile(filename[, globals{, locals] ]) © Descripcién Interpreta el cédigo contenido en el archivo cuyo nombre se le pasa como parimetro y retorna el resultado. Los argumentos pasados en globals y locals son opcionales, y consisten en sendos diccionarios que seusaran como espacio de nombres global y local respectivamente. Si no se pasa ningiin espacio de nombres se usard el mismo donde se encuentre la propia funcién. M filed © Uso file(name{, mode[, buffering] ]) © Deseripcién Funcién constructora para el tipo £11e. Acepta los mismos argumentos que la funcién open (). Es recomendable usar la funcién open () en lugar de £ite(). y filter) e Uso filter (function, iterable) © Descripcién Recibe una funcién y un iterable como argumentos, y retorna una lista de elementos a partir del iterable, filtrandolo por medio de la funcién. Si la funcién retorna un valor True para un elemento del iterable, este es retomado. Si el iterable es una cadena o una tupla, £i1ter () retornard el mismo tipo. En caso contrario retornara una lista. #1 /usr/bin/python # -*- coding: utf-8 -*- def €iltra (dato) : if dato > 5: return True else: return False salida = filter (filtra, (1,7,9,3,5,9,10,3,1,4,11]) print salida 188 PYTHON. PASO A PASO RAMA Salida del programa: (7, 9, 9, 10, 12] 7 class float) © Uso float (x) © Descripcién Clase para los ntimeros en coma flotante. © Métodos — as_integer_ratio() retorna una tupla con un par de nimeros enteros tales que el primero, dividido por el segundo, dé como resultado el mimero en coma flotante original. — fromhex (cadena) crea un nuevo mimero en coma flotante a partir de una cadena que contenga su representacién hexadecimal. — hex() retorna una cadena con la representacién hexadecimal del niimero. — is_integer() retorna un valor booleano true si el mimero es entero. V format() © Uso format (value[, format_spec]) © Descripcién Convierte el argumento value en una representacién “formateada” segin lo indicado en format_spec. Lo que significa concretamente que format_spec depende del tipo de value. Esta funcién es usada por varias funciones de manipulacién de tipos, y no es normal Ilamarla directamente. V class frozenset() Uso frozenset ([iterable] ) Descripcién Retorna un objeto frozenset. Métodos © RAMA Apéndice |, FUNCIONES Y CLASES NATIVAS 189 — copy () retorna una copia del set. — difference () retorna un set con los elementos que existen en el set original, pero no con los que se pasan como argumento. — intersection() retorna un sef con los elementos comunes que existen en ambos. — isdisjoint() retorna un valor booleano true si dos sets no contienen ningin elemento comin. — iseubset () retorna un valor booleano true si el set pasado como argumento contiene al set original. — issuperset () retorna un valor booleano true si el set original contiene al set pasado como argumento. — symmetric_difference() retorna un set con los elementos que existen en uno u otro de ellos, pero no en ambos. — union () retorna un set con la unién de este y de los que se le pasan como parametros. Vy getattrd) © Uso getattr(object, name[, default]) © Descripcién Retorna el valor del atributo indicado en name del objeto object. Admite un argumento default que contenga el valor retornado si el atributo no existe. F globals() © Uso globals() © Descripcién Retorna un diccionario con la actual tabla de simbolos globales. V hasattr0, © Uso hasattr (object, name) 190 PYTHON. PASO A PASO RAMA © RAMA Apéndice |, FUNCIONES ¥ CLASES NATIVAS 191 © Descripcién 7 input) Retorna un valor true si la cadena pasada en el argumento name es el nombre de un atributo perteneciente al objeto object y valse si no los. © Uso input ( [prompt] } © Descripcién 7 hash0) Muestra el texto que se le pasa como argumento (si lo hay) y espera una entrada del teclado. Esta entrada consistiré en todo lo que teclee © Uso cl usuario hasta que pulse la tecla ENTER (sin contar la propia tecla hash (object) ° ENTER). © Deseripeién ; EL intérprete espera que la entrada sca en lenguaje Python Retorna un entero con el valor hash de un objeto, si es que lo tiene. Se sintécticamente valido, y trataré de evaluarla (si est entre comillas, suele usar para comparaciones rapidas entre claves de diccionarios. Jo considerard una cadena; si es un texto sin comillas, buscaré una Tguales valores numéricos siempre ‘tienen el. mismo hash, incluso’ st variable de ese nombre; si es un néimero, lo interpretaré como tal; si son tipos distintos (como 1 y 1.0). es una sentencia, tratard de ejecutarla, etc.). Retorna el resultado de evaluar la expresién. 7 help, Es equivalente a eval (raw_input (prompt) ). © Uso El uso de esta funcién es bastante limitado y, normalmente, la funcién help ( {object} raw_dnput () es mas adecuada, © Descripcién Invoca al sistema de ayuda de Python. 7 class int() Si se llama sin el argumento se iniciara en modo interactivo. Si se le © Uso pasa una cadena como argumento buscar ese concepto y, si es posible, the (eo) mostrar un texto con informacién. Esta funcién puede usarse en un feeGe, Baaeetey script, pero esta principalmente concebida para su uso interactivo. © Descripcién 7 hex() Clase para los ntimeros enteros. © Uso © Métodos hex (30) — bit_length () retornael mimero de bits necesarios para representar el mimero. © Descripcién Convierte un mimero entero en una cadena conteniendo ese mismo mimero en formato hexadecimal. V isinstance() © Uso Vv idQ isinstance (object, classinfo) © Uso © Descripcién ta(onject) Retorna un valor True si el objeto pasado como argumento es una © Descripeién instancia de la clase indicada o de una subclase de esta. Retorna el identificador (id) del objeto (cl nombre interno por el que se referencia a ese objeto) que se pasa como pardmetro. Consiste en V issubclass() un entero 0 entero largo que es tinico para ese objeto. Si, por ejemplo, « be dos variables referencian a un mismo objeto, tendrén el mismo identificador issubclass(class, classinfo) 192 PYTHON. PASO A PASO RAMA © Descripcién Retorna un valor true si la clase pasada como primer argumento es una instancia de la clase indicada en el segundo o de una subclase de esta. T iter © Uso iter(o[, sentinel]) © Descripcién Acepta un iterable como argumento y retorna un iterador. 7 lenQ) © Uso len() © Descripcién Retorna la longitud de una secuencia o coleccién. Se define “longitud” como el nimero de elementos de esa secuencia (cadenas, tuplas, listas, rangos o bytes) 0 coleccién (diccionarios, sets, 0 frozensets). M class list() © Uso List ([iterable]) © Descripcién Retorna una lista con los elementos de iterabie. © Métodos — append (elemento) agrega un nuevo elemento al final de la lista. — count (elemento) retoma el mimero de veces que aparece el elemento indicado en la lista. — extend (secuencia) afiade los elementos de la secuencia indicada (por ejemplo, otra lista o tupla) a la lista. — index (elemento) retorna el indice de la primera aparicién en la lista del elemento indicado. Se genera un error valuezrror si el elemento no se encuentra. — insert (posicién, elemento) inserta el objeto en la posicién de Ja lista indicada. — pop (elemento) elimina y retorna el elemento de la lista indicado. Sino se indica ninguno, usa el ditimo de la lista. Apéndice |, FUNCIONES Y CLASES NATIVAS 193, — remove (elemento) elimina el elemento indicado de la lista. — reverse () invierte el orden de los elementos de la lista. — sort () ordena los elementos de la lista. Si se le pasa una funcion como parametro, usara esa funcién como criterio de ordenacién. F locals() © Uso locals () © Descripcién Actualiza y retorna un diccionario con Ia actual tabla de simbolos locales. M class long() © Uso tong (x-0) tong (x, base-i0) © Descripcién Clase para los mimeros enteros largos. © Métodos — bit_length () retornael mimero de bits necesarios para representar el mimero. Vy mapo © Uso map (function, iterable, ...) © Descripcién Aplica la funcién que se le pasa como argumento a cada elemento del iterable, y retorna una lista con los resultados. Si se le pasa mas de un iterable, la funcién procesara simulténeamente un elemento de cada uno de los iterables. Para ello, ldgicamente, debe admitir tantos argumentos como iterables se le pasen a map (). Si un iterable tiene menos elementos, se asumir que el resto contiene el valor None. Si la funcién retorna mas de un resultado, map () retornard una lista de tuplas con tantos elementos por tupla como resultados retorne la funcién. 194 PYTHON. PASO A PASO RAMA #1 /usr/bin/python # -*- coding: utf-8 -*- def filtra(a, b): return a +b salida = map(filtra, [1,2,3], [10,20,30]) print salida Salida del programa: [11, 22, 33] 7 max() © Uso max(iterable[, key]) max(argl, arg2, *args[, key]) © Descripcién Retorna el mayor elemento de entre los de un iterable o de entre los provistos en dos o mas argumentos. En el argumento opcional key se puede indicar una fancién que actiie como comparador. ¥ memoryviewQ, © Uso memoryview (obj) © Descripcién Retorna un objeto memoryview (un buffer de memoria de solo lectura de la API de C) a partir del argumento. Vy ming @ Uso min(iterable[, key]) min(argl, arg2, *argsi, key]) © Descripcién Retorna el menor elemento de entre los de un iterable o de entre los provistos en dos o mas argumentos. En el argumento opcional key se puede indicar una fancién que actiie como comparador. Apéndice |, FUNCIONES Y CLASES NATIVAS 195, 7 next) e Uso next (iterator [, default]) © Descripcién © Uso abs (x) © Descripcién Retorna el siguiente elemento del iterador que se le pasa como pardmetro. El argumento opcional default contiene lo que se retornaré por defecto si el iterador no contiene mas elementos. F class object) © Uso object () © Descripcién Clase base para todos los objetos New Style. Si uno de estos objetos no tiene superclase, su superclase es object. F oct) e Uso oct (x) © Deseripcién Convierte un entero en una cadena con su valor en base octal. V opend) © Uso open (name, mode[, buffering] ]) © Descripcién Abre el fichero cuyo nombre se le pasa como pardmetro y retorna un objeto £i1e, El argumento mode debe ser una cadena que indique el modo en el que se abre el fichero: "r": lectura (valor por defecto) . "w" escritura (si el archivo ya existe se sobrescribiré su contenido) . "a" escritura (si el archivo ya existe se afiadira el nuevo contenido al final de este). 196 PYTHON. PASO A PASO RAMA Por defecto, el fichero se abriré en modo texto, adaptando los retornos de carro a la plataforma. Para abrir el fichero en modo binario se debe agregar “b” al cardcter del modo, con lo que quedarian respectivamente asi: “rb”, “wb” y “ab”. Para abrir el archivo como lectura y escritura se debe usar “r+” en modo texto 0 “r+b” en modo binario. El argumento opcional buffering especifica cl tamaiio de buffer del fichero deseado: 0 significa sin buffer, 1 significa linea a linea y otros valores indican le tamaiio del buffer en bytes. Fy ord, © Uso ord(c) © Descripcién Recibe como pardmetro una cadena conteniendo un solo caracter, y retorna un entero con el cédigo Unicode correspondiente a ese caracter. Si el cardcter es de 8 bits retornaré su valor ASCTI. Es la funcién inversa de chr () para caracteres de 8 bits y de unichr () para caracteres Unicode. Vy pow0 © Uso pow(x, y[, z]) © Descripcién Retorna el mimero contenido en el primer argumento elevado al del segundo argumento. Si hay un tercero, se usa como médulo. V range() © Uso range (stop) vange(start, stop[, step]) © Descripcién Retorna una lista de mimeros en progresién aritmética. © RAMA Apéndice |, FUNCIONES Y CLASES NATIVAS 197 Acepta de uno a tres néimeros enteros como argumentos. Si solo se le pasa un argumento, este ser el mimero en el que se detiene la progresi6n (sin incluir el propio mimero) y la progresién comenzara desde cero. Si se pasan dos enteros como argumentos, el primero de ellos sera el nimero desde el que se empieza y el segundo el final (de nuevo, no incluido). Si se le pasa un tercer argumento, este seré la cifra en la que se incrementa el valor de cada elemento de la progresién. Su principal uso es como contador en bucles. V raw_input() e Uso raw_input ( [prompt] } © Descripcién Muestra el texto que se le pasa como argumento (si lo hay) y espera una entrada del teclado. Esta entrada consistiré en todo lo que teclee cl usuario hasta que pulse la tecla ENTER (sin contar la propia tecla ENTER). Retorna una cadena con el texto introducido. #1/usr/bin/python # -*- coding: utf-a -*- nombre = raw_input("Escribe tu nombre: ") print "Hola " + nombre Salida del programa: Escribe tu nombre: Bruce Wayne Hola Bruce Wayne reduce() © Uso veduce(function, iterable{, initializer]) © Descripcién Aplica la funcién pasada como primer argumento (que debe aceptar dos pardmetros y retornar un resultado) acumulativamente de izquierda a derecha a los elementos del iterable, hasta que quede un solo resultado, que ser el que se retorne. Es decir, primero se aplica a los dos primeros elementos, luego al resultado de esto y al segundo elemento, después al resultado de esta segunda reduccién y al tercero, etc. Si en el iterable hay un solo elemento, reduce () retornard ese elemento. 198 PYTHON. PASO A PASO RAMA Si existe el argumento initializer, este se usaré como primer elemento. #1 /usr/bin/python # -*- coding: utf-8 -*- def concatena(a, b): return a+ "-" 4b salida = reduce (concatena, ["1","2","3","4","5"]) print salida Salida del programa: 1-2-3-4-5 7 reload() © Uso reload (module) © Descripcién Vuelve a cargar el médulo que se pasa como argumento, que debe haber sido importado previamente. Vy repro) © Uso repr (object) © Descripcién Retorna una cadena con la representacién textual del objeto pasado como argumento (cl mismo efecto se produce usando las comillas invertidas “"”). #1 /usr/bin/python # -*- coding: utf-8 -*- lista = ["uno", "dos"] print “lista~ print repr (lista) print repr (raw_input) Apéndice |, FUNCIONES Y CLASES NATIVAS 199 Salida del programa: ['uno', ‘dos'] ['uno', ‘dos'] V reversed() © Uso reversed (seq) © Descripcién Retorna un iterador con el contenido de la secuencia seq invertida. seq debe ser un objeto con un método _reversed_() (como, por ejemplo, una lista). #1/usr/bin/python # -*- coding: utf-8 -*- lista = ["uno", "dos", "tres"] for x in reversed(lista): print x Salida del programa: tres dos 7 roundQ © Uso xound(number[, ndigits)) © Descripcién Retorna un mimero en coma flotante con el mimero pasado como argumento, con la parte decimal redondeada al mimero de digitos indicado en naigits (0 sin decimales, por defecto).. 7 class set() © Uso set ([iterable]) © Descripcién Retorna un objeto set. 200 PYTHON. PASO A PASO RAMA © Métodos add() afiade un elemento al set. *clear () elimina todos los elementos del set. copy () retorna una copia del set. difference () retorna un set con los elementos que existen en el set original, pero no con los que se pasan como argumento. difference update() actualiza el set con los elementos que existan en él pero no con los que se pasan como argumento. discard (...) elimina un elemento del set. Sino existe, no ocurre nada. intersection() retorna un sef con los elementos comunes que existen en ambos. intersection update() actualiza el set con los elementos comunes que existen en ambos. isdisjoint () retorna un valor booleano true si dos sets no contienen ningiin elemento comin. iseubset () retornaun valor booleano True si el set pasado como argumento contiene al set original. iseuperset () retorna un valor booleano true si el set original contiene al set pasado como argumento. pop() elimina y retorna un elemento del set. En caso de que no exista, se genera un KeyError. remove () elimina un elemento del set. En caso de que no exista, se genera un KeyBrrox. symmetric difference () retorna un sef con los elementos que existen en uno u otro de ellos, pero no en ambos. symmetric difference update() actualiza el set con los elementos que existen en uno u otro de ellos, pero no en ambos. union() retorna un sef con la unin de este y de los que se le pasan como parametros. update () actualiza el set con la unién de este y de los que se le pasan como pardmetros. M setattr() e Uso setattr(object, name, value) Apéndice | FUNCIONES ¥ CLASES NATIVAS 201 © Descripcién Asigna al atributo de nombre name del objeto objet el valor value. Si el atributo no existe, se crea con ese nombre. Es la funcién opuesta a delattr(). V class slice() © Uso slice (stop) slice(start, stop[, step]) © Descripcién Retorna un objeto slice, que extiende la funcionalidad de los slices de secuencias. F sorted) e Uso sorted(iterable[, cmp[, key[, reverse]]]) Descripcién Retorna una lista ordenada con los elementos del iterable que se pasa como argumento. En el argumento opcional cmp se puede asignar una funcién que sirva para el ordenamiento. Esta funcién debe aceptar dos argumentos (los elementos a comparar) y retornar un valor positivo, cero 0 negativo si el primer elemento es mayor, igual 0 menor que el segundo, respectivamente. El argumento key puede usarse para asignar una funcién que acepte un solo argumento y que retorne la clave de comparacién para cada elemento. reverse es un valor booleano. Si es true los elementos serin devueltos en orden inverso. Y staticmethodQ, e Uso staticmethod (function) © Descripcién Retorna un método estatico para la funcién function. Un método estitico es el que no recibe un primer pardmetro por defecto, ni de clase (class) ni de objeto (self). 202 PYTHON. PASO A PASO RAMA @staticmethod se usa como un decorador. #1 /usx/bin/python # -*- coding: utf-8 -*- class MiClase: @staticmethod def metodo (entrada) : return entrada objeto = MiClase print objeto.metodo(5) Salida del programa: 5 De este modo, el método no recibe se1£ como primer parémetro. 7 class str) Uso str(object='') Descripcién Retorna una cadena con una representacién del objeto que se le pasa como argumento. Métodos — capitalize () retorna una copia de la cadena con la primera letra, en mayiscula. — center (ancho{, careacter_de_espacio]) retorna la cadena ampliada al ancho especificado en ancho; el espacio sobrante se rellena por ambos lados con espacios en blanco o, si se proporciona, con el caracter indicado en el atributo opcional careacter_de_ espacio. — count (subcadena[, inicio[, fin]]) retorna un entero con el néimero de veces que aparece subcadena contenido en la cadena. Opcionalmente, se puede afiadir el principio y el fin del segmento de la cadena donde se buscaré (usando el mismo formato que para el slicing). — decode ({codificacién[,errores]]) decodifica la cadena usando la codificacién indicada en el primer argumento. Si no se Apéndice |, FUNCIONES Y CLASES NATIVAS 203, indica ninguna, se usard la codificacién por defecto del sistema. El segundo puede ser usado para indicar el tipo de mensajes de error que se quiere recibir cuando un cardcter no es reconocido, y puede ser uno de los siguientes: e “strict” devolvera un valuekrror. Es la opcién por defecto si no se indica nada. © “ignore” ignorard el cardcter y continuara por el siguiente. © “replace” usard un cardcter de reemplazo. La (muy extensa) lista de codificaciones posibles puede encontrarse en esta direccién: _hitps://docs.python.org/2/library/codecs. himltistandard-encodings. encode ({codificacién[,errores]]) decodifica la cadena usando la codificacién indicada en el primer argumento. Si no se indica ninguna, se usard la codificacién por defecto del sistema. El segundo puede ser usado para indicar el tipo de mensajes de error que se quiere recibir cuando un cardcter no es reconocido, y puede ser uno de los siguientes: @ “strict” devolvera un UnicodeEncodezrror. Es la opcién por defecto si no se indica nada. © “ignore” ignorard el cardcter y continuara por el siguiente. © “replace” usard un cardcter de reemplazo. La (muy extensa) lista de codificaciones posibles puede encontrarse en esta direccién: _hitps://docs.python.org/2/library/codecs. himltistandard-encodings. endswith(final[, inicio[, £in]]) retorna un valor booleano true si la cadena termina con la cadena indicada en final (que también puede ser una tupla de cadenas) y un valor raise si no lo hace. Se puede indicar opcionalmente el inicio y fin de la posicién en la que se comparara. expandtabs ({tamafio)) retorna una copia de la cadena donde todos los caracteres “tabulador” han sido convertidos a series de espacios. El atributo opcional indica el nimero de espacios que se usardn; si no se provee, se usar 8 como valor por defecto. find(subcadena[, inicio[, fin]]) retorna el indice de la primera aparicién en la cadena de la subcadena indicada. Opcionalmente, se puede afiadir el principio y el fin del segmento 204 PYTHON. PASO A PASO RAMA de la cadena donde se buscaré (usando el mismo formato que para el slicing). Si la subcadena no aparece, retorna -1. format (targs, **kwargs) retorna una version formateada de la cadena, usando sustituciones, identificadas por Haves ({}), que se asignen en los argumentos args y kwargs. index(subcadena[, inicio[, fin]]) tiene el mismo uso que find (), pero retorna un error Valuesrror si la subcadena no es encontrada. isalnum() retorna un valor booleano True si todos los caracteres de la cadena son alfabéticos. En caso contrario, retorna Falso. isdigit () retorna un valor booleano true si todos los caracteres de la cadena son numéricos. En caso contrario, retorna Falso. islower() retorna un valor booleano True si todos los caracteres de la cadena estan en minisculas. En caso contrario, retorna Falso. isspace () retorna un valor booleano true si todos los caracteres de la cadena son espacios en blanco. En caso contrario, retoma Falso. istitle() retorna un valor booleano True si las palabras de la cadena estan escritas en mimisculas, salvo la primera letra de cada palabra, que debe estar en maytisculas. En caso contrario, retorna Falso. isupper () retorna un valor booleano True si todos los caracteres de la cadena estan en maytsculas. En caso contrario, retorna Falso. join(iterable) usa la cadena como separador para concatenar las cadenas contenidas en el iterable que se le proporciona. ljust (ancho[, careacter_de_espacio]) retorna la cadena ampliada al ancho especificado en ancho. El espacio sobrante se rellena por la derecha con espacios en blanco o, si se proporciona, con el cardcter indicado en el atributo opcional careacter_de_ espacio. lower () retorna una copia de la cadena en mintsculas. Apéndice |, FUNCIONES Y CLASES NATIVAS 205, istrip() retorna una copia de la cadena a la que se le han eliminado todos los espacios en blanco del principio. Si se le aporta otro cardcter como argumento, eliminard ese en lugar del espacio. partition (separador) busca la cadena indicada en separador y retorna una tupla con la forma (“principio de la cadena”, “separador”, “fin de la cadena”). Si el separador aparece mas de una vez, se cortard por la primera empezando por la izquierda. Si no encuentra el separador, tanto el principio como el final que retorna seran cadenas vacfas (pero si retornard el separador). replace (original, reemplazo[, contador]) retorna una copia de la cadena con todas las apariciones de la cadena aportada en original reemplazadas por la cadena reemplazo. Admite un tercer argumento opcional contador que indica el mimero maximo de sustituciones que se haran. xfind(subcadena[, inicio[, fin]]) actia igual que find, pero empieza a buscar por la derecha. xindex(subcadena[, inicio[, fin]]) tiene cl mismo uso que y£ind (), pero retorna un error ValueBrror si la subcadena no es encontrada. xjust(ancho[, careacter_de_espacio]) retorna la cadena ampliada al ancho especificado en ancho; el espacio sobrante se rellena por la izquierda con espacios en blanco o, si se proporciona, con el cardcter indicado en el atributo opcional careacter_de_ espacio. xpartition(separador) busca la cadena indicada en separador y retorna una tupla con la forma (“principio de la cadena”, “separador”, “fin de la cadena”). Si el separador aparece mas de una vez, se cortard por la primera empezando por la derecha. Si no encuentra el separador, tanto el principio como el final que retorna serdn cadenas vacias (pero si retornard el separador). replit({separador [,méximo]]) retorna una lista de cadenas, producto de dividir de derecha a izquierda la cadena usando como delimitador los espacios en blanco o, si se le proporciona, usando la cadena contenida en separador. Opcionalmente, se le puede dar el nimero maximo de elementos que tendré esa lista. retrip() retorma una copia de la cadena a la que se le han eliminado todos los espacios en blanco del final. Si se le aporta otro cardcter como argumento, climinard ese en lugar del espacio. 208 PYTHON. PASO A PASO RAMA — split ([separador [,méximo]]) retorna una lista de cadenas, producto de dividir de izquierda a derecha la cadena usando como delimitador los espacios en blanco 0, si se le proporciona, usando la cadena contenida en separador. Opcionalmente, se le puede dar el nimero maximo de elementos que tendré esa lista. — splitiines() retorna una lista con cada una de las lineas contenidas en la cadena. — startswith(inicio[, iniciol[, fin]]) retorna un valor booleano true si la cadena comienza con la cadena indicada en inicio (que también puede ser una tupla de cadenas) y un valor False sino lo hace. Se puede indicar opcionalmente el inicio y fin de la posicién en la que se comparara. — strip () retorna una copia de la cadena a la que se le han climinado todos los espacios en blanco del principio. Si se le aporta otro cardcter como argumento, climinard ese en lugar del espacio. = swapcase () retorna una copia de la cadena con todas las mimisculas en mayisculas y viceversa. — title () retorna una copia de la cadena en mimisculas, pero con la primera letra de cada palabra en mayaisculas. — translate(tabla [,borrar]) devuelve una copia de la cadena con los caracteres mapeados a través de la tabla de traduccién asignada en tabia. Los caracteres que se incluyan en el argumento opcional borrar serin eliminados. Se puede asignar el valor None a la tabla en el primer argumento para simplemente borrar los caracteres deseados con el segundo argumento. La tabla de traduccién debe ser una cadena de 256 caracteres, y puede ser creada mediante la funcién maketrans () del médulo string. — upper () retorna una copia de la cadena en maytsculas. = zfill(ancho) amplia una cadena numérica hasta el tamafio indicado en ancho, y rellena el espacio restante con ceros a la izquierda. Vy sumo e Uso sum(iterable[, start]) © Descripcién ‘Suma los elementos del iterable pasado como pardmetro, comenzando por la posicién indicada en el argumento opcional start (0 por el primer elemento, si este no existe). © RAMA Apéndice |, FUNCIONES Y CLASES NATIVAS 207 7 tupled Uso tuple ([iterable] ) Descripcién Retorna una tupla a partir de los elementos del iterable que se le pasa como pardmetro y en ese mismo orden. Métodos — count (valor) cuenta el mimero de apariciones en la tupla del valor que se le pasa como parametro. — index (elemento) retorna el indice de la primera aparicién en la tupla del elemento indicado. Genera un error valueError sino se encuentra. M class type) Uso type (object) type(name, bases, dict) Deseripcion Con un argumento, retorna el tipo de un objeto. Con tres argumentos, retorna un objeto de nuevo tipo. V unichr() Uso unichr (i) Descripcién Retorna una cadena Unicode conteniendo el cardcter cuyo cédigo corresponde al entero que se le pasa como argumento. Es la funcién inversa de ora(). 7 unicode, Uso unicode (object="') unicode (object [, encoding[, errors]]) Descripcién Retorna una cadena Unicode a partir del objeto pasado como atributo (normalmente una cadena). Métodos Los mismos que los de las cadenas (ver str). 208 PYTHON. PASO A PASO RAMA Vy vars() e Uso vars ([object]) © Descripcién Retoma el atributo __dict__ de un médulo, clase, instancia u otro objeto que tenga un atributo dict. Ese atributo contiene el diccionario de nombres del objeto, clase, etc. F xrange() e Uso xrange (stop) xrange(start, stop[, step]) © Descripcién Esta funcién actia igual que range (), pero retorna un objeto range (un generador) en lugar de una lista de mimeros en progresién aritmética. ‘Acepta de uno a tres néimeros enteros como argumentos. Si solo se le pasa un argumento, este seri el nimero en el que se detiene la progresién (sin incluir el propio mimero) y la progresién comenzara desde cero. Si se pasan dos enteros como argumentos, el primero de ellos sera el ntimero desde el que se empieza y el segundo el final (de nuevo, no inchuido). Si se le pasa un tercer argumento, este la cantidad en el que se incrementa el valor de cada elemento de la progresién. #1 /usr/bin/python # -*- coding: utf-8 -*- for i in xrange(2, 20, 2): print 4 Salida del programa: 12 14 16 18 Apéndice |, FUNCIONES Y CLASES NATIVAS 209 y zip) e Uso zip({iterable, ..]) (x) © Descripcién Acepta uno o mis iterables como atributos, y retorna una lista formada por tuplas que contienen los elementos de esos iterables. La primera tupla contendré el primer elemento de cada iterable, la segunda el segundo, ete. La longitud de la lista final ser la del iterable mas corto. SYNAPS PREMIUM Apéndice l| MODULOS DE LA LIBRERIA ESTANDAR DE PYTHON Este es un listado alfabético de los médulos contenidos en la libreria estindar de Python. Hay una lista actualizada y detallada (aunque en inglés) en la pagina oficial de Python: hitps://docs.python.org/2/library/. Para obtener informacién detallada sobre cada uno de los médulos y las funciones, variables y objetos que contienen, se puede usar el programa pydoc (que también es un médulo de la librerfa estandar de Python), escribiendo la orden pydoc nombre_del_médulo en la linea de comandos. y builtin: médulo con las funciones nativas, se importa autométicamente. __¢uture_: permite importar funcionalidades del lenguaje que no estan presentes en la versién actual. _main_: el espacio de nombres del médulo principal. Y winreg (Windows): herramientas para manipular el registro de ‘Windows. 212 PYTHON. PASO A PASO RAMA i i | NWUUUU Ut NX A abe: clases base abstractas. aifc: herramientas para manipular archivos de audio AIFF y AIFC. anydbn: interfaz genérica para DBM-style database modules. argparse: herramientas para la linea de comandos y argumentos. array: optimiza arrays de tipos numéricos. ast: manipulacién de Abstract Syntax Tree (Arboles de sintaxis). asynchat: soporte para protocolos asincronos. asyncore: clase base para manipular sockets asincronos. atexit: register and execute cleanup functions. audicop: herramientas para manipular audio raw. B base64: RFC 3548: Base16, Base32, Base64 Data Encodings. BaseHTTPserver: servidor HTTP basico (clase base para SimpleHTTPServer y CGIHTTPServer). bab: debugger. binaseii: herramientas para convertir entre varios formatos ASCII y binarios. binhex: herramientas para manipular archivos en formato binhex4. bisect: algoritmos de biseccién para busqueda binaria. bed : interfaz para bases de datos Berkeley DB. bz2: interfaz para rutinas de compresién y descompresién compatibles con bzip2. Cc calendar: herramientas para trabajar con calendarios. Yogi: herramientas para usar la interfaz CGI con Python. ceturrrserver: controlador para servidores HTTP que pueden ejecutar scripts CGI. egith: trazador configurable para scripts CGI. © RAMA ‘Apéndice ll. MODULOS DE LA LIBRERIA ESTANDAR DE PYTHON 213 bi NU UY chunk: médulo para leer bloques de datos IFF. cmath: funciones matematicas para mimeros complejos. cond: herramientas para intérpretes de comandos. code: utilidades para implementar REPL. codecs: codificar y decodificar datos y flujos. codeop: compilar cédigo Python. collections: tipos de datos de alto rendimiento. colorsys: conversién entre RGB y otros sistemas de color. compileal1: herramientas para compilar en bytecode todos los archivos Python en un drbol de directorios. configParser: intérprete de archivos de configuracién. context1ib: utilidades para la sentencia with con contexto. Cookie: soporte para cookies. cookie1b: clases para la manipulacién automitica de cookies. copy: operaciones de copia. copy_reg: operaciones con copias serializadas con pikle. ePickle: version rapida de pickle, pero no subclasable. cProfile: interfaz para el profiler ‘Isprof. crypt (Unix): funcién crypt() de UNIX, para encriptar contrasefias. eStringr! ersién de StringIO, rapida pero no subclasable. csv: manejo de archivos CSV. ctypes: manejo de tipos de datos de C en Python. curses (Unix): creacién de interfaces giaficas en modo texto. D datetime: fecha y hora. dbhash: interfaz para BSD database library. dbm (Unix): interfaz con dbm. decimal: implementacién de la General Decimal Arithmetic Specification. 21d PYTHON. PASO A PASO RAMA NWUUUY i ee i YN WUUUUUY xX aiff1ib: calcular diferencias entre objetos. dis: desensamblador para bytecode Python. distutils: soporte para construir médulos Python. doctest: test de cédigo en docstrings. DocXMLRPCServer: servidor XML-RPC autodocumentado. dumbabn: interfaz DBM portable. dummy_thread: reemplazo para el médulo thread. dummy threading: reemplazo para el médulo threading. E email: manejo de correo electrénico. encodings: codificaciones de cadenas. ensurepip: manejo de pip en instalaciones o entornos virtuales. errno: errores estdndar. exceptions: excepciones estindar. F fent1 (Unix): lamadas al sistema fenti() ¢ ioctl(). £ilecmp: compara ficheros. £ileinput: bucle de lectura en torno a la entrada estindar o lineas de archivos. findertools (Mac): eventos del finder de Apple. fnmatch: expresiones regulares estilo UNIX. formatter: formatos de salida. fpect1 (unix): manejo del control de excepciones sobre operaciones en coma fiotante. fractions: numeros racionales Y stp1ib: cliente FTP. functools: funciones de alto nivel sobre objetos. © RAMA ‘Apéndice li. MODULOS DE LA LIBRERIA ESTANDAR DE PYTHON 215 NW UUU UY VW UVC Ut VNU UUUUY G ge: interfaz con el colector de basura. gabm (Unix) : uso del dbm de GNU. gensuitemodule (Mac): crea paquetes a partir de diccionarios OSA. getopt: intérprete de linea de comandos. getpass: acceso a claves y usuarios. gettext: internacionalizacién de idiomas. glob: expansién de rutas de ficheros estilo UNIX. grp (Unix): group database. gzip: compresién y descompresién con gzip. H haghlib: algoritmos hash. heapg: colas de prioridades. hmac: implementacién de HMAC. hotshot: profiler para login. htmlentitydefs: definiciones de entidades HTML. intérprete de HTML y XHTML. httplib: cliente HTTP y HTTPS. HTMLParse: sliente IMAP4. imaplil imghdr: determina el tipo de imagen de un archivo. imp: acceso a import. import1ib: manejador para__import_. inspect: extrac informacién de objetos Python. io: entradas/salidas. itertools: funciones para iteradores. 216 PYTHON. PASO A PASO RAMA VN WUUUUUY NWN NWUUUY json: formato JSON. ‘K keyword: manejo de claves en listas, tuplas, etc. 14b2t03: cambiar scripts de Python 2 a Python 3. Linecache: acceso a lineas de archivos. Locale: servicios de internacionalizacién. Logging: logging para aplicaciones. M macpath: manipulaci6n de rutas de ficheros en Mac OS 9. mailbox: mailboxes. mailcap: archivos Mailcap. marshal: serializacién de objetos Python. math: funciones matemiticas. mimetypes: tipos MIME. MiniAgFrame (ac): soporte para servidor Open Scripting Architecture (OSA) (“Apple Events”). nmap: interfaz para archivos proyectados en memoria en UNIX y Windows. modulefinder: buscador de médulos. msilib (Windows): creacién de archivos CAB y de Microsoft Installer. msvert (Windows): manejo del runtime de MS VC-++. multiprocessing: manejo de hilos basado en procesos. © RAMA ‘Apéndice li. MODULOS DE LA LIBRERIA ESTANDAR DE PYTHON 217 NWN VW UU EEE eee uuuuy — netrc: archivos .netre. nis (Unix): interfaz con la biblioteca NIS de Sun. antp1ib: cliente NNTP. numbers: Clases abstractas numéricas. oO operator: operadores. os: interfaz con el sistema operative. ossaudiodev (Linux, FreeBSD) : acceso a dispositivos de audio OSS. P parser: parsetrees para cédigo Python. pab: debugger de Python para intérpretes interactivos. pickle: protocolo para la serializacién de objetos. pickletools: herramientas para el protocolo pickle. pipes (Unix): interfaz para “tuberias” UNIX. pkgutil: utilidades para import. platform: identificacién de plataforma. plist1ib: manejo de archivos plist de Mac OS X. pop1ib: cliente POP3. posix (Unix): llamadas POSIX. pprint: impresién de datos. profile: profiler de Python. pstats: estadisticas para el profiler. pty (Linux): manejo de seudoterminales. pwd (Unix): Password Database. py_compile: compilador de cédigo Python a bytecode. 218 PYTHON. PASO A PASO RAMA 7 pyclbr: inspeccién de clases y métodos de un médulo. ¥ pydoc: documentacién y ayuda de Python. Q F queue: gestion de colas. ¥ quopri: encode and decode files using the MIME quoted-printable encoding. R random: mimeros seudoaleatorios. re: expresiones regulares. readline (Unix): soporte para la biblioteca GNU readline. resource (Unix): informacién de uso de recursos en procesos. rlcompleter: intérprete de autocompletado. robotpars : intérprete de archivos robots.txt. i | runpy: manejo de médulos sin importarlos. Ss sched: event scheduler de propésito general. Scrolledrext (tk): widget para barra de scroll vertical. select: manejo simultanco de entradas/salidas nviltiples. shelve: objetos persistentes. shlex: andlisis léxico simple para interfaces de comandos. shutil: operaciones sobre archivos. signal: sefiales para eventos asincronos. simpleHTTPserver: servidor bisico HTTP. simplexunRPcserver: servidor basico XML-RPC. site: rutas de médulos y otras configuraciones del sistema. servidor SMTP. smtpd: i smtp1ib: cliente SMTP. © RAMA ‘Apéndice ll. MODULOS DE LA LIBRERIA ESTANDAR DE PYTHON 219 NW U UU EE Ee ee ueuuuur NX VNU UUUUY sndhdr: determina el tipo de un archivo de sonido. socket: interfaz de red de bajo nivel. Socket Server: framework para servidores de red. spwd (Unix): Shadow Password Database. sqlites: acceso a bases de datos SQLite 3.x. se1: TLS/SSL manejo de sockets. stat: utilidades para interpretar los resultados de os.stat(), os.Istat() y os.fstat(). string: operaciones sobre cadenas. stringro: lectura y escritura de cadenas como si se tratase de archivos. stringprep: preparacién de cadenas segin el RFC 3453. struct: intérprete de cadenas como datos binarios. subprocess: administrador de subprocesos. sunau: interfaz con el formato de sonido AU. symbol: constantes que representan nodos internos en un Arbol sintactico. symtable: interfaz con las tablas de simbolos del compilador. sys: pardmetros y funciones del sistema. sysconfig: informacién de configuracién de Python. syslog (Unix): interfaz con el syslog de UNIX. T tabnanny: herramienta para detectar problemas con los espacios en blanco en los archivos fuente de Python en un Arbol de directorios. tarfile: manejo de archivos TAR. telnet1ib: cliente telnet, tempfile: genera archivos y directorios temporales. termios (Unix): control de terminales tty estilo POSIX. tes : paquetes de test para Python. textwrap! ajuste de textos. thread: crea multiples hebras en un intérprete. 220 PYTHON. PASO A PASO RAMA i i i i i i | NX threading: interfaz de manejo de hebras. time: uso y conversién de datos y formatos de tiempo. timeit: cronometra la ejecucién de fragmentos de cédigo. Tix: widgets de Tk para Tkinter. Thinter: interfaz con Tel/Tk para interfaces graficas. token: constantes que representan nodos en un arbol sintactico. tokenize: analizador Iéxico de cédigo Python. trace: traza la ejecucién de sentencias Python. traceback: manipulacién de stack traces. tek: widgets con Tk. tty (Unix): funciones de acceso a terminal. turtle: grificos de tortuga (estilo LOGO) para Tk. types: nombres para los tipos predefinidos. U unicodedata: acceso a la base de datos Unicode Database. unittest: framework para test unitarios. url1ib: librerfa para abrir recursos de red por su URL. url1ib2: nueva libreria para abrir recursos de red por su URL. urlparse: manejo de URL. UserDict: clase envoltorio para diccionarios. Userbist: clase envoltorio para listas. Userstring: clase envoltorio para cadenas. uu: codificar y decodificar en formato uwencode. uuid: objetos UUID (Universally Unique Identifiers). WwW warnings: manejo de mensajes de alerta. wave: interfaz para el formato de sonido WAV. © RAMA ‘Apéndice ll. MODULOS DE LA LIBRERIA ESTANDAR DE PYTHON 221 YWWUUY weakref: soporte para weak references y weak dictionaries. webbrowser: controlador para navegadores web. whichab: detectar qué médulo creé una base de datos. winsound (Windows) : sistema de sonido de Windows. wagiref: herramientas para WSGI. x xdrlib: codificar y decodificar XDR. xm1: médulos de procesado de XML. xmlrpelib: cliente de XML-RPC. Z W zipfile: lectura y escritura de archivos ZIP, Vy zipimport: oporte para importar médulos desde archivos ZIP. z1ib: rutinas de bajo nivel compatibles con gzip. SYNAPS PREMIUM Apéndice III DIFERENCIAS ENTRE PYTHON 2 Y PYTHON 3 Como ya dijimos, Python 3 es bdsicamente igual que Python 2. Las diferencias entre ellos son pequefias, pero suficientes para que ambos lenguajes sean incompatibles. Este es un listado (si bien no exhaustivo) de las principales diferencias que tiene Python 3 con Python 2. V Python 3 resuelve muchos de los problemas de codificacién de texto, y ahora todas las cadenas son Unicode por defecto. VW Todas las clases de Python 3 son New Style. No existen las clases Old Siyle. V En Python 3, print es una funcién y no una sentencia del lenguaje, por lo que debe usarse con paréntesis del modo print ("CADENA") en lugar de print "CADENA", V Funciones como filter (),map() 0 z4p(), que en Python 2 retornaban una lista, en Python 3 retornan un iterable. ¥ Como vimos en el capitulo sobre operadores, el resultado de una division de enteros en Python 2 es otro entero (perdiendo la parte decimal, si es que la hay); sin embargo, en Python 3 el resultado sera siempre un mimero en coma fiotante, por lo que no se pierde la parte decimal. Esta es una de las fuentes de incompatibilidad més “peligrosas”, porque el intérprete no 224 PYTHON. PASO A PASO RAMA dard ningiin aviso 0 mensaje de error (salvo que haya incompatibilidad de tipos en el uso posterior del resultado), mientras que el comportamiento de nuestro programa puede ser muy distinto del esperado. V La funci6n xcange() desaparece de Python 3, y hay que usar range () en su lugar. V La funcién raw input () no existe en Python 3 y es reemplazada por la funcién input (), que adopta el comportamiento que esta tenia (ahora retorna siempre un objeto string). V El método next () desaparece. V Python 3 retoma un typezrror al intentar comparar tipos no ordenables. Portar cédigo de Python 2 a Python 3 En general, la mayor parte del cédigo de Python 2 es perfectamente funcional en Python 3 sin necesidad de modificaciones. De todos modos, modificar un programa en Python 2 para que sea compatible con Python 3 puede ser desde una tarea trivial en la que no haya que modificar apenas nada (sobre todo cuando hay involucradas pocas lineas de cddigo), hasta un arduo trabajo casi imposible. La prueba son todos esos médulos que o no han sido portados atin o lo han sido parcialmente. La librerfa estindar de Python incluye el programa 2t03: htips://docs. python.org/2/library/2t03.himl, que automatiza muchos de los cambios necesarios para migrar cédigo a Python 3. La web oficial de Python tiene una guia con algunos consejos para aquellos que deseen portar cédigo de Python 2 a Python 3 en hitps://docs.python.org/3/howto/ pyporting.himl. También hay disponible una pagina wiki de ayuda en hitps://wiki. python.org/moin/PortingP ythonToPy3k. SYNAPS PREMIUM Simbolos it_, 123, 124, 125, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 139, 140, 141 __initpy__, 152, 153, 154 —_main_, 136, 137, 150, 166, 211 —name_, 150, 166 A abs(), 179 all(), 179 any(), 180 Apple, 21, 214, 216 Archivo, 15, 39, 42, 43, 46, 47, 145, 146, 147, 152, 153, 154, 157, 167, 172, 173, 174, 175, 176, 177, 178, 182, 187, 195, 196, 215, 219 Argumento, 107, 108, 109, 124, 138, 159, 166, 167, 171, 172, 173, 176, 177, 178, 179, 182, 183, 184, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 205, 206, 207, 208 ASC, 46, 60, 90, 181, 196, 212 Atributo, 123, 125, 127, 131, 133, 136, 137, 138, 139, 140, 141, 144, 166, 167, 184, 185, 189, INDICE ALFABETICO 190, 201, 202, 203, 204, 205, 207, 208, 209 B Base binaria, 56 Base decimal, 55 Base hexadecimal, 16, 56, 63, 164, 188 Base octal, 55, 63 basestring(), 180 BDLF, 21 binQ, 180 bool(), 57, 61, 180 Break, 51, 95, 96 BSD, 21, 213 Bucle, 90, 94, 95, 96, 98, 99, 100, 102, 104, 115, 117, 121, 169, 174, 175, 197 bytearray(), 180 c C, 17, 98, 161, 194, 213 Cadenas, 52, 57, 58, 66, 67, 68, 77, 81, 82, 86, 88, 98, 100, 114, 161, 165, 175, 178, 181, 192, 203, 204, 205, 206, 207, 214, 219, 220, 223 callable), 181 226 PYTHON. PASO A PASO chr(), 181, 196 Clase, 123, 124, 125, 127, 128, 129, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 141, 144, 160, 171, 181, 191, 192, 201, 208, 212 Clase base, 127, 129 Clase derivada, 127 Clase hija, 127, 130 Clase madre, 127, 130, 131 classmethod(), 181 cmp(), 182 Cédigo fuente, 17, 22, 29, 182 Comentarios, 45 compile(), 182, 186 complex(), 55, 183 Condicional, 91 Continue, 51, 96 CSV, 178, 213 D Decorador, 118, 119, 181, 202 def, 13, 51, 105, 106, 107, 108, 109, 10, 111, 112, 113, 114, 116, 117, 118, 119, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 139, 140, 141, 146, 148, 149, 150, 153, 166, 170, 182, 183, 187, 194, 198, 202 delattr(), 183, 201 Diccionario, 82, 83, 84, 85, 86, 87, 88, 98, 99, 110, 184, 185, 186, 187, 189, 190, 192, 193, 208, 215, 220 dict(), 83, 184 dirQ), 185 doestrings, 113, 121 E Editor, 12, 25, 30, 31, 32, 33, 34, 35, 36, 37, 39, 46 lif, 51, 93, 94, 108, 114, 119, 132, 134 RAMA else, 51, 93, 94, 95, 103, 108, 114, 119, 126, 132, 134, 187 enumerate(), 185 Espacios de nombres, 23, 120, 125, 148, 150, 151, 152, 154, 155, 185, 186, 187, 211 eval(), 182, 183, 186 except, 51, 101, 102, 103, 140 execfile(), 187 Exponencial, 164 F False, 57, 66, 67, 69, 70, 71, 91, 180, 181, 187, 190, 203, 206 file(), 32, 171, 172, 175, 183, 187, 195 filter(), 187, 223 float(), 54, 60, 61, 62, 66, 188 for, 21, 51, 53, 98, 99, 100, 104, 110, 111, 115, 116, 117, 163, 167, 175, 176, 199, 208 format(), 188 Formato, 13, 29, 30, 35, 46, 55, 136, 161, 182, 190, 202, 204, 212, 219, 220 from, 51, 150, 151, 152, 154 frozenset(), 188 Fuertemente tipado, 53 Funciones, 19, 22, 33, 34, 61, 63, 105, 107, 110, 111, 112, 113, 114, 115, 117, 118, 119, 120, 121, 123, 124, 141, 145, 146, 147, 148, 150, 151, 152, 153, 154, 156, 160, 170, 171, 179, 181, 188, 211, 219 G Generador 115, 116, 175, 185, 208 getattr(), 189 globals(), 189 GUI, 168 Guido van Rossum, 21 © RAMA H hasattr(), 189 hashQ), 190 helpQ, 190 hex(), 63, 188, 190 I id, 85, 190 IDE, 30 IDLE, 31, 32, 33, 36, 37, 42, 46, 169 if, 51, 91, 92, 93, 94, 95, 96, 101, 102, 103, 108, 114, 119, 126, 132, 134, 166, 187 import, 51, 145, 146, 147, 149, 150, 151, 152, 154, 155, 157, 167, 169, 170, 215, 217 inmutables, 79, 82, 83, 86, 87, 88 input(), 13, 43, 166, 167, 191, 224 Instalador, 25, 27, 28 int(), 53, 54, 60, 61, 62, 66, 138, 140, 180, 191 isinstance(), 191 issubclass(), 191 iter(), 192 Tterable, 115, 179, 180, 184, 187, 188, 192, 193, 194, 197, 199, 201, 204, 206, 207, 209, 223 Iteradores, 98, 115, 215 L lambda, 51, 119, 120, 121 len(), 133, 192 Linea de 6rdenes, 12, 29, 40, 42, 43, 114, 156, 158, 165, 167, 168, 211, 212, 215 Linux, 12, 21, 22, 29, 30, 31, 39, 40, 42, 157, 217 list), 76, 192 Lista, 24, 27, 28, 37, 71, 74, 75, 76, 71, 78, 79, 81, 82, 86, 87, 98, 110, 115, 116, 117, 141, 142, 143, 147, inDIce ALFABETICO 227 156, 162, 167, 172, 173, 174, 175, 176, 177, 184, 185, 186, 187, 192, 193, 196, 198, 199, 201, 203, 205, 206, 208, 209, 211, 223 Literales, 49, 51 locals(), 193 long), 54, 60, 61, 62, 193 M Mag, 12, 28, 30, 31, 39, 40, 42, 214, 215, 216, 217 map(), 193, 223 max(), 194 memoryview(), 194 Método, 99, 100, 104, 123, 124, 125, 127, 128, 129, 130, 131, 132, 133, 134, 135, 138, 140, 141, 144, 169, 165, 171, 172, 173, 174, 175, 176, 177, 178, 179, 181, 189, 199, 201, 202, 218, 224 min(), 194 Médulo, 53, 64, 65, 74, 114, 136, 141, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 165, 166, 167, 168, 178, 179, 196, 198, 206, 208, 211, 214, 216, 218, 221, 224 Mutables, 79, 85, 86, 88 N next(), 195, 224 None, 57, 60, 184, 193, 206 oO object(), 195 oct(), 63, 195 open(), 171, 172, 187, 195 Operadores, 63, 64, 65, 66, 67, 68, 69, 70, 71, 74, 88, 133, 134, 135, 217, 223 ord(), 196, 207 228 PYTHON. PASO A PASO P Palabras reservadas, 51 Paquetes, 22, 28, 29, 31, 152, 153, 154, 155, 156, 157, 158, 159, 160 Paradigma, 18, 19, 119, 144 Pardmetro, 42, 107, 109, 110, 114, 118, 124, 133, 142, 181, 182, 185, 187, 190, 193, 195, 196, 201, 202, 206, 207 pass, 51, 92, 128 Perl, 18, 98 pip, 158, 159, 214 pow), 196 print, 13, 39, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 55, 56, 57, 59, 60, 61, 62, 63, 66, 67, 68, 70, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 89, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 124, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 146, 147, 148, 149, 150, 151, 152, 154, 155, 157, 162, 163, 164, 165, 166, 167, 173, 174, 175, 182, 183, 186, 187, 194, 197, 198, 199, 202, 208, 223 Propiedades, 123, 125, 128 pydoc, 114, 141, 156, 160, 179, 211, 218 Python Package Index, 157, 158, 159 R range(), 116, 196, 208, 224 raw_input(), 43, 197 reduce(), 197 reload, 198 repr(), 198 RAMA reversed(), 199 round(), 199 Ss script, 24, 39, 40, 42, 43, 46, 95, 165, 166, 167, 168, 170, 172, 190 Secuencias, 71, 75, 81, 82, 201 self, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 181, 201, 202 set, 84, 85, 138, 139, 140, 185, 189, 199, 200 set(), 84, 85, 199 setattr(), 184, 200 shebang, 42, 43, 44, 46 shell, 31, 32, 33, 34, 36 slice, 201 slicing, 78, 81, 82, 202, 204 Software libre, 12, 22, 25, 30 sorted(), 201 staticmethod(), 201 str(), 53, 57, 60, 61, 62, 63, 97, 105, 109, 114, 126, 127, 128, 129, 130, 131, 132, 133, 138, 141, 167, 180, 202, 207 subclase, 127, 180, 191, 192 sum(), 206 Superclase, 127, 180, 195 sys.argy, 167 T Tkinter, 156, 168, 169, 170, 171, 178, 220, True, 57, 61, 66, 67, 69, 70, 71,81, 91, 180, 181, 184, 187, 188, 189, 190, 191, 192, 200, 201, 203, 204, 206 ‘try, 51, 100, 101, 102, 103, 104, 140 Tupla, 79, 80, 81, 107, 142, 185, 187, 188, 192, 193, 203, 205, 206, 207, 209 © RAMA tuple(), 207 type(), 60, 105, 207 U unichr(), 181, 196, 207 unicode(), 207 UNICODE, 46, 60, 223 UNIX, 31, 39, 42, 43, 159, 167, 214 UTE, 46,47 Vv Variables, 34, 35, 49, 50, 51, 75, 85, 88, 91, 100, 105, 111, 112, 113, 121, 123, 125, 146, 147, 148, 149, 150, 153, 154, 156, 185, 190, 211 inDIce ALFABETICO 229 vars(), 208 Ventana, 31, 32, 43, 46, 169, 170, 171 Ww while, 51, 94, 95, 96, 97, 104, 109, 114, 116, 117 Widget, 168, 169, 170, 171 Windows, 12, 21, 25, 27, 28, 30, 31, 39, 40, 42, 43, 172, 196, 211, 216, 221 Z Zen, 23 zip(), 209, 223 — PYTHON Paso a paso En los ultimos afios, el lenguaje de programacién Python aparece siempre en los primeros puestos de todos los rankings de popularidad, siendo uno de los mas usados. Python es un lenguaje multiplataforma comodo, flexible, potente y facilmente extensible, ideal tanto para programar pequefias soluciones como para acometer grandes proyectos informaticos. Estas caracteristicas han hecho que se emplee tanto en informatica doméstica como en ambientes cientificos o entornos empresariales. Ademas, su clara orientaci6n a la limpieza del cédigo y la legibilidad hacen de Python una de las mejores opciones (probablemente la mejor) para aquellos que buscan comenzar su aprendizaje en la programacién: al contrario que otros lenguajes de programacién mas abstrusos, Python es agradable de leer y aprender. En este libro se explica como programar usando el lenguaje Python paso a paso y desde cero. En su redacci6n se ha puesto especial atencion en la sencillez y la facilidad de comprensi6n, usando ejemplos practicos y funcionales y buscando una curva de aprendizaje lo mas suave posible, sin asumir que el lector tiene conocimientos de programacion previos. De forma gradual y sencilla, se muestran todos los aspectos de la programaci6n en Python, desde la instalacién del propio intérprete o las estructuras y elementos del lenguaje, hasta el acceso a ficheros, el uso y programacion de funciones y bibliotecas, la programacién orientada a objetos o la construccién de interfaces graficos. 0 a 9"7e84gole4e1 aP Ra-Ma’*

También podría gustarte