Aprenda a Pensar Como un Programador                           con Python
Aprenda a Pensar Como un Programador                             con Python                                   Allen Downey...
Copyright c 2002 Allen Downey, Jeffrey Elkner, y Chris Meyers.Corregido por Shannon Turlington y Lisa Cutler.Dise˜o de la c...
Pr´logo  oPor David BeazleyComo educador, investigador, y autor de libros, estoy encantado de ver la fi-nalizaci´n de este ...
vi                                                                      Pr´logo                                           ...
PrefacioPor Jeff ElknerEste libro debe su existencia a la colaboraci´n hecha posible por la Internet y                     ...
viii                                                                   Prefacionecesidad. Convencido de que deb´ de haber ...
ixpartir de ´l me hizo posible hacerlo, mostrando al mismo tiempo que el modelo          ecooperativo de desarrollo que ta...
x                                                                       PrefacioEl primer ejemplo del texto ilustra esta c...
xilo que es una variable ya es suficientemente dif´ para estudiantes principiantes                                         ...
xii                                                                  Prefaciodisponibles para nuestro uso y ahorrar un tie...
Lista de ColaboradoresParafraseando la filosof´ de la Free Software Foundation, este libro es libre                       ı...
xiv                                                  Lista de Colaboradores      Michael Conlon envi´ una correcci´n grama...
xvMichael Schmitt envi´ una correcci´n del Cap´                    o             o         ıtulo sobre archivos y excep-ci...
xvi                                                   Lista de Colaboradores      Andy Mitchell pill´ un error tipogr´fico ...
´Indice generalPr´logo  o                                                                                    vPrefacio    ...
xviii                                                               ´                                                     ...
´Indice general                                                                     xix   4.7.   Condiciones anidadas . . ...
xx                                                                   ´                                                    ...
´Indice general                                                                    xxi   8.15. Matrices . . . . . . . . . ...
xxii                                                                   ´                                                  ...
´Indice general                                                                  xxiii   14.4. Un ejemplo m´s complicado ....
xxiv                                                               ´                                                      ...
´Indice general                                                                   xxv   19.4. Cola Enlazada Mejorada . . ....
xxvi                                                              ´                                                       ...
Cap´   ıtulo 1El Camino del ProgramaEl objetivo de este libro es ense˜arle a pensar como lo hacen los cient´              ...
2                                                    El Camino del ProgramaComo se puede deducir de la nomenclatura “lengu...
1.2 ¿Qu´ es un programa?       e                                                                         3int´rprete: modo...
4                                                 El Camino del Programaun sistema de ecuaciones o determinar las ra´ de u...
1.3 ¿Qu´ es la depuraci´n (debugging)?       e               o                                                        51.3...
6                                                   El Camino del Programa1.3.4.    Depuraci´n experimental               ...
1.4 Lenguajes formales y lenguajes naturales                                    7     Los lenguajes de programaci´n son le...
8                                                   El Camino del Programaredundancia: Para reducir la ambig¨edad y los ma...
1.6 Glosario                                                                    9Este es un ejemplo de una sentencia print...
10                                               El Camino del Programaerror (bug): Un error en un programa.depuraci´n: El...
Cap´   ıtulo 2Variables, expresiones ysentencias2.1.     Valores y tiposEl valor es uno de los elementos fundamentales (co...
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Aprenda a pensar como un programador con python
Próxima SlideShare
Cargando en…5
×

Aprenda a pensar como un programador con python

1.289 visualizaciones

Publicado el

...

Publicado en: Educación
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
1.289
En SlideShare
0
De insertados
0
Número de insertados
13
Acciones
Compartido
0
Descargas
32
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Aprenda a pensar como un programador con python

  1. 1. Aprenda a Pensar Como un Programador con Python
  2. 2. Aprenda a Pensar Como un Programador con Python Allen Downey Jeffrey Elkner Chris Meyers Traducido por ´ Miguel Angel Vilella ´ Angel Arnal Iv´n Juanes a Litza Amurrio Efrain Andia C´sar Ballardini e Green Tea Press Wellesley, Massachusetts
  3. 3. Copyright c 2002 Allen Downey, Jeffrey Elkner, y Chris Meyers.Corregido por Shannon Turlington y Lisa Cutler.Dise˜o de la cubierta por Rebecca Gimenez. nGreen Tea Press1 Grove St.P.O. Box 812901Wellesley, MA 02482Se permite copiar, distribuir, y/o modificar este documento bajo los t´rminos de ela GNU Free Documentation License, Versi´n 1.1 o cualquier versi´n posterior o opublicada por la Free Software Foundation; siendo las Secciones Invariantes“Pr´logo”, “Prefacio”, y “Lista de Colaboradores”, sin texto de cubierta, y osin texto de contracubierta. Se incluye una copia de la licencia en el ap´ndice etitulado “GNU Free Documentation License”.La GNU Free Documentation License est´ disponible en www.gnu.org o escri- abiendo a la Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,MA 02111-1307, USA.La forma original de este libro es c´digo fuente L TEX. La compilaci´n de este o A ofuente L TE A X tiene el efecto de generar una representaci´n independiente del odispositivo de un libro de texto, que puede convertirse a otros formatos e im-primirse.El fuente L TEX de este libro y m´s informaci´n sobre el proyecto de Libro de A a oTexto de C´digo Abierto est´n disponibles en o a http://www.thinkpython.comLa composici´n de este libro se realiz´ utilizando L TEX y LyX. Las ilustraciones o o Ase hicieron con xfig. Todos ellos son programas gratuitos de c´digo abierto. oHistoria de la impresi´n: oAbril 2002: Primera edici´n. oISBN 0-9716775-0-6
  4. 4. Pr´logo oPor David BeazleyComo educador, investigador, y autor de libros, estoy encantado de ver la fi-nalizaci´n de este libro. Python es un lenguaje de programaci´n divertido y o oextremadamente f´cil de usar que en los ultimos a˜os se ha hecho muy popu- a ´ nlar. Desarrollado hace diez a˜os por Guido van Rossum, su sintaxis simple y la nsensaci´n general se deriva en gran parte del ABC, un lenguaje desarrollado en olos 1980s para la ense˜anza. Sin embargo, Python tambi´n se cre´ para resolver n e oproblemas reales y presenta una variedad amplia de caracter´ ısticas de lenguajesde programaci´n como C++, Java, Modula-3 y Scheme. Debido a esto, una de olas caracter´ ısticas notables de Python es su atractivo para los desarrolladoresprofesionales de progamaci´n, cient´ o ıficos, investigadores, artistas, y educadores.A pesar del atractivo de Python para muchas comunidades diferentes, puedeque a´n se pregunte “¿por qu´ Python?” o “¿por qu´ ense˜ar programaci´n u e e n ocon Python?”No es tarea f´cil responder a estas preguntas, en especial cuando ala opini´n popular est´ del lado de alternativas m´s masoquistas como C++ y o a aJava. Sin embargo, pienso que la respuesta m´s directa es que la progrmaci´n a oen Python es simplemente m´s divertida y m´s productiva. a aCuando imparto cursos de inform´tica, quiero cubrir conceptos importantes, ahacer el material interesante y enganchar a los estudiantes. Desgraciadamente,hay una tendencia en los cursos de introducci´n a la programaci´n a prestar o odemasiada atenci´n a la abstracci´n matem´tica que hace que los estudiantes o o ase frustren con problemas farragosos relacionados con detalles nimios de la sin-taxis, compilaci´n, y la aplicaci´n de reglas aparentemente arcanas. Aunque o otal abstraci´n y formalismo son importantes para ingenieros profesionales de la oprogramaci´n y estudiantes que planean continuar sus estudios de inform´tica, o adecidirse por este enfoque en un curso introductorio s´lo tiene ´xito en hacer o eaburrida la inform´tica. Cuando imparto un curso, no quiero tener un aula de aestudiantes sin inspiraci´n. Quisiera verlos intentando resolver problemas in- oteresantes, explorando ideas diferentes, probando enfoques no convencionales,
  5. 5. vi Pr´logo orompiendo las reglas, y aprendiendo de sus errores. Al hacerlo, no quiero perderla mitad del semestre tratando de sortear problemas con una sintaxis abstru-sa, mensajes de error del compilador incomprensibles, o los varios cientos demaneras que un programa puede generar un error de proteci´n general. oUna de las razones por las que me gusta Python es por que proporciona un equi-librio muy bueno entre lo pr´ctico y lo conceptual. Puesto que Python es un alenguaje interpretado, los principiantes pueden tomar el lenguaje y empezar ahacer cosas interesantes casi inmediato, sin perderse el los problemas de compila-ci´n y enlazado. Adem´s, Python viene con una gran biblioteca de m´dulos que o a ose pueden usar para hacer toda clase de tareas que abarcan desde programaci´n opara web a gr´ficos. Este enfoque pr´ctico es una buena manera de enganchar a a aestudiantes y permite que completen proyectos significativos. Sin embargo, Pyt-hon tambi´n puede servir como una base excelente para intruducir conceptos eimportantes de inform´tica. Puesto que Python soporta completamente proce- adimientos y clases, los estudiantes pueden introducirse gradualmente en temascomo abstracci´n procedural, estructuras de datos, y programaci´n orientada a oobjetos, que son aplicables a cursos posteriores en Java o C++. Python inclusotoma prestada cierta cantidad de caracter´ ısticas de lenguajes de programaci´n ofuncionales y puede usarse para intruducir conceptos que pudieran ser cubiertosen mas detalle en cursos de Scheme o Lisp.Leendo, el prefacio de Jeffrey, me sorprenden sus comentarios sobre que Pyt-hon le permite ver un “m´s alto nivel de ´xito y un bajo nivel de frustraci´n a e o 2que puede “avanzar r´pido con mejores resultados”. Aunque estos comentarios ase refieren a sus cursos introductorios, a veces uso Python por estas mismasrazones en cursos de inform´tica avanzada en la Universidad de Chicago. En aestos cursos me enfrento constantemente con la desalentadora tarea de cubrirun mont´n de material dif´ en un agotador trimestre de nueve semanas. Aun- o ıcilque es ciertamente posible para m´ infligir mucho dolor y sufrimiento usando un ılenguaje como C++, he visto a menudo que ese estilo es ineficaz, especialmentecuando el curso se trata de un asunto sin relaci´n apenas con la “programaci´n”. o oEncuentro que usar Python me permite dedicarme m´s al asunto en cuesti´n a omientras permito a los estudiantes completar proyectos utiles. ´Aunque Python es todav´ un lenguaje joven y en desarollo, creo que tiene ıaun futuro brillante en la educaci´n. Este libro es un paso importante en esa odirecci´n. oDavid BeazleyUniversidad de ChicagoAutor de Python Essential Reference
  6. 6. PrefacioPor Jeff ElknerEste libro debe su existencia a la colaboraci´n hecha posible por la Internet y oal movimiento de software libre. Sus tres autores, un profesor universitario, unprofesor de instituto y un programador profesional, todav´ tienen que conocerse ıacara a cara, pero hemos sido capaces de colaborar estrechamente y hemos reci-bido la ayuda de mucha gente maravillosa que han donado su tiempo y esfuerzopara ayudar a mejorar este libro.Creemos que este libro es un testamento a los beneficios y futuras posibilidadesde este tipo de colaboraci´n, cuyo marco han establecido Richard Stallman y la oFree Software Foundation.C´mo y por qu´ vine a usar Python o eEn 1999, el examen de Advanced Placement (AP) de Ciencias de la Computa-ci´n del Claustro Escolar se realiz´ por primera vez en C++. Como en muchos o oinstitutos en todo el pa´ la decisi´n de cambiar de lenguaje tuvo un impacto ıs, odirecto sobre el curriculum de inform´tica en el Insituto de Yorktown en Ar- alington, Virgina, donde doy clase. Hasta ese momento, el lenguaje de ense˜anza nera Pascal tanto en nuestro curso de primer a˜o como en el AP. Al seguir con nla pr´ctica anterior de dar a los estudiantes dos a˜os de exposici´n al mismo a n olenguaje, tomamos la decisi´n de cambiar a C++ en el aula de primer a˜o del o ncurso 1997-98 de modo que estar´ ıamos en sinton´ con el cambio del Claustro ıaEscolar para el curso AP del a˜o siguiente. nDos a˜os m´s tarde, me convenc´ de que C++ era una mala elecci´n para iniciar n a ı oa los estudiantes en la inform´tica. Aunque es un lenguaje de programaci´n a omuy poderoso, tambi´n es extremadamente dif´ de aprender y ense˜ar. Me e ıcil nencontr´ luchando constantemente con la dif´ sintaxis de C++ y sus m´ltiples e ıcil uformas de hacer las cosas, y como consecuencia perd´ muchos estudiantes sin ıa
  7. 7. viii Prefacionecesidad. Convencido de que deb´ de haber una elecci´n mejor para el lenguaje ıa ode nuestro curso de primer a˜o, me puse a buscar una alternativa para C++. nNecesitaba un lenguaje que funcionase tanto en las m´quinas de nuestro labo- aratorio de Linux como en las plataformas Windows y Macintosh que la mayor´ ıade los estudiantes ten´ en casa. Quer´ que fuera de c´digo abierto, para que ıan ıa olos estudiantes pudieran usarlo en casa sin importar su nivel econ´mico. Quer´ o ıaun lenguaje utilizado por programadores profesionales, y que tuviera una co-munidad activa de desarrolladores a su alrededor. Ten´ que soportar tanto la ıaprogramaci´n procedural como la orientada a objetos. Y lo m´s importante, o aten´ que ser f´cil de aprender y de ense˜ar. Cuando investigu´ las opciones con ıa a n eestos obejetivos en mente, Python destac´ como el mejor candidato. oPed´ a uno de los estudiantes m´s talentosos de Yorktown, Matt Ahrens, que ı aprobase Python. En dos meses, no s´lo hab´ aprendido el lenguaje, sino que o ıaescribi´ una aplicaci´n llamada pyTicket que permit´ a nuestro personal infor- o o ıamar de problemas tecnol´gicos via Web. Sab´ que Matt no pod´ terminar una o ıa ıaaplicaci´n de tal escala en tan poco tiempo con C++, y este logro, combinado ocon la positiva valoraci´n de Python por parte de Matt, suger´ que Python era o ıala soluci´n que buscaba. oEncontrar un libro de textoUna vez decidido a usar Python tanto en mis clases de inform´tica b´sica como a aen el a˜o siguiente, el problema m´s acuciante era la falta de un libro de texto n adisponible.El contenido libre vino al rescate. Anteriormente en ese a˜o, Richard Stallman nme present´ a Allen Downey. Ambos hab´ o ıamos escrito a Richard expresandonuestro inter´s en desarrollar conenidos educativos libres. Allen ya hab´ escrito e ıaun libro de texto de inform´tica de primer a˜o, How to Think Like a Com- a nputer Scientist. Cuando le´ ese libro, supe inmediatamente que quer´ usarlo ı ıaen mi clase. Era el libro de inform´tica m´s claro y pr´ctico que hab´ visto. a a a ıaPon´ el ´nfasis en los procesos de pensamiento involucrados en la programaci´n ıa e om´s que en las caracter´ a ısticas de un lenguaje en particular. Su lectura me hizoinmediatamente un maestro mejor.How to Think Like a Computer Scientist no era s´lo un libro excelente, sino que ose public´ bajo la licencia p´blica GNU, lo que significaba que pod´ usarse y o u ıamodificarse libremente para ajustarse a las necesidades de su usuario. Una vezque decid´ usar Python, se me ocurri´ que podr´ traducir la versi´n original ı o ıa oen Java del libro de Allen al nuevo lenguaje. Aunque no hubiera sido capaz deescribir un libro de texto por mi cuenta, tener el libro de Allen para trabajar a
  8. 8. ixpartir de ´l me hizo posible hacerlo, mostrando al mismo tiempo que el modelo ecooperativo de desarrollo que tan buenos resultados hab´ dado en el software ıapod´ funcionar tambi´n para el contenido educativo. ıa eEl trabajo en este libro durante los dos ultimos a˜os ha sido gratificante para mis ´ nestudiantes y para m´ y mis estudiantes desempe˜aron un importante papel en ı, nel proceso. Como pod´ hacer cambios instant´neos cuando alguien encontraba ıa aun error ortogr´fico o un pasaje dif´ a ıcil, los anim´ a buscar errores en el libro ed´ndoles un punto extra cada vez que hac´ una sugerencia que terminaba a ıancomo un cambio en el texto. Esto tuvo el doble beneficio de animarlos a leer eltexto con m´s atenci´n y tener el texto revisado en profundidad por sus cr´ a o ıticosm´s importantes: los estudiantes que lo usan para aprender inform´tica. a aPara la segunda mitad del libro, acerca de la programaci´n orientada a objetos, osab´ que necesitar´ a alguien con m´s experiencia real en programaci´n de ıa ıa a ola que yo ten´ para hacerlo bien. El libro se estanc´ en un estado inacabado ıa odurante buena parte de un a˜o hasta que la comunidad de c´digo abierto de n onuevo proporcion´ los medios necesarios para su terminaci´n. o oRecib´ un correo electr´nico de Chris Meyers expresando su inter´s en el li- ı o ebro. Chris es un programador profesional que empez´ a impartir un curso de oprogramaci´n con Python el a˜o pasado en el Colegio de Lane Community, o nen Eugene, Oregon. La perspectiva de impartir el curso llev´ a Chris has- ota el libro, y empez´ a colaborar con ´l inmediatamente. Hacia el final del o ea˜o escolar hab´ creado un proyecto complementario en nuesto sitio web en n ıahttp://www.ibiblio.org/obp llamado Python for Fun y estaba trabajandocon algunos de mis estudiantes aventajados como profesor magistral, dirigi´ndo- eles m´s all´ de donde yo pod´ llevarles. a a ıaPresentando la programaci´n con Python oEl proceso de traducir y usar How to Think Like a Computer Scientist duran-te los dos ultimos a˜os ha confirmado la idoneidad de Python para ense˜ar a ´ n nestudiantes principiantes. Python simplifica enormemente los ejemplos de pro-gramaci´n y facilita la ense˜anza de los conceptos importantes en programaci´n. o n o
  9. 9. x PrefacioEl primer ejemplo del texto ilustra esta cuesti´n. Es el tradicional programa o“hola, mundo”, que en la versi´n C++ del libro es as´ o ı: #include <iostream.h> void main() { cout << "Hola, mundo" << endl; }en la versi´n Python se convierte en: o print "Hola, Mundo"Aunque es un ejemplo trivial, destacan las ventajas de Python. El curso deInform´tica I en Yorktown no tiene prerrequisitos, as´ que muchos de los estu- a ıdiantes que ven este ejemplo est´n mirando su primer programa. Algunos de aellos est´n sin duda un poco nerviosos, tras haber o´ que programar compu- a ıdotadores es algo dif´ de aprender. La versi´n C++ siempre me ha obligado a ıcil oelegir entre dos opciones insatisfactorias: explicar las sentencias #include, voidmain(), {, y } y arriesgarme a confundir o intimidar a algunos estudiantes desdeel principio, o decirles “No te preocupes de todo eso ahora, hablaremos de ellom´s tarde”, y arriesgarme a lo mismo. Los objetivos educativos en este momento adel curso son exponer a los estudiantes a la idea de una sentencia de progra-maci´n y llevarles a escribir su primer programa, present´ndoles de esta forma o ael entorno de programaci´n. La programaci´n con Python tiene exactamente lo o oque necesito para hacer estas cosas, y nada m´s. aLa comparaci´n del texto explicativo de este programa para cada versi´n del o olibro ilustra mejor lo que esto significa para los estudiantes principiantes. Haytrece p´rrafos de explicaci´n de “¡Hola, mundo!” en la versi´n C++. En la a o oversi´n Python s´lo hay dos. A´n m´s importante: los once p´rrafos que faltan o o u a ano tocan las “grandes ideas” de la programaci´n de computadores, sino las ominucias de la sintaxis de C++. Encontr´ que esto mismo suced´ por todo el e ıalibro. P´rrafos enteros desapareciendo de la versi´n Python del texto porque la a osintaxis clara de Python los hace innecesarios.El uso de un lenguaje de muy alto nivel como Python permite que el profesordeje para m´s tarde hablar sobre los detalles de bajo nivel de la m´quina hasta a aque los estudiantes tengan el fondo necesario para entender los detalles. De estemodo crea la habilidad de poner pedag´gicamente “antes lo primero”. Uno de olos mejores ejemplos de ello es la manera en la cual Python maneja las variables.En C++ una variable es un nombre para un lugar que contiene una cosa. Lasvariables deben declararse seg´n su tipo en parte porque el tama˜o del lugar al u nque apuntan tiene que determinarse de antemano. As´ la idea de una variable ı,est´ ligada al hardware de la m´quina. El concepto poderoso y fundamental de a a
  10. 10. xilo que es una variable ya es suficientemente dif´ para estudiantes principiantes ıcil(tanto de inform´tica como de ´lgebra). Octetos y direcciones no ayudan a la a acomprensi´n. En Python una variable es un nombre que se˜ala una cosa. Este o nes un concepto mucho m´s intuitivo para estudiantes principiantes y est´ m´s a a acerca del significado de “variable” que aprendieron en su clase de matem´ticas. aEste a˜o tuve muchas menos dificultades ense˜ando lo que son las variables que n nen el anterior, y pas´ menos tiempo ayud´ndoles con los problemas derivados e ade su uso.Otro ejemplo de c´mo Python ayuda en la ense˜anza y aprendizaje de la pro- o ngramaci´n es en su sintaxis para las funciones. Mis estudiantes siempre han otenido una gran dificultad comprendiendo las funciones. El problema principalse centra alrededor de la diferencia entre la definici´n de una funci´n y la llama- o oda a una funci´n, y la distinci´n asociada entre un par´metro y un argumento. o o aPython viene al rescate con una sintaxis a la que no le falta belleza. La defini-ci´n de una funci´n empieza con la palabra clave def, y simplemente digo a mis o oestudiantes: “cuando definas una funci´n, empieza con def, seguido del nombre ode la funci´n que est´s definiendo; cuando llames a una funci´n, simplemente di o e o(escribe) su nombre”. Los par´metros van con las definiciones; los argumentos acon las llamadas. No hay tipo de retorno, tipos de par´metros, o par´metro por a areferencia y valor de por medio, por lo que ahora soy capaz de ense˜ar funciones nen la mitad de tiempo que antes, con mejor comprensi´n. oEl uso de Python ha mejorado la eficacia de nuestro programa de inform´ticaapara todos los estudiantes. Veo un mayor nivel general de ´xito y un menor enivel de frustraci´n del que experiment´ durante los dos a˜os que ense˜´ C++. o e n neAvanzo m´s r´pido con mejores resultados. M´s estudiantes terminan el curso a a acon la habilidad de crear programas utiles y con la actitud positiva hacia la ´experiencia de programaci´n que esto engendra. oFormar una comunidadHe recibido correos electr´nicos de todos los rincones del planeta de parte ode gente que usa este libro para aprender o enese˜ar a programar. Ha em- npezando a surgir una comunidad de usuarios, y muchas personas han contri-buido al proyecto mandando materiales a trav´s del sitio web complementario ehttp://www.thinkpython.com.Con la publicaci´n de este libro en forma impresa, espero que continue y se oacelere el crecimiento de la comunidad de usuarios. La emergencia de esta co-munidad de usuarios y la posibilidad que sugiere para colaboraciones similaresentre educadores han sido para m´ las partes m´s excitantes de trabajar en este ı aproyecto. Trabajando juntos, podemos incrementar la calidad de los materiales
  11. 11. xii Prefaciodisponibles para nuestro uso y ahorrar un tiempo valioso. Les invito a unirse anuestra comunidad y espero con impaciencia saber algo de ustedes. Por favor,escriban a los autores a feedback@thinkpython.com.Jeffrey ElknerEscuela Secundaria YortownArlington, Virginia
  12. 12. Lista de ColaboradoresParafraseando la filosof´ de la Free Software Foundation, este libro es libre ıacomo la libre expresi´n, pero no necesariamente gratis como la pizza gratis. oSe hizo realidad a causa de una colaboraci´n que no habr´ sido posible sin o ıala GNU Free Documentation License. As´ que queremos agradecer a la Free ıSoftware Foundation por desarrollar esta licencia y, por supuesto, ponerla anuestra disposici´n. oTambi´n nos gustar´ dar las gracias a los m´s de cien lectores de aguda vista e ıa aque se han preocupado de enviarnos sugerencias y correcciones en los dos ulti- ´mos a˜os. Siguiendo el esp´ n ıritu del software libre, decidimos expresar nuestragratitud en la forma de una lista de colaboradores. Desgraciadamente, esta listono est´ completa, pero hacemos lo que podemos para mantenerla actualizada. aSi se toma el tiempo de echar un vistazo a la lista, ver´ que cada una de las apersonas que aparecen le ha ahorrado a usted y a los lectores que le sucedanla confusi´n de un error t´cnico o una explicaci´n poco clara simplemente en- o e ovi´ndonos una nota. aPos imposible que parezca tras tantas correcciones, todav´ puede haber ıaerrores en el libro. Si se encontrara con una, esperamos que se tome unminuto para ponerse en contacto con nosotros. La direcci´n de correo es ofeedback@thinkpython.com. Si cambiamos algo a partir de su sugerencia, apa-recer´ en la siguiente versi´n de la lista de colaboradores (a no ser que pida a oquedar omitido). ¡Gracias! Lloyd Hugh Allen envi´ una correcci´n de la Secci´n 8.4. o o o Yvon Boulianne envi´ una correcci´n de un error sem´ntico en el Cap´ o o a ıtulo 5. Fred Bremmer comunic´ una correcci´n de la Secci´n 2.1. o o o Jonah Cohen escribi´ los scripts en Perl para convertir la fuente L TEX del o A libro en hermoso HTML.
  13. 13. xiv Lista de Colaboradores Michael Conlon envi´ una correcci´n gramatical del Cap´ o o ıtulo 2 y una mejora del estilo del Cap´ ıtulo 1, e inici´ una discusi´n sobre aspectos o o t´cnicos de los int´rpretes. e e Benoit Girard envi´ una correcci´n de un divertido error de la Secci´n 5.6. o o o Courtney Gleason y Katherine Smith escribieron horsebet.py, que se us´ como un caso de estudio en una versi´n temprana del libro. Su pro- o o grama puede encontrarse en el sitio web. Lee Harr comunic´ m´s correcciones de las que tenemos sitio para enume- o a rar aqu´ y de verdad deber´ aparecer como uno de los principales editores ı, ıa del texto. James Kaylin es un estudiante que us´ el texto. Envi´ numerosas correc- o o ciones. David Kershaw arregl´ la funci´n catTwice que no funcionaba en la Sec- o o ci´n 3.10. o Eddie Lam ha enviado numerosas correcciones de los Cap´ ıtulos 1, 2 y 3. Tambi´n arregl´ el Makefile de forma que crea un ´ e o ındice la primera vez que se ejecuta y nos ayud´ a preparar un esquema de versiones. o Man-Yong Lee envi´ una correcci´n del c´digo de ejemplo de la Secci´n o o o o 2.4. David Mayo se˜al´ que la palabra “unconscientemente”en el Cap´ n o ıtulo 1 deb´ cambiarse por “subconscientemente”. ıa Chris McAloon envi´ varias correciones de las Secciones 3.9 y 3.10. o Matthew J. Moelter ha sido un colaborador durante mucho tiempo y ha enviado numerosas correcciones y sugerencias. Simon Dicon Montford inform´ de una definici´n de funci´n faltante y o o o varios errores tipogr´ficos en el Cap´ a ıtulo 3. Tambi´n encontr´ errores en e o la funci´n incrementa del Cap´ o ıtulo 13. John Ouzts corrigi´ la definici´n de “valor de retorno”del Cap´ o o ıtulo 3. Kevin Parks envi´ valiosos comentarios y sugerencias acerca de c´mo me- o o jorar la distribuci´n del libro. o David Pool envi´ un error tipogr´fico en el glosario del Cap´ o a ıtulo 1, y tambi´n amables palabras de ´nimo. e a
  14. 14. xvMichael Schmitt envi´ una correcci´n del Cap´ o o ıtulo sobre archivos y excep-ciones.Robin Shaw se˜al´ un error en la Secci´n 13.1, donde la funci´n impri- n o o omeHora se usaba en un ejemplo sin haberla definido.Paul Sleigh encontr´ un error en el Cap´ o ıtulo 7 y un error en el script Perlde Jonah Cohen que, a partir de L TEX genera, el HTML. ACraig T. Snydal est´ poniendo a prueba el texto en un curso en la Uni- aversidad de Drew. Ha contribuido con varias sugerencias y correcciones deimportancia.Ian Thomas y sus estudiantes usan el texto en un curso de programaci´n. oSon los primeros en probar los Cap´ ıtulos de la segunda mitad del libro, yhan hecho numerosas correcciones y sugerencias.Keith Verheyden envi´ una correcci´n del Cap´ o o ıtulo 3.Peter Winstanley nos hizo saber de un persistente error en nuestro lat´ ındel Cap´ ıtulo 3.Chris Wrobel hizo correcciones al c´digo del Cap´ o ıtulo sobre E/S de archi-vos y excepciones.Moshe Zadka ha hecho contribuciones inestimables al proyecto. Adem´s ade escribir el primer borrador del Cap´ ıtulo sobre diccionarios, propor-cion´ una gu´ continuada en las primeras etapas del libro. o ıaChristoph Zwerschke envi´ varias correcciones y sugerencias pedag´gicas, o oy explic´ la diferencia entre gleich y selbe. oJames Mayer envi´ un cargamento de errores tipogr´ficos y ortogr´ficos, o a aincluyendo dos en la lista de colaboradores.Hayden McAfee pill´ una inconsistencia potencialmente confusa entre dos oejemplos.´Angel Arnal es parte de un equipo internacional de traductores que tra-bajan en la versi´n en espa˜ol del texto. Tambi´n ha encontrado varios o n eerrores en la versi´n inglesa. oTauhidul Hoque y Lex Berezhny crearon las ilustraciones del Cap´ ıtulo 1y mejoraron muchas de las otras ilustraciones.Dr. Michele Alzetta pill´ un error en el Cap´ o ıtulo 8 y envi´ varios comen- otarios y sugerencias pedag´gicas interesantes sobre Fibonacci y La Mona. o
  15. 15. xvi Lista de Colaboradores Andy Mitchell pill´ un error tipogr´fico en el Cap´ o a ıtulo 1 y un ejemplo err´neo en el Cap´ o ıtulo 2. Kalin Harvey sugiri´ una clarificaci´n al Cap´ o o ıtulo 7 y detect´ varios errores o tipogr´ficos. a Christopher P. Smith encontr´ varios errores tipogr´ficos y nos est´ ayu- o a a dando a preparar la actualizaci´n del libro para Python 2.2. o David Hutchins pill´ un error tipogr´fico en el Pr´logo. o a o Gregor Lingl ense˜a Python en un instituto de Viena, Austria. Est´ tra- n a bajando en una traducci´n del libro al alem´n, y pill´ un par de errores o a o graves en el Cap´ ıtulo 5. Julie Peters encontr´ un error tipogr´fico en el Prefacio. o a
  16. 16. ´Indice generalPr´logo o vPrefacio viiLista de Colaboradores xiii1. El Camino del Programa 1 1.1. El lenguaje de programaci´n Python . . . . . . . . . . . . . . . o 1 1.2. ¿Qu´ es un programa? . . . . . . . . . . . . . . . . . . . . . . . e 3 1.3. ¿Qu´ es la depuraci´n (debugging)? . . . . . . . . . . . . . . . . e o 4 1.4. Lenguajes formales y lenguajes naturales . . . . . . . . . . . . . 6 1.5. El primer programa . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.6. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92. Variables, expresiones y sentencias 11 2.1. Valores y tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3. Nombres de variables y palabras reservadas . . . . . . . . . . . 13 2.4. Sentencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.5. Evaluar expresiones . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.6. Operadores y expresiones . . . . . . . . . . . . . . . . . . . . . 16
  17. 17. xviii ´ Indice general 2.7. El orden de las operaciones . . . . . . . . . . . . . . . . . . . . 17 2.8. Las operaciones sobre cadenas . . . . . . . . . . . . . . . . . . . 17 2.9. Composici´n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 18 2.10. Los comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.11. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193. Funciones 21 3.1. Llamadas a funciones . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2. Conversi´n de tipos . . . . . . . . . . . . . . . . . . . . . . . . . o 22 3.3. Coerci´n de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . o 22 3.4. Funciones matem´ticas . . . . . . . . . . . . . . . . . . . . . . . a 23 3.5. Composici´n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 24 3.6. A˜adir funciones nuevas . . . . . . . . . . . . . . . . . . . . . . n 24 3.7. Las definiciones y el uso . . . . . . . . . . . . . . . . . . . . . . 26 3.8. Flujo de ejecuci´n . . . . . . . . . . . . . . . . . . . . . . . . . . o 27 3.9. Par´metros y argumentos . . . . . . . . . . . . . . . . . . . . . a 28 3.10. Las variables y los par´metros son locales . . . . . . . . . . . . a 29 3.11. Diagramas de pila . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.12. Funciones con resultado . . . . . . . . . . . . . . . . . . . . . . 31 3.13. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324. Condicionales y recursividad 35 4.1. El operador m´dulo . . . . . . . . . . . . . . . . . . . . . . . . . o 35 4.2. Expresiones booleanas . . . . . . . . . . . . . . . . . . . . . . . 36 4.3. Operadores l´gicos . . . . . . . . . . . . . . . . . . . . . . . . . o 36 4.4. Ejecuci´n condicional . . . . . . . . . . . . . . . . . . . . . . . . o 37 4.5. Ejecuci´n alternativa . . . . . . . . . . . . . . . . . . . . . . . . o 37 4.6. Condiciones encadenadas . . . . . . . . . . . . . . . . . . . . . . 38
  18. 18. ´Indice general xix 4.7. Condiciones anidadas . . . . . . . . . . . . . . . . . . . . . . . . 39 4.8. La sentencia return . . . . . . . . . . . . . . . . . . . . . . . . 40 4.9. Recursividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.10. Diagramas de pila para funciones recursivas . . . . . . . . . . . 42 4.11. Recursividad infinita . . . . . . . . . . . . . . . . . . . . . . . . 43 4.12. Entrada por teclado . . . . . . . . . . . . . . . . . . . . . . . . 44 4.13. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455. Funciones productivas 47 5.1. Valores de retorno . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.2. Desarrollo de programas . . . . . . . . . . . . . . . . . . . . . . 48 5.3. Composici´n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 51 5.4. Funciones booleanas . . . . . . . . . . . . . . . . . . . . . . . . 52 5.5. M´s recursividad . . . . . . . . . . . . . . . . . . . . . . . . . . a 53 5.6. Acto de fe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 5.7. Un ejemplo m´s . . . . . . . . . . . . . . . . . . . . . . . . . . . a 56 5.8. Comprobaci´n de tipos . . . . . . . . . . . . . . . . . . . . . . . o 57 5.9. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586. Iteraci´n o 61 6.1. Asignaci´n m´ltiple . . . . . . . . . . . . . . . . . . . . . . . . . o u 61 6.2. La sentencia while . . . . . . . . . . . . . . . . . . . . . . . . . 62 6.3. Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.4. Tablas de dos dimensiones . . . . . . . . . . . . . . . . . . . . . 66 6.5. Encapsulado y generalizaci´n . . . . . . . . . . . . . . . . . . . o 67 6.6. M´s encapsulaci´n . . . . . . . . . . . . . . . . . . . . . . . . . a o 68 6.7. Variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.8. M´s generalizaci´n . . . . . . . . . . . . . . . . . . . . . . . . . a o 70 6.9. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 6.10. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
  19. 19. xx ´ Indice general7. Cadenas 75 7.1. Un tipo de datos compuesto . . . . . . . . . . . . . . . . . . . . 75 7.2. Longitud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 7.3. Recorrido y el bucle for . . . . . . . . . . . . . . . . . . . . . . 76 7.4. Porciones de cadenas . . . . . . . . . . . . . . . . . . . . . . . . 78 7.5. Comparaci´n de cadenas . . . . . . . . . . . . . . . . . . . . . . o 78 7.6. Las cadenas son inmutables . . . . . . . . . . . . . . . . . . . . 79 7.7. Una funci´n “encuentra” . . . . . . . . . . . . . . . . . . . . . . o 80 7.8. Bucles y conteo . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 7.9. El m´dulo “string” . . . . . . . . . . . . . . . . . . . . . . . . . o 81 7.10. Clasificaci´n de caracteres . . . . . . . . . . . . . . . . . . . . . o 82 7.11. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838. Listas 85 8.1. Valores de una lista . . . . . . . . . . . . . . . . . . . . . . . . . 85 8.2. Acceso a los elementos . . . . . . . . . . . . . . . . . . . . . . . 86 8.3. Longitud (tama˜o) de una lista . . . . . . . . . . . . . . . . . . n 87 8.4. Pertenencia a una lista . . . . . . . . . . . . . . . . . . . . . . . 88 8.5. Listas y bucles for . . . . . . . . . . . . . . . . . . . . . . . . . 88 8.6. Operaciones con listas . . . . . . . . . . . . . . . . . . . . . . . 89 8.7. Porciones (slices) . . . . . . . . . . . . . . . . . . . . . . . . . . 90 8.8. Las listas son mutables . . . . . . . . . . . . . . . . . . . . . . . 90 8.9. Borrado en una lista . . . . . . . . . . . . . . . . . . . . . . . . 91 8.10. Objetos y valores . . . . . . . . . . . . . . . . . . . . . . . . . . 91 8.11. Alias (poner sobrenombres) . . . . . . . . . . . . . . . . . . . . 92 8.12. Clonar listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 8.13. Listas como par´meteros . . . . . . . . . . . . . . . . . . . . . . a 94 8.14. Listas anidadas . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
  20. 20. ´Indice general xxi 8.15. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 8.16. Cadenas y listas . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 8.17. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 979. Tuplas 99 9.1. Mutabilidad y tuplas . . . . . . . . . . . . . . . . . . . . . . . . 99 9.2. Asignaci´n de tuplas . . . . . . . . . . . . . . . . . . . . . . . . 100 o 9.3. Tuplas como valor de retorno . . . . . . . . . . . . . . . . . . . 101 9.4. N´meros aleatorios . . . . . . . . . . . . . . . . . . . . . . . . . 101 u 9.5. Lista de n´meros aleatorios . . . . . . . . . . . . . . . . . . . . 102 u 9.6. Conteo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 9.7. Muchos baldes . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 9.8. Una soluci´n en una sola pasada . . . . . . . . . . . . . . . . . 106 o 9.9. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10710.Diccionarios 109 10.1. Operaciones sobre diccionarios . . . . . . . . . . . . . . . . . . . 110 10.2. M´todos del diccionario . . . . . . . . . . . . . . . . . . . . . . 111 e 10.3. Asignaci´n de alias y copiado . . . . . . . . . . . . . . . . . . . 112 o 10.4. Matrices dispersas . . . . . . . . . . . . . . . . . . . . . . . . . 112 10.5. Pistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 10.6. Enteros largos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 10.7. Contar letras . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 10.8. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11611.Archivos y excepciones 119 11.1. Archivos de texto . . . . . . . . . . . . . . . . . . . . . . . . . . 121 11.2. Escribir variables . . . . . . . . . . . . . . . . . . . . . . . . . . 123 11.3. Directorios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
  21. 21. xxii ´ Indice general 11.4. Encurtido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 11.5. Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 11.6. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12812.Clases y objetos 131 12.1. Tipos compuestos definidos por el usuario . . . . . . . . . . . . 131 12.2. Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 12.3. Instancias como par´metro . . . . . . . . . . . . . . . . . . . . . 133 a 12.4. Mismidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 12.5. Rect´ngulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 a 12.6. Instancias como valores de retorno . . . . . . . . . . . . . . . . 136 12.7. Los objetos son mudables . . . . . . . . . . . . . . . . . . . . . 136 12.8. Copiado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 12.9. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13913.Clases y funciones 141 13.1. Hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 13.2. Funciones puras . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 13.3. Modificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 13.4. ¿Qu´ es mejor? . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 e 13.5. Desarrollo de prototipos frente a planificaci´n . . . . . . . . . . 145 o 13.6. Generalizaci´n o . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 13.7. Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 13.8. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14714.Clases y m´todos e 149 14.1. Caracter´ ısticas de la orientaci´n a objetos . . . . . . . . . . . . 149 o 14.2. imprimeHora . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 14.3. Otro ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
  22. 22. ´Indice general xxiii 14.4. Un ejemplo m´s complicado . . . . . . . . . . . . . . . . . . . . 152 a 14.5. Argumentos opcionales . . . . . . . . . . . . . . . . . . . . . . . 153 14.6. El m´todo de inicializaci´n . . . . . . . . . . . . . . . . . . . . . 154 e o 14.7. Revisi´n de los Puntos . . . . . . . . . . . . . . . . . . . . . . . 155 o 14.8. Sobrecarga de operadores . . . . . . . . . . . . . . . . . . . . . 156 14.9. Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 14.10. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16015.Conjuntos de objetos 161 15.1. Composici´n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 o 15.2. Objetos Carta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 15.3. Atributos de clase y el m´todo e str . . . . . . . . . . . . . . 163 15.4. Comparaci´n de naipes . . . . . . . . . . . . . . . . . . . . . . . 164 o 15.5. Mazos de naipes . . . . . . . . . . . . . . . . . . . . . . . . . . 165 15.6. Impresi´n del mazo de naipes . . . . . . . . . . . . . . . . . . . 166 o 15.7. Barajar el mazo . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 15.8. Eliminaci´n y reparto de los naipes . . . . . . . . . . . . . . . . 168 o 15.9. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16916.Herencia 171 16.1. Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 16.2. Una mano de cartas . . . . . . . . . . . . . . . . . . . . . . . . 172 16.3. El reparto de los naipes . . . . . . . . . . . . . . . . . . . . . . 173 16.4. Mostremos la mano . . . . . . . . . . . . . . . . . . . . . . . . . 174 16.5. La clase JuegoDeCartas . . . . . . . . . . . . . . . . . . . . . . 175 16.6. La clase ManoDeLaMona . . . . . . . . . . . . . . . . . . . . . . . 176 16.7. La clase JuegoDeLaMona . . . . . . . . . . . . . . . . . . . . . . 177 16.8. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
  23. 23. xxiv ´ Indice general17.Listas enlazadas 183 17.1. Referencias incrustadas . . . . . . . . . . . . . . . . . . . . . . . 183 17.2. La clase Nodo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 17.3. Listas como colecciones . . . . . . . . . . . . . . . . . . . . . . . 185 17.4. Listas y recursividad . . . . . . . . . . . . . . . . . . . . . . . . 186 17.5. Listas infinitas . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 17.6. Teorema fundamental de la ambig¨edad . . . . . . . . . . . . . 188 u 17.7. Modificar listas . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 17.8. Envoltorios y ayudantes . . . . . . . . . . . . . . . . . . . . . . 190 17.9. La clase ListaEnlazada . . . . . . . . . . . . . . . . . . . . . . 190 17.10. Invariantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 17.11. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19218.Pilas 195 18.1. Tipos abstractos de datos . . . . . . . . . . . . . . . . . . . . . 195 18.2. El TAD Pila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 18.3. C´mo implementar pilas con listas de Python . . . . . . . . . . 196 o 18.4. Uso de push y pop . . . . . . . . . . . . . . . . . . . . . . . . . 197 18.5. Usar una pila para evaluar postfijo . . . . . . . . . . . . . . . . 198 18.6. An´lisis sint´ctico . . . . . . . . . . . . . . . . . . . . . . . . . . 199 a a 18.7. Evaluar un postfijo . . . . . . . . . . . . . . . . . . . . . . . . . 199 18.8. Clientes y proveedores . . . . . . . . . . . . . . . . . . . . . . . 200 18.9. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20119.Colas 203 19.1. El TAD Cola . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 19.2. Cola Enlazada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 19.3. Rendimiento t´ ıpico . . . . . . . . . . . . . . . . . . . . . . . . . 205
  24. 24. ´Indice general xxv 19.4. Cola Enlazada Mejorada . . . . . . . . . . . . . . . . . . . . . . 205 19.5. Cola priorizada . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 19.6. La clase Golfista . . . . . . . . . . . . . . . . . . . . . . . . . 209 19.7. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 ´20. Arboles 211 20.1. Crear ´rboles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 a 20.2. Recorrer ´rboles a . . . . . . . . . . . . . . . . . . . . . . . . . . 213 ´ 20.3. Arboles de expresi´n . . . . . . . . . . . . . . . . . . . . . . . . 213 o 20.4. Recorrido de un ´rbol . . . . . . . . . . . . . . . . . . . . . . . 214 a 20.5. Construir un ´rbol de expresi´n . . . . . . . . . . . . . . . . . . 216 a o 20.6. Manejar errores . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 20.7. El ´rbol de animales . . . . . . . . . . . . . . . . . . . . . . . . 221 a 20.8. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224A. Depuraci´n o 225 A.1. Errores de sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . 225 A.2. Errores en tiempo de ejecuci´n . . . . . . . . . . . . . . . . . . 227 o A.3. Errores sem´nticos . . . . . . . . . . . . . . . . . . . . . . . . . 231 aB. Crear un nuevo tipo de datos 235 B.1. Multiplicaci´n de fracciones . . . . . . . . . . . . . . . . . . . . 236 o B.2. Suma de fracciones . . . . . . . . . . . . . . . . . . . . . . . . . 237 B.3. Algoritmo de Euclides . . . . . . . . . . . . . . . . . . . . . . . 238 B.4. Comparar fracciones . . . . . . . . . . . . . . . . . . . . . . . . 239 B.5. Forzando la m´quina . . . . . . . . . . . . . . . . . . . . . . . . 240 a B.6. Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
  25. 25. xxvi ´ Indice generalC. Listados Completos de Python 243 C.1. Clase Punto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 C.2. Clase Hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 C.3. Cartas, mazos y juegos . . . . . . . . . . . . . . . . . . . . . . . 245 C.4. Lists Enlazadas . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 C.5. Clase Pila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 C.6. Colas y colas priorizadas . . . . . . . . . . . . . . . . . . . . . . 251 C.7. ´ Arboles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 C.8. ´ Arboles de expresi´n . . . . . . . . . . . . . . . . . . . . . . . . 254 o C.9. Adivina el animal . . . . . . . . . . . . . . . . . . . . . . . . . . 255 C.10. Fraction class . . . . . . . . . . . . . . . . . . . . . . . . . . . 256D. Lecturas recomendadas 259 D.1. Libros y sitios web sobre Python . . . . . . . . . . . . . . . . . 260 D.2. Libros recomendados sobre inform´tica en general . . . . . . . . 261 aE. GNU Free Documentation License 263 E.1. Applicability and Definitions . . . . . . . . . . . . . . . . . . . 264 E.2. Verbatim Copying . . . . . . . . . . . . . . . . . . . . . . . . . 265 E.3. Copying in Quantity . . . . . . . . . . . . . . . . . . . . . . . . 265 E.4. Modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 E.5. Combining Documents . . . . . . . . . . . . . . . . . . . . . . . 268 E.6. Collections of Documents . . . . . . . . . . . . . . . . . . . . . 269 E.7. Aggregation with Independent Works . . . . . . . . . . . . . . . 269 E.8. Translation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 E.9. Termination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 E.10. Future Revisions of This License . . . . . . . . . . . . . . . . . 270 E.11. Addendum: How to Use This License for Your Documents . . . 270
  26. 26. Cap´ ıtulo 1El Camino del ProgramaEl objetivo de este libro es ense˜arle a pensar como lo hacen los cient´ n ıficosinform´ticos. Esta manera de pensar combina las mejores caracter´ a ısticas de lamatem´tica, la ingenier´ y las ciencias naturales. Como los matem´ticos, los a ıa, acient´ ıficos inform´ticos usan lenguajes formales para designar ideas (espec´ a ıfica-mente, computaciones). Como los ingenieros, ellos dise˜an cosas, ensamblando nsistemas a partir de componentes y evaluando ventajas y desventajas de cadauna de las alternativas. Como los cient´ ıficos, ellos observan el comportamientode sistemas complejos, forman hip´tesis, y prueban sus predicciones. oLa habilidad m´s importante del cient´ a ıfico inform´tico es la soluci´n de pro- a oblemas. La soluci´n de problemas incluye poder formular problemas, pensar en ola soluci´n de manera creativa, y expresar una soluci´n con claridad y precisi´n. o o oComo se ver´, el proceso de aprender a programar es la oportunidad perfecta apara desarrollar la habilidad de resolver problemas. Por esa raz´n este cap´ o ıtulose llama “El Camino del programa”.A cierto nivel, usted aprender´ a programar, lo cual es una habilidad muy util a ´por s´ misma. A otro nivel, usted utilizar´ la programaci´n para obtener alg´n ı a o uresultado. Ese resultado se ver´ m´s claramente durante el proceso. a a1.1. El lenguaje de programaci´n Python oEl lenguaje de programaci´n que aprender´ es Python. Python es un ejemplar o ade un lenguaje de alto nivel; otros ejemplos de lenguajes de alto nivel son C,C++, Perl y Java.
  27. 27. 2 El Camino del ProgramaComo se puede deducir de la nomenclatura “lenguaje de alto nivel”, tambi´n eexisten lenguajes de bajo nivel, a los que tambi´n se califica como lengua- ejes de m´quina o lenguajes ensambladores. A prop´sito, los computadores s´lo a o oejecutan programas escritos en lenguajes de bajo nivel. Los programas de altonivel tienen que traducirse antes de ejecutarse. Esta traducci´n lleva tiempo, lo ocual es una peque˜a desventaja de los lenguajes de alto nivel. nAun as´ las ventajas son enormes. En primer lugar, la programaci´n en lenguajes ı ode alto nivel es mucho m´s f´cil; escribir programas en un lenguaje de alto nivel a atoma menos tiempo, los programas son m´s cortos y m´s f´ciles de leer, y es m´s a a a aprobable que estos programas sean correctos. En segundo lugar, los lenguajesde alto nivel son portables, lo que significa que pueden ejecutarse en tiposdiferentes de computadores sin modificaci´n alguna o con pocas modificaciones. oLos programas escritos en lenguajes de bajo nivel s´lo pueden ser ejecutarse en oun tipo de computador y deben reescribirse para ejecutarlos en otro.Debido a estas ventajas, casi todos los programa se escriben en un lenguaje dealto nivel. Los lenguajes de bajo nivel s´lo se usan para unas pocas aplicaciones oespeciales.Hay dos tipos de programas que traducen lenguajes de alto nivel a lenguajesde bajo nivel: int´rpretes y compiladores. Un int´rprete lee un programa de e ealto nivel y lo ejecuta, lo que significa que lleva a cabo lo que indica el programa.Traduce el programa poco a poco, leyendo y ejecutando cada comando. CODIGO INTERPRETER SALIDA FUENTEUn compilador lee el programa y lo traduce todo al mismo tiempo, antes deejecutar cualquiera de las instrucciones. En este caso, al programa de alto nivelse le llama el c´digo fuente, y al programa traducido el c´digo de obje- o oto o el c´digo ejecutable. Una vez compilado el programa, puede ejecutarlo orepetidamente sin volver a traducirlo.CODIGO CODIGO COMPILADOR EJECUTOR SALIDAFUENTE OBJETOPython se considera como lenguaje interpretado porque los programas de Pyt-hon se ejecutan por medio de un int´rprete. Existen dos maneras de usar el e
  28. 28. 1.2 ¿Qu´ es un programa? e 3int´rprete: modo de comando y modo de gui´n. En modo de comando se escri- e oben sentencias en el lenguaje Python y el int´rprete muestra el resultado. e$ pythonPython 1.5.2 (#1, Feb 1 2000, 16:32:16)Copyright 1991-1995 Stichting Mathematish Centrum, Amsterdam>>> print 1 + 12La primera l´ ınea de este ejemplo es el comando que pone en marcha el int´rprete ePython. Las dos l´ıneas siguientes son mensajes del int´rprete. La tercera l´ e ıneacomienza con >>>, que es la invitaci´n del int´rprete para indicar que est´ listo. o e aEscribimos print 1 + 1 y el int´rprete contest´ 2. e oAlternativamente, se puede escribir el programa en un archivo y usar el int´rpre- ete para ejecutar el contenido de dicho archivo. El archivo se llama, en este ca-so, un gui´n. Por ejemplo, en un editor de texto se puede crear un archivo olatoya.py que contenga esta l´ ınea:print 1 + 1Por acuerdo un´nime, los archivos que contienen programas de Python tienen anombres que terminan con .py.Para ejecutar el programa, se le tiene que indicar el nombre del gui´n al int´rpre- o ete.$ python latoya.py2En otros entornos de desarrollo los detalles de la ejecuci´n de programas pueden oser diferentes. Aem´s, la mayor´ de programas son m´s interesantes que el a ıa amencionado.La mayor´ de ejemplos en este libro se ejecutan desde en la l´ ıa ınea de comando.La l´ ınea de comando es muy apropiada para el desarrollo de programas y parapruebas r´pidas porque se pueden teclear las instrucciones de Python y se pue- aden ejecutar inmediatamente. Una vez que un programa est´ completo, puede aarchivarse en un gui´n para ejecutarlo o modificarlo en el futuro. o1.2. ¿Qu´ es un programa? eUn programa es una secuencia de instrucciones que especifican c´mo ejecutar ouna computaci´n. La computaci´n puede ser algo matem´tico, como solucionar o o a
  29. 29. 4 El Camino del Programaun sistema de ecuaciones o determinar las ra´ de un polinomio, pero tambi´n ıces epuede ser una computaci´n simb´lica, como buscar y reemplazar el texto de un o odocumento o (aunque parezca raro) compilar un programa.Las instrucciones (comandos, ´rdenes) tienen una apariencia diferente en len- oguajes de programaci´n diferentes, pero existen algunas funciones b´sicas que o ase presentan en casi todo lenguaje:entrada: Recibir datos del teclado, o un archivo u otro aparato.salida: Mostrar datos en el monitor o enviar datos a un archivo u otro aparato.matem´ticas: Ejecutar operaciones b´sicas de matem´ticas como la adici´n y a a a o la multiplicaci´n. ooperaci´n condicional: Probar la veracidad de alguna condici´n y ejecutar o o una secuencia de instrucciones apropiada.repetici´n: Ejecutar alguna acci´n repetidas veces, normalmente con alguna o o variaci´n. oLo crea o no, eso es todo. Todos los programas que existen, por complicados quesean, est´n formulados exclusivamente con tales instrucciones. As´ una manera a ı,de describir la programaci´n es: El proceso de romper una tarea en tareas cada ovez m´s peque˜as hasta que estas tareas sean suficientemente simples para ser a nejecutadas con una de estas instrucciones simples.Quiz´s esta descripci´n sea un poco ambigua. No se preocupe. Lo explicaremos a ocon m´s detalle con el tema de los algoritmos. a1.3. ¿Qu´ es la depuraci´n (debugging)? e oLa programaci´n es un proceso complejo y, por ser realizado por humanos, a omenudo desemboca en errores. Por razones caprichosas, esos errores se llamanbugs y el proceso de buscarlos y corregirlos se llama depuraci´n (en ingl´s o e“debugging”).Hay tres tipos de errores que pueden ocurrir en un programa, de sintaxis, entiempo de ejecuci´n y sem´nticos. Es muy util distinguirlos para encontrarlos o a ´mas r´pido. a
  30. 30. 1.3 ¿Qu´ es la depuraci´n (debugging)? e o 51.3.1. Errores sint´cticos aPython s´lo puede ejecutar un programa si el programa es correcto sint´ctica- o amente. En caso contrario, es decir si el programa no es correcto sint´cticamente, ael proceso falla y devuelve un mensaje de error. El t´rmino sintaxis se refiere a ela estructura de cualquier programa y a las reglas de esa estructura. Por ejem-plo, en espa˜ol la primera letra de toda oraci´n debe ser may´scula, y todas las n o uoraciones deben terminar con un punto. esta oraci´n tiene un error sint´ctico. o aEsta oraci´n tambi´n o ePara la mayor´ de lectores, unos pocos errores sint´cticos no son significatvos, ıa ay por eso pueden leer la poes´ de e. e. cummings sin anunciar errores de sin- ıataxis. Python no es tan permisivo. Si hay aunque sea un solo error sint´ctico aen el programa, Python mostrar´ un mensaje de error y abortar´ la ejecuci´n a a odel programa. Durante las primeras semanas de su carrera como programadorpasar´, seguramente, mucho tiempo buscando errores sint´cticos. Sin embargo, a atal como adquiera experiencia tendr´ menos errores y los encontrar´ mas r´pido. a a a1.3.2. Errores en tiempo de ejecuci´n oEl segundo tipo de error es un error en tiempo de ejecuci´n. Este error no aparece ohasta que se ejecuta el programa. Estos errores tambi´n se llaman excepciones eporque indican que algo excepcional (y malo) ha ocurrido.Con los programas que vamos a escribir al principio, los errores en tiempo deejecuci´n ocurrir´n con poca frecuencia, as´ que puede pasar bastante tiempo o a ıhasta que vea uno.1.3.3. Errores sem´nticos aEl tercer tipo de error es el error sem´ntico. Si hay un error de l´gica en su a oprograma, el programa se ejecutar´ sin ning´n mensaje de error, pero el resul- a utado no ser´ el deseado. Ser´ cualquier otra cosa. Concretamente, el programa a ahar´ lo que usted le dijo. aA veces ocurre que el programa escrito no es el programa que se ten´ en mente. ıaEl sentido o significado del programa (su sem´ntica) no es correcto. Es dif´ ha- a ıcilllar errores de l´gica, porque requiere trabajar al rev´s, observando el resultado o edel programa para averiguar lo que hace.
  31. 31. 6 El Camino del Programa1.3.4. Depuraci´n experimental oUna de las t´cnicas m´s importantes que usted aprender´ es la depuraci´n. Aun- e a a oque a veces es frustrante, la depuraci´n es una de las partes m´s intelectualmente o aricas, interesantes y estimulantes de la programaci´n. oLa depuraci´n es una actividad parecida a la tarea de un investigador: se tie- onen que estudiar las claves para inducir los procesos y eventos llevaron a losresultados que tiene a la vista.La depuraci´n tambi´n es una ciencia experimental. Una vez que se tiene la o eidea de cu´l es el error, se modifica el programa y se intenta nuevamente. Si su ahip´tesis fue la correcta se pueden predecir los resultados de la modificaci´n y o oestar´ m´s cerca de un programa correcto. Si su hip´tesis fue err´nea tendr´ que a a o o aidearse otra hip´tesis. Como dijo Sherlock Holmes, “Cuando se ha descartado olo imposible, lo que queda, no importa cuan inveros´ ımil, debe ser la verdad.”(A. Conan Doyle, The Sign of Four)Para algunas personas, la programaci´n y la depuraci´n son lo mismo: la pro- o ogramaci´n es el proceso de depurar un programa gradualmente hasta que haga olo que usted quiera. La idea es que deber´ usted comenzar con un programa ıaque haga algo y hacer peque˜as modificaciones, depur´ndolas sobre la marcha, n ade modo que siempre tenga un programa que funcione.Por ejemplo, Linux es un sistema operativo que contiee miles de l´ ıneas de c´digo, opero Linus Torvalds lo comenz´ como un programa para explorar el microproce- osador Intel 80836. Seg´n Larry Greenfield, “Uno de los proyectos tempranos de uLinus fue un programa que alternaba la impresi´n de AAAA con BBBB. Este oprograma evolucion´ en Linux” (de The Linux Users’Guide Versi´n Beta 1). o oOtros cap´ ıtulos tratar´n m´s acerca del tema de depuraci´n y otras t´cnicas de a a o eprogramaci´n. o1.4. Lenguajes formales y lenguajes naturalesLos lenguajes naturales son los lenguajes hablados por seres humanos, comoel espa˜ol, el ingl´s y el franc´s. No los han dise˜ados personas (aunque se n e e nintente poner cierto orden en ellos), sino que se han desarrollado naturalmente.Los lenguajes formales son lenguajes dise˜ados por humanos y que tienen naplicaciones espec´ıficas. La notaci´n matem´tica, por ejemplo, es un lenguaje o aformal ya que se presta a la representaci´n de las relaciones entre n´meros y o us´ ımbolos. Los qu´ımicos utilizan un lenguaje formal para representar la estructuraqu´ımica de las mol´culas. Y lo m´s importante: e a
  32. 32. 1.4 Lenguajes formales y lenguajes naturales 7 Los lenguajes de programaci´n son lenguajes formales de- o sarrollados para expresar computaciones.Los lenguajes formales casi siempre tienen reglas sint´cticas estrictas. Por ejem- aplo, 3 + 3 = 6 es una expresi´n matem´tica correcta, pero 3 = +6$ no lo es. De o ala misma manera, H2 0 es una nomenclatura qu´ ımica correcta, pero 2 Zz no loes.Existen dos clases de reglas sint´cticas, en cuanto a unidades y estructura. Las aunidades son los elementos b´sicos de un lenguaje, como lo son las palabras, los an´meros y los elementos qu´ u ımicos. Por ejemplo, en 3=+6$, $ no es una unidadmatem´tica aceptada (al menos hasta donde nosotros sabemos. Similarmente, a2 Zz no es formal porque no hay ning´ n elemento con la abreviatura Zz. uLa segunda clase de regla sint´ctica est´ relacionada con la estructura de un a aelemento; o sea, el orden de las unidades. La estructura de la sentencia 3=+6$no se acepta porque no se puede escribir el s´ ımbolo de igualdad seguido de un ımbolo positivo. Similarmente, las f´rmulas moleculares tienen que mostrar els´ on´mero de sub´ u ındice despu´s del elemento, no antes. e A manera de pr´ctica, trate de producir una oraci´n con estructura a o aceptada pero que est´ compuesta de unidades irreconocibles. Luego e escriba otra oraci´n con unidades aceptables pero con estructura no o v´lida. aAl leer una oraci´n, sea en un lenguaje natural o una sentencia en un lenguaje ot´cnico, se debe discernir la estructura de la oraci´n. En un lenguaje natural e oeste proceso, llamado an´lisis sint´ctico ocurre subconscientemente. a aPor ejemplo cuando usted escucha la oraci´n “El otro zapato cay´”, entiende o oque “el otro zapato” es el sujeto y “cay´” es el verbo. Cuando se ha analizado ola oraci´n sint´cticamente, se puede deducir el significado, o la sem´ntica, de la o a aoraci´n. Suponiendo que sepa lo ques es un zapato y lo que es caer, entender´ el o asignificado de la oraci´n. oAunque existen muchas cosas en com´n entre los lenguajes naturales y los ulenguajes formales—por ejemplo las unidades, la estructura, la sintaxis y lasem´ntica—tambi´n existen muchas diferencias: a eambig¨ edad: Los lenguajes naturales tienen much´ u ısimas ambig¨edades, que u los hablantes sortean usando claves contextuales y otra informaci´n. Los o lenguajes formales se dise˜an para estar completamente libres de am- n big¨edades, o tanto como sea posible, lo que quiere decir que cualquier u sentencia tiene s´lo un significado, sin importar el contexto. o
  33. 33. 8 El Camino del Programaredundancia: Para reducir la ambig¨edad y los malentendidos, las lenguas na- u turales utilizan bastante redundancia. Como resultado suelen ser prolijos. Los lenguajes formales son menos redundantes y m´s concisos. aliteralidad: Los lenguajes naturales tienen muchas met´foras y frases hechas. a El significado de un dicho, por ejemplo “Estirar la pata”, es diferente al significado de sus sustantivos y verbos. En este ejemplo, la oraci´n no tiene o nada que ver con un pie y significa ’morirse’. Los lenguajes formales no difieren de su significado literal.Los que aprenden a hablar un lenguaje natural—es decir, todo el mundo—muchas veces tienen dificultad en adaptarse a los lenguajes formales. A vecesla diferencia entre los lenguajes formales y los naturales es comparable a ladiferencia entre la prosa y la poes´ ıa:Poes´ Se utiliza una palabra por su cualidad auditiva tanto como por su signi- ıa: ficado. El poema, en su totalidad, produce un efecto o reacci´n emocional. o La ambig¨edad no es solo com´n sino utilizada a prop´sito. u u oProsa: El significado literal de la palabra es mas importante y la estructura da m´s significado a´n. La prosa se presta al an´lisis m´s que la poes´ pero a u a a ıa, todav´ contiene ambig¨edad. ıa uProgramas: El significado de un programa es inequ´ ıvoco y literal, y es enten- dido en su totalidad analizando las unidades y la estructura.He aqu´ unas sugerencias para la lectura de un programa (y de otros lenguajes ıformales). Primero, recuerde que los lenguajes formales son mucho m´s densos aque los lenguajes naturales, y por consecuente lleva m´s tiempo leerlos. Tam- abi´n, la estructura es muy importante, as´ que entonces no es una buena idea e ıleerlo de pies a cabeza, de izquierda a derecha. En vez de eso, aprenda a sepa-rar las diferentes partes en su mente, identificar las unidades e interpretar laestructura. Finalmente, ponga atenci´n a los detalles. Los fallos de puntuaci´n o oy la ortograf´ que puede obviar en el lenguaje natural, pueden suponer una ıa,gran diferencia en un lenguaje formal.1.5. El primer programaTradicionalmente el primer programa en un lenguaje nuevo se llama “Hola,mundo” (Hello world!) porque s´lo muestra las palabras “Hola a todo el mundo”. oEn Python es as´ ı:print "Hola, mundo"
  34. 34. 1.6 Glosario 9Este es un ejemplo de una sentencia print, la cual no imprime nada en papel,m´s bien muestra un valor. En este caso, el resultado es las palabras aHola, mundoLas comillas se˜alan el comienzo y el final del valor; no aparecen en el resultado. nAlguna gente eval´a la calidad de un lenguaje de programaci´n por la simplici- u odad del programa “Hola, mundo”. Si seguimos ese criterio, Python cumple contodas sus metas.1.6. Glosariosoluci´n de problemas: El proceso de formular un problema, hallar la solu- o ci´n y expresar esa soluci´n. o olenguaje de alto nivel: Un lenguaje como Python dise˜ado para ser f´cil de n a leer y escribir para la gente.lenguaje de bajo nivel: Un lenguaje de programaci´n dise˜ado para ser f´cil o n a de ejecutar para un computador; tambi´n se lo llama “lenguaje de m´qui- e a na” o “lenguaje ensamblador”.portabilidad: La cualidad de un programa que le permite ser ejecutado en m´s de un tipo de computador. ainterpretar: Ejecutar un programa escrito en un lenguaje de alto nivel tradu- ci´ndolo l´ e ınea por l´ ıneacompilar: Traducir un programa escrito en un lenguaje de alto nivel a un len- guaje de bajo nivel todo al mismo tiempo, en preparaci´n para la ejecuci´n o o posterior.c´digo fuente: Un programa escrito en un lenguaje de alto nivel antes de ser o compilado.c´digo de objeto: La salida del compilador una vez que ha traducido el pro- o grama.programa ejecutable: Otro nombre para el c´digo de objeto que est´ listo o a para ejecutarse.gui´n: Un programa archivado (que va a ser interpretado). oprograma: Un conjunto de instrucciones que especifica una computaci´n. oalgoritmo: Un proceso general para resolver una clase completa de problemas.
  35. 35. 10 El Camino del Programaerror (bug): Un error en un programa.depuraci´n: El proceso de hallazgo y eliminaci´n de los tres tipos de errores o o de programaci´n. osintaxis: La estructura de un programa.error sint´ctico: Un error en un programa que hace que el programa sea im- a posible de analizar sint´cticamente (e imposible de interpretar). aerror en tiempo de ejecuci´n: Un error que no ocurre hasta que el progra- o ma ha comenzado a ejecutarse e impide que el programa contin´e. uexcepci´n: Otro nombre para un error en tiempo de ejecuci´n. o oerror sem´ntico: Un error en un programa que hace que ejecute algo que no a era lo deseado.sem´ntica: El significado de un programa. alanguage natural: Cualquier lenguaje hablado que evolucion´ de forma natu- o ral.lenguaje formal: Cualquier lenguaje dise˜ado por humanos que tiene un n prop´sito espec´ o ıfico, como la representaci´n de ideas matem´ticas o pro- o a gramas de computadores; todos los lenguajes de programaci´n son lengua- o jes formales.unidad: Uno de los elementos b´sicos de la estructura sint´ctica de un progra- a a ma, an´logo a una palabra en un lenguaje natural. aan´lisis sint´ctico: La examinaci´n de un programa y el an´lisis de su estruc- a a o a tura sint´ctica. asentencia print: Una instrucci´n que causa que el int´rprete Python muestre o e un valor en el monitor.
  36. 36. Cap´ ıtulo 2Variables, expresiones ysentencias2.1. Valores y tiposEl valor es uno de los elementos fundamentales (como por ejemplo una letra oun n´mero) que manipula un programa. Los valores que hemos visto hasta el umomento son 2 (el resultado de sumar 1 + 1) y Hola, mundo.Estos valores son de distintos tipos: 2 es un entero y Hola, mundo es unacadena, llamada as´ porque contiene una “cadena” de letras. Usted (y el ıint´rprete) puede identificar las cadenas porque est´n encerradas entre comi- e allas.La sentencia print tambi´n funciona con enteros: e>>> print 44Si no est´ seguro del tipo que tiene un determinado valor, puede pregunt´rselo a aal int´rprete de Python. e>>> type("Hola, mundo")<type ’string’>>>> type(17)<type ’int’>No es sorprendente que las cadenas sean de tipo string (cadena en ingl´s) y elos enteros sean de tipo int (por integer en ingl´s). De forma menos obvia, los e

×