Introduccion a La Programacon Con Phyton 3

download Introduccion a La Programacon Con Phyton 3

If you can't read please download the document

description

programacion de computadores en phyton 3

Transcript of Introduccion a La Programacon Con Phyton 3

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Introduccin a la programacincon Python 3

    Andrs Marzal VarIsabel Gracia LuengoPedro Garca Sevilla

    Departament De LLenguatges i sistemes informtics

    Codis dassignatures EI1003 i mt1003

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Edita: Publicacions de la Universitat Jaume I. Servei de Comunicaci i PublicacionsCampus del Riu Sec. Edifici Rectorat i Serveis Centrals. 12071 Castell de la Planahttp://www.tenda.uji.es e-mail: [email protected]

    Collecci Sapientia 93www.sapientia.uji.esPrimera edici, 2014

    ISBN: 978-84-697-1178-1

    Publicacions de la Universitat Jaume I s una editorial membre de lune, cosa que en garanteix la difusi de les obres en els mbits nacional i inter-nacional. www.une.es

    Reconeixement-CompartirIgual CC BY-SAAquest text est subjecte a una llicncia Reconeixement-CompartirIgual de Creative Com-mons, que permet copiar, distribuir i comunicar pblicament lobra sempre que sespecifique lautor i el nom de la publicaci fins i tot amb objectius comercials i tamb permet crear obres derivades, sempre que siguen distribudes amb aquesta mateixa llicncia.http://creativecommons.org/licenses/by-sa/3.0/legalcode

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    ndice generalPrefacio 71. Introduccin 111.1. Computadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2. Codificacin de la informacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.3. Programas y lenguajes de programacin . . . . . . . . . . . . . . . . . . . . . . . . . 161.3.1. Cdigo de mquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.3.2. Lenguaje ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.3.3. Un programa diferente para cada ordenador? . . . . . . . . . . . . . . . . . 201.3.4. Lenguajes de programacin de alto nivel . . . . . . . . . . . . . . . . . . . . 211.3.5. Compiladores e intrpretes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.3.6. Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.3.7. Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261.4. Ms all de los programas: algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . 262. Una calculadora avanzada 312.1. Sesiones interactivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.1.1. Los operadores aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.1.2. Errores de tecleo y excepciones . . . . . . . . . . . . . . . . . . . . . . . . . 392.2. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.2.1. Tipos entero y flotante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412.2.2. El tipo de datos booleano (y sus operadores) . . . . . . . . . . . . . . . . . 422.3. Literales de entero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462.4. Variables y asignaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472.4.1. Asignaciones con operador . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512.4.2. Variables no inicializadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512.5. El tipo de datos cadena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522.6. Funciones predefinidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542.6.1. Algunas funciones sobre valores numricos . . . . . . . . . . . . . . . . . . 542.6.2. Dos funciones bsicas para cadenas: ord y chr . . . . . . . . . . . . . . . . 572.7. Mdulos e importacin de funciones y variables . . . . . . . . . . . . . . . . . . . . 582.7.1. El mdulo math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582.7.2. Otros mdulos de inters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612.8. Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612.8.1. Unos mtodos sencillos para manipular cadenas. . . . . . . . . . . . . . . . . 612.8.2. . . . y uno mucho ms complejo: format . . . . . . . . . . . . . . . . . . . . . 623. Programas 673.1. Tu primer programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.1.1. Instalar y preparar Eclipse para el trabajo con la extensin Pydev . . . . 673.1.2. Nuestro primer programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753.2. Ejecucin de programas desde la lnea de rdenes . . . . . . . . . . . . . . . . . . 773.3. Entrada/salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.3.1. Lectura de datos de teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783.3.2. Ms sobre la funcin print . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    3.4. Sobre la legibilidad de los programas . . . . . . . . . . . . . . . . . . . . . . . . . . 813.4.1. Algunos convenios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823.4.2. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833.5. Grficos de tortuga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 844. Estructuras de control 954.1. Sentencias condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954.1.1. Un programa ilustrativo: resolucin de ecuaciones de primer grado . . . . 954.1.2. La sentencia condicional if . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974.1.3. Sentencias condicionales anidadas . . . . . . . . . . . . . . . . . . . . . . . 1004.1.4. Otro ejemplo: resolucin de ecuaciones de segundo grado . . . . . . . . . 1034.1.5. En caso contrario (else) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1044.1.6. Una estrategia de diseo: refinamientos sucesivos . . . . . . . . . . . . . . 1064.1.7. Un nuevo refinamiento del programa de ejemplo . . . . . . . . . . . . . . . 1084.1.8. Otro ejemplo: mximo de una serie de nmeros . . . . . . . . . . . . . . . . 1104.1.9. Evaluacin con cortocircuitos . . . . . . . . . . . . . . . . . . . . . . . . . . . 1154.1.10. Un ltimo problema: mens de usuario . . . . . . . . . . . . . . . . . . . . . 1164.1.11. Una forma compacta para estructuras condicionales mltiples (elif ) . . . . 1184.2. Sentencias iterativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194.2.1. La sentencia while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1204.2.2. Un problema de ejemplo: clculo de sumatorios . . . . . . . . . . . . . . . . 1254.2.3. Otro programa de ejemplo: requisitos en la entrada . . . . . . . . . . . . . 1274.2.4. Mejorando el programa de los mens . . . . . . . . . . . . . . . . . . . . . . 1294.2.5. El bucle for in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1324.2.6. for in como forma compacta de ciertos while . . . . . . . . . . . . . . . . . 1354.2.7. Nmeros primos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1364.2.8. Rotura de bucles: break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1424.2.9. Anidamiento de estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1444.3. Captura y tratamiento de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . 1464.4. Algunos ejemplos grficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1484.4.1. Un graficador de funciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1484.4.2. Una animacin: simulacin gravitacional . . . . . . . . . . . . . . . . . . . . 1524.5. Una reflexin final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1595. Tipos estructurados: secuencias 1615.1. Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1615.1.1. Lo que ya sabemos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1615.1.2. Escapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1625.1.3. Longitud de una cadena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1655.1.4. Indexacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1665.1.5. Recorrido de cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1675.1.6. Un ejemplo: un contador de palabras . . . . . . . . . . . . . . . . . . . . . . 1695.1.7. Otro ejemplo: un programa de conversin de binario a decimal . . . . . . . 1735.1.8. A vueltas con las cadenas: inversin de una cadena . . . . . . . . . . . . . 1755.1.9. Subcadenas: el operador de corte . . . . . . . . . . . . . . . . . . . . . . . . 1765.1.10. Una aplicacin: correo electrnico personalizado . . . . . . . . . . . . . . 1785.1.11. Referencias a cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1805.2. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1855.2.1. Cosas que, sin darnos cuenta, ya sabemos sobre las listas . . . . . . . . . 1865.2.2. Comparacin de listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1895.2.3. El operador is . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1905.2.4. Modificacin de elementos de listas . . . . . . . . . . . . . . . . . . . . . . . 1915.2.5. Mutabilidad, inmutabilidad y representacin de la informacin enmemoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1925.2.6. Adicin de elementos a una lista . . . . . . . . . . . . . . . . . . . . . . . . 1945.2.7. Lectura de listas por teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . 1975.2.8. Borrado de elementos de una lista . . . . . . . . . . . . . . . . . . . . . . . 199

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    5.2.9. Pertenencia de un elemento a una lista . . . . . . . . . . . . . . . . . . . . 2025.2.10. Ordenacin de una lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2035.3. De cadenas a listas y viceversa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2085.4. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2105.4.1. Sobre la creacin de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . 2115.4.2. Lectura de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2145.4.3. Qu dimensin tiene una matriz? . . . . . . . . . . . . . . . . . . . . . . . . 2145.4.4. Operaciones con matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2155.4.5. El juego de la vida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2196. Funciones 2316.1. Uso de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2316.2. Definicin de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2326.2.1. Definicin y uso de funciones con un solo parmetro . . . . . . . . . . . . 2326.2.2. Definicin y uso de funciones con varios parmetros . . . . . . . . . . . . . 2426.2.3. Definicin y uso de funciones sin parmetros . . . . . . . . . . . . . . . . . 2446.2.4. Procedimientos: funciones sin devolucin de valor . . . . . . . . . . . . . . 2486.2.5. Funciones que devuelven varios valores mediante una lista . . . . . . . . . 2536.3. Variables locales y variables globales . . . . . . . . . . . . . . . . . . . . . . . . . . 2556.4. El mecanismo de las llamadas a funcin . . . . . . . . . . . . . . . . . . . . . . . . . 2646.4.1. La pila de llamadas a funcin y el paso de parmetros . . . . . . . . . . . 2646.4.2. Paso del resultado de expresiones como argumentos . . . . . . . . . . . . . 2696.4.3. Ms sobre el paso de parmetros . . . . . . . . . . . . . . . . . . . . . . . . 2706.4.4. Acceso a variables globales desde funciones . . . . . . . . . . . . . . . . . . 2786.5. Un ejemplo: Memorin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2836.6. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2936.6.1. Integracin numrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2936.6.2. Aproximacin de la exponencial de un nmero real . . . . . . . . . . . . . . 2956.6.3. Clculo de nmeros combinatorios . . . . . . . . . . . . . . . . . . . . . . . . 3006.6.4. El mtodo de la biseccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3016.7. Diseo de programas con funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 3036.7.1. Ahorro de tecleo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3046.7.2. Mejora de la legibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3056.7.3. Algunos consejos para decidir qu debera definirse como funcin: anlisisdescendente y ascendente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3056.8. Recursin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3066.8.1. Clculo recursivo del factorial . . . . . . . . . . . . . . . . . . . . . . . . . . 3076.8.2. Clculo recursivo del nmero de bits necesarios para representar un nmero3106.8.3. Los nmeros de Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3116.8.4. El algoritmo de Euclides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3146.8.5. Las torres de Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3166.8.6. Recursin indirecta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3196.8.7. Grficos fractales: copos de nieve de Von Koch . . . . . . . . . . . . . . . . 3206.9. Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3266.9.1. Un mdulo muy sencillo: mnimo y mximo . . . . . . . . . . . . . . . . . . 3266.9.2. Un mdulo ms interesante: gravedad . . . . . . . . . . . . . . . . . . . . . 3276.10. Documentacin del cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3306.10.1. Otro mdulo: clculo vectorial . . . . . . . . . . . . . . . . . . . . . . . . . . 3316.10.2. Un mdulo para trabajar con polinomios . . . . . . . . . . . . . . . . . . . . 3346.10.3. Un mdulo con utilidades estadsticas . . . . . . . . . . . . . . . . . . . . . 3376.10.4. Un mdulo para clculo matricial . . . . . . . . . . . . . . . . . . . . . . . . 338

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    7. Tipos estructurados: clases y diccionarios 3417.1. Tipos de datos a medida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3417.1.1. Lo que sabemos hacer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3417.1.2. . . . pero sabemos hacerlo mejor . . . . . . . . . . . . . . . . . . . . . . . . . 3427.1.3. Lo que haremos: usar tipos de datos a medida . . . . . . . . . . . . . . . 3447.2. Definicin de clases en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3467.2.1. Referencias y objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3497.2.2. Un ejemplo: gestin de calificaciones de estudiantes . . . . . . . . . . . . . 3517.3. Algunas clases de uso comn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3547.3.1. La clase fecha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3557.3.2. Colas y pilas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3587.3.3. Colas de prioridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3607.3.4. Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3617.4. Un ejemplo completo: gestin de un videoclub . . . . . . . . . . . . . . . . . . . . . 3637.4.1. Videoclub bsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3647.4.2. Un videoclub ms realista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3707.4.3. Listado completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3727.4.4. Extensiones propuestas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3787.4.5. Algunas reflexiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3787.5. Diccionarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3797.5.1. Creacin de diccionarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3797.5.2. Consulta en diccionarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3797.5.3. Recorrido de diccionarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3807.5.4. Borrado de elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3817.5.5. Una aplicacin: un listn telefnico . . . . . . . . . . . . . . . . . . . . . . . 3817.5.6. Un contador de palabras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3837.5.7. Rediseo del programa del videoclub con diccionarios . . . . . . . . . . . . 3848. Ficheros 3878.1. Generalidades sobre ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3878.1.1. Sistemas de ficheros: directorios y ficheros . . . . . . . . . . . . . . . . . . 3878.1.2. Rutas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3888.1.3. Montaje de unidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3898.2. Ficheros de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3908.2.1. El protocolo de trabajo con ficheros: abrir, leer/escribir, cerrar . . . . . . . 3908.2.2. Lectura de ficheros de texto lnea a lnea . . . . . . . . . . . . . . . . . . . 3908.2.3. Lectura carcter a carcter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3958.2.4. Otra forma de leer lnea a lnea . . . . . . . . . . . . . . . . . . . . . . . . . 3978.2.5. Escritura de ficheros de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . 3988.2.6. Aadir texto a un fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4008.2.7. Cosas que no se pueden hacer con ficheros de texto . . . . . . . . . . . . . 4028.2.8. Un par de ficheros especiales: el teclado y la pantalla . . . . . . . . . . . 4028.3. Una aplicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4038.4. Texto con formato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    PrefacioIntroduccin a la programacin con Python 3 desarrolla el temario de la asignatura Pro-gramacin I que se imparte durante el primer semestre de primer curso en los grados enIngeniera Informtica y en Matemtica Computacional de la Universitat Jaume I. En ella sepretende ensear a programar y se utiliza Python como primer lenguaje de programacin.Por qu Python? Python es un lenguaje de muy alto nivel que permite expresar algoritmosde forma casi directa (ha llegado a considerarse pseudocdigo ejecutable) y hemos comprobadoque se trata de un lenguaje particularmente adecuado para la enseanza de la programacin.Esta impresin se ve corroborada por la adopcin de Python como lenguaje introductorio enotras universidades. Otros lenguajes, como Java, C o C#, exigen una gran atencin a multitudde detalles que dificultan la implementacin de algoritmos a un estudiante que se enfrentapor primera vez al desarrollo de programas. No obstante, son lenguajes de programacin dereferencia y deberan formar parte del currculum de todo informtico. Aprender Python comoprimer lenguaje permite estudiar las estructuras de control y de datos bsicas con un altonivel de abstraccin y, as, entender mejor qu supone exactamente la mayor complejidad dela programacin en otros lenguajes y hasta qu punto es mayor el grado de control que nosotorgan. Por ejemplo, una vez se han estudiado listas en Python, su implementacin en otroslenguajes permite al estudiante no perder de vista el objetivo ltimo: construir una entidad concierto nivel de abstraccin usando las herramientas concretas proporcionadas por el lenguaje. Dealgn modo, pues, Python ayuda al aprendizaje posterior de otros lenguajes, lo que proporcionaal estudiante una visin ms rica y completa de la programacin. Las similitudes y diferenciasentre los distintos lenguajes permiten al estudiante inferir ms fcilmente qu es fundamental yqu accesorio o accidental al disear programas en un lenguaje de programacin cualquiera.Y por qu otro libro de texto introductorio a la programacin? Ciertamente hay muchoslibros que ensean a programar desde cero. Creemos que este texto se diferencia de ellos en laforma en que se exponen y desarrollan los contenidos. Hemos procurado adoptar siempre el puntode vista del estudiante y presentar los conceptos y estrategias para disear programas bsicospaso a paso, incrementalmente. La experiencia docente nos ha ido mostrando toda una seriede lneas de razonamiento inapropiadas, errores y vicios en los que caen muchos estudiantes.El texto intenta exponer, con mayor o menor fortuna, esos razonamientos, errores y vicios paraque el estudiante los tenga presentes y procure evitarlos. As, en el desarrollo de algunosprogramas llegamos a ofrecer versiones errneas para, acto seguido, estudiar sus defectos ymostrar una versin corregida. El libro est repleto de cuadros que pretenden profundizar enaspectos marginales, llamar la atencin sobre algn extremo, ofrecer algunas pinceladas dehistoria o, sencillamente, desviarse de lo sustancial con alguna digresin que podra resultarmotivadora para el estudiante.Queremos aprovechar para dar un consejo al estudiantado que no nos cansamos de repetir:es imposible aprender a programar limitndose a leer un texto o a seguir pasivamente unaexplicacin en clase (especialmente si el perodo de estudio se concentra en una o dos semanasantes del examen). Programar al nivel propio de un curso introductorio no es particularmentedifcil, pero constituye una actividad intelectual radicalmente nueva para muchos estudiantes.Es necesario darse una oportunidad para ir asentando los conocimientos y las estrategias dediseo de programas (y as, superar el curso). Esa oportunidad requiere tiempo para madurar. . . ytrabajo, mucho trabajo; por eso el texto ofrece ms de cuatrocientos ejercicios. Solo tras haberseenfrentado a buena parte de ellos se estar preparado para demostrar que se ha aprendido lonecesario.

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Este texto es una actualizacin y revisin del libro Introduccin a la programacin con Pythonpublicado dentro de la coleccin Sapientia de la Universitat Jaume I. Las principales diferenciascon respecto a la versin anterior son:Se ha actualizado la versin del lenguaje empleado. La versin anterior del libro se escribipara Python 2 (en concreto, para la versin 2.3). Desde entonces, el lenguaje ha seguidodos ramas de desarrollo diferentes: Python 2 y Python 3. Este nuevo texto utiliza Python 3,lo que, adems de modificar contenidos, ha supuesto reescribir todos los programas deejemplo. Aunque en el momento de escribir estas lneas ya se ha publicado la versin 3.4de Python, todos los programas de ejemplo incluidos en este libro deberan funcionar paracualquier versin a partir de la 3.1.Tambin hemos cambiado el entorno de desarrollo y la librera grfica empleada. Laversin anterior del libro usaba un entorno de desarrollo propio (PythonG) que, a suvez, incorporaba una sencilla librera grfica. Ahora se utiliza un entorno de desarrolloestndar y muy potente, Eclipse, que podr seguir siendo usado por los estudiantes enotras asignaturas y con otros lenguajes de programacin. En cuanto a la parte grfica,ahora se utiliza el mdulo turtle, incorporado al propio lenguaje desde la versin 3.1.El captulo 7 del libro anterior resultaba un tanto artificial al simular, mediante una librerapropia, el concepto de registro como una versin simplificada del concepto de clase.Aunque la programacin orientada a objetos se estudia en detalle en otras asignaturasde los grados, hemos considerado ms acertado reescribir este captulo para introducir losconceptos bsicos de clase y objeto. Adems, se ha incluido tambin un breve apartadodedicado al estudio de diccionarios.

    Por supuesto, hemos corregido erratas (y tambin errores importantes!), hemos aadido nuevosejemplos y modificado otros, hemos incorporado nuevos ejercicios y reubicado otros en lugaresque hemos juzgado ms apropiados, etc.Convenios tipogrficosHemos tratado de seguir una serie de convenios tipogrficos a lo largo del texto. Los pro-gramas, por ejemplo, se muestran con fondo gris, as:

    1 printPor regla general, las lneas del programa aparecen numeradas a mano izquierda. Esta nu-meracin tiene por objeto facilitar la referencia a puntos concretos del programa y no debereproducirse en el fichero de texto si se copia el programa.Cuando se quiere destacar el nombre del fichero en el que reside un programa, se indica enuna barra encima del cdigo:

    1 printCuando un programa contiene algn error grave, aparece un rayo rojo a la izquierda del nombredel programa:E1 rint

    Algunos programas no estn completos y, por ello, presentan alguna deficiencia. No obstante,hemos optado por no marcarlos como errneos cuando estos evolucionan en el curso de laexposicin.La informacin que aparece en pantalla se muestra con un tipo de letra monoespaciado. As,el resultado de ejecutar la versin correcta del programa hola_mundo py se mostrar como:

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Las sesiones interactivas del intrprete de Python tambin se muestran con un tipo de letramonoespaciado. El prompt primario del intrprete Python se muestra con los caracteres y el secundario con .Las expresiones y sentencias que debe teclear el usuario, tanto en el intrprete de Pythoncomo durante la ejecucin de un programa, se destacan en color azul y el retorno de carro serepresenta explcitamente con el smbolo :

    AgradecimientosEste texto es fruto de la experiencia docente de todo el profesorado de las asignaturasMetodologa y tecnologa de la programacin (de las antiguas titulaciones de Ingeniera In-formtica e Ingeniera Tcnica en Informtica de Gestin) y Programacin I (de los actualesgrados en Ingeniera Informtica y en Matemtica Computacional) de la Universitat Jaume I yse ha enriquecido con las aportaciones, comentarios y correcciones de muchos profesores delDepartamento de Lenguajes y Sistemas Informticos: Juan Pablo Aibar Ausina, Rafael BerlangaLlavori, Antonio Castellanos Lpez, Vctor Manuel Jimnez Pelayo, Mara Dolores Llid Escriv,David Llorens Piana, Jos Luis Llopis Borrs, Ramn Mollineda Crdenas, Federico Prat Villary Juan Miguel Vilar Torres. Para todos ellos, nuestro ms sincero agradecimiento. Finalmen-te, tambin agradecemos la colaboracin de cuantos nos han hecho llegar sugerencias o handetectado erratas.

    Castelln de la Plana, 28 de julio de 2014Andrs Marzal Var, Isabel Gracia Luengo y Pedro Garca Sevilla

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Captulo 1Introduccin

    Qu sabes de este asunto? pregunt el Rey a Alicia.Nada dijo Alicia.Absolutamente nada? insisti el Rey.Absolutamente nada dijo Alicia.Esto es importante dijo el Rey, volvindose hacia los jurados.Alicia en el pas de las maravillas, Lewis Carroll

    El objetivo de este curso es ensearte a programar, esto es, a disear algoritmos y expre-sarlos como programas escritos en un lenguaje de programacin para poder ejecutarlos en uncomputador.Seis trminos tcnicos en el primer prrafo. No est mal. Vayamos paso a paso: empezaremospor presentar en qu consiste, bsicamente, un computador.1.1. Computadores

    El diccionario de la Real Academia define computador electrnico como Mquina electrnica,analgica o digital, dotada de una memoria de gran capacidad y de mtodos de tratamientode la informacin, capaz de resolver problemas matemticos y lgicos mediante la utilizacinautomtica de programas informticos.La propia definicin nos da indicaciones acerca de algunos elementos bsicos del computador:la memoria,y algn dispositivo capaz de efectuar clculos matemticos y lgicos.

    La memoria es un gran almacn de informacin. En la memoria guardamos todo tipo dedatos: valores numricos, textos, imgenes, etc. El dispositivo encargado de efectuar operacionesmatemticas y lgicas, que recibe el nombre de Unidad Aritmtico-Lgica (UAL), es como unacalculadora capaz de trabajar con esos datos y producir, a partir de ellos, nuevos datos (elresultado de las operaciones). Otro dispositivo se encarga de transportar la informacin de lamemoria a la UAL, de controlar a la UAL para que efecte las operaciones pertinentes en elinstante justo y de depositar los resultados en la memoria: la Unidad de Control. El conjuntoque forman la Unidad de Control y la UAL se conoce por Unidad Central de Proceso (o CPU,del ingls Central Processing Unit).Podemos imaginar la memoria como un armario enorme con cajones numerados y la CPUcomo una persona que, equipada con una calculadora (la UAL), es capaz de buscar operandosen la memoria, efectuar clculos con ellos y dejar los resultados en la memoria.

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Unidad Central de ProcesoMemoria1234567...

    Unidad de ControlUnidad Aritmtico-Lgica

    Utilizaremos un lenguaje ms tcnico: cada uno de los cajones que conforman la memoriarecibe el nombre de celda (de memoria) y el nmero que lo identifica es su posicin o direccin,aunque a veces usaremos estos dos trminos para referirnos tambin a la correspondiente celda.Cada posicin de memoria permite almacenar una secuencia de unos y ceros de tamao fijo.Por qu unos y ceros? Porque la tecnologa actual de los computadores se basa en la sencillezcon que es posible construir dispositivos binarios, es decir, que pueden adoptar dos posiblesestados: encendido/apagado, hay corriente/no hay corriente, cierto/falso, uno/cero. . . Es posiblerepresentar datos tan variados como nmeros, textos, imgenes, etc. con solo unos y ceros? Larespuesta es s (aunque con ciertas limitaciones). Para entenderla mejor, es preciso que nosdetengamos brevemente a considerar cmo se representa la informacin con valores binarios.1.2. Codificacin de la informacin

    Una codificacin asocia signos con los elementos de un conjunto a los que denominamossignificados. En occidente, por ejemplo, codificamos los nmeros de cero a nueve con el conjuntode signos {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Al hacerlo, ponemos en correspondencia estos smbolos concantidades, es decir, con su significado: el smbolo 6 representa a la cantidad seis. El conjuntode signos no tiene por qu ser finito. Podemos combinar los dgitos en secuencias que ponemosen correspondencia con, por ejemplo, los nmeros naturales. La sucesin de dgitos 99 formaun nuevo signo que asociamos a la cantidad noventa y nueve. Los ordenadores solo tienen dossignos bsicos, {0, 1}, pero se pueden combinar en secuencias, as que no estamos limitados asolo dos posibles significados.Una variable que solo puede tomar uno de los dos valores binarios recibe el nombre de bit(acrnimo del ingls binary digit). Es habitual trabajar con secuencias de bits de tamao fijo.Una secuencia de 8 bits recibe el nombre de byte (aunque en espaol el trmino correcto esocteto, este no acaba de imponerse y se usa mucho ms la voz inglesa). Con una secuencia de8 bits podemos representar 256 (que es el valor de 28) significados diferentes. El rango [0, 255]de valores naturales comprende 256 valores, as que podemos representar cualquiera de elloscon un patrn de 8 bits. Podramos decidir, en principio, que la correspondencia entre bytes yvalores naturales es completamente arbitraria. As, podramos decidir que la secuenciarepresenta, por ejemplo, el nmero natural 0 y que la secuencia representa el valor 3.Aunque sea posible esta asociacin arbitraria, no es deseable, pues complica enormementeefectuar operaciones con los valores. Sumar, por ejemplo, obligara a tener memorizada unatabla que dijera cul es el resultado de efectuar la operacin con cada par de valores, y hay65.536 pares diferentes!Los sistemas de representacin posicional permiten establecer esa asociacin entre secuen-cias de bits y valores numricos naturales de forma sistemtica. Centramos el discurso ensecuencias de 8 bits, aunque todo lo que exponemos a continuacin es vlido para secuen-cias de otros tamaos1. El valor de una cadena de bits b7b6b5b4b3b2b1b0 es, en un siste-ma posicional convencional, 7i=0 bi 2i. As, la secuencia de bits codifica el valor0 27 + 0 26 + 0 25 + 0 24 + 1 23 + 0 22 + 1 21 + 1 20 = 8+ 2+ 1 = 11. El bit de ms a la1Ocho bits ofrecen un rango de valores muy limitado. Es habitual en los ordenadores modernos trabajar con gruposde 4 bytes (32 bits) u 8 bytes (64 bits).

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    izquierda recibe el nombre de bit ms significativo y el bit de ms a la derecha se denominabit menos significativo.1 Cul es el mximo valor que puede representarse con 16 bits y un sistema de repre-sentacin posicional como el descrito? Qu secuencia de bits le corresponde?2 Cuntos bits se necesitan para representar los nmeros del 0 al 18, ambos inclusive?El sistema posicional es especialmente adecuado para efectuar ciertas operaciones aritm-ticas. Tomemos por caso la suma. Hay una tabla de sumar en binario que te mostramos acontinuacin:

    sumandos suma acarreo

    El acarreo no nulo indica que un dgito no es suficiente para expresar la suma de dos bits yque debe aadirse el valor uno al bit que ocupa una posicin ms a la izquierda. Para ilustrarla sencillez de la adicin en el sistema posicional, hagamos una suma de dos nmeros de 8 bitsusando esta tabla. En este ejemplo sumamos los valores 11 y 3 en su representacin binaria:+

    Empezamos por los bits menos significativos. Segn la tabla, la suma y da con acarreo :Acarreo+

    El segundo dgito empezando por la derecha toma el valor que resulta de sumar a yel acarreo que arrastramos. O sea, y es con acarreo , pero al sumar el acarreo quearrastramos de la anterior suma de bits, el resultado final es con acarreo :Acarreo+

    Ya te habrs hecho una idea de la sencillez del mtodo. De hecho, ya lo conoces bien, pues elsistema de numeracin que aprendiste en la escuela es tambin posicional, solo que usando diezdgitos diferentes en lugar de dos, as que el procedimiento de suma es esencialmente idntico.He aqu el resultado final, que es la secuencia de bits , o sea, el valor 14:Acarreo+

    La circuitera electrnica necesaria para implementar un sumador que acte como el descritoes extremadamente sencilla.3 Calcula las siguientes sumas de nmeros codificados con 8 bits en el sistema posicional:a)

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    b)c)

    Debes tener en cuenta que la suma de dos nmeros de 8 bits puede proporcionar una cantidadque requiere 9 bits. Suma, por ejemplo, las cantidades 255 (en binario de 8 bits es )y 1 (que en binario es ):Acarreo+( )

    El resultado es la cantidad 256, que en binario se expresa con 9 bits, no con 8. Decimosen este caso que la suma ha producido un desbordamiento. Esta anomala debe ser tenida encuenta cuando se usa o programa un ordenador.Hasta el momento hemos visto cmo codificar valores positivos. Podemos representar tambincantidades negativas? La respuesta es s. Consideremos brevemente tres formas de hacerlo. Laprimera es muy intuitiva: consiste en utilizar el bit ms significativo para codificar el signo; sivale , por ejemplo, el nmero expresado con los restantes bits es positivo (con la representacinposicional que ya conoces), y si vale , es negativo. Por ejemplo, el valor de es 2 yel de es 2. Efectuar sumas con valores positivos y negativos resulta relativamentecomplicado si codificamos as el signo de un nmero. Esta mayor complicacin se trasladatambin a la circuitera necesaria. Mala cosa.Otra forma de codificar cantidades positivas y negativas es el denominado complemento auno. Consiste en lo siguiente: se toma la representacin posicional de un nmero (que debepoder expresarse con 7 bits) y se invierten todos sus bits si es negativo. La suma de nmeroscodificados as es relativamente sencilla: se efecta la suma convencional y, si no se ha producidoun desbordamiento, el resultado es el valor que se deseaba calcular; pero si se produce undesbordamiento, la solucin se obtiene sumando el valor 1 al resultado de la suma (sin teneren cuenta ya el bit desbordado). Vemoslo con un ejemplo. Sumemos el valor 3 al valor 2 encomplemento a uno:Acarreo+( ) +

    La primera suma ha producido un desbordamiento. El resultado correcto resulta de sumaruna unidad a los 8 primeros bits.La codificacin en complemento a uno tiene algunas desventajas. Una de ellas es que haydos formas de codificar el valor 0 (con 8 bits, por ejemplo, tanto comorepresentan el valor 0) y, por tanto, solo podemos representar 255 valores ([127, 127]), en lugarde 256. Pero el principal inconveniente es la potencial lentitud con que se realizan operacionescomo la suma: cuando se produce un desbordamiento se han de efectuar dos adiciones, es decir,se ha de invertir el doble de tiempo para completar la operacin.Una codificacin alternativa (y que es la utilizada en los ordenadores) es la denominadacomplemento a dos. Para cambiar el signo a un nmero hemos de invertir todos sus bits ysumar 1 al resultado. Esta codificacin, que parece poco natural, tiene las ventajas de que solohay una forma de representar el valor nulo (el rango de valores representados es [128, 127])y de que una sola operacin de suma basta siempre para obtener el resultado correcto de unaadicin. Repitamos el ejemplo anterior. Sumemos 3 y 2, pero en complemento a dos:

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Acarreo+( )Si ignoramos el bit desbordado, el resultado es correcto.

    4 Codifica en complemento a dos de 8 bits los siguientes valores:a) 4b) 4c) 0d) 127e) 1f ) 15 Efecta las siguientes sumas y restas en complemento a dos de 8 bits:a) 4 + 4b) 4 + 3c) 127 128d) 127 127e) 1 1f ) 1 2Bueno, ya hemos hablado bastante acerca de cmo codificar nmeros (aunque ms ade-lante ofreceremos alguna reflexin acerca de cmo representar valores con parte fraccional).Preocupmonos por un instante acerca de cmo representar texto. Hay una tabla que pone encorrespondencia 127 smbolos con secuencias de bits y que se ha asumido como estndar. Entreesos smbolos se encuentran todas las letras del alfabeto ingls, tanto en minscula como enmayscula, signos de puntuacin y otros que puedes encontrar en el teclado. Es la denominadatabla ASCII, cuyo nombre corresponde a las siglas de American Standard Code for InformationInterchange. La correspondencia entre secuencias de bits y caracteres determinada por la tablaes arbitraria, pero aceptada como estndar. La letra a, por ejemplo, se codifica con la secuenciade bits y la letra A se codifica con .El texto se puede codificar, pues, como una secuencia de bits. Aqu tienes el texto codificado con la tabla ASCII:Cuando aparece ese texto en pantalla, no vemos esas secuencias de bits: no entenderamosnada. En pantalla vemos una sucesin de grficos, uno que corresponde a la letra H, seguidode otro que corresponde a la letra o. . . Estos grficos son patrones de pxeles almacenados enla memoria del ordenador y que se muestran en la pantalla. Un bit de valor 0 puede mostrarsecomo color blanco y un bit de valor 1 como color negro. La letra H que ves en pantalla, porejemplo, podra no ser ms que la visualizacin de este patrn de bits:

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    La tabla ASCII al completoEstos son los valores (en base 10) de cada smbolo en la tabla ASCII:

    Los 32 primeros elementos de la tabla corresponden a los denominados caracteres de control yse disearon para controlar los dispositivos en los que se muestra el texto. La mayor parte de ellosson obsoletos, pues se concibieron cuando lo normal era que el texto producido por un ordenadorse mostrara en un teletipo, una impresora, tarjetas perforadas o una consola. El carcter , porejemplo, haca sonar la campanita del teletipo ( es abreviatura de bell). En un ordenador dehoy, ese carcter puede disparar un pitido. El carcter con nmero decimal 32 (en binario )es el espacio en blanco ( es abreviatura de space). Del 33 al 47 tenemos un juego de caracteresvariados (signos de puntuacin, el signo del dlar, la almohadilla, algunos operadores matemticos,etc.). Del 48 al 57 encontramos los dgitos del sistema decimal. Del 58 al 64 hay otros caracteresespeciales (signos de puntuacin, de comparacin y la arroba). Empieza entonces el alfabeto enmaysculas, que va del cdigo 65 al 90). Del 91 al 96 volvemos a encontrar smbolos variados y elalfabeto en minsculas sigue a estos con los smbolos del 97 al 122. La tabla se completa con otroscuatro smbolos variados y un ltimo carcter de control: el que representa la accin de borrado deun carcter ( es abreviatura de delete).En la memoria del ordenador se dispone de un patrn de bits para cada carcter2. Cuandose detecta el cdigo ASCII , se muestra en pantalla el patrn de bits correspondientea la representacin grfica de la H. Truculento, pero eficaz.No solo podemos representar caracteres con patrones de pxeles: todos los grficos de orde-nador son simples patrones de pxeles dispuestos como una matriz.Como puedes ver, s basta con ceros y unos para codificar la informacin que manejamos enun ordenador: nmeros, texto, imgenes, etc.

    1.3. Programas y lenguajes de programacinAntes de detenernos a hablar de la codificacin de la informacin estbamos comentandoque la memoria es un gran almacn con cajones numerados, es decir, identificables con valoresnumricos: sus respectivas direcciones. En cada cajn se almacena una secuencia de bits detamao fijo. La CPU, el cerebro del ordenador, es capaz de ejecutar acciones especificadasmediante secuencias de instrucciones. Una instruccin describe una accin muy simple, delestilo de suma esto con aquello, multiplica las cantidades que hay en tal y cual posicinde memoria, deja el resultado en tal direccin de memoria, haz una copia del dato de estadireccin en esta otra direccin, averigua si la cantidad almacenada en determinada direccines negativa, etc. Las instrucciones se representan mediante combinaciones particulares de unosy ceros (valores binarios) y, por tanto, se pueden almacenar en la memoria.Combinando inteligentemente las instrucciones en una secuencia podemos hacer que la CPUejecute clculos ms complejos. Una secuencia de instrucciones es un programa. Si hay una

    2La realidad es cada vez ms compleja. Los sistemas modernos almacenan los caracteres en memoria de otra forma,pero hablar de ello supone desviarnos mucho de lo que queremos contar.

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    instruccin para multiplicar pero ninguna para elevar un nmero al cubo, podemos construir unprograma que efecte este ltimo clculo a partir de las instrucciones disponibles. He aqu,grosso modo, una secuencia de instrucciones que calcula el cubo a partir de productos:1) Toma el nmero y multiplcalo por s mismo.2) Multiplica el resultado de la ltima operacin por el nmero original.

    Las secuencias de instrucciones que el ordenador puede ejecutar reciben el nombre deprogramas en cdigo de mquina, porque el lenguaje de programacin en el que estn expresadasrecibe el nombre de cdigo de mquina. Un lenguaje de programacin es cualquier sistema denotacin que permite expresar programas.1.3.1. Cdigo de mquinaEl cdigo de mquina codifica las secuencias de instrucciones como sucesiones de unos yceros que siguen ciertas reglas. Cada familia de ordenadores dispone de su propio repertorio deinstrucciones, es decir, de su propio cdigo de mquina.Un programa que, por ejemplo, calcula la media de tres nmeros almacenados en las posi-ciones de memoria 10, 11 y 12, respectivamente, y deja el resultado en la posicin de memoria13, podra tener el siguiente aspecto expresado de forma comprensible para nosotros:

    Memoria1234567...En realidad, el contenido de cada direccin estara codificado como una serie de unos yceros, as que el aspecto real de un programa como el descrito arriba podra ser este:

    Memoria1234567...La CPU es un ingenioso sistema de circuitos electrnicos capaz de interpretar el significadode cada una de esas secuencias de bits y llevar a cabo las acciones que codifican. Cuando laCPU ejecuta el programa empieza por la instruccin contenida en la primera de sus posiciones dememoria. Una vez ha ejecutado una instruccin, pasa a la siguiente, y sigue as hasta encontraruna instruccin que detenga la ejecucin del programa.Supongamos que en las direcciones de memoria 10, 11 y 12 se han almacenado los valores5, 10 y 6, respectivamente. Representamos as la memoria:

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Memoria1234... 510 1011 612...Naturalmente, los valores de las posiciones 10, 11 y 12 estarn codificados en binario, aunquehemos optado por representarlos en base 10 en aras de una mayor claridad.La ejecucin del programa procede del siguiente modo. En primer lugar, se ejecuta la ins-truccin de la direccin 1, que dice que tomemos el contenido de la direccin 10 (el valor 5), losumemos al de la direccin 11 (el valor 10) y dejemos el resultado (el valor 15) en la direccinde memoria 13. Tras ejecutar esta primera instruccin, la memoria queda as:

    Memoria1234... 510 1011 612 1513...A continuacin, se ejecuta la instruccin de la direccin 2, que ordena que se tome el contenidode la direccin 13 (el valor 15), se sume al contenido de la direccin 12 (el valor 6) y se depositeel resultado (el valor 21) en la direccin 13. La memoria pasa a quedar en este estado.

    Memoria1234... 510 1011 612 2113...Ahora, la tercera instruccin dice que hemos de tomar el valor de la direccin 13 (el valor 21),dividirlo por 3 y depositar el resultado (el valor 7) en la direccin 13. Este es el estado en quequeda la memoria tras ejecutar la tercera instruccin:

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Memoria1234... 510 1011 612 713...Y finalmente, la CPU detiene la ejecucin del programa, pues se encuentra con la instruccinen la direccin 4.

    6 Ejecuta paso a paso el mismo programa con los valores 2, 2 y 0 en las posiciones dememoria 10, 11 y 12, respectivamente.7 Disea un programa que calcule la media de cinco nmeros depositados en las posicio-nes de memoria que van de la 10 a la 14 y que deje el resultado en la direccin de memoria 15.Recuerda que la media x de cinco nmeros x1, x2, x3, x4 y x5 es

    x = 5i=1 xi5 = x1 + x2 + x3 + x4 + x55 .8 Disea un programa que calcule la varianza de cinco nmeros depositados en lasposiciones de memoria que van de la 10 a la 14 y que deje el resultado en la direccin dememoria 15. La varianza, que se denota con 2, es

    2 = 5i=1(xi x)25 ,donde x es la media de los cinco valores. Supn que existe una instruccin Multiplicar elcontenido de direccin a por el contenido de direccin b y dejar el resultado en direccin c.Qu instrucciones podemos usar para confeccionar programas? Ya hemos dicho que el orde-nador solo sabe ejecutar instrucciones muy sencillas. En nuestro ejemplo, solo hemos utilizadotres instrucciones distintas:

    una instruccin de suma de la forma p qr;una instruccin de divisin de la forma p qr;y una instruccin que indica que se ha llegado al final del programa: .

    Pocos programas interesantes podemos hacer con tan solo estas tres instrucciones! Na-turalmente, en un cdigo de mquina hay instrucciones que permiten efectuar sumas, restas,divisiones y otras muchas operaciones. Y hay, adems, instrucciones que permiten escoger quinstruccin se ejecutar a continuacin, bien directamente, bien en funcin de si se cumple ono determinada condicin (por ejemplo, p).

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    1.3.2. Lenguaje ensambladorEn los primeros tiempos de la informtica los programas se introducan en el ordenadordirectamente en cdigo de mquina, indicando uno por uno el valor de los bits de cada unade las posiciones de memoria. Para ello se insertaban manualmente cables en un panel deconectores: cada cable insertado en un conector representaba un uno y cada conector sin cablerepresentaba un cero. Como puedes imaginar, programar as un computador resultaba una tareaardua, extremadamente tediosa y propensa a la comisin de errores. El ms mnimo fallo conducaa un programa incorrecto. Pronto se disearon notaciones que simplificaban la programacin:cada instruccin de cdigo de mquina se representaba mediante un cdigo mnemotcnico, esdecir, una abreviatura fcilmente identificable con el propsito de la instruccin.Por ejemplo, el programa desarrollado antes se podra representar como el siguiente texto:

    En este lenguaje la palabra representa la instruccin de sumar, la de dividir yrepresenta la instruccin que indica que debe finalizar la ejecucin del programa. La almohadilla( ) delante de un nmero indica que deseamos acceder al contenido de la posicin de memoriacuya direccin es dicho nmero. Los caracteres que representan el programa se introducen enla memoria del ordenador con la ayuda de un teclado y cada letra se almacena en una posicinde memoria como una combinacin particular de unos y ceros (su cdigo ASCII, por ejemplo).Pero cmo se puede ejecutar ese tipo de programa si la secuencia de unos y ceros que ladescribe como texto no constituye un programa vlido en cdigo de mquina? Con la ayuda deotro programa: el ensamblador. El ensamblador es un programa traductor que lee el contenidode las direcciones de memoria en las que hemos almacenado cdigos mnemotcnicos y escribeen otras posiciones de memoria sus instrucciones asociadas en cdigo de mquina.El repertorio de cdigos mnemotcnicos traducible a cdigo de mquina y las reglas quepermiten combinarlos, expresar direcciones, codificar valores numricos, etc., recibe el nombre delenguaje ensamblador , y es otro lenguaje de programacin.1.3.3. Un programa diferente para cada ordenador?Cada CPU tiene su propio juego de instrucciones y, en consecuencia, un cdigo de mquinay uno o ms lenguajes ensambladores propios. Un programa escrito para una CPU de la marcaIntel no funcionar en una CPU diseada por otro fabricante, como Motorola3. Incluso diferentesversiones de una misma CPU tienen juegos de instrucciones que no son totalmente compatiblesentre s!: los modelos ms evolucionados de una familia de CPU pueden incorporar instruccionesque no se encuentran en los ms antiguos4.Si queremos que un programa se ejecute en ms de un tipo de ordenador, habr que escri-birlo de nuevo para cada CPU particular? Durante mucho tiempo se intent definir algn tipode lenguaje ensamblador universal, es decir, un lenguaje cuyos cdigos mnemotcnicos, sincorresponderse con los del cdigo de mquina de ningn ordenador concreto, fuesen fcilmentetraducibles al cdigo de mquina de cualquier ordenador. Disponer de dicho lenguaje permitiraescribir los programas una sola vez y ejecutarlos en diferentes ordenadores tras efectuar las co-rrespondientes traducciones a cada cdigo de mquina con diferentes programas ensambladores.Si bien la idea es en principio interesante, presenta serios inconvenientes:

    Un lenguaje ensamblador universal no puede tener en cuenta cmo se disearn orde-nadores en un futuro y qu tipo de instrucciones soportarn, as que posiblemente quedeobsoleto en poco tiempo.3A menos que la CPU se haya diseado expresamente para reproducir el funcionamiento de la primera, como ocurrecon los procesadores de AMD, diseados con el objetivo de ejecutar el cdigo de mquina de los procesadores de Intel.4Por ejemplo, aadiendo instrucciones que faciliten la programacin de aplicaciones multimedia (como ocurre con losIntel Pentium MMX y modelos posteriores) prcticamente impensables cuando se dise la primera CPU de la familia(el Intel 8086).

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Hola, mundo!Nos gustara mostrarte el aspecto de los programas escritos en lenguajes ensambladores realescon un par de ejemplos. Es una tradicin ilustrar los diferentes lenguajes de programacin con unprograma sencillo que se limita a mostrar por pantalla el mensaje Hello, World! (Hola, mundo!),as que la seguiremos. He aqu ese programa escrito en los lenguajes ensambladores de dos CPUdistintas: a mano izquierda, el de los procesadores 80x86 de Intel (cuyos ltimos representantes porel momento son la familia de procesadores i5 e i7) y, a mano derecha, el de los procesadores de lafamilia Motorola 68000 (que es el procesador de los primeros ordenadores Apple Macintosh).

    Como puedes ver, ambos programas presentan un aspecto muy diferente. Por otra parte, los dos sonbastante largos (entre 10 y 20 lneas) y de difcil comprensin, a menos que se cuente con conocimientopreciso de lo que hace cada instruccin y las reglas sintcticas de cada lenguaje ensamblador.Programar en lenguaje ensamblador (incluso en ese supuesto lenguaje ensamblador uni-versal) es complicadsimo por los numerosos detalles que deben tenerse en cuenta.

    Adems, puestos a disear un lenguaje de programacin general, por qu no utilizar unlenguaje natural, es decir un lenguaje como el castellano o el ingls? Programar un computadorconsistira, simplemente, en escribir (o pronunciar frente a un micrfono!) un texto en el queindicsemos qu deseamos que haga el ordenador usando el mismo lenguaje con que nos co-municamos con otras personas. Un programa informtico podra encargarse de traducir nuestrasfrases al cdigo de mquina, del mismo modo que un programa ensamblador traduce lenguajeensamblador a cdigo de mquina. Es una idea atractiva, pero que queda lejos de lo que sabemoshacer por varias razones:La complejidad intrnseca de las construcciones de los lenguajes naturales dificulta enor-memente el anlisis sintctico de las frases, es decir, comprender su estructura y cmo serelacionan entre s los diferentes elementos que las constituyen.El anlisis semntico, es decir, la comprensin del significado de las frases, es an mscomplicado. Las ambigedades e imprecisiones del lenguaje natural hacen que sus frasespresenten, fcilmente, diversos significados, aun cuando las podamos analizar sintcti-camente. (Cuntos significados tiene la frase Trabaja en un banco.?) Sin una buenacomprensin del significado no es posible efectuar una traduccin aceptable.

    1.3.4. Lenguajes de programacin de alto nivelHay una solucin intermedia: podemos disear lenguajes de programacin que, sin ser tanpotentes y expresivos como los lenguajes naturales, eliminen buena parte de la complejidadpropia de los lenguajes ensambladores y estn bien adaptados al tipo de problemas que podemos

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    resolver con los computadores: los denominados lenguajes de programacin de alto nivel. Elcalificativo de alto nivel seala su independencia de un ordenador concreto. Por contraposicin,los cdigos de mquina y los lenguajes ensambladores se denominan lenguajes de programacinde bajo nivel.He aqu el programa que calcula la media de tres nmeros en un lenguaje de alto nivel tpico(Python):

    Las tres primeras lneas definen los tres valores y la cuarta calcula la media. Como puedes ver,resulta mucho ms legible que un programa en cdigo de mquina o en un lenguaje ensamblador.Para cada lenguaje de alto nivel y para cada CPU se puede escribir un programa que seencargue de traducir las instrucciones del lenguaje de alto nivel a instrucciones de cdigo demquina, con lo que se consigue la deseada independencia de los programas con respecto alos diferentes sistemas computadores. Solo habr que escribir una versin del programa en unlenguaje de programacin de alto nivel y la traduccin de ese programa al cdigo de mquinade cada CPU se realizar automticamente.1.3.5. Compiladores e intrpretesHemos dicho que los lenguajes de alto nivel se traducen automticamente a cdigo demquina, s, pero has de saber que hay dos tipos diferentes de traductores dependiendo de sumodo de funcionamiento: compiladores e intrpretes.Un compilador lee completamente un programa en un lenguaje de alto nivel y lo traduceen su integridad a un programa de cdigo de mquina equivalente. El programa de cdigo demquina resultante se puede ejecutar cuantas veces se desee, sin necesidad de volver a traducirel programa original.Un intrprete acta de un modo distinto: lee un programa escrito en un lenguaje de alto nivelinstruccin a instruccin y, para cada una de ellas, efecta una traduccin a las instrucciones decdigo de mquina equivalentes y las ejecuta inmediatamente. No hay un proceso de traduccinseparado por completo del de ejecucin. Cada vez que ejecutamos el programa con un intrprete,se repite el proceso de traduccin y ejecucin, ya que ambos son simultneos.

    Compiladores e intrpretes. . . de idiomasPuede resultarte de ayuda establecer una analoga entre compiladores e intrpretes de lenguajesde programacin y traductores e intrpretes de idiomas.Un compilador acta como un traductor que recibe un libro escrito en un idioma determinado(lenguaje de alto nivel) y escribe un nuevo libro que, con la mayor fidelidad posible, contiene unatraduccin del texto original a otro idioma (cdigo de mquina). El proceso de traduccin (compilacin)tiene lugar una sola vez y podemos leer el libro (ejecutar el programa) en el idioma destino (cdigode mquina) cuantas veces queramos.Un intrprete de programas acta como su homnimo en el caso de los idiomas. Supn quese imparte una conferencia en ingls en diferentes ciudades y un intrprete ofrece su traduccinsimultnea al castellano. Cada vez que la conferencia es pronunciada, el intrprete debe realizarnuevamente la traduccin. Es ms, la traduccin se produce sobre la marcha, frase a frase, y no de untirn al final de la conferencia. Del mismo modo acta un intrprete de un lenguaje de programacin:traduce cada vez que ejecutamos el programa y adems lo hace instruccin a instruccin.Por regla general, los intrpretes ejecutarn los programas ms lentamente, pues al tiempode ejecucin del cdigo de mquina se suma el que consume la traduccin simultnea. Adems,un compilador puede examinar el programa de alto nivel abarcando ms de una instruccin cadavez, por lo que es capaz de producir mejores traducciones. Un programa interpretado suele sermucho ms lento que otro equivalente que haya sido compilado (tpicamente entre 2 y 100 vecesms lento!).

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Si tan lento resulta interpretar un programa, por qu no se usan nicamente compiladores?Es pronto para que entiendas las razones, pero, por regla general, los intrpretes permitenuna mayor flexibilidad que los compiladores y ciertos lenguajes de programacin de alto nivelhan sido diseados para explotar esa mayor flexibilidad. Otros lenguajes de programacin, porcontra, sacrifican la flexibilidad en aras de una mayor velocidad de ejecucin. Aunque nadaimpide que compilemos o interpretemos cualquier lenguaje de programacin, ciertos lenguajesse consideran apropiados para que la traduccin se lleve a cabo con un compilador y otros no. Esms apropiado hablar, pues, de lenguajes de programacin tpicamente interpretados y lenguajesde programacin tpicamente compilados. Entre los primeros podemos citar Python, BASIC, Perl,Tcl, Ruby, Bash, Java o Lisp. Entre los segundos, C, C , Pascal, C o Fortran.5En el primer curso de los grados en Ingeniera Informtica y en Matemtica Computacionalde la Universitat Jaume I aprenderemos a programar usando dos lenguajes de programacindistintos: uno interpretado, Python, y otro, Java, que puede ser interpretado o compilado a partirde un lenguaje intermedio. Este volumen se dedica al estudio del lenguaje de programacinPython.1.3.6. PythonExisten muchos otros lenguajes de programacin, por qu aprender Python? Python presentauna serie de ventajas que lo hacen muy atractivo, tanto para su uso profesional como para elaprendizaje de la programacin. Entre las ms interesantes desde el punto de vista didcticotenemos:

    Python es un lenguaje muy expresivo, es decir, los programas Python son muy compactos:un programa Python suele ser bastante ms corto que su equivalente en lenguajes comoC. (Python llega a ser considerado por muchos un lenguaje de programacin de muy altonivel).Python es muy legible. La sintaxis de Python es muy elegante y permite la escritura deprogramas cuya lectura resulta ms fcil que si utilizramos otros lenguajes de programa-cin.Python ofrece un entorno interactivo que facilita la realizacin de pruebas y ayuda adespejar dudas acerca de ciertas caractersticas del lenguaje.El entorno de ejecucin de Python detecta muchos de los errores de programacin queescapan al control de los compiladores y proporciona informacin muy rica para detectarlosy corregirlos.Python puede usarse como lenguaje imperativo procedimental o como lenguaje orientadoa objetos.Posee un rico juego de estructuras de datos que se pueden manipular de modo sencillo.Estas caractersticas hacen que sea relativamente fcil traducir mtodos de clculo a programasPython.Los lenguajes de programacin no permanecen inmutables a lo largo del tiempo: evolucionan.Python no es una excepcin. A partir de la experiencia con una versin del lenguaje y dela influencia que ejercen otros lenguajes sobre los programadores, hay una presin constantepor hacer que el lenguaje ofrezca nuevas capacidades o simplifique el modo en el que seexpresan ciertos clculos. Python fue diseado inicialmente por Guido van Rossum a partirde su experiencia colaborando con otros en el desarrollo de un lenguaje experimental: ABC. LaWorld Wide Web apareca al poco de crearse la primera versin de Python y ayudaba a poneren contacto a miles de programadores en todo el mundo. La elegancia de Python, unida a laaparicin de un nuevo medio de comunicacin entre especialistas, hicieron que un lenguaje que

    5Lo cierto es que la mayora de los lenguajes interpretados se traducen primero a un lenguaje intermedio que es elrealmente interpretado. Ocurre, por ejemplo, con Python y Java. C es an ms especial: los programas escritos en estelenguaje se traducen a un lenguaje intermedio que, a su vez, se traduce a cdigo de mquina en cada ejecucin, perode una sola vez. Este modelo de compilacin en dos etapas tambin ha pasado a ser corriente para Java.

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    no provena de la academia o la industria tuviera un xito inusitado. Hablamos de los aos 90del pasado siglo, dcada en la que fue tomando fuerza el concepto de software libre.Una activa comunidad de desarrolladores liderada por Guido van Rossum (quien sigue te-niendo la ltima palabra en todas las decisiones) va mejorando el lenguaje progresivamente.Cada nueva versin se marca con una serie de nmeros separados por puntos. Lee, si quieres,el cuadro titulado Versiones para entender ms sobre la codificacin tradicional de versionesde productos software.VersionesLos productos software evolucionan aadiendo funcionalidad o corrigiendo errores presentes enuna versin determinada. Se ha adoptado un convenio para referirse a cada una de las versiones deun producto software: una serie de nmeros separados por puntos. Tpicamente se usan 2 nmerosseparados por un punto: el nmero principal (major version number) y el nmero secundario (minorversion number). La primera versin de un producto es la 1.0. Si se aade funcionalidad menor ose corrigen errores menores, el autor del software ir produciendo las versiones 1.1, 1.2, 1.3, etc. delproducto (y que no acaba con la 1.9, pues puede seguir la 1.10, la 1.11, etc.). Se entiende que todasesas versiones son compatibles hacia atrs, es decir, los datos que sirven para la versin 1.x sonutilizables en toda versin 1.y donde y > x . En ocasiones se sacan versiones que contienen cambiostan pequeos que no merece avanzar ni siquiera el nmero secundario. As, a la versin 1.6 le puedesuceder la 1.6.1 y a esta la 1.6.2 para pasar luego a la 1.7. Cuando hay un cambio de funcionalidadimportante, se inicia una nueva serie de versiones que comienza en la 2.0. A la 2.0 le sigue la 2.1 yas sucesivamente.Pero no siempre las cosas son tan sencillas. El software que se produce en empresas sueleconsiderar aspectos relacionados con el mrketing y omitir o esconder la numeracin que hemospresentado. El sistema operativo Microsoft Windows sigui el criterio que hemos descrito en unprincipio. Hubo un Microsoft Windows 1.0, un 1.1, un 2.0, un 3.0 y un 3.1. Incluso un 3.11. Perola numeracin se rompi aparentemente con Microsoft Windows 95. Decimos aparentemente porqueinternamente se mantuvo. Esa versin de Windows es la cuarta. La serie XP es la quinta. MicrosoftWindows Vista es la versin 6.0. Y Microsoft Windows 7 es la. . . 6.1!Hemos hablado nicamente de las versiones que se lanzan al pblico. Durante el desarrollo hayvarias fases de pruebas antes de lanzar un producto. La primera versin que se hace pblica es laversin alfa. As, un producto puede tener una versin 1.3 alfa y hacerla pblica para pedir apotenciales colaboradores que ayuden a detectar errores. No es raro que se programe lanzar dosversiones alfa. Por ejemplo 1.3 alfa 1 y 1.3 alfa 2, recogiendo la segunda correcciones a erroresdetectados en la primera o incorporando alguna mejora de ltima hora. Cuando el software empiezaa considerarse robusto se pasa a las versiones beta, de las que tambin suele planificarse un parde versiones. En las versiones beta solo se corrigen errores y no se aade nueva funcionalidad. Yantes de salir al mercado, an se programa una versin casi definitiva: la versin RC (por ReleaseCandidate o candidato para lanzamiento). Nuestro hipottico producto conocera entonces unaversin 1.3 RC. Si la RC contuviera an numerosos fallos (lo que no sera buena seal), podrapublicarse una segunda RC, es decir, una versin 1.3 RC2. No hay obligacin de seguir este esquemade numeracin, pero lo encontrars con frecuencia en muchos productos.En el momento de escribir estas lneas, se ha publicado la versin de Python 3.4, precedida porlas versiones 3.4 alpha 1, 2, 3 y 4; 3.4 beta 1, 2 y 3; 3.4 RC 1, 2 y 3.

    La primera versin de Python con un uso extendido es la 1.5. Una gran comunidad dedesarrolladores, liderada por el autor original, trabaja continuamente en la mejora del lenguaje.Aproximadamente cada ao se hace pblica una nueva versin de Python. Tranquilo! No es quecon cada versin cambie radicalmente el lenguaje de programacin, sino que este se enriquecemanteniendo en lo posible la compatibilidad con los programas escritos para versiones anteriores.Nosotros utilizaremos caractersticas de la versin 3.1 de Python, por lo que debers utilizar esaversin o una superior.Una ventaja fundamental de Python es la gratuidad de su intrprete. Puedes descargar elintrprete de la pgina web . El intrprete de Python tiene versionespara prcticamente cualquier plataforma en uso: sistemas PC bajo Linux, sistemas PC bajoMicrosoft Windows, sistemas Macintosh de Apple, etc.Para que te vayas haciendo a la idea de qu aspecto presenta un programa completo enPython, te presentamos uno que calcula la media de tres nmeros que introduce por teclado el

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    usuario y muestra el resultado por pantalla:

    Python 2.x y Python 3.xEstamos en un momento especial en el desarrollo de Python: conviven dos ramas del lenguajeque evolucionan simultneamente. Una rama, la que se conoce como 2.x, public hace varios meses laversin 2.7.6 del lenguaje. La otra, conocida como 3.x, acaba de publicar la versin 3.4.0. El lenguajePython es bsicamente el mismo en las dos ramas, pero hay algunas diferencias importantes que hacenque un programa escrito para la versin 2.7 no siempre funcione en la versin 3.4. No ocurre lo mismocon los programas escritos para versiones distintas de la misma serie, es decir, un programa escritopara la versin 2.4, por ejemplo, debera funcionar perfectamente con un intrprete de cualquier versinposterior en la serie 2.x. Decimos que cada versin de la serie 2.x (o 3.x) presenta compatibilidadhacia atrs dentro de la misma serie.Por qu hay una rama 3.x incompatible con programas escritos para Python 2.x? A lo largo delos aos se fueron detectando fallos o aspectos poco elegantes del diseo de Python, cuya correccino mejora supondra que los programas ya escritos dejaran de funcionar. Guido van Rossum hablabaentonces de una versin de Python ideal en la que todos los problemas estaran resueltos: Python3000. El nmero 3000 era una referencia jocosa tanto a la versin en la que todo estara resueltocomo al ao en el que se publicara esa versin. Un buen da decidi no esperar tanto y anunci quePython creara un desarrollo en dos ramas: la serie 2.x y la 3.x. Durante un tiempo, los programadoresencontraran mejoras en el lenguaje que no introduciran incompatibilidades (la serie 2.x), pero seanimaba a que, en unos pocos aos, todos fueran adaptando sus programas a la versin 3.x. Pasadoun tiempo razonable, se cancelara el desarrollo en la serie 2.x y solo evolucionara la 3.x. Un plansensato para no estancar el lenguaje y no fastidiar a todos los programadores que haban apostadopor Python hace aos.En la ltima dcada Python ha experimentado un importantsimo aumento del nmero deprogramadores y empresas que lo utilizan. Google, por ejemplo, usa Python como uno de susprincipales lenguajes de desarrollo (otros dos son Java y C ). Guido van Rossum, inventor dePython, trabaja en Google. Tambin YouTube usa Python en sus sistemas de explotacin. EIndustrial Light & Magic (la empresa de efectos especiales de George Lucas) y Pixar recurrena Python en sus sistemas de produccin cinematogrfica. Y si alguna vez has usado BitTorrent,el popular sistema P2P, has de saber que est escrito en Python. La relacin de empresas einstituciones que usa Python es inacabable: Intel, Hewlett-Packard, NASA, JPMorgan Chase,etc. Aqu tienes unas citas que encabezaron durante algn tiempo la web oficial de Python( ):Python ha sido parte importante de Google desde el principio, y lo sigue siendoa medida que el sistema crece y evoluciona. Hoy da, docenas de ingenieros deGoogle usan Python y seguimos buscando gente diestra en este lenguaje.Peter Norvig, director de calidad de bsquedas de Google Inc.Python juega un papel clave en nuestra cadena de produccin. Sin l, un proyectode la envergadura de Star Wars: Episodio II hubiera sido muy difcil de sacaradelante. Visualizacin de multitudes, proceso de lotes, composicin de escenas. . .Python es lo que lo une todo.Tommy Brunette, director tcnico senior de Industrial Light & Magic.Python est en todas partes de Industrial Light & Magic. Se usa para extenderla capacidad de nuestras aplicaciones y para proporcionar la cola que las une. Cadaimagen generada por computador que creamos incluye a Python en algn punto delproceso. Philip Peterson, ingeniero principal de I+D de Industrial Light & Magic.

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    1.3.7. JavaEl lenguaje de programacin Java es uno de los ms utilizados en el mundo profesional.Se dise por tcnicos de Sun Microsystems a mediados de los aos 90 como un lenguajey entorno de programacin cuyos programas seran ejecutables en todo tipo de dispositivos:telfonos mviles, televisores, microondas, etc. Al presentarse en pblico, Java permita crearpequeos programas ejecutables en navegadores web: los denominados applets. En ese momento,la posibilidad de extender la experiencia de la navegacin con aplicaciones interactivas erarevolucionaria y dio un gran impulso al lenguaje. Pero finalmente Java se impuso en el mundode las aplicaciones web del lado del servidor. Las aplicaciones web ofrecen servicios accesiblescon el mismo protocolo de comunicacin que usan los navegadores.Finalmente no (solo) es el lenguaje en s lo que hace productivo el trabajo de los desarro-lladores: la coleccin de utilidades y bibliotecas que lo acompaan es fundamental. Java cuentacon un entorno de desarrollo muy rico y un gran conjunto de libreras de cdigo, es decir, colec-ciones de funciones ya escritas que el programador usa para no tener que reinventar la ruedaconstantemente.No obstante, programar con Java requiere un mayor esfuerzo que hacerlo con Python. Losprogramas Java son ms extensos y requieren de una gran atencin a muchos detalles por partedel programador.La torre de BabelHemos dicho que los lenguajes de programacin de alto nivel pretendan, entre otros objetivos,paliar el problema de que cada ordenador utilice su propio cdigo de mquina. Puede que, en conse-cuencia, ests sorprendido por el nmero de lenguajes de programacin citados. Pues los que hemoscitado son unos pocos de los ms utilizados: hay centenares! Por qu tantos?El primer lenguaje de programacin de alto nivel fue Fortran, que se dise en los primerosaos 50 (y an se utiliza hoy da, aunque en versiones evolucionadas). Fortran se dise con elpropsito de traducir frmulas matemticas a cdigo de mquina (de hecho, su nombre proviene deFORmula TRANslator, es decir, traductor de frmulas). Poco despus se disearon otros lenguajesde programacin con propsitos especficos: Cobol (Common Business Oriented Language), Lisp (ListProcessing language), etc. Cada uno de estos lenguajes haca fcil la escritura de programas parasolucionar problemas de mbitos particulares: Cobol para problemas de gestin empresarial, Lisppara ciertos problemas de Inteligencia Artificial, etc. Hubo tambin esfuerzos para disear lenguajesde propsito general, es decir, aplicables a cualquier dominio, como Algol 60 (Algorithmic Language).En la dcada de los 60 hicieron su aparicin nuevos lenguajes de programacin (Algol 68, Pascal,Simula 67, Snobol 4, etc.), pero quiz lo ms notable de esta dcada fue que se sentaron las basestericas del diseo de compiladores e intrpretes. Cuando la tecnologa para el diseo de estasherramientas se hizo accesible a ms y ms programadores hubo un autntico estallido en el nmerode lenguajes de programacin. Ya en 1969 se haban diseado unos 120 lenguajes de programacin yse haban implementado compiladores o intrpretes para cada uno de ellos.La existencia de tantsimos lenguajes de programacin cre una situacin similar a la de la torrede Babel: cada laboratorio o departamento informtico usaba un lenguaje de programacin y no habaforma de intercambiar programas.Con los aos se ha ido produciendo una seleccin de aquellos lenguajes de programacin msadecuados para cada tipo de tarea y se han diseado muchos otros que sintetizan lo aprendido delenguajes anteriores. Los ms utilizados hoy da son Java, C, C , Python, Perl y PHP.Si tienes curiosidad, puedes ver ejemplos del programa Hello, world! en ms de 100 len-guajes de programacin diferentes visitando la pgina

    1.4. Ms all de los programas: algoritmosDos programas que resuelven el mismo problema expresados en el mismo o en diferenteslenguajes de programacin pero que siguen, en lo fundamental, el mismo procedimiento, son dosimplementaciones del mismo algoritmo. Un algoritmo es, sencillamente, una secuencia de pasosorientada a la consecucin de un objetivo.

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Cuando diseamos un algoritmo podemos expresarlo en uno cualquiera de los numerososlenguajes de programacin de propsito general existentes. Sin embargo, ello resulta poco ade-cuado:no todos los programadores conocen todos los lenguajes y no hay consenso acerca de cules el ms adecuado para expresar las soluciones a los diferentes problemas,cualquiera de los lenguajes de programacin presenta particularidades que pueden inter-ferir en una expresin clara y concisa de la solucin a un problema.

    Podemos expresar los algoritmos en lenguaje natural, pues el objetivo es comunicar unprocedimiento resolutivo a otras personas y, eventualmente, traducirlos a algn lenguaje deprogramacin. Si, por ejemplo, deseamos calcular la media de tres nmeros ledos de tecladopodemos seguir este algoritmo:1) solicitar el valor del primer nmero,2) solicitar el valor del segundo nmero,3) solicitar el valor del tercer nmero,4) sumar los tres nmeros y dividir el resultado por 3,5) mostrar el resultado.Como puedes ver, esta secuencia de operaciones define exactamente el proceso que nos permiteefectuar el clculo propuesto y que ya hemos implementado como un programa en Python.Los algoritmos son independientes del lenguaje de programacin. Describen un procedimientoque puede ser implementado en cualquier lenguaje de programacin de propsito general o,incluso, que puedes ejecutar a mano con lpiz, papel y, quiz, la ayuda de una calculadora.Ojo! No es cierto que cualquier procedimiento descrito paso a paso pueda considerarse unalgoritmo. Un algoritmo debe satisfacer ciertas condiciones. Una analoga con recetas de cocina(procedimientos para preparar platos) te ayudar a entender dichas restricciones.Estudia esta primera receta:1) poner aceite en una sartn,2) encender el fuego,3) calentar el aceite,4) coger un huevo,5) romper la cscara,6) verter el contenido del huevo en la sartn,7) aderezar con sal,8) esperar a que tenga buen aspecto.

    En principio ya est: con la receta, sus ingredientes y los tiles necesarios somos capacesde cocinar un plato. Bueno, no del todo cierto, pues hay unas cuantas cuestiones que no quedandel todo claras en nuestra receta:Qu tipo de huevo utilizamos?: un huevo de gallina?, un huevo de rana?Cunta sal utilizamos?: una pizca?, un kilo?Cunto aceite hemos de verter en la sartn?: un centmetro cbico?, un litro?Cul es el resultado del proceso?, la sartn con el huevo cocinado y el aceite?

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    En una receta de cocina hemos de dejar bien claro con qu ingredientes contamos y cul es elresultado final. En un algoritmo hemos de precisar cules son los datos del problema (datos deentrada) y qu resultado vamos a producir (datos de salida).Esta nueva receta corrige esos fallos:Ingredientes: 10 cc. de aceite de oliva, una gallina y una pizca de sal.Mtodo:1) esperar a que la gallina ponga un huevo,2) poner aceite en una sartn,3) encender el fuego,4) calentar el aceite,5) coger el huevo,6) romper la cscara,7) verter el contenido del huevo en la sartn,8) aderezar con sal,9) esperar a que tenga buen aspecto.Presentacin: depositar el huevo frito, sin aceite, en un plato.

    Pero la receta an no est bien del todo. Hay ciertas indefiniciones en la receta:1) Cun caliente ha de estar el aceite en el momento de verter el huevo?, humeando?, ardiendo?2) Cunto hay que esperar?, un segundo?, hasta que el huevo est ennegrecido?3) Y an peor, estamos seguros de que la gallina pondr un huevo? Podra ocurrir que lagallina no pusiera huevo alguno.Para que la receta est completa, deberamos especificar con absoluta precisin cada uno delos pasos que conducen a la realizacin del objetivo y, adems, cada uno de ellos debera serrealizable en tiempo finito.No basta con decir ms o menos cmo alcanzar el objetivo: hay que decir exactamente cmose debe ejecutar cada paso y, adems, cada paso debe ser realizable en tiempo finito. Estanueva receta corrige algunos de los problemas de la anterior, pero presenta otros de distintanaturaleza:

    Ingredientes: 10 cc. de aceite de oliva, un huevo de gallina y una pizca de sal.Mtodo:1) poner aceite en una sartn,2) encender el fuego a medio gas,3) calentar el aceite hasta que humee ligeramente,4) coger un huevo,5) romper la cscara con el poder de la mente, sin tocar el huevo,6) verter el contenido del huevo en la sartn,7) aderezar con sal,8) esperar a que tenga buen aspecto.Presentacin: depositar el huevo frito, sin aceite, en un plato.El quinto paso no es factible. Para romper un huevo has de utilizar algo ms que el poder de lamente. En todo algoritmo debes utilizar nicamente instrucciones que pueden llevarse a cabo.He aqu una receta en la que todos los pasos son realizables:

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Ingredientes: 10 cc. de aceite de oliva, un huevo de gallina y una pizca de sal.Mtodo:

    1) poner aceite en una sartn,2) sintonizar una emisora musical en la radio,3) encender el fuego a medio gas,4) echar una partida al solitario,5) calentar el aceite hasta que humee ligeramente,6) coger un huevo,7) romper la cscara,8) verter el contenido del huevo en la sartn,9) aderezar con sal,10) esperar a que tenga buen aspecto.Presentacin: depositar el huevo frito, sin aceite, en un plato.

    En esta nueva receta hay acciones que, aunque expresadas con suficiente precisin y siendorealizables, no hacen nada til para alcanzar nuestro objetivo (sintonizar la radio y jugar a lascartas). En un algoritmo, cada paso dado debe conducir y acercarnos ms a la consecucin delobjetivo.Hay una consideracin adicional que hemos de hacer, aunque en principio parezca unaobviedad: todo algoritmo bien construido debe finalizar tras la ejecucin de un nmero finito depasos.Aunque todos los pasos sean de duracin finita, una secuencia de instrucciones puede requerirtiempo infinito. Piensa en este mtodo para hacerse millonario:1) comprar un nmero de lotera vlido para el prximo sorteo,2) esperar al da de sorteo,3) cotejar el nmero ganador con el nuestro,4) si son diferentes, volver al paso 1; en caso contrario, somos millonarios.Como ves, cada uno de los pasos del mtodo requiere una cantidad finita de tiempo, pero no hayninguna garanta de alcanzar el objetivo propuesto.En adelante, no nos interesarn ms las recetas de cocina ni los procedimientos para enri-quecerse sin esfuerzo (al menos no como objeto de estudio de la asignatura!). Los algoritmos enlos que estaremos interesados son aquellos que describen procedimientos de clculo ejecutablesen un ordenador. Ello limitar el mbito de nuestro estudio a la manipulacin y realizacin declculos sobre datos (numricos, de texto, etc.).Un algoritmo debe poseer las siguientes caractersticas:1) Ha de tener cero o ms datos de entrada.2) Debe proporcionar uno o ms datos de salida como resultado.3) Cada paso del algoritmo ha de estar definido con exactitud, sin la menor ambigedad.4) Ha de ser finito, es decir, debe finalizar tras la ejecucin de un nmero finito de pasos, cadauno de los cuales ha de ser ejecutable en tiempo finito.5) Debe ser efectivo, es decir, cada uno de sus pasos ha de poder ejecutarse en tiempo finito conunos recursos determinados (en nuestro caso, con los que proporciona un sistema computador).

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Abu Jafar Mohammed ibn Ms Al-Khowrizm y EuclidesLa palabra algoritmo tiene origen en el nombre de un matemtico persa del siglo IX: Abu JafarMohammed ibn Ms Al-Khowrizm (que significa Mohammed, padre de Jafar, hijo de Moiss,nacido en Khowrizm). Al-Khowrizm escribi tratados de aritmtica y lgebra. Gracias a los textosde Al-Khowrizm se introdujo el sistema de numeracin hind en el mundo rabe y, ms tarde, enOccidente.En el siglo XIII se publicaron los libros Carmen de Algorismo (un tratado de aritmtica en verso!)y Algorismus Vulgaris, basados en parte en la Aritmtica de Al-Khowrizm. Al-Khowrizm escribitambin el libro Kitab al jabr wal-muqabala (Reglas de restauracin y reduccin), que dio origena una palabra que ya conoces: lgebra.Abelardo de Bath, uno de los primeros traductores al latn de Al-Khowrizm, empez un textocon Dixit Algorismi. . . (Dijo Algorismo. . . ), popularizando as el trmino algorismo, que pas asignificar realizacin de clculos con numerales indoarbigos. En la Edad Media los abaquistascalculaban con baco y los algorismistas con algorismos.En cualquier caso, el concepto de algoritmo es muy anterior a Al-Khowrizm. En el siglo III a.C.,Euclides propuso en su tratado Elementos un mtodo sistemtico para el clculo del Mximo ComnDivisor (MCD) de dos nmeros. El mtodo, tal cual fue propuesto por Euclides, dice as: Dados dosnmeros naturales, a y b, comprobar si ambos son iguales. Si es as, a es el MCD. Si no, si a esmayor que b, restar a a el valor de b; pero si a es menor que b, restar a b el valor de a. Repetirel proceso con los nuevos valores de a y b. Este mtodo se conoce como algoritmo de Euclides,aunque es frecuente encontrar, bajo ese mismo nombre, un procedimiento alternativo y ms eficiente:Dados dos nmeros naturales, a y b, comprobar si b es cero. Si es as, a es el MCD. Si no, calcularc, el resto de dividir a entre b. Sustituir a por b y b por c y repetir el proceso.Adems, nos interesa que los algoritmos sean eficientes, esto es, que alcancen su objetivo lo msrpidamente posible y con el menor consumo de recursos.

    9 Disea un algoritmo para calcular el rea de un crculo dado su radio. Recuerda queel rea de un crculo es pi veces el cuadrado del radio.No hay una nica solucin. Diferentes personas ofrecern algoritmos distintos en funcindel orden de las operaciones y del nivel de detalle de cada una. Alguien podra proponer estealgoritmo breve:1) Devolver el producto de pi por el radio por el radio.Otro podra alterar el orden de las operaciones:1) Devolver el producto de radio por pi por el radio.Y otro podra trabajar con pasos ms finos:1) Calcular radio por el radio y denominar cuadrado al resultado.2) Devolver el producto de pi por el valor de cuadrado.

    10 Disea un algoritmo que calcule el IVA (21 %) de un producto dado su precio de ventasin IVA.11 Podemos llamar algoritmo a un procedimiento que escriba en una cinta de papeltodos los nmeros decimales de pi?

  • Andrs Marzal / Isabel Gracia / Pedro Garca - ISBN: 978-84-697-1178-1 Introduccin a la programacin con Python 3 - UJI - DOI: http://dx.doi.org/10.6035/Sapientia93

    Captulo 2Una calculadora avanzadaSabes sumar? le pregunt la Reina Blanca. Cunto es uno ms uno msuno ms uno ms uno ms uno ms uno ms uno ms uno ms uno ms uno?No lo s dijo Alicia. Perd la cuenta.No sabe hacer una adicin le interrumpi la Reina Roja.Alicia en el pas de las maravillas, Lewis Carroll

    El objetivo de este captulo es que te familiarices con el entorno interactivo de Python, queaprendas a construir expresiones aritmticas almacenando los resultados en variables medianteasignaciones y que conozcas los tipos de datos bsicos del lenguaje de programacin Python.2.1. Sesiones interactivas

    Cuando programamos utilizamos un conjunto de herramientas al que denominamos entornode programacin. Entre estas herramientas tenemos editores de texto (que nos permiten escribirprogramas), compiladores o intrpretes (que traducen los programas a cdigo d