0% encontró este documento útil (0 votos)
32 vistas

Python Informaticos

Cargado por

Blanca Alonso
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
32 vistas

Python Informaticos

Cargado por

Blanca Alonso
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
Está en la página 1/ 256
Python para informaticos Explorando la informacién Version 2.7.2 Charles Severance Copyright © 2009- Charles Severance Traduecin al espatol por Femando Tardio Historial de impresiones: Agosto 2015: Primera edicién en espaiol de Python para Informaticos: Explorando la informacion May 2018: Permiso editorial gracia a Sue Blumenberg. Octubre 2013: Revisién completa a los capitulos 13 y 14 para cambiar a ISON y usar Auth. Afiadido capitulo nuevo en Visualizacién Septiembre 2013: Libro publicado en Amazon CreateSpace Enero 2010: Libro publicado usando la méquina Espresso Book de la Universidad de Michigan Diciembre 2009: Revisién completa de los capitulos 2-10 de Think Python: How to Think Like a Computer Scientist y escritura de los capitulos 1 y 11-15, para produ- cir Python for Informatics: Exploring the Information Junio 2008: Revisién completa, titulo cambiado por Think Python: How to Think Like a Computer Scientist Agosto 2007: Revisién completa, titulo cambiado por How to Think Like a (Python) Pro- ‘grammer. Abril 2002: Primera edicién de How to Think Like a Computer Scientist, Este trabajo esti licenciado bajo una licencia Creative Common Attribution- NonCommercial-ShareAlike 3.0 Unported. Esta licencia esté disponible en creativeconmons.org/Licenses/by-ne~sa/3.0/. Puedes consultar qué es lo que el autor considera usos comerciales y no comerciales de este material, as{ como las exenciones de licencia en el apéndice titulado Detalles del Copyright Las fuentes ISHSX de Ia versién Think Python: How 10 Think Like a Computer Scientist de este libro estin disponibles en http: //wwe.thinkpython con. Prefacio Python para informaticos: Remezclando un libro libre Entre los académicos, siempre se ha dicho que se debe “publicar © morit”, Por ello, es bastante habitual que siempre quieran crear algo desde cero, para que sea su propia obra original. Este libro es un experimento que no empieza desde cero, sino que “remezcla” el libro titulado Think Python: How to Think Like a Computer Scientist (Piensa en Python: Cémo pensar como un informético), escrito por Allen B. Downey, Jeff Elkner, y otros. En diciembre de 2009, yo estaba prepardndome para enseftar SIS02 - Networked Programming (Programacién en red) en la Universidad de Michigan por quinto semestre consecutivo y decidi que ya era hora de escribir un libro de texto sobre Python que se centrase en el manejo de datos en vez de hacerlo en explicar algorit- ‘mos y abstracciones. Mi objetivo en $1502 es ensefiar a la gente habilidades para el manejo cotidiano de datos usando Python. Pocos de mis estudiantes planean de~ dicarse de forma profesional a la programacién informética, La mayorfa esperan egar a ser bibliotecarios, administradores, abogados, bidlogos, economistas, etc., ‘aunque quieren aplicar con eficacia la tecnologia en sus respectivos campos. Como no consegufa encontrar un libro orientado a datos en Python adecuado para mii curso, me propuse escribirlo yo mismo. Por suerte, en una reunién de la fa cultad tres semanas antes de que empezara con el nuevo libro (que tenia planeado esctibir desde cero durante las vacaciones), el Dr, Atul Prakash me mostré el libro Think Python (Piensa en Python) que él habia usado para su curso de Python ese semestre. Se trata de un texto sobre ciencias de la computacién bien escrito, con explicaciones breves y directas y fécil de entender. La estructura general del libro se ha cambiado para conseguir llegar a los proble ‘mas de andlisis de datos lo antes posible, y contiene, casi desde el principio, una setie de ejemplos y ejercicios con cédigo, dedicados al anélisis de datos. Los capitulos 2-10 son similares a los del libro Think Python, pero en ellos hay cambios importantes. Los ejemplos y ejercicios dedicados a nimeros han sido reemplazados por otros orientados a datos. Los temas se presentan en el orden adecuado para ir construyendo soluciones de andlisis de datos progresivamente mis sofisticadas. Algunos temas, como try y except, se han adelantado y son Vv Capitulo 0. Prefacio presentados como parte del capitulo de condicionales. Las funciones se tratan muy someramente hasta que se hacen necesarias para manejar programas complejos, en vez de introducirlas en las primeras lecciones como abstraccién. Casi todas las funciones definidas por el usuario han sido eliminadas del cédigo de los ejemplos y ejercicios, excepto en el capitulo 4. La palabra “recursién”” no aparece en todo el libro. En los capitulos 1 y 11-16, todo el material es nuevo, centrado en el uso con problemas del mundo real y en ejemplos sencillos en Python para el andlisis de datos, incluyendo expresiones regulares de baisqueda y andlisis, automatizacién de tareas en el PC, recepcidn de datos a través de la red, rastreo de paginas web en busca de datos, uso de servicios web, andlisis de datos XML y JSON, y creacién y uso de bases de datos mediante el lenguaje de consultas estructurado (SQL). El objetivo final de todos estos cambios es pasar de un enfoque de ciencias de la computacién a uno puramente informatico, incluyendo solamente temas de tecno- logia basica que puedan ser ttiles incluso si los alumnos al final eligen no conver- tirse en programadores profesionales. Los estudiantes que encuentren este libro interesante y quieran adentrarse mas en el tema deberfan echar un vistazo al libro de Allen B, Downey Think Python. Gra- cias a que hay muchos temas comunes en ambos libros, los estudiantes adquirirén rapidamente habilidades en las éreas adicionales de la programacién técnica y ra zonamiento algoritmico que se tratan en Think Python, ¥ dado que ambos libros tienen un estilo similar de escritura, deberfan ser capaces de moverse répidamente por Think Python con un minimo de esfuerzo. Como propietario de los derechos de Think Python, Allen me ha dado permiso para cambiar la licencia del material de su libro que aparece también en éste, desde la GNU Free Documentation License (Licencia de Documentacién Libre) a la més reciente Creative Commons Attribution ~ Share Alike license. Esto sigue tun cambio general en las licencias de documentacién abierta, que estén pasando del GFDL al CC-BY-SA (como, por ejemplo, Wikipedia). BI uso de la licencia CC-BY-SA mantiene la tradicional fortaleza del copyleft a la vez que hace que sea mas sencillo para los autores nuevos el reutilizar este material como les resulte ms provechoso. Creo que este libro sirve como ejemplo de por qué los materiales libres son tan importantes para el futuro de la educacién, y quiero agradecer a Allen B. Downey y al servicio de publicaciones de la Universidad de Cambridge por su amplitud de mmiras al permitir que este libro esté disponible con unos derechos de reproduccién abiertos, Espero que estén satisfechos con el resultado de mis esfuerzos y deseo que td como lector también estés satisfecho con nuestros esfuerzos colectivos. Quiero agradecer a Allen B. Downey y a Lauren Cowles su ayuda, paciencia y orientacién en la gestién y resolucién del tema de los derechos de autor en toro a este libro. Excepto, por supuesto,en esta inca Charles Severance www.dr-chuck.com Ann Arbor, MI, USA 9 de Septiembre de 2013 Charles Severance es un profesor clinico asociado en la School of Information de la Universidad de Michigan. vi Capitulo 0. Prefacio Indice general Prefacio 1. Por qué deberfa aprender a escribir programas? 1a. 12, 13. 14, 15. 16. 17. Creatividad y motivacién Arquitectura hardware del PC Comprendiendo la programacién Palabras y frases Conversando con Python Terminologfa: intérprete y compilador Escribir un programa {Qué es un programa? Los bloques de construccién de los programas {Qué es posible que vaya mal? El viaje de aprendizaje Glosario Ejercicios ‘Variables, expresiones y sentencias 24 22. 2.3. 24, Valores y tipos Variables Nombres de variables y palabras claves Sentencias u u 13 19 19 20 2 22 vu 25. 26. 20. 28. 29. 2.10. 241 2.12. 2.13. 214. 25. Operadores y operandos Expresiones Orden de las operaciones Operador médulo Operaciones con cadenas Peticién de informacién al usuario ‘Comentarios Eleccisn de nombres de variables mneménicos Depuracién Glosario Ejercicios Ejecucién condicional 3.1. Expresiones booleanas 3.2. Operadores légicos 3.3, Ejecucién condicional 3.4, Ejecucién alternativa 3.5. Condicionales encadenados 3.6. _Condicionales anidados 3.7. Captura de excepciones usando try y except 3.8, Evaluacién en cortocircuito de expresiones ligicas 3.9. Depuracién 3.10, Glosario 3.11, Ejercicios, Funciones 4.1, Llamadas a funciones 4.2. Funciones internas 4.3. Funciones de conversién de tipos 4.4, Niimeros aleatorios 29 29 30 33 33 4 34 35 36 37 40 4 2 4B 4s 45 45 47 fuudice general 6. 4.5. Funciones matematicas 4.6. Afiadiendo funciones nuevas 41. Definicién y usos 4.8. Flujo de ejecucién 4.9. Parimetros y argumentos.. 4.10, Funciones productivas y funciones estériles 4.11. {Por qué funciones? 4.12. Depuracién 4.13. Glosario . 4.14, Ejercicios Iteracién 5.1. Actualizacién de variables 5.2. Lasentencia while 5.3. Bucles infinitos 5.4, “Bucles infinitos” y break 5.5. Finalizar iteraciones con cont inue 5.6. Bucles definidos usando for 5.1. Disefios de bucles 5.8. Depuracién 5.9. Glosario . 5.10, Ejercicios Cadenas 6.1. Una cadena es una secuencia 6.2. Obtener Ia longitud de una cadena mediante Len 6.3. Recorrido a través de una cadena con un bucle 6.4, — Rebanado de cadenas (slicing) 6.5. Las cadenas son inmutables 6.6. Bucles y contadores 48. 49 50 si 52. 53 34 58 55 56 59 59 59 60 61 62 62 63 66 6 67 69 9 70 70 n 2D RQ 8. 6.7. Eloperador in 6.8. Comparacién de cadenas 69. Métodos de cadenas . . 6.10, Andlisis de cadenas 6.11, Operador de formato 6.12, Depuracién 6.13. Glosario 6.14, Ejercicios Ficheros 7.1. Persistencia 7.2. Apertura de ficheros 7.3. Ficheros de texto y lineas 7.4, Lectura de ficheros 7.5. Bisqueda dentro de un fichero 7.6, Permitiendo al usuario elegir el nombre del fichero 7.1. Usode try, except, y open 78, Escritura en ficheros 7.9. Depuracién 7.10. Glosario TAL, Ejetcicios . Listas 8.1, Unallista es una secuencia 8.2. Las listas son mutables 83. Recorrer una lista 84, Operaciones con listas 8.5. Rebanado de listas. . 8.6, Métodos de listas 87. Borrado de elementos general 81 81 82 83 84 85 87 88 89 90 a1 a1 93 93 93 94 95 95 96 7 fuudice general 10. 88, 89. 8.10. AL 8.12, 8.13. 8.14. 8.15. 8.16. Listas y funciones Listas y cadenas Anélisis de Iineas Objetos y valores Alias . Listas como argumentos Depuracién Glosario Ejercicios Diccionarios 9A. 92. 93. 9.4. 95. 96. 97. Tuplas 10.1 10.2. 10.3. 10.4. 10.5. 106. 107. 10.8, 109. Diccionario como conjunto de contadores, Diccionarios y archivos Bucles y diccionarios Procesado avanzado de texto Depuracién Glosario . Ejercicios Las tuplas son inmutables Asignacién de tuplas. Diccionarios y tuplas Asignacién milkiple con diccionarios Las palabras mas comunes Uso de tuplas como claves en diccionarios Secuencias: cadenas, listas, y tuplas—jDios mio! Depuracién 10.10. Glosario 10.11 Ejercicios xI 7 98 99, 100 lol 102 103 107 107 109 ut 112 113 us 116 47 18 xt 11. Expresiones regulares 1. 112, 7. 118, ls. Equivalencia de caracteres en expresiones regulares Extraccién de datos usando expresiones regulares ‘Combinar biisqueda y extraccién Escapado de caracteres. . Resumen Seccién extra para usuarios de Unix Depuracién Glosario Fjercicios 12, Programas en red 13, A 12.2. 123, 124, 125. 126. 127. 128, 129, Protocolo de Transporte de Hipertexto - HTTP El Navegador Web Ms Sencillo del Mundo Recepcién de una imagen mediante HTTP Recepcin de paginas web con urllib . Analisis de HTML y rascado de la web . Anilisis de HTML mediante expresiones regulares Anilisis de HTML mediante BeautifulSoup Lectura de archivos binarios mediante urllib.. Glosario 12.10. Fjercicios Uso de servicios web BA 13.2. 133, 134, eXtensible Markup Language - XML Anilisis de XML. Desplazamiento a través de los nodos JavaScript Object Notation - JSON Anélisis de JSON . Interfaces de programacién de aplicaciones general 133 134 . 135 138 - 141 142 143 161 161 162 163 - 163 - 164 165 fuudice general 4, 15. 16. 13.7. Servicio web de geocodificacién de Google 13.8. Seguridad y uso de APIs 13.9. Glosario 13.10, Ejercicios Bases de datos y SQL. 14.1. (Qué es una base de datos? 14.2, Conceptos sobre bases de datos 14.3. Add-on de Firefox para gestién de SQLite 14.4. Creacidn de una tabla en una base de datos 14.5. Resumen de Lenguaje de Consultas Estructurado 14.6. Rastreo en Twitter usando una base de datos 14.7. Modelado de datos basico 14.8. Programacién con miiltiples tablas 14.9. Tres tipos de claves 14.10. Uso de ISON para recuperar datos 14.11, Resumen . 14.12. Depuracién 14.13. Glosario Visualizacién de datos 15.1. Construccién de un mapa de Google a partir de datos geocodifi- cados 15.2. Visualizacién de redes ¢ interconexiones 15.3. Visualizacién de datos de correo Automatizacién de tareas habituales en tu PC 16.1. Nombres de archivo y rutas 16.2. Ejemplo: Limpieza de un directorio de fotos 16.3. Argumentos de linea de comandos 16.4. Pipes (tuberias) 16.5. Glosario . 16.6. Ejercicios xi 167 169 173 1B 175 17s, 176 176 . 177 180 Isl 187 189 194 19s 197 197 198 201 201 203 206 213 213 214 220 221 222 223 xy A. Programando con Python en Windows B. Programando con Python en Macintosh C. Colaboraciones D. Detalles del Copyright general 225 27 29 233 Capitulo 1 éPor qué deberia aprender a escribir programas? Escribir programas (o programar) es una actividad muy gratificante y creativa, Puedes escribir programas por muchas razones, desde por mantenerte activo hasta por resolver un problema dificil de andlisis de datos o por divertirte ayudando a otros a resolver cualquier cuestién, Este libro asume que todo el mundo necesita saber programar, ¥ que una vez que sepas programar ya encontrards tii mismo la forma de aplicar tus recién adquiridas habilidades. En nuestra vida diaria estamos rodeados de computadores, que van desde portati- les hasta teléfonos méviles. Podemos pensar en esos equipos como nuestros “asis- tentes personales”, que son capaces de ocuparse de muchas cosas por nosotros. EI hardware en los equipos que usamos a diario esté creado esencialmente para hacernos continuamente la pregunta, “{ Qué quieres que haga a continuacién?” (Featiagoa >) (abbas >) (Gdastagoe >) (Gentine) (Gaminneisne (Seminar) (“iQustagss >) (“aQabbagoa >) (iQubbago a Los programadores afiaden un sistema operativo y un conjunto de aplicaciones al hardware y asf tenemos al final un Asistente Personal Digital que resulta bastante util y capaz. de ayudarnos a hacer muchas cosas diferentes. Nuestros equipos son répidos, tienen gran cantidad de memoria y podrian resul- tarnos muy iitiles si tan solo conociéramos el lenguaje que debemos hablar para explicar a la maquina qué queremos que “haga a continuaci6n”. Si conociéramos ese lenguaje, podriamos pedirle al equipo que realizase tareas repetitivas para no- sotros. Precisamente, el tipo de cosas que los computadores hacen mejor suelen ser el tipo de cosas que los humanos encuentran aburridas y soporiferas. 2 Capitulo 1, :Por qué deberfa aprender a escribir programas? Por ejemplo, echa un vistazo a los primeros tres parrafos de este capitulo y dime cual es Ia palabra més utilizada y cudmtas veces se ha usado. A pesar de que seas capaz de leer y entender las palabras en unos pocos segundos, contatlas resulta casi doloroso, porque no es el tipo de problema que las mentes humanas fueron disefiadas para resolver. Para un PC! es justo al revés: leer y comprender texto de un troz0 de papel es algo complicado para él, pero contar las palabras y decir cuintas veces se ha usado la mas frecuente le resulta muy sencillo: python words.ey Introduzea fichero:words. txt Nuestro “asistente de anélisis de informacién personal” nos diré répidamente que la palabra “que” se ha usado ocho veces en los primeros tres parrafos de este capitulo. El hecho de que los PCs sean buenos en cosas en las que los humanos no lo son es el motivo por el que necesitas ser capaz de hablar “lenguaje de PC”. Una vez que hayas aprendido ese nuevo idioma, podris delegar tareas mundanas en tu socio (la méquina), dejando més tiempo libre para ti, de modo que puedas dedicarte a aquellas otras cosas para las que ests mas capacitado. Seras el encargado de poner la creatividad, intuicién e inventiva a esa asociacién. 1.1. Creatividad y motivacion Aunque este libro no esté dirigido a programadores profesionales, la programa- cin profesional puede ser un trabajo muy gratificante, tanto a nivel financiero como personal. Construir programas tiles, elegantes e ingeniosos para que otros Jos usen es una actividad muy creativa, Tu equipo o Asistente Personal Digital (PDA?), normalmente contienen muchos programas diferentes de multitud de gru- pos de programadores distintos, cada uno de los cuales compite por tu atencidn interés. Esos programadores intentan hacerlo lo mejor que saben para adaptarse a tus necesidades y a la vez proporcionarte una buena experiencia como usuario. En algunos casos, cuando eliges un programa determinado, los programadores son directamente recompensados por tu eleccién, Si pensamos en los programas como salida creativa para grupos de programadores, tal vez la figura siguiente sea una versién més apropiada de tu PDA’ >) (Blige) (a (ee) Bee ) ( ore \ ‘es deci, computadora u ordenador personal (Nota del tad.) Digital Assistant (Notadel trad.) Arquitectura hardware del PC Por ahora, nuestra motivacién principal no es conseguir dinero o gustar mas a los usuarios finales, sino ser nosotros mismos mas productivos en el manejo de los datos y la informacién que encontraremos en nuestras vidas. Al principio, seras tanto programador como usuario final de tus propios programas. Cuando ganes en habilidad como programador y la programacién se haga més creativa para ti, tus objetivos podrén cambiar hacia el desarrollo de programas para otto 1.2. Arquitectura hardware del PC Antes de que empecemos a aprender el idioma que deberemos hablar para dar instrucciones a los PCs para desarrollar software, necesitamos aprender un poco acerca de cémo estén construidos los equipos. Si desmontaras tu PC o teléfono mévil y mirases dentro, encontrarias los siguientes componentes: Teathasea 7 of postion Conia Entrada Procesamiento Red Salida Menara , Peicpal Memoria Las definiciones de alto-nivel de esos componentes son las siguientes: = La Unidad Central de Procesamiento (0 CPU) es la parte del equipo que esta construida para estar obsesionada con el “;qué es lo siguiente?” Si tu PC esta clasificado como de 3.0 Gigahercios, significa que la CPU va a pre- guntar “{Qué hago a continuacién?” tres mil millones de veces por segundo. Tendrds que aprender a hablarle muy répido para mantener el ritmo de esa cpu. = La Memoria Principal se usa para almacenar la informacién que la CPU necesitard enseguida. La memoria principal es casi tan rapida como la CPU Pero la informacién almacenada en la memoria principal desaparece cuando el equipo se apaga. = La Memoria Secundaria se utiliza también para almacenar informacién, pero es mucho més lenta que la memoria principal. La ventaja de la memo- ria secundaria es que puede mantener almacenada la informacién incluso Capitul iPor qué deberfa aprender a escribir programas? cuando el equipo esta apagado. Ejemplos de memoria secundaria son las uunidades de disco 0 las memorias flash (que se encuentran normalmente en liépices USB y reproductores de musica portatiles) = Los Dispositivos de Entrada y Salida son simplemente Ia pantalla, tecla- do, ratén, mictéfono, altavoces, touchpad, etc. Son todos los aparatos que utilizamos para interactuar con el PC, = En la actualidad, la mayoria de los PCs disponen también de una Conexién de Red para recibir informacién a través de la red. Podemos pensar en la red como en un sitio muy lento donde se almacenan y recuperan datos, que puede no estar siempre “activado”. Asi que en cierto sentido, la red es una forma lenta y a veces poco fiable de Memoria Secundaria. ‘Aunque la mayorfa de los detalles de cémo funcionan estos componentes es mejor dejarlos para los que construyen los equipos, resulta itil tener cierta terminologia con la que referimos a todas estas partes distintas mientras escribimos nuestros programas. Como programador, tu trabajo es usar y orquestar cada uno de esos recursos para resolver el problema que necesites solucionar y analizar los datos que obtengas de la solucién. Como programador, principalmente estards “hablando” con la CPU y dicigndole qué debe hacer a continuacién, A veces le dirés a la CPU que use la ‘memoria principal, la memoria secundaria o los dispositivos de entrada/salida, Sofware Unidad OF Dispositves Cental Enda Procesamiento Rea Salida Memoria , Memoria femora va Seeundaria n> ‘Ti debes ser la persona que conteste a la pregunta de la CPU “;Qué hago a conti- nuacién?”. Pero serfa muy inc6modo encogerse hasta los Smm de altura y meterse dentro de la maquina s6lo para poder pasarle un comando tres mil millones de ve- ces por segundo. Asf que en vez de eso, deberds darle por escrito las instrucciones por adelantado, Llamaremos a esas instrucciones almacenadas un programa, y al acto de escribir las instrucciones y conseguir que sean correctas, programar. Comprendiendo la programacién 1.3. Comprendiendo la programacién Durante el resto de este libro, intentaremos convertirte en una persona hébil en el arte de programar. Al final serés un programador — tal vez no un programador profesional, pero al menos tendrés la capacidad de echar un vistazo a un problema de andlisis de datos/informacién y desarrollar un programa para resolverlo. En cierto sentido, necesitas dos habilidades para ser un programador: = En primer lugar, debes dominar el lenguaje de programacién (Python) - de- bes conocer su vocabulario y su gramética, Debes ser capaz de escribir las palabras en este nuevo lenguaje correctamente y saber cémo construir “fra: ses” bien formadas en este lenguaje. = En segundo lugar, debes “contar una historia”. Al escribir una historia, com- binas palabras y frases para transmitir un concepto al lector. Son necesarios habilidad y arte para construir la historia, y esa habilidad se mejora preci ‘mente escribiendo y obteniendo cierta respuesta. En programacién, nuestro programa es Ia “historia” y el problema que se esté tratando de resolver es el “concepto”. Una vez que aprendas un lenguaje de programacién como Python, encontrards ‘mucho mds sencillo aprender un segundo lenguaje como JavaScript o C++. Cada nuevo lenguaje de programacién tendré un vocabulario y gramética muy diferen- tes, pero la forma de resolver problemas va a ser la misma en todos ellos. Aprenderds el “vocabulario” y “frases” de Python muy répidamente. Te costaré un poco més ser capaz de escribir un programa coherente para resolver un problema nuevo, Se ensefia a programar de forma muy similar a como se enseiia a escri- bir. Se comienza leyendo y explicando programas, después se escriben programas sencillos, y poco a poco se va incrementando su complejidad. En algdn momento “encuentras tu musa” y comienzas a descubrir los patrones por ti mismo, siendo capaz de tomar un problema y escribir un programa para resolverlo. Y una ver. se ha alcanzado ese punto, la programacién se convierte en un proceso muy agradable y creative. Comenzaremos con el vocabulario y estructura de los programas en Python. Ten paciencia sila simplicidad de los ejemplos te recuerdan a cuando empezaste a leer por primera vez. 1.4. Palabras y frases A diferencia de los idiomas humanos, el vocabulario de Python es actualmen- te bastante reducido. Llamamos a ese “vocabulario” las “palabras reservadas”” ‘Son palabras que tienen un significado muy especial para Python. Cuando Python encuentra esas palabras en un programa, tienen un significado y slo uno para Capitul iPor qué deberfa aprender a escribir programas? Python, Mas adelante, cuando escribas programas, compondras tus propias pala- bras, que tendrén significado para ti, lamadas variables. Tendrés una gran libertad para escoger los nombres para tus variables, pero no podras usar ninguna de las palabras reservadas de Python. Cuando se entrena a un perro, se usan palabras especiales como “siéntate”, “quie- to”, y “traelo”, Cuando hablas con un perro y no usas ninguna de las palabras reservadas, s6lo consigues que te mire con cara extrafia hasta que le digas una palabra reservada. Por ejemplo, si le dices: “Me gustaria que hubiera més gente que se dedicase a pasear para mejorar su salud”, Io que la mayorfa de los perros oirian seria: “bla bla bla pasear bla bla bla bla.”. Esto se debe a que “pasear” es una palabra reservada en el idioma del perro. Mucha gente sugeritia que el idioma entre humanos y gatos no tiene palabras reservadas? Las palabras reservadas en el idioma en que los humanos hablan con Python con- tiene las siguientes: del From elif else Eso es todo, y a diferencia de un perro, Python ya esté completamente entrenado. Cuando utilices “try”, Python lo intentard cada vez que se lo digas sin equivocar- set Aprenderemos esas palabras reservadas y cémo usarlas a su debido tiempo, pero por ahora nos centraremos en la equivalencia en Python de “habla” (en el idioma humano-a-perro). Lo bueno de pedirle a Python que hable es que podemos incluso decirle qué debe decir, paséndole un mensaje entre comillas: print *jHol2, mundo! * Y ya hemos escrito nuestra primera frase sintécticamente correcta en Python. La sentencia comienza con la palabra reservada print, seguida por una cadena de texto de nuestra eleccién, encerrada entre comillas simples. 1.5. Conversando con Python Ahora que ya conocemos una palabra y una sentencia simple en Python, debe- mos aprender cémo comenzar una conversacién con Python para probar nuestras nuevas habilidades. ‘+ puede tradcrse como “itentc"(Nota dl tad.) Antes de que puedas conversar con Python, deberds instalar el software de Pyt- hhon en tu equipo, y aprender a ponerlo en marcha. La explicacién sobre emo conseguirlo excede el propésito de este capitulo, asf que te sugiero que constul- tes www pythonlearn.con, donde tengo instrucciones detalladas y capturas de pantallas sobre cémo instalar y poner en marcha Python en sistemas Macintosh y Windows®, En algtin momento, terminards en un terminal o ventana de coman- dos, escribirés python, y cl intérprete de Pyhton comenzari a ejecutarse en modo interactivo, apareciendo algo como lo siguiente: 2¢ 2010, 21:47:48) 4.2.1 (apple ‘ype "help", credits" or "License" for more El prompt o indicador >>> es el modo que tiene el intérprete de Python de pre- guntarte: ";Qué quieres que haga a continuacién?”, Python esta preparado para tener una conversacién contigo. Todo lo que tienes que hacer es hablar el idioma de Python. Imaginemos por ejemplo que no conoces ni siquiera la més simple de las palabras © frases del lenguaje Python. Tal vez. quieras usar la Iinea habitual que siguen los astronautas cuando aterrizan en un planeta remoto y quieren hablar con sus habitantes: >e> Venimes en son de paz, por favor Venimos en son de paz, por favor Ievadnos ante vuestro Lid syntaxe: cori invalid syntare Esto no esté funcionando. A menos que pienses en algo répido, los habitantes del planeta probablemente te clavardn sus lanzas, te ensartarén en un asador, te cocinarén sobre el fuego, y te usarén como cena. Por suerte has comprado una copia de este libro durante el viaje, asf que lo hojeas hasta llegar precisamente a esta pagina y pruebas de nuevo: >>> print "lela, mundo! ola, Esto tiene mejor aspecto, asf que intentas comunicarte un poco mas: >>> print "Ti debes sez el dios 1 fegendaric que vient estado esperdndate dura >>> print Henes estat Andate durante mucko t 1s leyendas dicen que debes 2: dicen que debes e: >>> pra Meestras Ley ar my 5fin los capitulo Gnales del bro también encontraris dos apéndices con instracciones sobre la instalacin de Python en eos sistemas (Not delta.) Capitul iPor qué deberfa aprender a escribir programas? >", Line L print ‘Vanes a ten La conversacién fue bien durante un rato, y entonces, en cuanto cometiste el mini- ‘mo error al usar su lenguaje, Python volvié a apuntarte con las lanzas. En este momento, ya deberfas haberte dado cuenta de que, a pesar de que Python es increfblemente complejo, potente y muy exigente con la sintaxis que debes usar para comunicarte con él, Python no es inteligente. En realidad tan s6lo ests man- teniendo una conversacién contigo mismo, eso si, usando una sintaxis correcta En cierto sentido, cuando usas un programa escrito por otra persona, la conversa- cidn se mantiene entre ti mismo y esos otros programadores, con Python actuando como intermediario. Python es un modo de que los creadores de programas pue- dan expresar cémo ereen que deben desarrollarse las conversaciones. Y dentro de tunos pocos capitulos mas, ti serds uno de esos programadores que usan Python para hablar con los usuarios de sus programas. Antes de terminar nuestra primera conversacién con el intérprete de Python, pro- bablemente debas saber cual es el modo correcto de decir “adios” cuando ests interactuando con los habitantes del Planeta Python: File "cstdin>", Line 1, in ror: nane ‘adios’ is not defined >> Lf you don't mind, I need to leave File "> quit Te habras dado cuenta de que el error es diferente en los primeros dos intentos, a pesar de ser ambos incorrectos. El segundo error es diferente porque if es una palabra reservada, y Python vis la palabra reservada en la frase y crey6 que estabas intentando decirle algo, pero encontré la sintaxis de Ta sentencia incorrecta®. El modo correcto de decir “adios” a Python es introducir quit() en el indicador interactivo >>>. Probablemente te hubiera llevado un buen rato adivinarlo, asf que es posible que el tener un libro a mano esté empezando a resultarte ttl en el segundo intento se eseribié “si no te importa, tengo que marcharme”. Se ha conservado el ‘mensaje en inglés, ya que la palabra que causa el error en ese caso es if si) (Nota del trad.) ‘Terminologia: intérprete y compilador 9 1.6. Terminologia: intérprete y compilador Python es un lenguaje de alto nivel, que intenta ser relativamente sencillo de es- cribir y leer para los humanos y fécil de leer y procesar para los PCs. Hay otros Tenguajes de alto nivel, como Java, C++, PHP, Ruby, Basic, Perl, JavaScript, y mu- chos més. El hardware existente dentro del Ia Unidad Central de Procesamiento (CPU) no comprende ninguno de estos lenguajes de alto nivel. La CPU entiende un lenguaje que se llama eédigo maquina. El cédigo méquina ces muy simple y francamente muy cansado de escribir, porque en él todo esté re~ presentado por ceros y unos: El cédigo méquina superficialmente patece muy sencillo, dado que sélo hay ceros ¥y unos, pero su sintaxis es incluso més complicada y mucho més enrevesada que lade Python. Asi que muy pocos programadores utilizan este lenguaje. En vez de «so, se han construido varios traductores para permitir a los programadores escribir cen lenguajes de alto nivel, como Python o JavaScript, y esos traductores convierten Juego los programas a cédigo méquina para que la CPU pueda ejecutarlos. Dado que el cédigo méquina esté ligado al hardware del equipo, ese eédigo no es portable a través de los diferentes tipos de hardware. Los programas escri tos en lenguajes de alto nivel pueden ser trasladados a diferentes equipos usando ‘un intérprete distinto en cada maquina, o recompilando el cédigo para crear una versién en e6digo maquina del programa para cada nuevo equipo. Estos traductores de lenguajes de programacién se clasifican en dos categorias ‘generales: (1) intérpretes y (2) compiladores. Un intérprete lee el cédigo fuente del programa tal y como lo ha escrito el pro gramador, analiza ese c6digo fuente ¢ interpreta las instrucciones al vuelo, Python es un intérprete, y cuando estamos haciéndolo funcionar de forma interactiva, po- demos escribir una linea de Python (una sentencia), y Python la procesa inmedia~ tamente y queda listo para que podamos escribir otra nueva linea. Algunas de las lineas de Python le indican que lo que queremos es recordar cierto valor para mas tarde, Debemos elegir un nombre para que ese valor sea recordado ¥y podremos usar ese nombre simbdlico para recuperar el valor después. Usamos el término variable para referimos a las etiquetas que utilizamos para manejar esos datos almacenados. >>> print x bo> print y 10 Capitul iPor qué deberfa aprender a escribir programas? En este ejemplo, le pedimos a Python que recuerde el valor seis y use la etiqueta X, para que podemos recuperar ese valor més tarde. Comprobamos que Python ha guardado de verdad el valor usando print, A continuacién le pedimos a Python que recupere x, lo multiplique por siete y coloque el nuevo valor calculado en y. Finalmente, le pedimos a Python que imprima el valor que esté en ese momento eny. Aunque estemos escribiendo estos comandos en Python linea por linea, Python los esta tratando como una secuencia ordenada de sentencias, de modo que las ilt ‘mas sentencias son capaces de recuperar datos creados en las anteriores. Estamos escribiendo nuestro primer pérrafo simple, con cuatro frases en un orden légico y util. EI intérprete ha sido creado para ser capaz de tener una conversacién interacti- va como la que se muestra més arriba. Un compilador, en cambio, necesita que Je entreguen el programa completo en un archivo, y después ejecuta un proceso para traducir el cédigo fuente de alto nivel a cédigo maquina. A continuacién el compilador guarda el cédigo méquina resultante en un archivo para su posterior ejecucién, Si usas un sistema Windows, a menudo esos programas ejecutables en eédigo ‘maquina tienen un sulijo (0 extensién) como “exe” or “dll”, que indican “execu: table (ejecutable)” y “dynamic link library (librerfa de enlace dinémico)” respec- tivamente. En Linux y Macintosh no hay un sufijo que marque de forma énica un archivo como ejecutable Si abrieras un archivo ejecutable en un editor de texto, se mostrarfa algo comple- tamente disparatado ¢ ilegible sree TAA ee erear ead Have" we\xsa"| ewer e-ed" ee" es \x80°D"HA\ xB “eEene No es fécil leer o escribir cédigo méquina, ast que esté bien que tengamos intérpretes y compiladores que nos permitan escribir en lenguajes de alto nivel, como Python o C. En este momento del debate acerca de compiladores ¢ intérpretes, deberias estar pregunténdote algunas cosas sobre el mismo intérprete de Python. ,En qué lengua- je ha sido escrito? ,Ha sido escrito en un lenguaje compilado? Cuando escribimos “python”, ,qué es exactamente lo que ocurre? El intérprete de Python esta escrito en un lenguaje de alto nivel llamado “C”. Pue- des ver el cédigo fuente real del intérprete de Python acudiendo a www.p: y usar ese e6digo como quieras. Asf que el propio Python es también un programa, y esta compilado en cédigo méquina. Cuando instalaste Python en tu Escribir un programa u PC ( el vendedor lo instal6), pusiste una copia del cédigo maquina del programa Python traducido para tu sistema. En Windows, el ejecutable en cédigo méquina nayores sayorpa sayorcan' daa No necesitas ni siquiera saber Python para utilizar este programa, Deberds Ile- gar hasta el capitulo 10 de este libro para comprender del todo las impresionan- tes técnicas que se han usado para crear el programa. Eres el usuario final, s6lo tienes que utilizar el programa y maravillarte de su habilidad y de cuanto esfuer- zo manual te ha ahorrado, Simplemente escribe el cédigo en un archivo lamado words.py y ejectitalo, o descarga el cédigo fuente de itt: //wwe.p com/code/ y harlo funcionar. ythonlearn. Los bloques de construccién de los program: 13 Este es un buen ejemplo de cémo Python y su lenguaje estén actuando como inter- ‘mediarios entre ti (el usuario final) y yo (el programador). Python es para nosotros ‘un modo de intercambiar secuencias de instrucciones dtiles (es decir, programas) cen un lenguaje comtin que puede ser usado por cualquiera que instale Python en su equipo. As{ que ninguno de nosotros estamos hablando a Python, sino que estamos comunicndonos mutuamente a través de Python. 1.9. Los bloques de construccién de los programas En los préximos capitulos, aprendetemos mas acerca del vocabulario, estructura de las frases, estructura de los parrafos, y estructura de las historias de Python Aprenderemos sobre las potentes capacidades de Python y cémo usar esas capaci- dades juntas para crear programas titles. Hay ciertos modelos conceptuales de bajo nivel que se usan para construir progra~ ‘mas. Estas estructuras no son exclusivas de los programas Python, sino que son parte de cualquier lenguaje de programacién, desde el cédigo méquina hasta los lenguajes de alto nivel. entrada: Obtiene datos del “mundo exterior”, Puede consistir en leer datos de un archivo, o incluso de algtin tipo de sensor, como un micréfono o GPS. En nuestros programas iniciales Ia entrada provendré del propio usuario, escribiendo datos en el teclado. salida: Muestra el resultado del programa en a pantalla o lo almacena en un archivo; 0 a veces lo envia a un dispositivo, como puede ser un altavoz, para reproducir misica o leer texto. ejecucién secuencial: Ejecuta sentencias una detris de otra, en el orden en que se encuentran en el script. ejecucién condicional: Comprucba ciertas condiciones y después ejecuta u omi- te una secuencia de sentencias. ejecucién repetida: Ejecuta cierto conjunto de sentencias repetidamente, nor ‘malmente con alguna variaci6n. reutilizacién: Se escriben un conjunto de instrucciones una vez y se las da un nombre para después reutilizarlas cuando sean necesarias en cualquier otra parte del programa, Parece demasiado simple para ser verdad, y por supuesto nunca es tan simple. Es ‘como decir que caminar es simplemente “poner un pie delante del otro”. Fl “arte” de escribir un programa es componer y entrelazar juntos estos elementos bésicos ‘muchas veces, para producir algo que sea itl a sus usuarios, El programa anterior que calcula el niimero de palabras usa directamente todos estos patrones, excepto uno. 4 Capitul iPor qué deberfa aprender a escribir programas? 1.10. {Qué es posible que vaya mal? Como hemos visto en nuestra primera conversacién con Python, deberemos co- municamos de forma muy precisa cuando escribamos cédigo Python. La minima desviacién o error provocard que Python deje de ejecutar nuestro programa, Los programadores novatos a menudo se toman el hecho de que Python no deje sspacio para errores como una prueba de que Python es perverso, odioso y cruel Aunque a Python parece que le gustan todos los demés, reconoce a los novatos y Jes guarda rencor. Debido a ese rencor, Python toma sus programas perfectamente escritos y los rechaza como si fueran “initiles” s6lo para atormentarnos, File "estdin>", Line 1 synta snvalié syntax Line print ‘Hola, mundo" File "estal yntaxSeror: invalid syntax File "eetdia>", Line 1 jTe odio, Python! SyntaxBrror: invalid syntax do> si sales fuera, te daré una lecciés File "estdin>*, Line si sales fuera, te daré una leccién yntaxSerori invalid syntax Hay poco que ganar discutiendo con Python, Sélo es una herramienta. No tiene emociones, es feliz.y esté listo para servirte en cualquier momento que le necesites. Sus mensajes de error parecen crueles, pero son simples peticiones de ayuda de Python. Ha examinado lo que has escrito y sencillamente no es capaz de entender lo que has puesto. Python se parece mucho a un perro: te quiere incondicionalmente, pero sélo es capaz. de entender unas pocas palabras clave, as{ que te mira con una expresién adorable en su cara (>>>),y espera a que tt le digas algo que él pueda comprender, Cuando Python dice “SyntaxError: invalid syntax”, esta simplemente agitando su cola y diciendo: “Me parece que has dicho algo, pero es que no comprendo lo que significa, De todos modos, sigue hablando conmigo, por favor (>>>).” Cuando tus programas vayan aumentando su complejidad, te encontrards con tres tipos de errores en general: Errores de sintaxis: Estos son los primeros errores que cometerés y los més féci- les de corregir. Un error de sintaxis quiere decir que has violado las reglas viaje de aprendizaje 15 de la “gramética’” de Python. Python hace lo que puede para indicar la linea yel caracter correctos en donde cree que esté la confusién. Lo tnico compli- ado de los errores de sintaxis es que a veces el error que se necesita cotregir esté en alguna linea del programa anterior a aquella en la cual Python emite el aviso, De modo que la linea y el carécter que Python indica en un error de sintaxis pueden ser s6lo un punto de partida para tu investigacién. Errores I6gicos: Un error Idgico es cuando tu programa tiene una sintaxis co recta, pero existe un error en el orden de las sentencias o tal vez un error cen c6mo las sentencias se relacionan unas con otras. Un buen ejemplo de un error légico seria, “toma un trago de tu botella de agua, ponla en tu mochila, camina hasta la biblioteca, y luego vuelve a poner el tapén a la botella.” Errores semanticos: Un error seméntico se produce cuando la descripcién de los pasos a seguir es sintcticamente perfecta y se realiza en el orden correcto, pero sencillamente existe un error en el programa, El programa es perfe: tamente correcto, pero no realiza aquello que ti pretendias que hiciera. Un ejemplo sencillo podria ser si ti estuvieses indicando a alguien el camino hacia un restaurante y dijeras: “...cuando Megu ‘ign con la ga solinera, gira la izquierda, comtinga durante kilémetro y medio y el edificio rojo que encuentres a tu derecha seré el restaurante.” Tu amigo se retrasa y te llama para decirte que esté en una granja, dando vueltas alrededor de un gtanero, sin que haya sefal alguna de un restaurante, Entonces le preguntas: “{Giraste a la izquierda o a la derecha en la gasolinera?”, y él responde: “Segui al pie de la letra tus indicaciones, las tengo por escrito, y decfan que debfa girar la izquierda y continuar kilometro y medio desde la gasolinera.” Entonces le dices: “Lo siento mucho, porque aunque mis instrucciones son sintécticamente correctas, por desgracia contienen un pequeito ¢ indetectado error seméntico.”. ala intersé Cuando se produce cualquiera de los tres tipos de error, se debe una vez. mas a que Python esté intentando por todos los medios hacer exactamente lo que ti le has pedido. 1.11. El viaje de aprendizaje Segiin vayas avanzando por el resto del libro, no te asustes si los conceptos no parecen encajar bien unos con otros al principio. Cuando estabas aprendiendo a hablar, no supuso un problema que durante los primeros aos s6lo pudieras emitir lindos balbuceos. Y también fue normal que te Hevara seis meses pasar de un vocabulario simple a frases simples y que te Ilevara 5-6 afios més pasar de frases a pérrafos, y que todavia tuvieran que transcurtir unos cuantos afios mas hasta que fuiste capaz de escribir una historia corta interesante por ti mismo. Pretendemos que aprendas Python mucho més répidamente, por lo que te en- sefiaremos todo al mismo tiempo durante los préximos capitulos. Atin asi, ten 16 Capitulo 1, :Por qué deberfa aprender a escribir programas? en cuenta que esto es como aprender un idioma nuevo, que Ileva un tiempo absor- ber y comprender antes de que te resulte familiar. Eso produce cierta confusién, ya que visitaremos y volveremos a visitar temas para intentar que consigas ver el conjunto del cuadro mientras vamos definiendo los pequefios fragmentos que forman esa obra completa. A pesar de que el libro esté escrito de forma lineal, y que si estés participando en un curso éste también avanzaré de forma lineal, no dudes en ser no lineal en el modo en que abordes las materias. Avanza y retrocede, y lee a veces por encima, Al ojear material més avanzado sin comprender del todo Jos detalles tendrés una mejor comprensién del “;por qué?” de la programaci6n, AL revisar el material anterior e incluso al rehacer los ejercicios previos, te dards cuenta que ya has aprendido un montén de cosas, incluso si la materia que estés examinando en ese momento parece un poco impenetrable. Normalmente, cuando uno aprende su primer lenguaje de programacién, hay unos pocos momentos “;A-jé!” estupendos, en los cuales puedes levantar la vista de la roca que ests machacando con martillo y cincel, separarte unos pasos y compro- bar que lo que estas intentando construir es una maravillosa escultura Si algo parece particularmente dificil, generalmente no vale la pena quedarse mirdndolo toda la noche. Témate un respiro, échate una siesta, come algo, explica- Je a alguien (quizas a tu perro) con qué estis teniendo problemas, y después vuelve a observarlo con nuevos ojos. Te aseguro que una vez que aprendas los conceptos de la programacién en el libro, volverds atrds y vers que en realidad todo era facil y elegante y que simplemente te ha Ilevado un poco de tiempo llegar a absorberlo. 1.12. Glosario bug: Un error en un programa, c6digo fuente: Un programa en un lenguaje de alto nivel. cédigo maquina: El lenguaje de més bajo nivel para el software, ya que se trata del lenguaje que es directamente ejecutado por la unidad central de proce- samiento (CPU), compilar: Traducir un programa escrito en un lenguaje de alto nivel a otro len- guaje de bajo nivel de una vez, prepardndolo para su posterior ejecucién, error seméntico: Un error en un programa que provoca que haga algo distinto de lo que el programador pretendfa, interpretar: Ejecutar un programa en un lenguaje de alto nivel traduciendo sus lineas de una en una. lenguaje de alto nivel: Un lenguaje de programacién como Python, que esta di- sefiado para ser sencillo de leer y escribir para los humanos. 7 Ienguaje de bajo nivel: Un lenguaje de programacién que ha sido disefiado pa- ra ser sencillo de ejecutar para una maquina; también se le llama “cédigo maquina” o “lenguaje ensamblador”. memoria principal: Almacena programas y datos. La memoria principal pierde su informacién cuando se interrumpe la energia que la alimenta. memoria secundaria: Almacena programas y datos y retiene su informacién in- cluso cuando Ia corriente se interrumpe. Generalmente es més lenta que la ‘memoria principal. Ejemplos de memoria secundaria pueden ser unidades de disco y memorias flash en lépices USB. modo interactive: Un modo de uso de usar el intérprete de Python escribiendo comandos y expresiones en el prompt (indicador) parsear: Examinar un programa y analizar su estructura sintéctica, portabilidad: La propiedad de un programa que le permite funcionar en més de un tipo de equipo, programa: Un conjunto de instrucciones que especifican una operaci6n, prompt: Cuando un programa muestra un mensaje y se detiene para que el usua- rio escriba alguna entrada para el programa. resolucién de problemas: El proceso de formular un problema, encontrar una solucién y expresar esa solucién. seméntica: El significado de un programa. sentencia print: Una instruccién que provoca que el intérprete de Python muestre un valor en la pantalla. unidad central de procesamiento: El corazén de cualquier PC. Es lo que eje- cuta el software que escribimos; también se le suele llamar “CPU” o “el procesador”. 1.13. Ejercicios Ejercicio 1.1 ,Cudl es la funci6n de la memoria secundaria en un PC? a) Bjecutar todos los célculos y 16gica del programa ') Recuperar paginas web de Internet ©) Almacenar informacién durante mucho tiempo — incluso entre ciclos de apaga- do y encendido 4) Recoger la entrada del usuario Ejercicio 1.2 {Qué es un programa’ 18 Capitulo 1, :Por qué deberfa aprender a escribir programas? Ejercicio 1.3 ;Cuél es la diferencia entre un compilador y un intérprete? Ejercicio 1.4. {Cuil de los siguientes contiene “cédigo maquina’ 1 intérprete de Python b) El teclado ©) El cédigo fuente de Python 4) Un documento de un procesador de texto Ejercicio 1.5 Qué esté mal en el c6digo siguiente?: Ejercicio 1.6 {En qué parte del equipo queda almacenada una variable como “X” después de que se haya ejecutado la siguiente linea de Python?: x= 123 a) Unidad Central de Procesamiento ) Memoria Principal ©) Memoria Secundaria 4) Dispositivos de Entrada ©) Dispositivos de Salida srcicio 1.7 ;Qué imprimiré en pantalla el siguiente programa?: x0 P a) 43 by 4a xt 4d) Error, porque x = x + 1 no es posible mateméticamente Ejercicio 1.8 Explica cada uno de los siguientes conceptos usando como ejem- plo una capacidad humana: (1) Unidad Central de Procesamiento, (2) Memoria Principal, (3) Memoria Secundaria, (4) Dispositivo de Entrada, y (5) Dispositivo de Salida. Por ejemplo, “{Cual es el equivalente humano a la Unidad Central de Procesamiento”? Ejercicio 1.9. {Cémo puedes corregir un “Error de sintaxis”? Capitulo 2 Variables, expresiones y sentencias 24. Valores y tipos Un valor es una de las cosas bésicas que utiliza un programa, como una le- tra 0 un méimero. Los valores que hemos visto hasta ahora han sido 1, 2, y Esos valores pertenecen a tipos diferentes: 2 es un entero (int), y *;Hola, mundo!" es una cadena (string), que recibe ese nombre porque con. tiene una “cadena” de letras. Ts (y el intérprete) podéis identificar las cadenas porque van encerradas entre comillas. La sentencia print también funciona con enteros. Vamos a usar el comando para iniciar el intérprete. >>> pri Si no estés seguro de qué tipo de valor estés manejando, el intérprete te lo puede decir. >>> type! tela, mundo! ctype ‘ste!> >>> eypa(l type "in No resulta sorprendente que las cadenas pertenezca al tipo st r, y los enteros per- tenezcan al tipo int. Resulta, sin embargo, menos obvio que los niimeros con un punto decimal pertenezcan a un tipo llamado float (flotante), debido a que esos iiimeros se representan en un formato conocido como punto flotante! "Ein el mundo anglosajén (y también en Python) la parte decimal de un nimero se separa de la par entra mediante un punto, yno mediante una coma (Nota del ad) 20 bles, expresiones y senter {Qué ocurre con valores como '17" y "3.2"? Parecen nimeros, pero van entre comillas como las cadenas, >o> type(* >>> type Son cadenas. Cuando escribes un entero grande, puede que te sientas tentado a usar comas 0 puntos para separarlo en grupos de tres digitos, como en 1, 000,000 ®, Eso no es tun entero valido en Python, pero en cambio sf que resulta vilido algo como: 1098 2, Bien, ha funcionado, ;Pero eso no era lo que esperébamos!. Python interpreta 1,000, 000 como una secuencia de enteros separados por comas, as{ que lo impri- me con espacios en medio. Este es el primer ejemplo que hemos visto de un error semintico: el cédigo funcio- na sin producir ningiin mensaje de error, pero no hace su trabajo “correctamente”, 2.2. Variables Una de las caracteristicas més potentes de un lenguaje de programacién es la ca- pacidad de manipular variables. Una variable es un nombre que se refiere aun. valor. Una sentencia de asignacién crea variables nuevas y las da valores: >>> mensaje = 'Y ahora algo completanente diferente’ >>> pi = 3.14isa2e Este ejemplo hace tres asignaciones. La primera asigna una cadena a una variable nueva Hamada wensa je; la segunda asigna el entero 17 a n; la tercera asigna el valor (aproximado) de 7 a p Para mostrar el valor de una variable, se puede usar la sentencia print: 3.24159265359 2m el mando anglosajénel“Separador de millares” es la coms, y noel punto (Nota dl tad) Nombres de variables y palabras claves 21 El tipo de una variable es el tipo del valor al que se refiere. >> minuto/60.0 33 228 2.6. Expresiones Una expresién es una combinacién de valores, variables y operadores. Un valor por si mismo se considera una expresién, y también lo es una variable, asf que las siguientes expresiones son todas vilidas (asumiendo que la variable x tenga un valor asignado): Si escribes una expresién en modo interactivo, el intérprete la evaltia y muestra el resultado: Sin embargo, en un script, juna expresién por si misma no hace nada! Esto a ‘menudo puede producir confusién entre los principiantes. Ejercicio 2.1 Escribe las siguientes sentencias en el intérprete de Python para comprobar qué hacen 2.7, Orden de las operaciones Cuando en una expresién aparece més de un operador, el orden de evaluacién depende de las reglas de precedencia. Para los operadores matematicos, Python sigue las convenciones mateméticas. El acténimo PEMDSR resulta itil para re- cordar esas reglas’ “in Python 50, el esllado de esta dvisién es un nimero Fretance. En Python 3.0, e! nuevo operador// eel que realiza la divsin ener. 4 apitulo 2, Variables, expresiones y sentencias = Los Paréntesis tienen el nivel superior de precedencia, y pueden usarse para forzar a que una expresién sea evaluada en el orden que se quiera. Dado que las expresiones entre paréntesis son evaluadas primero, 2 * (3-1) es 4, y (141) ** (5-2) es 8, Se pueden usar también paréntesis para hacer una expresién més sencilla de leer, incluso si el resultado de la misma no varfa Porello, como en (minuto * 190) / 60 = La Exponenciacisn (elevar un nimero a una potencia) tiene el siguiente nivel més alto de precedencia, de modo que 2**1+1 es 3, no 4, y 3*1*#3 es 3, no 27. = La Multiplicacién y la Divisién tienen la misma precedencia, que es supe- rior a la de la Suma y la Resta, que también tienen entre si el mismo nivel de precedencia. Asf que 2*3-1 es 5, no 4, y 64/2 es 8, no 5, = Los operadores con igual precedencia son evaluados de izquierda a derecha. Asf que la expresisn 5-3-1 es 1 y no 3, ya que 5-3 se evalia antes, y después se resta 1 de 2. En caso de duda, afiade siempre paréntesis a tus expresiones para asegurarte de que las operaciones se realizan en el orden que ti quieres. 2.8. Operador médulo El operador médulo trabaja con enteros y obtiene el resto de la operacién consis- tente en dividir el primer operando por el segundo. En Python, el operador médulo €s un signo de porcentaje (+). La sintaxis es la misma que se usa para los demés operadores: Asi que 7 dividido por 3 es 2 y nos sobra 1 El operador médulo resulta ser sorprendentemente itil. Por ejemplo, puedes com- probar si un niimero es divisible por otro—si xy es cero, entonces x es divisible Por y También se puede extraer el digito més a la derecha de los que componen un niimero. Por ejemplo, x% 10 obtiene el digito que esta mas a la derecha de x (en ‘base 10). De forma similar, x8 100 obtiene los dos tiltimos digitos. 25 2.9. Operaciones con cadenas El operador + funciona con las cadenas, pero no realiza una suma en el sentido ‘matematico, En ver. de eso, realiza una coneatenaci6n, que quiere decir que une ambas cadenas, enlazando el final de 1a primera con el principio de la segunda, Por ejemplo: >>> primero = 10 >o> segundo = 15 25 La salida de este programa es 199150. 2.10. Peticién de informacién al usuario ‘A veces necesitaremos que sea el usuario quien nos proporcione el valor para una variable, a través del teclado. Python proporciona una funcién interna llamada raw_input que recibe la entrada desde el teclado®. Cuando se llama a esa funcién, l programa se detiene y espera a que el usuario escriba algo. Cuando el usuario pulsa Retorno o Intro, el programa continia y rav_input devuelve como una cadena aquello que el usuario escribié, >>> print entrada coalquis Antes de recibir cualquier dato desde el usuario, es buena idea escribir un men- saje explicdndole qué debe introducir. Se puede pasar una cadena a raw_input, que seré mostrada al usuario antes de que el programa se detenga para recibir su entrada: >>> nore = raw_input ("céno te Lanas?\n") econo Le chuck La secuencia \n al final del mensaje representa un newline, que es un cardcter especial que provoca un salto de linea, Por eso la entrada del usuario aparece debajo de nuestro mensaje. Si esperas que el usuario escriba un entero, puedes intentar convertir el valor de retomo a int usando la funcién int (): 5a Python 3.0 xa fancin ha sido Hamada $n 26 pitulo 2. Variables, expresiones y sente les 1a velocidad de vuelo de una golondrina sin carga?\n" prompt >>> velocidad cual n a velocidad de viele de una ” 2 Pero si el usuario escribe algo que no sea una cadena de dfgitos, obtendras un e vuelo de una golondzina sin car: fs a una golonde una europea? invalid Literal for sat () ‘Veremos cémo controlar este tipo de errores més adelante. 2.11. Comentarios ‘A medida que los programas se van volviendo més grandes y complicados, se vuelven mas dificiles de leer. Los lenguajes formales son densos, y a menudo es complicado mirar un trozo de cédigo ¢ imaginarse qué es lo que hace, 0 por qué. Por eso es buena idea afiadir notas a tus programas, para explicar en un lenguaje normal qué es lo que el programa esté haciendo. Estas notas reciben el nombre de comentarios, y en Python comienzan con el simbolo +: # calcula el per caje de h tor porcentaje = este caso, el comentario aparece como una linea completa. Pero también puc- des poner comentarios al final de una linea porcentaje = (minuto + 1 aje ee una Todo lo que va desde # hasta el final de La linea es ignorado—no afecta para nada al programa. Las comentarios son més titles cuando documentan caracterfsticas del cédigo que no resultan obvias. Es razonable asumir que el lector puede descifrar qué es lo que el cédigo hace; es mucho més itil explicarle por qué. Este comentario es redundante con el cédigo e iniitil veS basi Este comentario contiene informacién ttil que no esta en el c6digo: v5 4 velocidad en netros/sequndo 2.12, Eleccién de nombres de variables mneménicos 27 Elegir nombres adecuados para las variables puede reducir Ia necesidad de co- ‘mentarios, pero los nombres largos también pueden ocasionar que las expresiones complejas sean dificiles de leer, asf que hay que conseguir wna solucién de com- promiso, 2.12. Eleccién de nombres de variables mneménicos Mientras sigas las sencillas reglas de nombrado de variables y evites Tas palabras vadas, dispondras de una gran variedad de opciones para poner nombres a tus variables. Al principio, esa diversidad puede llegar a resultarte confusa, tanto al leer un programa como al escribir el tuyo propio. Por ejemplo, los tres programas siguientes son idénticos en cuanto a la funcién que realizan, pero muy diferentes ‘cuando los lees e intentas entenderlos. = 35.9 b= 12.50 xigiz3ahd * xtq2zSafd xig2p2afd EI intérprete de Python ve los tres programas como exactamente idénticos, pero Jos humanos ven y asimilan estos programas de forma bastante diferente. Los hhumanos entenderdn més répidamente el objetivo del segundo programa, ya que cl programador ha elegido nombres de variables que reflejan lo que pretendia de acuerdo al contenido que iba almacenar en cada variable. Esa sabia eleccién de nombres de variables se denomina utilizar “nombres de v: riables mneménicos”. La palabra mneménico® significa “que ayuda a memori- zar”. Elegimos nombres de variables mneménicos para ayudarnos a recordar por qué creamos las variables al principio. ‘A pesar de que todo esto parezca estupendo, y de que sea una idea muy buena usar nombres de variables mneménicos, ese tipo de nombres pueden interponerse cn el camino de los programadores novatos a la hora de analizar y comprender el cédigo. Esto se debe a que los programadores principiantes no han memorizado ain las palabras reservadas (slo hay 31), y a veces variables con nombres que SConsulia hetps://es.wikipedia.org/wik fe lada de la palabra “mmneménico” ‘onico para obtener una deseripeién deta- 28 pitulo 2. bles, expresiones y senter son demasiado descriptivos pueden legar a parecerles parte del lenguaje y no simplemente nombres de variable bien elegidos’. Echa un vistazo répido al siguiente eédigo de ejemplo en Python, que se mueve en bucle a través de un conjunto de datos, Trataremos los bucles pronto, pero por ahora tan s6lo trata de entender su significado: print word {Qué ocurre aqui? {Cuéles de las piezas (for, word, in, etc.) son palabras reserva- das y cuales son simplemente nombres de variables? ,Acaso Python comprende de un modo basico la nocién de palabras (words)? Los programadores novatos tie- nen problemas separando qué parte del cédigo debe mantenerse tal como esté en este ejemplo y qué partes son simplemente eleccién del programador. El cédigo siguiente es equivalente al de arriba: Para los principiantes es mas fécil estudiar este c6digo y saber qué partes son pa: labras reservadas definidas por Python y qué partes son simplemente nombres de variables elegidas por el programador. Fsté bastante claro que Python no entien- de nada de pizza ni de porciones, ni del hecho de que una pizza consiste en un Conjunto de una 0 mas porciones. Pero si nuestro programa lo que realmente va a hacer es leer datos y buscar pa- labras en ellos, pizza y porcién son nombres muy poco mneménicos. Elegitlos como nombres de variables distrae del propésito real del programa. Dentro de muy poco tiempo, conocerds las palabras reservadas mas comunes, y cempezards a ver cémo esas palabras reservadas resaltan sobre las demés: for word in word! print wor Las partes del cédigo que estén definidas por Python (for, in, print, y :) estén en negrita, mientras que las variables elegidas por el programador (word y words) no lo estén, Muchos editores de texto son conscientes de la sintaxis de Python y colorearsn las palabras reservadas de forma diferente para darte pistas que te permitan mantener tus variables y las palabras reservadas separados. Dentro de poco empezaras a leer Python y podrés determinar répidamente qué es una variable Yy qué es una palabra reservada. Tl pirafo anterior se reiere ms bien a quienes cligen nombres de variables en inglés, ya que todas las palabras reervadas de Python coinciden con palabras props de ese idioma (Nota del weed) Depuracién 29 2.13. Depura En este punto, el error de sintaxis que es mas probable que cometas serd intentar utilizar nombres de variables no vélidos, como class y yield, que son palabras clave, 0 oda” job y USS, que contienen caracteres no validos. Si pones un espacio en un nombre de variable, Python cree que se trata de dos operandos sin ningtin operador: axbrror: invalid syntax Para la mayorfa de errores de sintaxis, los mensajes de error no ayudan mucho. Los ‘mensajes mas comunes son SyntaxBrror: invalid syntax y 3 invalid token, ninguno de los cuales resulta muy informativo. taxBrror El runtime error (error en tiempo de ejecucisn) que es més probable que obtengas es un “use before def” (uso antes de definir); que significa que estés intentando usar una variable antes de que Ie hayas asignado un valor. Eso puede ocurrir si scribes mal el nombre de la variable: Naneerror: nane "eapitla’ is not defined Los nombres de las variables son sensibles a maytisculas, asf que LaTeX no es lo mismo que latex. En este punto, la causa més probable de un error seméntico es el orden de las operaciones. Por ejemplo, para evaluar 4, puedes sentirte tentado a escribir bop 1.0 / 2.0 * pi Pero la divisién se evalia antes, jasi que obtendrés 1/2, que no es lo mismo! No hay forma de que Python sepa qué es lo que querfas escribir exactamente, asf que neste caso no obtienes un mensaje de error; simplemente obtienes una respuesta incorrecta. 2.14. Glosario asignacién: Una sentencia que asigna un valor a una variable. cadena: Un tipo que representa secuencias de caracteres. coneatenar: Unir dos operandos, uno a continuacién del otro. comentario: Informacién en un programa que se pone para otros programadores (0 para cualquiera que lea el cédigo fuente), y no tiene efecto alguno en la ejecucién del programa. 30 pitulo 2. bles, expresiones y senter in entera: La operacién que divide dos ntimeros y trunca la parte fraccio- naria, entero: Un tipo que representa niimeros enteros. evaluar: Simplificar una expresién realizando las operaciones en orden para ob. tener un Gnico valor. expresin: Una combinaci6n de variables, operadores y valores que representan tun Gnico valor resultante, mneménico: Una ayuda para memorizar. A menudo damos nombres mneméni- cos a las variables para ayudamos a recordar qué est almacenado en ellas. palabra clave: Una palabra reservada que es usada por el compilador para anali zar un programa; no se pueden usar palabres clave como if, def, y while como nombres de variables. punto flotante: Un tipo que representa ntimeros con parte decimal operador: Un s{mbolo especial que representa un edlculo simple, como suma, rmultiplicacién o concatenacién de cadenas. operador médulo: Un operador, representado por un signo de porcentaje (*), que funciona con enteros y obtiene el resto cuando un niimero es dividido or otto operando: Uno de los valores con los cuales un operador opera. reglas de precedencia: El conjunto de reglas que gobierna el orden en el cual son evaluadas las expresiones que involuctan a méltiples operadores, senteneia: Una seccién del cédigo que representa un comando 0 accién. Hasta ahora, las tnicas sentencias que hemos visto son asignaciones y sentencias print. tipo: Una categoria de valores. Los tipos que hemos visto hasta ahora son enteros (tipo int), mimeros en punto flotante (ipo float), y cadenas (tipo st). valor: Una de las unidades bésicas de datos, como un niimero 0 una cadena, que un programa manipula, variable: Un nombre que hace referencia a un valor. 2.15. Ejercicios Ejercicio 2.2 Eseribe un programa que use raw_i nombre y luego darie la bienvenida, put para pedirle al usuario su 3 Introduzca tu nombre: Chui Por ahora no es necesario preocuparse de que nuestro salario tenga exactamente dos digitos después del punto decimal. Si quieres, puedes probar la funcién interna de Python round para redondear de forma adecuada el salario resultante a dos digitos decimales. Ejercicio 2.4 Asume que ejecutamos las siguientes sentencias de asignacién: ancho = 17 alto = 12.0 Para cada una de las expresiones siguientes, escribe el valor de la expresién y el tipo (del valor de la expresién). 1. ancho/2 2. ancho/2.0 3. alto/3 ators Usa el intérprete de Python para comprobar tus respuestas. Ejercicio 2.5 Escribe un programa que le pida al usuario una temperatura en gra- dos Celsius, la convierta a grados Fahrenheit e imprima por pantalla la temperatura convertida. 32. apitulo 2. Variables, expresiones y sentencias Capitulo 3 Ejecucién condicional 3.1. Expresiones booleanas Una expresién booleana es aquella que puede ser verdadera (True) o falsa (Pa11se). Los ejemplos siguientes usan el operador ==, que compara dos operandos fe si son iguales y False en caso contrario: son valores especiales que pertenecen al tipo hool (ooleano) ; no son cadenas: ctype "bool!> El operador =~ es uno de los operadores de comparacién; los demas son: xls fx es distin x Ls not y tx no mnismo que y ‘A pesar de que estas operaciones probablemente te resulten familiares, los simbo- los en Python son diferentes de los simbolos matemticos que se usan para realizar las mismas operaciones. Un error muy comtin es usar s6lo un simbolo igual (=) cn vez del simbolo de doble igualdad (==). Recuerda que = es un operador de asignacién, y == es un operador de comparacién, No existe algo como =< 0 =>. 4 Capitulo 3. Ejecucién condi 3.2. Operadores l6gicos Existen tres operadores légicos: and (y), or (0), y not (no). El significado seméntico de estas operaciones es similar a su significado en inglés. Por ejemplo, x >0 and x <10 es verdadero s6lo cuando x es mayor que 0 y menor que 10. as2 dera, 0 es verdadero si cualquiera de las condiciones es verda s decir, si el mtimero es divisible por 2 0 por 3 Finalmente, el operador not niega una expresi6n booleana, de modo que not (x >y) es verdadero si x >y es falso; es decir, si x es menor o igual que y Estrictamente hablando, los operandos de los operadores ldgicos deberfan ser ex- presiones booleanas, pero Python no es muy estricto, Cualquier nimero distinto de cero se interpreta como “verdadero.” de> 17 and True Esta flexibilidad puede ser util, pero existen ciertas sutilezas en ese tipo de uso que pueden resultar confusas. Es posible que prefieras evitar usarlo de este modo hasta que estés bien seguro de lo que estas haciendo. 3.3. Ejecucién condicional Para poder escribir programas titles, casi siempre vamos a necesitar la capacidad de comprobar condiciones y cambiar el comportamiento del programa de acuet- do acllas. Las sentencias condicionales nos proporciona esa capacidad, La forma mas sencilla es la sentencia i La expresién booleana después de la sentencia if recibe el nombre de condicién. La sentencia if se finaliza con un cardeter de dos-puntos (:) y la(s) Kinea(s) que van detrs de la sentencia if van indentadas! (es decir, llevan una tabulacién 0 varios espacios en blanco al principio). ‘el término correco en espafol seria “sangradas”, pero en el mundillo de la programacion se suele decir que las lineas van “indentadas” (Nota del trad) Ejecucién altern: 35 print 'x es positivo' Si la condicién légica es verdadera, la sentencia indentada ser4 ejecutada. Si la condicién es falsa, la sentencia indentada ser omitida. La sentencia if tiene la misma estructura que la definicién de funciones 0 los bucles for?. La sentencia consiste en una linea de encabezado que termina con cl cardcter dos-puntos (:) seguido por un bloque indentado. Las sentencias de este tipo reciben el nombre de sentencias compuestas, porque se extienden a lo largo de varias ineas. No hay Ifmite en el niimero de sentencias que pueden aparecer en el cuerpo, pero debe haber al menos una. Ocasionalmente, puede resultar itil tener un cuerpo sin sentencias (normalmente como emplazamiento reservado para cédigo que no se ha escrito atin). Fn ese caso, se puede usar la sentencia pass, que no hace nada. pass t inecesite gestionar los valores negativos Si introduces una sentencia if en el intérprete de Python, el prompt cambiaré su aspecto habitual por puntos suspensivos, para indicar que estés en medio de un bloque de sentencias, como se muestra a continuacién: 3.4, Ejecuci6n alternativa La segunda forma de la sentencia if es la ejecucién alternativa, en la cual existen dos posibilidades y la condicién determina cual de ellas serd ejecutada, La sintaxis cs similar a ésta: ae sa print "x es part studiaremos las funciones en el eapitalo 4y los bucles en el eaptlo 5, 36 Capitulo 3. Ejecucién condicional Si al dividir x por 2 obtenemos como resto 0, entonces sabemos que x es par, y el programa muestra un mensaje a tal efecto. Si esa condicidn es falsa, se ejecuta el segundo conjunto de sentencias. no si print 'x es impar') print 'x es par’ > Dado que la condicién debe ser obligatoriamente verdadera o falsa, solamente una de las alternativas sera ejecutada, Las alternativas reciben el nombre de ramas, dado que se trata de ramificaciones en el flujo de la ejecucién. Algunas veces hay dos ramas. Una forma de expresar una operacién como ésa es usar un condi encadenado: is de dos posibilidades, de modo que necesitamos mas de ional ifxcy: int "x es menor ave y! int ‘x es mayor que y! tee y son iguales* Lif es una abreviatura para “else if”, En este caso también sera ejecutada tinica- mente una de las ramas. 3 ani 37 x| print ‘menor! si x>y >| print 'mayor' print ‘igual’ — <-— No hay un limite para el mimero de sentencias e: Si hay una clausula e1s debe ir al final, pero tampoco es obligatorio que ésta cxista Cada condicién es comprobada en orden. Si la primera es falsa, se comprueba la siguiente y asf con las demés. Si una de ellas es verdadera, se ejecuta la rama correspondiente, y la sentencia termina. Incluso si hay mas de una condicién que sea verdadera, slo se ejecuta la primera que se encuentra. 3.6. Condicionales anidados Un condicional puede también estar anidado dentro de otro. Podriamos haber es- tito el ejemplo anterior de las tres ramas de este modo: xo! print "© y son iguales? El condicional exterior contiene dos ramas. La primera rama ejecuta una sentencia simple. La segunda contiene otra sentencia i£, que tiene a su vez sus propias dos amas. Bsas dos ramas son ambas sentencias simples, pero podrian haber sido sentencias condicionales también. 38 Capitulo 3. Ejecucién condi si no x Fane = float (ent) valuet rwalid Literal for float(): fred Existen estructuras de ejecucién condicional dentro de Python pata manejar este tipo de errores esperados e inesperados, llamadas “try / except”. La idea de try y except es que si se sabe que cierta secuencia de instrucciones puede generar un problema, sea posible aftadir ciertas sentencias para que sean ejecutadas en caso de error. Bstas sentencias extras (el bloque except) serdn ignoradas si no se produce ningtin error, Puedes pensar en la caracterfstica try y except de Python como una “péliza de seguros” en una secuencia de sentencias. ‘Se puede reescribir nuestro conversor de temperaturas de esta forma: eure Fahzenhett: "por favor, introd Python comienza ejecutando la secuencia de sentencias del bloque try. Si todo vva bien, se saltard todo el bloque except y terminaré, Si ocurre una excepcién dentro del bloque try, Python saltard fuera de ese bloque y ejecutard la secuencia de sentencias del bloque except. python fahren?.py roduzca 1a Tenper: wra Fahrenheit 72 40 Capitulo Ejecucién condicional 2a.zeezenze22 python fahzen2.py Introdurca la Terperataca Gestionar una excepcién con una sentencia try recibe el nombre de capturar tuna excepcién. En este ejemplo, la clausula except muestra un mensaje de error, En general, caplurar una excepcién te da la oportunidad de corregir el problema, volverlo a intentar 0, al menos, terminar el programa con elegancia. 3.8. Evaluacién en cortocircuito de expresiones légicas Cuando Python esté procesando una expresién légica, como x >= 2 and (x/y) >2, evalia la expresisn de izquierda a derecha. Debido a la definicién de and, si x es menor de 2, la expresin x >= 2 resulta ser alsa, de modo que la expresién completa ya va a resultar £21sa, independientemente de si (x/y) >2 se evalia como verdadera o falsa Cuando Python detecta que no se gana nada evaluando el resto de una expresién légica, detiene su evaluacién y no realiza el célculo del resto de la expresiGn Cuando la evaluacién de una expresién logica se detiene debido a que ya se conoce el valor final, eso es conocido como cortocireuitar la evaluacién, A pesar de que esto pueda parecer hilar demasiado fino, el funcionamiento en cor- tocircuito nos descubre una ingeniosa técnica conocida como patrén guardian. Examina la siguiente secuencia de c6digo en el intérprete de Python: doy doy File "cstdino", Line 1, in = 2 fue evaluada co- mo falsa, asf que (x/y) no lleg6 a cjecutarse debido a la regla del cortocircuito, y no se produjo ningiin error. Depui 41 Es posible construir las expresiones ldgicas colocando estratégicamente una eva~ luacién como guardidn justo antes de la evaluacién que podrfa causar un error, como se muestra a continuacién: ee >> x >= 2 andy != 0 and [x/y) > 2 >>> x >= 2 and (aly) > 2 and y f= last) En la primera expresién légica, x >= 2 es f21sa, asf que la evaluacidn se detiene enel and. En la segunda expresién lgica, x >= 2s verdadera, peroy != des falsa, de modo que nunea se aleanza (x/y) En la tercera expresién légica, el y != 0 va después del céleulo de (x/y) , de ‘modo que la expresi6n falla con un error. En la segunda expresi6n, sedice que y != 0 actia como guardisn para garantizar que sélo se ejecute (x/y) en el caso de que y no sea cero. 3.9. Depuracién Los “traceback” que Python muestra cuando se produce un error contienen un ‘mont6n de informacién, pero pueden resultar abrumadores. Las partes més titiles ‘normalmente son: = Qué tipo de error se ha producido, y = Dénde ha ocurrido. Los errores de sintaxis (syntax errors), normalmente son faciles de localizar, pero veces tienen trampa, Los errores debido a espacios en blanco pueden ser compli- cados, ya que los espacios y las tabulaciones son invisibles, y solemos ignorarlos. breor: invalid syntax 2 Capitulo Ejecucién condicional En este ejemplo, el problema es que la segunda linea esta indentada por un espacio. Pero el mensaje de error apunta a y, lo cual resulta engafioso. En general, los mensajes de error indican dénde se ha descubierto el problema, pero el error real podria estar en el cédigo previo, a veces en alguna linea anterior. Ccurre lo mismo con los erzores en tiempo de ejecucién (runtime errors). Supén que estas tratando de calcular una relacién sefial-ruido en decibelios. La formula es SNR4p = 1010g10( Prenat /Pruido)- En Python, podrias escribir algo como esto: Inport math int_seral EI mensaje de error apunta a la linea 5, pero no hay nada incorrecto en ese Linea. Para encontrar el error real, puede resultar itil mostrar en pantalla el valor de relacion, que resulta ser 0. El problema esté en la linea 4, ya que al dividir dos enteros se realiza una divisién entera, La solucién es representar la intensidad de Ia sefial y Ia intensidad del ruido con valores en punto flotante. En general, los mensajes de error te dicen dénde se ha descubierto el problema, pero a menudo no es ahi exactamente donde se ha producido. 3.10, Glosario condi La expresién booleana en una sentencia condicional que determina qué rama serd ejecutada. condicional anidado: Una sentencia condicional que aparece en una de las ramas de otra sentencia condicional. mnal encadenado: Una sentencia condicional con una serie de ramas al- ternativas. condi cortocireuito: Cuando Python va evaluando una expresién ldgica por tramos y detiene el proceso de evaluacisn debido a que ya conoce el valor final que va a tener el resultado sin necesidad de evaluar el resto de Ia expresién. cuerpo: La secuencia de sentencias en el interior de una sentencia compuesta. 3fin Python 3.0, ya no se produce el mensaje de ero el operador de divs realzadivisin en panto flotate inchs con aperandos entero jerci 43 expresién booleana: Un expresién cuyo valor puede ser o bien Verdacero o bien Falso operadores de comparacién: Uno de los operadores que se utiliza para compa- rar dos operandos: > <>ay< ‘operador légico: Uno de los operadores que se combinan en las expresiones boo- Teanas: and, or, y not. patrén guardian: Cuando construimos una expresién légica con comparaciones adicionales para aprovecharnos del funcionamiento en cortocircuito, rama: Una de las secuencias alternativas de sentencias en una sentencia condi- ional sentencia compuesta: Una sentencia que consiste en un encabezado y un cuerpo. El encabezado termina con dos-puntos (:). El cuerpo esta indentado con relacién al encabezado. sentencia condicional: Una sentencia que controla el flujo de ejecuc diendo de cierta condicién, depen- traceback: Una lista de las funciones que se estén ejecutando, que se muestra en pantalla cuando se produce una excepcién, 3.11. Ejercicios Ejercicio 3.1 Reescribe el programa del célculo del salario para darle al empleado 1.5 veces la tarifa horaria para todas las horas trabajadas que excedan de 40. ‘5 la Tarifa por hora: 10 fo: 475.0 0 3.2 Reescribe el programa del salario usando try y except, de mo- do que el programa sea capaz de gestionar entradas no numéricas con elegancia, ‘mostrando un mensaje y saliendo del programa. A continuacién se muestran dos ¢jecuciones del programa: Introduzca las Horas: 20 por hora: nueve Ejercicio 3.3 Escribe un programa que solicite una puntuacién entre 0.0 y 1.0. Si Ja puntuacisn esta fuera de ese rango, muestra un mensaje de error, Si la puntua- cin esté entre 0.0 y 1.0, muestra la calificacién usando la tabla siguiente: Puntuacién >= 0.9 >= 0.7 >= 0.6 < 0.6 Introduzea calificacién Sobresaliente Notable Bien Suficiente Insuficiente puntuacién: 0.95 Sobresaliente Introduzca Puntuacién Introduzea Puntuacién Introduzea Bien Introduzea puntuacién: perfecto incorrecta puntuacién: 10.0 incorrecta puntuacién: 0.75 puntuacién: 0.5 Insuficiente Ejecuta el programa repetidamente, como se muestra arriba, para probar con varios valores de entrada diferentes, Capitulo 4 Funciones 4.1, Llamadas a ful nes: Enel contexto de la programacién, una funcién es una secuencia de sentencias que realizan una operacién y que reciben un nombre, Cuando se define una funcién, se especifica el nombre y Ia secuencia de sentencias. Mas adelante, se puede “lamar” a la funcién por ese nombre. Ya hemos visto un ejemplo de una Hamada a una funcién: stype "i El nombre de la funcién ype. La expresidn entre paréntesis recibe el nombre de argumento de la funcién, El argumento es un valor o variable que se pasa a la funcién como parimetro de entrada. El resultado de la funcién type es el tipo del argumento. Es habitual decir que una funcién “toma’ (o recibe) un argumento y “retorna” (0 devuelve) un resultado. El resultado se llama valor de retorno. 4.2, Funciones internas Python proporciona un nimero importante de funciones internas, que pueden ser usadas sin necesidad de tener que definirlas previamente. Los creadores de Python han escrito un conjunto de funciones para resolver problemas comunes y las han incluido en Python para que las podamos utilizar. Las funciones max y min nos darn respectivamente el valor mayor y menor de una lista: 46 Capitulo 4, Funciones La funcién max nos dice cual es el “cardcter més grande” de la cadena (que resulta ser la letra “u”), mientras que la funcién min nos muestra el caracter més pequefio (que en ese caso es un espacio). tra funcién interna muy comtin es Len, que nos dice cudintos elementos ha su argumento, Si el argumento de Len es una cadena, nos devuelve el mimero de caracteres que hay en la cadena, >o> Len {tHola, mundo n Estas funciones no se limitan a buscar en cadenas. Pueden operar con cualquier conjunto de valores, como veremos en los siguientes capftulos. Se deben tratar los nombres de las funciones internas como si fueran palabras reservadas (es decir, evita usar “max” como nombre para una variable) 4.3. Funciones de conversién de tipos Python también proporciona funciones internas que convierten valores de un tipo a otro, La funcién int toma cualquier valor y lo convierte en un entero, si puede, © se queja si no puede: int (32") Vatueirror: invalid literal for int() nt puede convertir valores en punto flotante a enteros, pero no los redondea; simplemente corta y descarta la parte decimal: o> int (3.99999) int (2.3) 2 Float convierte enteros y cadenas en niimeros de punto flotante: >>> float (3 32.0 >> Hloat (13.14159" aut Finalmente, str convierte su argumento en una cadena: ste(32) on "aa Niimeros aleat 47 4.4, Niimeros aleatorios ‘A partir de las mismas entradas, la mayoria de los programas generarén las mis- ‘mas salidas cada vez, que es lo que llamamos comportamiento determinista. El determinismo normalmente es algo bueno, ya que esperamos que la misma ope- racién nos proporcione siempre el mismo resultado. Para ciertas aplicaciones, sin embargo, querremos que el equipo sea impredecible. Los juegos son el ejemplo obvio, pero hay més. Conseguir que un programa sea realmente no-determinista no resulta tan facil, pero hay modos de hacer que al menos lo parezca. Una de ellos es usar algoritmos que generen niimeros pseudoaleatorios. Los niimeros pseudoaleatorios no son verdaderamente aleatorios, ya que son generados por una operacién determinista, pero si sélo nos fijamos en los némeros resulta casi imposible distinguitlos de los aleatorios de verdad. El médulo cancion proporciona funciones que generan niimeros pseudoaleatorios (a los que simplemente llamaremos “aleatorios” de ahora en adelante) La funcién random devuelve un niimero flotante aleatorio entre 0.0 y 1.0 (inclu- yendo 0.0, pero no 1.0). Cada vez que se llama a random, se obtiene el nimero siguiente de una larga serie. Para ver un ejemplo, ejecuta este bucle: ange (1 x = random, random Este programa produce la siguiente lista de 10 niimeros aleatorios entre 0.0 hasta (peto no incluyendo) 1.0 Ejercicio 4.1 Bjecuta el programa en tu sistema y observa qué niimeros obtienes, La funcién random es solamente una de las muchas que trabajan con niimeros aleatorios. La funcién randint toma los parémetros inferior y superior, y devuelve un entero entre inferior y superior (incluyendo ambos extremos). >>> random.randint (5, 48 Capitulo 4, Funciones Para elegir un elemento de una secuencia aleatoriamente, se puede usar choice: 23 El médulo random también proporciona funciones para generar valores aleatorios de distribuciones continuas, incluyendo Gausiana, exponencial, gamma, y unas cuantas més. 4.5. Funciones matematicas Python tiene un médulo matemético (math) , que proporciona la mayorfa de las funciones mateméticas habituales. Antes de que podamos utilizar el médulo, de- beremos importarlo: 55> import math Esta sentencia crea un objeto médulo llamado math. Si se imprime el objeto médulo, se obtiene cierta informacién sobre él poe cath sth! from ' /use/1ib/pychon2, nodule El objeto médulo contiene la funcién y variables definidas en el médulo. Para acceder a una de esas funciones, es necesario especificar el nombre del médulo y el nombre de la funcisn, separados por un punto (también conocido como perfodo). Este formato recibe el nombre de notacién punto, jacion = int_senal / >>> decibelios = 10 * >>> radianes = 0. do> altura = math, sin (radianes} El primer ejemplo calcula el logaritmo base 10 de la relacidn sefial-ruido. El médu- Jo math también proporciona una funcién Hamada 1og que calcula logaritmos en base e. El segundo ejemplo calcula el seno de la variable radianes. El nombre de la variable es una pista de que sin y las otras funciones trigonométricas (cos, tan, etc.) toman argumentos en radianes. Para convertir de grados a radianes, hay que dividir por 360 y multiplicar por 2n: 49 >>> qrados = 45 os7a1 La expresi6n math.pi toma la variable pi del médulo math, El valor de esa va- riable es una aproximacién de 7, con una precisién de unos 15 digitos. Si sabes de trigonometrfa, puedes comprobar el resultado anterior, compardndolo con la rafz cuadrada de dos dividida por dos >>> math.eart (2) / 2.0 0, 707206781187 4.6. Aiiadiendo funciones nuevas Hasta ahora, s6lo hemos estado usando las funciones que vienen incorporadas en Python, pero es posible afiadir también funciones nuevas. Una definicién de funcién especifica el nombre de una funcién nueva y la secuencia de sentencias que se ejecutan cuando esa funcién es llamada. Una vez definida una funcién, se puede reutilizar una y otra vez a lo largo de todo el programa. He aqui un ejemplo: det tot def es una palabra clave que indica que se trata de una definicién de funcién. El nombre de la funci6n es muest ra_estribillo. Las reglas para los nombres de las funciones son los mismos que para las variables: se pueden usar letras, nfimeros y algunos signos de puntuacién, pero el primer cardcter no puede ser un niimero, No se puede usar una palabra clave como nombre de una funcién, y se deberia evitar también tener na variable y una funcién con el mismo nombre, Los paréntesis vacfos después del nombre indican que esta funcién no toma ningin argumento. Mis tarde construiremos funciones que reciban argumentos de entra- a, La primera linea de la definicién de la funcién es Hamada la cabecera; el resto se ama el cuerpo. La cabecera debe terminar con dos-puntos (:), y el cuerpo debe ir indentado. Por convencién, el indentado es siempre de cuatro espacios. El cuerpo puede contener cualquier ntimero de sentencias. Las cadenas en la sentencia print estén encerradas entre comillas. Da igual utilizar comillas simples que dobles; la mayorfa de la gente prefiere comillas simples, excepto en aquellos casos en los que una comilla simple (que también se usa como apostrofe) aparece en medio de la cadena. 50 Capitulo 4, Funciones Si escribes una definicién de funcién en modo interactivo, el intérprete mos- traré puntos suspensivos (..) para informarte de que la definicién no esta completa: >>> det mve: dia.! Para finalizar la funci6n, debes introducir una linea vacfa (esto no es necesario en un script). ‘Al definir una funci6n se crea una variable con el mismo nombre. >>> print type (muestra_estribillo) El valor de miestra_est ribillo es function object (objeto funcién), que tiene como tipo ' function! La sintaxis para lamar a nuestra nueva funcién es la misma que usamos para las funciones intemnas: qué atearia 1e y trabajo todo Una ver. que se ha definido una funcién, puede usarse dentro de otra. Por ejem- plo, para repetir el estribillo anterior, podrfamos escribir una funcién Hamada repite_estribillo: ef repiteestribillo() maests y trabajo todo el dia Pero en realidad la cancién no es asi. 4.7. Definicién y usos Reuniendo los fragmentos de cédigo de las secciones anteriores, el programa com: pleto serfa algo como esto: Flujo de ejecucién 51 el dia. dof repiteestribitlo Este programa contiene dos definiciones de funciones: mes oy repite_estribillo. Las definiciones de funciones son ejecutadas exactamen- te igual que cualquier otra sentencia, pero su resultado consiste en crear objetos del tipo funcidn. Las sentencias dentro de cada funcién son ejecutadas solamente cuando se lama a esa funcién, y la definicién de una funcién no genera ninguna salida, a_estribi. Como ya te imaginards, es necesario crear una funcién antes de que se pueda ejecutar. En otras palabras, la definicién de la funcién debe ser ejecutada antes de que la funcién se llame por primera vez. Ejercicio 4.2 Desplaza la itima linea de este programa hacia arriba, de modo que Ja llamada a la funcién apatezca antes que las definiciones. Ejecuta el programa y observa qué mensaje de error obtienes, Ejercicio 4.3 Desplaza la llamada de la funcién de nuevo hacia el final, y coloca la definicién de muestra_estribillo después de la definicién de repite_estribillo. {Qué ocurre cuando haces funcionar ese programa? 4.8. Flujo de ejecucién ara asegurarnos de que una funcisn esté definida antes de usarla por primera ver, ario saber el orden en que las sentencias son ejecutadas, que es lo que Hamamos el flujo de ejecucién. La ejecucién siempre comienza en la primera sentencia del programa. Las senten- cias son ejecutadas una por una, en orden de arriba hacia abajo. Las definiciones de funciones no alteran el flujo de la ejecucién del programa, pero recuerda que las sentencias dentro de una funcién no son ejecutadas hasta que se ama a esa funcién, Una llamada a una funcién es como un desvio en el flujo de la ejecucién. En vez de pasar a la siguiente sentencia, el flujo salta al cuerpo de la funcién, ejecuta todas las sentencias que hay alli, y después vuelve al punto donde lo dejé. Todo esto parece bastante sencillo, hasta que uno recuerda que una funcién puede amar a otra, Cuando esté en mitad de una funcién, el programa puede tener que 52 Capitulo 4, Funciones ejecutar las sentencias de otra funcién. Pero cuando esta ejecutando esa nueva funcin, ital vez haya que ejecutar todavia més funciones! Afortunadamente, Python es capaz de llevar el seguimiento de dénde se encuentra en cada momento, de modo que cada vez que completa la ejecucién de una fun- cidn, el programa vuelve al punto donde lo dejé en la funcidn que habia Hamado esa, Cuando esto le leva hasta el final del programa, simplemente termina, {Cudl es la moraleja de esta s6rdida historia? Cuando leas un programa, no siem- pre te convendré hacerlo de arriba a abajo. A veces tiene mas sentido seguir el flujo de la ejecucién, 4.9. Pardmetros y argumentos Algunas de las funciones internas que hemos visto necesitan argumentos. Por ejemplo, cuando se llama a $e le pasa un nimero como argumento, Algunas funciones necesitan més de un argumento: mat.pow toma dos, la base y el exponente. Dentro de las funciones, los argumentos son asignados a variables lamadas pardmetros. A continuacién mostramos un ejemplo de una funcién definida por el usuario que recibe un argumento: Esta funcién asigna el argumento a un parametro llamado bruce. Cuando la fun- cidn es llamada, imprime el valor del parémetro (sea éste lo que sea) dos v Esta funcién funciona con cualquier valor que pueda ser mostrado en pantalla. >>> muest.ra_dos_veces ("Span") Las mismas reglas de composicidn que se aplican alas funciones internas, también se aplican a las funciones definidas por el usuario, de modo que podemos usar cualquier tipo de expresién como argumento para muest ra_dos_veces: Span Span Span § Span Span Sean Spam ios_veces ("Span * D> muestra_dos_veces inath.cos (math. pi 4.10, Funciones productivas y funciones esté 53 El argumento es evaluado antes de que la funcién sea llamada, asi que en los ejemplos, la expresién "Spam '*4 ynath.cos (math.pi) son evaluadas s6lo una vez ‘También se puede usar una variable como argumento: wae = a sedio-abeta." dos_veces michael o-abe redio-abey. El nombre de la variable que pasamos como argumento, (michael) no tiene nada que ver con el nombre del parémetro (bruce). No importa cémo se haya llamado al valor en origen (en la llamada); dentro de me. Hamar bruce. a_dos_veces, siempre se 4.10. Funciones productivas y funciones estériles Algunas de las funciones que estamos usando, como las matemiticas, producen resultados; a falta de un nombre mejor, las llamaremos funciones productivas (fruitful functions). Otras funciones, como muest ra_dos_veces, realizan una ac- ci6n, pero no devuelven un valor. A esas las lamaremos funciones estériles (void functions), Cuando Hamas a una funcién productiva, casi siempre querrés hacer luego algo con el resultado; por ejemplo, puede que quieras asignarlo a una variable o usarlo como parte de una expresi6n: x = nath.ct rea = (wath.sqrt (5) + 1) / 2 (cadians} Cuando Hamas a una funcién en modo interactivo, Python muestra el resultado: >>> nath.agrt (5 Pero en un script, si llamas a una funcién productiva y no almacenas el resultado de la misma en una variable, jel valor de retorno se desvanece en la niebla! Este script calcula la rafz cuadrada de 5, pero dado que no almacena el resultado cen una variable ni lo muestra, no resulta en realidad muy itil Las funciones estériles pueden mostrar algo en a pantalla o tener cualquier otro efecto, pero no devuelven un valor. Si intentas asignar el resultado a una variable, obtendras un valor especial Iamado None (nada). >>> resultado = print_swice{"Bing") bing Bing >>> print resu 54 Capitulo 4, Funciones EI valor None no es el mismo que la cadena ‘None'. Es un valor especial que tiene su propio tipo: ee Para devolver un resultado desde una funcién, usamos la sentencia return dentro de ella, Por ejemplo, podemos crear una funcién muy simple llamada sunados, que suma dos mimeros y devuelve el resultado, Cuando se ejecuta este script, la sentencia print mostraré “8”, ya que la funcién sumacos ha sido Namada con 3 y 5 como argumentos. Dentro de la funcién, los parimetros a y b equivaldrin a 3 y a 5 respectivamente. La funcién calculé la suma de ambos mimero y la guardé en una variable local a la funcién llamada uma. Después us la sentencia return para enviar el valor calculado de vuelta al cédigo de llamada como resultado de la funcién, que fue asignado a la variable x ¥y mostrado en pantalla. 4.11. {Por qué funciones? Puede no estar muy claro por qué met ma en funciones, Existen varias razones: a pena molestarse en dividir un progra- = El crear una funcién nueva te da oportunidad de dar nombre aun grupo de sentencias, lo cual hace a tu programa més facil de leer, entender, y depurar. = Las funciones pueden hacer un programa mas pequefio, al eliminar c6digo repetido. Ademés, si quieres realizar cualquier cambio en el futuro, sélo tendrés que hacerlo en un nico lugar. = Dividir un programa largo en funciones te permite depurar las partes de una en una y luego ensamblarlas juntas en una sola pieza. 1 Las funciones bien disefiadas a menudo resultan tiles para otros muchos programas. Una vez que has escrito y depurado una, puedes reutilizarla A lo largo del resto de! libro, a menudo usaremos una definicién de funcién para explicar un concepto. Parte de la habilidad de crear y usar funciones consiste en egar a tener una funcién que capture correctamente una idea, como “encontrar el valor més pequefio en una lista de valores”. Mas adelante te mostraremos el cédigo para encontrar el valor més pequeiio de una lista de valores y te lo presentaremos como una funcién llamada min, que toma una lista de valores como argumento y devuelve el menor valor de esa lista. Depuracién 55 4.12. Depura Si estés usando un editor de texto para escribir tus propios scripts, puede que tengas problemas con los espacios y tabulaciones. El mejor modo de evitar esos problemas es usar espacios exclusivamente (no tabulaciones). La mayorfa de los editores de texto que reconocen Python lo hacen asf por defecto, aunque hay algu- nos que no, Las tabulaciones y los espacios normalmente son invisibles, lo cual hace que sea 0.9 Sobresaliente > 0.8 Notable >0.7 Bien > 0.6 Suficiente < 0.6 Introduzca punt! Sobresaliente In Puntuacié punt Introduzca puntuacién: 0.5 Insuficiente Ejecuta el programa repetidamente para probar con varios valores de entrada dife- rentes, 58 ‘apitulo 4. Funciones Capitulo 5 Iteracién 5.1. Actualizacién de variables Uno de los usos habituales de las sentencia de asignacién consiste en realizar una actualizacién sobre una variable — en la cual el valor nuevo de esa variable depende del antiguo. Esto quiere decir nuevo valor”. toma el valor actual de x, afiédele 1, y luego actualiza x con el Si intentas actualizar una variable que no existe, obtendrés un error, ya que Python evaltia el lado derecho antes de asignar el valor a x: >> x = xl NameErsor: nane ‘xt is not defined Antes de que puedas actualizar una variable, debes inicializarla, normalmente ‘mediante una simple asignacién: D> x = xl Actualizar una variable afiadiéndole 1 se denomina incrementar; restarle 1 recibe el nombre de decrementar (0 disminuir). 5.2, La sentencia while Los PCs se suelen utilizar a menudo para automatizar tareas repetitivas. Repetit tareas idénticas o muy similares sin cometer errores es algo que a las maquinas se les da bien y en cambio a las personas no. Como las iteraciones resultan tan habituales, Python proporciona varias caracteristicas en su lenguaje para hacerlas ‘ms sencillas, 60 Capitulo 5. Iteracién Una forma de iteracién en Python es la sentencia wile. He aqui un programa sencillo que cuenta hacia atrés desde cinco y luego dice “;Despegue!”. 5 P * jDespague!* Casi se puede leer la sentencia while como si estuviera escrita en inglés. Significa, “Mientras n sea mayor que 0, muestra el valor de n y Iuego reduce el valor de n en 1 unidad. Cuando llegues a 0, sal de la sentencia while y muestra la palabra Despegue!” Este es el flujo de ejecucién de la sentencia wh formal: explicado de un modo més 1, Se evalia la condicién, obteniendo Verdadero or Faso, 2. Sila condicién es falsa, se sale de la sentencia while y se continta la eje- cucién en la siguiente sentencia, 3. Si la condicién es verdadera, se ejecuta el cuerpo del while y luego se vuelve al paso 1. Este tipo de flujo recibe el nombre de bucle, ya que el tercer paso enlaza de nuevo con el primero. Cada vez que se ejecuta el cuerpo del bucle se dice que realiza- mos una iteracién. Para el bucle anterior, podrfamos decir que “ha tenido cinco iteraciones”, lo que significa que el cuerpo del bucle se ha ejecutado cinco veces. EI cuerpo del bucle debe cambiar el valor de una o més variables, de modo que la condicién pueda en algin momento evaluarse como falsa y el bucle termine. La variable que cambia cada vez que el bucle se ejecuta y controla cudndo termina éste, recibe el nombre de variable de iteracién. Si no hay variable de iteracién, el bucle se repetiré para siempre, resultando asf un bucle infinito, 5.3. Bucles infinitos Una fuente de diversién sin fin para los programadores es la constatacién de que las instrucciones del champ&: “Enjabone, aclare, repita”, son un bucle infinito, ya que no hay una variable de iteracién que diga cudntas veces debe ejecutarse el proceso. Enel caso de una cuenta atrds, podemos verificar que el bucle termina, ya que sabemos que el valor de n es finito, y podemos ver que ese valor se va haciendo més pequefio cada vez que se repite el bucle, de modo que en algiin momento egaré a 0, Otras veces un bucle es obviamente infinito, porque no tiene ninguna variable de iteracién, “Bucles infinitos” y break 61 A veces no se sabe si hay que terminar un bucle hasta que se ha recorrido la mitad del cuerpo del mismo. En ese caso se puede crear un bucle infinito a propésito y usar la sentencia break para salir fuera de él cuando se desee. El bucle siguiente es, obviamente, un bucle infinito, porque la expresi6n légica de la sentencia whi Le es simplemente la constante I6gica True (verdadero); Si cometes el error de ejecutar este cédigo, aprenderés répidamente cémo detener un proceso de Python bloqueado en el sistema, 0 tendrés que localizar dénde se encuentra el botdn de apagado de tu equipo. Este programa funcionaré para siem- pre, 0 hasta que Ia baterfa del equipo se termine, ya que la expresiGn I6gica al Principio del bucle es siempre cierta, en virtud del hecho de que esa expresién es precisamente el valor constante True A pesar de que en este caso se trata de un bucle infinito intl, se puede usar ese disefio para construir bucles iitiles, siempre que se tenga la precaucién de aftadir digo en el cuerpo del bucle para salir explicitamente, usando break cuando se haya alcanzado la condicién de salida. Por ejemplo, supén que quieres recoger entradas de texto del usuario hasta que éste escriba fin, Podrias escribir: La condicién del bucle es True, lo cual es verdadero siempre, asf que el bucle se repetiré hasta que se ejecute la sentencia break. Cada vez que se entre en el bucle, se pediré una entrada al usuario. Si el usuario escribe fin, la sentencia break hard que se salga del bucle. En cualquier otro caso, cl programa repetiré cualquier cosa que el usuario escriba y volverd al principio del bucle. Este es un ejemplo de su funcionamiento: 62 Capitulo Este modo de escribir bucles whi le es habitual, ya que ast se puede comprobar la condicién en cualquier punto del bucle (no s6lo al principio), y se puede expresar Ja condicién de parada afirmativamente (“detente cuando ocurta..”), en vez de tener que hacerlo con ldgica negativa (“sigue haciéndolo hasta que ocurra..) 5.5. Finalizar iteraciones con cont inue Algunas veces, estando dentro de un bucle se necesita tetminar con la iteracién actual y saltar a Ia siguiente de forma inmediata, En ese caso se puede utilizar la sentencia continue para pasar a la siguiente iteracidn sin terminar la ejecucién del cuerpo del bucle para la actual A continuacién se muestra un ejemplo de un bucle que repite lo que recibe co- mmo entrada hasta que el usuario escribe “fin”, pero trata las Iineas que empiezan por el cargeter almohadilla como lineas que no deben mostrarse en pantalla (algo parecido a lo que hace Python con los comentarios). while Teue! Linea = raw if Linealo He aqui una ejecucién de ejemplo de ese nuevo programa con la sentencia continue affadida, > hola a todos Todas las Iineas se imprimen en pantalla, excepto Ia que comienza con el simbolo de almohadilla, ya que en ese caso se ejecuta y salta de vuelta a la sentencia while para comenzar la siguiente iteraci ‘modo que que se omite la sentencia print ‘tinue, finaliza la iteraci6n actual a, de 5.6. Bucles definidos usando for A veces se desea repetir un bucle a través de un conjunto de cosas, como una lista de palabras, las lineas de un archivo, o una lista de ntimeros. Cuando se tiene una lista de cosas para recorrer, se puede construir un bucle definido usando una Disefios de bucles 63 sentencia for. A la sentencia whi e se la llama un bucle indefinido, porque sim- plemente se repite hasta que cierta condicién se hace Fala, mientras que el bucle for se repite a través de un conjunto conocido de elementos, de modo que ejecuta tantas iteraciones como elementos hay en el conjunto. La sintaxis de un bucle for es similar a la del bucle waite, en ella hay una sen- tencia for y un cuerpo que se repite: nigos = ['Joseph', ‘Glenn’, Sally") foe amigo in aniges! ‘Peli al ever", anigo ferinado! En términos de Python, la variable amigos es una lista! de tres cadenas y el bucle se mueve recorriendo la lista y ejecuta su cuerpo una vez para cada una de las tres cadenas en Ia lista, produciendo esta salida: iz af suevor Joseph erminade! La traduccién de este bucle for al espaiiol no es tan directa como en el caso del while, pero si piensas en los amigos como un conjunto, seria algo asi como: “Bjecuta las sentencias en el cuerpo del bucle una vez para cada amigo que esté en {in) el conjunto Hamado amigos.” Revisando el bucle, for, for e in son palabras reservadas de Python, mientras que amigo y amigos son variables. for anigo in amigos: print ‘Feliz afio nuevo:’, amigo Enconcreto, amigo es la variable de iteracién para el bucle for. La variable amigo cambia para cada iteracién del bucle y controla cuindo se termina el bucle for. La variable de iteracion se desplaza sucesivamente a través de las tres cadenas almacenadas en la variable amigos. ‘A menudo se usa un bucle for o wile para movernos a través de una lista de elementos 0 el contenido de un archivo y se busca algo, como el valor mas grande el més pequefio de los datos que estamos revisando. Los bucles generalmente se construyen asf « Se inicializan una o més variables antes de que el bucle comience "Examinaremos ls stas con mis dtalle en un capital posterior. 64 Capitulo 1 Se realiza alguna operacisn con cada elemento en el cuerpo del bucle, posi- blemente cambiando las variables dentro de ese cuerpo, ' Se revisan las variables resultantes cuando el bucle se completa Usaremos ahora una lista de némeros para demostrar los conceptos y construccién de estos diserios de bucles, 5.7.1. Bucl de recuento y suma Por ejemplo, para contar el mimero de elementos en una lista, podemos escribir el siguiente bucle for: elesentos: ", contador Ajustamos Ia variable contador a cero antes de que el bucle comience, después escribimos un bucle for para movernos a través de la lista de mimeros, Nuestra variable de iteracién se Tama valor, y dado que no usamos valor dentro del bucle, lo tinico que hace es controlar el bucle y hacer que el cuerpo del mismo sea ejecutado una vez. para cada uno de los valores de la lista, En el cuerpo del bucle, afiadimos 1 al valor actual de contador para cada uno de los valores de la lista. Mientras el bucle se es tando, el valor de contador es la cantidad de valores que se hayan visto “hasta ese momento’ Una ver el bucle se completa, el valor de contador es el mimero total de elemen- tos. El nimero total “cae en nuestro poder” al final del bucle. Se construye el bucle de modo que obtengamos lo que queremos cuando éste termina, Otro bucle similar, que calcula el total de un conjunto de ntimeros, se muestra a continuacién: =o valor in 13, 41, 22, print To cle, sfuilizamos la variable de iteracién, Ein vez de afiadir simplemen- ‘acior como en el bucle previo, ahora durante cada iteracién del bucle afiadimos el ntimero actual (3, 41, 12, etc.) al total en ese momento. Si piensas en la variable total, ésta contiene la “suma parcial de valores hasta ese momen- to”, Asf que antes de que el bucle comience, total es cero, porque atin no se ha examinado ningtin valor. Durante el bucle, total es la suma parcial, y al final del bucle, total es la suma total definitiva de todos los valores de la lista Cuando el bucle se ejecuta, tot 21 acumula la suma de los elementos; una variable que se usa de este modo recibe a veces el nombre de acumulador. Disefios de bucles 65 Niel bucle que cuenta los elementos ni el que los suma resultan particularmente tiles en la préctica, dado que existen las funciones internas len () y sum() que ‘cuentan el nimero de elementos de una lista y el total de elementos en la misma respectivamente, 5.7.2. Bucles de maximos y minimos Para encontrar el valor mayor de una lista 0 secuencia, construimos el bucle si- guiente: ayor = None for valor in (3, 41, 12 "Bucle:', valor, mayor Cuando se ejecuta el programa, se obtiene la siguiente salida: Debemos pensar en la variable mayor como el “mayor valor visto hasta ese mo- mento”. Antes del bucle, asignamos a nayor el valot None, None es un valor cons tante especial que se puede almacenar en una variable para indicar que la variable std “vacia’” ‘Antes de que el bucle comience, el mayor valor visto hasta entonces es None, dado que no se ha visto atin ningén valor. Durante la ejecucién del bucle, si mayo: es None, entonces tomamos el primer valor que tenemos como el mayor hasta entonces. Se puede ver en la primera iteracién, cuando el valor de valor es 3, mientras que mayor es None, inmediatamente hacemos que mayor pase a ser 3. Tras la primera iteracién, mayor ya no es None, as{ que la segunda parte de la expresisn ldgica compuesta que comprueba si valor >ayor se activard sélo cuando encontremos un valor que sea mayor que el “mayor hasta ese momen- to”. Cuando encontramos un nuevo valor “mayor ain”, tomamos ese nuevo valor para nayor. Se puede ver en la salida del programa que mayor pasa desde 3 41 y luego a 74. Al final del bucle, se habrin revisado todos los valores y la variable mayor con- tendré entonces el valor mas grande de la lista 66 Capitulo 5. Iteracién Para calcular el niimero més pequefio, el cédigo es muy similar con un pequefio cambio: print Antes: for valor enor = valo: print "Nenor:', menor De nuevo, menor es el “menor hasta ese momento” antes, durante y después de que el bucle se ejecute. Cuando el bucle se ha completado, menor contendra el valor minimo de la lista También como en el caso del mimero de elementos y de la suma, las funciones in- temas max () yin () convierten la escritura de este tipo de bucles en innecesaria. Lo siguiente es una versién simple de la funcién interna de Python min () Lor < menor! En esta versién de la funcién para calcular el minimo, hemos eliminado las senten- cias print, de modo que sea equivalente a la funcién mn, que ya esté incorporada dentro de Python. 5.8. Depuracién ‘A medida que vayas escribiendo programas mas grandes, puede que notes que vas necesitando emplear cada vez més tiempo en depurarlos. Mas c6digo signifi- ca mas oportunidades de cometer un error y més lugares donde los bugs pueden esconderse. Un método para acortar el tiempo de depuracién es “depurar por biseccién”, Por ejemplo, si hay 100 lineas en tu programa y las compruebas de una en una, te Mevaré 100 pasos. En lugar de eso, intenta partir el problema por la mitad. Busca en medio del pro- grama, 0 cerca de ahi, un valor intermedio que puedas comprobar, Afiade una sen- tencia print (o alguna otra cosa que tenga un efecto verificable), y haz funcionar el programa. Si en el punto medio la verificacién es incorrecta, el problema deberfa estar en la primera mitad del programa. Si ésta es correcta, el problema estard en la segunda mitad,

También podría gustarte