notas para los cursos de computación y programación con python

Upload: aprender-libre

Post on 05-Apr-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    1/220

    Notas para los cursos deComputacin y Programacin

    con Python

    Nstor Aguilera

    Ao 2012

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    2/220

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    3/220

    Contenidos

    1. Preliminares 11.1. Organizacin y convenciones que usamos . . . . . . . . . . . . . . . . . . . .11.2. Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2

    1.2.1. Censura, censura, censura . . . . . . . . . . . . . . . . . . . . . . . . . . .31.3. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4

    2. El primer contacto 52.1. Funcionamiento de la computadora . . . . . . . . . . . . . . . . . . . . . . . .52.2. Bits y bytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62.3. Programas y lenguajes de programacin . . . . . . . . . . . . . . . . . . . . .72.4. Python y IDLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8

    3. Tipos de datos bsicos 103.1. Enteros y decimales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103.2. Por qu hay distintos tipos de datos? . . . . . . . . . . . . . . . . . . . . . . . .123.3. Tipo lgico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .123.4. Cadenas de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143.5. print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163.6. En el lo de la navaja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .173.7. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18

    4. Asignaciones 194.1. Asignaciones en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194.2. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23

    5. Mdulos 245.1. Mdulos estndares:math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .255.2. Mdulos propios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .275.3. Ingreso interactivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .275.4. Usandoimport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29

    6. Funciones 326.1. Ejemplos simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .326.2. Variables globales y locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .356.3. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39

    7. Funciones numricas y sus grcos 407.1. Funciones numricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .407.2. El mdulogrpc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    4/220

    Pg. ii Contenidos

    8. Sucesiones 448.1. ndices y secciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .448.2. Tuplas (tuple ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .458.3. Listas (list ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .468.4. Rangos (range ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .508.5. Operaciones comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .518.6. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53

    9. Tomando control 549.1. if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .549.2. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .57

    10. Recorriendo sucesiones 6110.1. Uso bsico defor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6110.2. Listas por comprensin usandofor . . . . . . . . . . . . . . . . . . . . . . . . .64

    10.3. Filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6510.4. Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66

    11. Formatos y archivosde texto 7511.1. Formatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7511.2. Archivos de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .78

    12. Simulacin 8312.1. Funciones de nmeros aleatorios en Python . . . . . . . . . . . . . . . . . .8312.2. Nmeros aleatorios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8412.3. Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8812.4. Mtodos de Monte Carlo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90

    13. Clasicacin y bsqueda 9213.1. Clasicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9213.2. Listas como conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9613.3. Bsqueda binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9813.4. Ejercicios adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10013.5. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101

    14. Nmeros enteros y divisibilidad 10214.1. El algoritmo de Euclides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10214.2. Ecuaciones diofnticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10514.3. Cribas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10614.4. Nmeros primos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10914.5. Ejercicios adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11314.6. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115

    15. Clculonumrico elemental 11615.1. La codicacin de decimales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11615.2. Errores numricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12015.3. Mtodos iterativos: puntos jos . . . . . . . . . . . . . . . . . . . . . . . . . . . .12115.4. El mtodo de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12615.5. El mtodo de la biseccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12915.6. Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13415.7. Ejercicios adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .137

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    5/220

    Contenidos Pg. iii

    15.8. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143

    16. Grafos 14416.1. Notaciones y cuestiones previas . . . . . . . . . . . . . . . . . . . . . . . . . . . .14416.2. Representacin de grafos en la computadora . . . . . . . . . . . . . . . . . .14616.3. Recorriendo un grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14916.4. Grafos con pesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15516.5. Camino ms corto: Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15716.6. Mnimo rbol generador: Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15916.7. Ejercicios Adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16016.8. Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .161

    17. Recursin 16217.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16217.2. Funciones denidas recursivamente . . . . . . . . . . . . . . . . . . . . . . . .163

    17.3. Variables no locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16417.4. Ventajas y desventajas de la recursin . . . . . . . . . . . . . . . . . . . . . . .16517.5. Los Grandes Clsicos de la Recursin . . . . . . . . . . . . . . . . . . . . . . . .16617.6. Contando objetos combinatorios . . . . . . . . . . . . . . . . . . . . . . . . . . .16817.7. Generando objetos combinatorios . . . . . . . . . . . . . . . . . . . . . . . . . .16917.8. Ejercicios adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175

    Apndices 177

    Apndice A. Mdulos y archivos mencionados 178 A.1. En el captulo 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178

    A.1.1. holamundo (ejercicio 5.8) . . . . . . . . . . . . . . . . . . . . . . . . . . . .178 A.1.2. holapepe (ejercicio 5.9) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178 A.1.3. sumardos (ejercicio 5.11) . . . . . . . . . . . . . . . . . . . . . . . . . . . .178 A.1.4. nada (ejercicio 5.12) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .178

    A.2. En el captulo 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179 A.2.1. holas (ejercicio 6.1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179 A.2.2. globyloc (ejercicio 6.6) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179 A.2.3. ocal (ejercicio 6.7) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180 A.2.4. argumento (ejercicio 6.8) . . . . . . . . . . . . . . . . . . . . . . . . . . . .181

    A.3. En el captulo 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181 A.3.1. grseno (ejercicio 7.3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181 A.3.2. grexplog (ejercicio 7.5) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181 A.3.3. gr1sobrex (ejercicio 7.7) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182

    A.4. En el captulo 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183

    A.4.1. i while (captulo 9) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183 A.5. En el captulo 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .184

    A.5.1. fbonacci (ejercicios10.19y 10.20) . . . . . . . . . . . . . . . . . . . . . .184 A.6. En el captulo 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .184

    A.6.1. pascal (ejercicio 11.6) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .184 A.6.2. tablaseno (ejercicio 11.7) . . . . . . . . . . . . . . . . . . . . . . . . . . . .185 A.6.3. dearchivoaconsola (ejercicio 11.8) . . . . . . . . . . . . . . . . . . . . . .185 A.6.4. santosvega.txt (ejercicio 11.8) . . . . . . . . . . . . . . . . . . . . . . . . .185

    A.7. En el captulo 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .185 A.7.1. dados (ejercicios12.4y 12.5) . . . . . . . . . . . . . . . . . . . . . . . . . .185

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    6/220

    Pg. iv Contenidos

    A.8. En el captulo 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186 A.8.1. enteros (captulo 14) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186 A.8.2. periodo (ejercicio 14.17) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .188

    A.9. En el captulo 15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189 A.9.1. decimales (captulo 15) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189 A.9.2. euclides2 (ejercicio 15.7) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189 A.9.3. numerico (captulo 15) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .191 A.9.4. grpuntofjo (ejercicio 15.13) . . . . . . . . . . . . . . . . . . . . . . . . . .194 A.9.5. grnewton (ejercicio 15.19) . . . . . . . . . . . . . . . . . . . . . . . . . . . .194 A.9.6. grbiseccion (ejercicio 15.22) . . . . . . . . . . . . . . . . . . . . . . . . . .195

    A.10. En el captulo 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196 A.10.1.gra os (captulo 16) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196 A.10.2.grgrsimple (ejercicio 16.8) . . . . . . . . . . . . . . . . . . . . . . . . . . . .199 A.10.3.grgrpesado (ejercicio 16.17) . . . . . . . . . . . . . . . . . . . . . . . . . .200

    A.11. En el captulo 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200 A.11.1.recursion (captulo 17) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200 A.11.2.nolocal (ejercicio 17.4) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .203

    Apndice B. Algunas notaciones y smbolos 204B.1. Lgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .204B.2. Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .204B.3. Nmeros: conjuntos, relaciones, funciones . . . . . . . . . . . . . . . . . . .205B.4. Nmeros importantes en programacin . . . . . . . . . . . . . . . . . . . . . .206B.5. En los apuntes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .206B.6. Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .206

    Resumen de comandos 207

    ndice de guras y cuadros 209ndice de autores 211

    ndice alfabtico 212

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    7/220

    Captulo 1

    Preliminares

    Estos apuntes, que cariosamente llamamos libro, son una introduccin a laresolucin de problemas matemticos con la computadora. A diferencia de cursos tradicionales de programacin, se cubre muy poco de las

    aplicaciones informticas como bases de datos o interfases grcas con el usuario: elnfasis es en matemticas y algoritmos.

    Usando el lenguaje Python, vemos temas elementales de anlisis y clculo num-rico, teora de nmeros, combinatoria y grafos, sirviendo tanto de presentacin dealgunos temas como de repaso y fortalecimiento de otros.

    Quedan aparte temas de lgebra lineal, ya que la resolucin numrica de pro-blemas lineales requiere un estudio cuidadoso de los errores, lo que est fuera delpropsito introductorio de estas notas.

    Hay muy poca teora, que se habr visto o se ver en otros cursos. Lo esencial

    aqu son los ejercicios.En todos los temas habr algunos ejercicios rutinarios y otros que no lo son tanto. Algunos pensarn que el material presentado es excesivo, y habr otros que querrnresolver ms ejercicios o ejercicios ms avanzados, y para ellos en algunos captulosse incluye una seccin deejercicios adicionales .

    1.1. Organizacin y convenciones que usamosEn los captulos 2 a 17 se presentan los temas y ejercicios, agrupados en secciones

    y a veces subsecciones. Secciones y ejercicios estn numerados comenzando con 1en cada captulo, de modo que la seccin 3.2 se reere a la seccin 2 del captulo 3, y el ejercicio 4.5 se reere al ejercicio 5 del captulo 4.

    Las pginas del libro estn diseadas para ser impresas en doble faz (y eventual-mente anillarse), mientras que la versin electrnica (en formato pdf y disponibleen http://www.santafe-conicet.gov.ar/~aguilera/libros/2012 ) ofrece laventaja de vnculos (links ) remarcados en azul, que pueden ser externos como elanterior o internos como en ejercicio 3.1.

    Lo que escribiremos en la computadora y sus respuestas se indican con otrotipo de letra y color , y fragmentos ms extensos se ponen en prrafos con unaraya a la izquierda:

    como ste

    http://www.santafe-conicet.gov.ar/~aguilera/libros/2012http://www.santafe-conicet.gov.ar/~aguilera/libros/2012
  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    8/220

    Pg. 2 Captulo 1. Preliminares

    Siguiendo la tradicin norteamericana, la computadora expresa los nmerosponiendo un punto decimal en vez de la coma, y para no confundirnos seguimosesa prctica. As, 1.589 es un nmero entre 1 y 2, mientras que 1589 es un nmeroentero, mayor que mil. A veces dejamos pequeos espacios entre las cifras para leermejor los nmeros, como en 123 456.789.

    En el apndice A estn varios mdulos o funciones que son propios del libro y no estn incluidos en la distribucin de Python. Hay dos excepciones: los mdulosgrpc (para grcos de puntos y curvas con ejes cartesianos) y grgr (para grafos) quese usan como cajas negras. No se incluyen ac (pero s estn en lapgina del libro)porque son relativamente grandes y aunque elementales no veremos muchasde las estructuras que tienen. Todos los mdulos no estndar que usamos estn en lapgina del libro.

    En elapndice B hay una sntesis de notaciones, convenciones o abreviaturas. Al nal se incluyen ndices de palabras y autores, tal vez no necesarios en la

    versin electrnica pero posiblemente s en la impresa.

    1.2. PythonPor muchos aos usamos Pascal como lenguaje para los apuntes. Pascal fue

    ideado por N. Wirth hacia 1970 para la enseanza de la programacin y fue unlenguaje popular por varias dcadas, pero ha cado en desuso en los ltimos aos, y es difcil conseguir versiones recientes para las distintas plataformas.

    Actualmente no hay lenguajes destinados a la enseanza de la programacindesde un enfoque matemtico y que estn ampliamente disponibles.

    Entre los lenguajes con mayor difusin hoy,(1) hemos elegido Python, http://www.python.org , creado por G. van Rossum hacia 1990.

    La eleccin de Python (pronunciadopizon ) se debe a varios motivos, entre ellos: Es fcil empezar a programar, pudiendo empezarse con un modo prctica-

    mente interactivo escribiendo en una ventana tipo terminal, caractersticacompartida por sistemas como Mathematica , Matlab o Maple .

    Los algoritmos se pueden implementar rpidamente usando funciones prede-nidas, y en especial listas con ltros, caracterstica compartida tambin con,por ejemplo, Mathematica .

    No tiene lmite para el tamao de enteros. Es gratisy est disponiblepara lasprincipales plataformas (Linux,MS-Windows,

    Mac OS y otras), y las nuevas versiones son lanzadas simultneamente. Tiene un entorno integrado para el desarrollo (IDLE). La distribucin incluye al mdulotkinter con el que se puede acceder a las faci-

    lidades grcas de Tcl/ Tk, permitiendo un entorno grco independiente de laplataforma. Estas facilidades son usadas por IDLE, de modo que la integracines estrecha y seguida muy de cerca.

    La distribucin ocial incluye una amplia variedad de extensiones (mdulos),entre los que nos interesan los de matemticas (math y random ).

    Pero tambin tiene sus desventajas para la enseanza: No tiene un conjunto pequeo de instrucciones.

    (1) Verhttp://www.tiobe.com/index.php/content/paperinfo/tpci/ . C es muy duro como primerlenguaje.

    http://www.santafe-conicet.gov.ar/~aguilera/libros/2012/index.htmlhttp://www.santafe-conicet.gov.ar/~aguilera/libros/2012/index.htmlhttp://www.santafe-conicet.gov.ar/~aguilera/libros/2012/index.htmlhttp://www.python.org/http://www.python.org/http://www.python.org/http://www.tiobe.com/index.php/content/paperinfo/tpci/http://www.tiobe.com/index.php/content/paperinfo/tpci/http://www.tiobe.com/index.php/content/paperinfo/tpci/http://www.python.org/http://www.python.org/http://www.santafe-conicet.gov.ar/~aguilera/libros/2012/index.htmlhttp://www.santafe-conicet.gov.ar/~aguilera/libros/2012/index.html
  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    9/220

    1.2. Python Pg. 3

    Es posible hacer una misma cosa de varias formas distintas, lo que lleva aconfusin.

    La sintaxis no es consistente.Esto hace que, a diferencia del curso con Pascal, dediquemos una buena parte

    del tiempo a estudiar el lenguaje, tratando de entender su idiosincrasia.

    1.2.1. Censura, censura, censura Para organizarnos mejor y no enloquecernos ponemos algunas restricciones para

    el uso de Python. Por ejemplo:

    De los 255 mdulos que trae la distribucin, slo permi-tiremos el uso explcito de math y random .

    Aunque debemos mencionar que: usaremos la funcinos.getcwd para entender dnde busca Python los mdu-

    los al usarimport , el mdulo builtins se usar implcitamente.Esto nos trae a que hay muchas cosas de programacin en general y de Python

    en particular que no veremos. Entre otras:

    Veremos pocos tipos de datos ( int , float , str , bool y las secuencias tuple ,list y range ). Por ejemplo, no veremos diccionarios (dict ) o conjuntos (set ).

    Usaremos diccionarios sin mayores explicaciones (apretar botones) en losmdulos grpc y grgr .

    No veremos cmo denir clases, ni programacin orientada a objetos en gene-ral.

    Usaremos algunos mtodos ya existentes de Python, por ejemplo para listas.No veremos los decoradores de Python.

    No veremos manejo de errores o excepciones (try , assert , debug , etc.). No veremos cmo denir argumentos opcionales en funciones, aunque los

    usaremos en las funciones predenidas como print o sort . No veremos generadores, a pesar de que hacen que Python sea ms eciente.

    En particular, no veremosfilter , map, y zip .

    Veremos range (captulo 8) y lo usaremos ampliamente.Las listas de Python son inecientes, pero manejaremos tamaos peque-os en el curso, salvo algunos objetos combinatorios que examinaremosindividualmente en el captulo de recursin.

    Si decimos que no veremos determinada construccin de Python en el curso, est prohibido usarla en la resolucin de ejercicios.

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    10/220

    Pg. 4 Captulo 1. Preliminares

    Enlapgina 207hay un resumen de los comandos de Python quevemos, sealan-do la primera pgina donde aparecen. Es posible que falten algunos, pero en generalson los nicos admitidos y no deben usarse otros.

    Terminamos destacando una convencin muy importante.Un prrafo que empieza con el smbolo contiene construcciones de Python que,

    aunque tal vez vlidas, hay que evitar a toda costa. Son construcciones confusas, oabsurdas en matemticas, o inecientes computacionalmente, o no se usan en otroslenguajes, etc.:

    Las construcciones sealadas con no deben usarse.

    1.3. Comentarios En la redaccin se puede notar la inuencia de Wirth (1987), Kernighan y

    Ritchie (1991), y los tres primeros volmenes de Knuth (1997a; 1997b; 1998)en lo referente a programacin, y de Gentile (1991) y Engel (1993) en cuanto abasar el curso en resolucin de problemas (y varios de los temas considerados).

    Los primeros captulos siguen ideas de las presentaciones de los libros deMathematica ( Wolfram, 1988, y siguientes ediciones), y el mismotutorial de Python .

    El libro deLitvin y Litvin(2010) sigue una losofa similar a la nuestra, pero anivel de secundaria y est en ingls.

    A los lectores que quieran aprender ms de programacin, les sugerimos el yamencionado de Wirth (1987) y, para un estudio ms profundo, los de Knuth(1997a; 1997b; 1998), dependiendo del tema de inters.

    Al nal de algunos captulos hay referencias bibliogrcas sobre temas y pro-blemas particulares, pero muchos de ellos pertenecen al folklore y es difcildeterminar el origen.

    La mayorade lasreferenciashistricasestn tomadasdehttp://www-histor y. mcs.st-and.ac.uk/ , pero hayvariastomadas dehttp://mathworld.wolfra m.com/ y tambin deWikipediA .

    Una posibilidad muy interesante para quienes les haya picado el bichito estomar problemas o directamente participar en las competencias estudiantilesde la ACM(Association for Computing Machinery) en las que los estudiantesde nuestro pas participan exitosamente desde hace varios aos.

    http://docs.python.org/py3k/tutorial/index.htmlhttp://docs.python.org/py3k/tutorial/index.htmlhttp://docs.python.org/py3k/tutorial/index.htmlhttp://www-history.mcs.st-and.ac.uk/http://www-history.mcs.st-and.ac.uk/http://www-history.mcs.st-and.ac.uk/http://mathworld.wolfram.com/http://mathworld.wolfram.com/http://www.wikipedia.org/http://www.wikipedia.org/http://cm.baylor.edu/welcome.icpchttp://cm.baylor.edu/welcome.icpchttp://www.wikipedia.org/http://mathworld.wolfram.com/http://mathworld.wolfram.com/http://www-history.mcs.st-and.ac.uk/http://www-history.mcs.st-and.ac.uk/http://docs.python.org/py3k/tutorial/index.htmlhttp://docs.python.org/py3k/tutorial/index.html
  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    11/220

    Captulo 2

    El primer contacto

    En este captulo hacemos breves descripciones del funcionamiento de la compu-tadora, de los programas y los lenguajes de programacin, para terminar con nuestroprimer encuentro directo con Python.

    2.1. Un poco (muy poco) sobre cmo funciona la compu-tadora

    La computadora es una mquina que toma datos de entrada , los procesa y de-vuelve resultados, tambin llamados datos de salida , como esquematizamos en lagura 2.1. Los datos, ya sean de entrada o salida, pueden ser simples como nmeros oletras, o mucho ms complicados como una matriz, una base de datos o una pelcula.

    En el modelo de computacin que usaremos, el procesamiento lo realiza unaunidad central de procesamiento o CPU (Central ProcessingUnit), que recibe y envadatos a un lugar llamadomemoria de la computadora.

    As, imaginamos que lo que escribimos en el teclado no es procesado directa-mente por la CPU, sino que es traducido adecuadamente y alojado en la memoriapreviamente. Tenemos entonces un esquema como el de lagura 2.2. Los elementosa la izquierda permiten que la computadora intercambie datos con el exterior (co-mo el teclado o la pantalla) o los conserve para uso posterior (como el disco), y laverdadera accin est entre la memoria y la CPU.

    Aunque las computadoras modernas suelen tener ms de una CPU, en nuestromodelo consideraremos que hay una sola.

    Del mismo modo, consideraremos que la CPU lee y escribe los datos de la memo-

    ria secuencialmente , es decir, uno a la vez, aunque las computadoras actuales puedenir leyendo y escribiendo simultneamente varios datos.Finalmente, las instrucciones que sigue la CPU forman parte de los datos en la

    memoria que se procesarn. Es decir, la CPU lee instrucciones en la memoria quele dicen qu otros datos (que pueden ser ms instrucciones) tomar de la memoria y

    Entrada Procesamiento Salida

    Figura 2.1: Esquema de entrada, procesamiento y salida.

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    12/220

    Pg. 6 Captulo 2. El primer contacto

    teclado

    ratn

    pantalla

    discos

    impresora

    otros

    memoria CPU

    Figura 2.2: Esquema de transferencia de datos en la computadora.

    1 0 1 0 1 0 0 1

    bits

    byte

    Figura 2.3: Un byte de 8 bits.

    qu hacer con ellos.Resumiendo, y muy informalmente, nuestro modelo tiene las siguientes caracte-

    rsticas: Hay una nica CPU, que slo intercambia datos con la memoria,

    este intercambio es secuencial, y las instrucciones que recibe la CPU forman parte de los datos en la memoria.k El modelo, con pocos cambios, se debe a John von Neumann (19031957), quien

    se interes inicialmente en lgica, teora de conjuntos, de la medida, y mecnica cuntica, tocando luego temas de anlisis funcional, teora ergdica, siendo funda-dor de la teora de juegos. En sus ltimos aos tambin tuvo inuencia decisiva en ecuaciones en derivadas parciales y en teora de autmatas, en la que sintetiz sus conocimientos e ideas de lgica y grandes computadoras electrnicas.

    2.2. Bits y bytesPodemos pensar que la memoria, en donde se almacenan los datos, est cons-

    tituida por muchas cajitas pequeas llamadas bits (binary dig it o dgito binario),en cada una de las cuales slo se puede guardar un 0 o un 1. Puesto que esta cajaes demasiado pequea para guardar informacin ms complicada que s / no oblanco/ negro, los bits se agrupan en cajas un poco ms grandes llamadas bytes ,generalmente de 8 bits, en los quepensamos quelos bits estn alineados y ordenados,puesto que queremos que 00001111 sea distinto de 11110000. Ver el esquema en lagura 2.3.

    Ejercicio 2.1. Suponiendo que un byte tenga 8 bits:a ) Cuntas ristras distintas de 0 y 1 puede tener?

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    13/220

    2.3. Programas y lenguajes de programacin Pg. 7

    Sugerencia : hacer la cuenta primero para un byte de 1 bit, luego para unbyte de 2 bits, luego para un byte de 3 bits,...

    b ) Si no importara el orden de los bits que forman el byte, y entonces 00001111,11110000, 10100101 fueran indistinguibles entre s, cuntos elementos dis-tintos podra contener un byte?

    Sugerencia : si el byte tiene 8 bits puede ser que haya 8 ceros y ningn uno,o 7 ceros y 1 uno, o... e

    Para lascomputadoras msrecientes, estas unidades de 8 bits resultan demasiadopequeas para alimentar a la CPU, por lo que los bits se agrupan en cajas de, porejemplo, 32, 64 o 128 bits (usualmente potencias de 2), siempre conceptualmentealineados y ordenados.

    k La palabra dgito viene del latn digitus = dedo, y originalmente se refera a los nmeros entre 1 y 10 (como la cantidad de dedos en las manos). El signicado fue cambiando con el tiempo y actualmente segn la RAE:

    un nmero dgito es aqul que puede expresarse con un solo guarismo.

    As, en la numeracin decimal los dgitos son los enteros entre cero y nueve (ambos incluidos), mientras que en base 2 los dgitos son 0 y 1.

    Ms recientemente, entendemos que algo es digital (como las computadoras o las cmaras fotogrcas) cuando trabaja internamente con representaciones binarias, y tiene poco que ver con la cantidad de dedos en las manos.

    2.3. Programas y lenguajes de programacinEl conjunto de instrucciones que damos a la computadora para realizar deter-

    minada tarea es lo que llamamosprograma . En particular, elsistema operativo de la

    computadora es un programa que alimenta constantemente a la CPU y le indica quhacer en cada momento. Entre otras cosas le va a indicar queejecute o corra nuestroprograma, leyendo (y ejecutando) las instrucciones que contiene.

    Los lenguajes de programacin son abstracciones que nos permiten escribirlas instrucciones de un programa de modo que sean ms sencillas de entenderque ristras de ceros y unos. Las instrucciones para la mquina se escriben comosentencias de acuerdo a las reglas del lenguaje que luego sern traducidas a algoque la CPU pueda entender, es decir, las famosas ristras de 0 y 1.

    Cuando trabajamos con Python, el programa llamado (casualmente)python haceesta traduccin (de humano a binario) e indica a la CPU que realice la tarea. Esto sehace a travs de otro programa llamado terminal en sistemas Unix: all escribimoslas instrucciones y luego le pedimos a Python que las ejecute.

    Cuando trabajamos en Python y hablamos de programas, nos referimos tanto alas instrucciones que escribimos en la terminal o que guardamos enmdulos , comoveremos en elcaptulo 5.

    En la mayora de los casos an para gente experimentada habr problemas,por ejemplo, por errores de sintaxis (no seguimos las reglas del lenguaje), o porque alejecutar el programa los resultados no son los esperados. Esto da lugar a un ciclo detrabajo esquematizado en lagura 2.4: editamos, es decir, escribimos las instruccio-nes del programa, probamos si funciona, y si hay errores como ser la mayora delas veces habr que corregirlos y volver a escribir las instrucciones.

    A medida que los programas se van haciendo ms largos ponemos mayorcantidad de instrucciones es conveniente tener un mecanismo que nos ahorre

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    14/220

    Pg. 8 Captulo 2. El primer contacto

    editar probar terminar

    corregir

    xito

    error

    Figura 2.4: Esquema del desarrollo de un programa.

    volver a escribir una y otra vez lo mismo. En todos los lenguajes de programacinest la posibilidad de que el programa traductor (en nuestro caso Python) tome lasinstrucciones de un archivo que sea fcil de modicar. Generalmente, este archivo seescribe y modica con la ayuda de un programa que se llamaeditor de textos .

    Varios editores de texto, como emacs o vim en Unix, o notepad en MS-Windows,

    son de uso general y se pueden usar para otros lenguajes de programacin u otrastareas. Por ejemplo, estas notas estn escritas con un editor de texto general y luegoprocesadas con L A TE X (que se pronuncialtej ), en vez de Python.

    Para los que estn haciendo las primeras incursiones en programacin es mssencillo tener un entorno que integre el editor de texto y la terminal. Afortunadamen-te, Python puede instalarse con uno de estos entornos llamado IDLE (pronunciadoidl ), y en el curso trabajaremos exclusivamente con ste. As, salvo indicacin con-traria, cuando hablemos de la terminal nos estaremos reriendo a la terminal de IDLE , y no la de Unix (aunque todo lo que hacemos con IDLE lo podemos hacerdesde la terminal de Unix).

    En resumen, en el curso no vamos a trabajar con Python directamente, sino atravs de IDLE.

    2.4. Python y IDLEUsaremos la ltima versin estable de Python (3.2.2 al escribir estas notas), que

    puede obtenerse del sitio ocial de Python, donde hay instalaciones disponibles paralos principales sistemas operativos.

    Algunas observaciones: Si hay problemas para instalar la versin ocial de Python, puede probarse con

    la instalacinActivePythonde ActiveState, siendo gratis las versiones Commu-nity Edition.

    La versin que usaremos no es completamente compatible con versiones ante-

    riores como la 2.7, y hay que tener cuidado cuando se hacen instalaciones o seconsulta documentacin (ejemplos, apuntes, libros, etc.) de internet. Muchosde los sistemas Unix vienen con Python preinstalado, pero posiblemen-

    te se trate de una versin anterior. Para vericar si la versin 3.2 est instalada,puede ponerse en la terminal de Unix:

    which python3.2

    y si no aparece la ubicacin, debe instalarse.En estos sistemas generalmente hay una opcin para instalar nuevas aplica-

    ciones, y puede ser que no est disponible directamente la ltima versin sino

    http://www.python.org/download/http://www.python.org/download/http://www.activestate.com/activepython/http://www.activestate.com/http://www.activestate.com/http://www.activestate.com/http://www.activestate.com/activepython/http://www.python.org/download/
  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    15/220

    2.4. Python y IDLE Pg. 9

    alguna anterior. Para lo que haremos en el curso no habr mayores diferenciassi se usa alguna de stas (siempre que sea mayor que 3 y no 2.7 o menor).

    En algunos casos, IDLE se ofrece como instalacin separada (que debe instalar-se). Adems, IDLE usa el programaTcl , tambin de ActiveState, y habr que tenerinstaladas versiones de Python, IDLE y Tcl compatibles.

    La forma de iniciar IDLE depende del sistema operativo y la instalacin, peronalmente debe aparecer la terminal de IDLE con un cartel similar a

    Python 3.2.2 (v3.2.2:137e45f15c0b, Sep 3 2011, 17:28:59)[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "copyright", "credits" or "license()" for more information.>>>

    si se instal la versin ocial, o aActivePython 3.2.2.3 (ActiveState Software Inc.) based onPython 3.2.2 (default, Sep 8 2011, 12:20:28)[GCC 4.0.2 20051125 (Red Hat 4.0.2-8)] on linux2Type "copyright", "credits" or "license()" for more information.>>>

    con la versin de ActiveState.Lo importanteaqu es vericar queaparezca anunciadoPython 3.2.2 en alguna

    parte de los carteles: versiones menores nos pueden dar dolores de cabeza.Los signos>>> en la terminal indican que Python est a la espera de que ingrese-

    mos alguna orden. Por ejemplo, ponemos2 + 2, quedando>>> 2 + 2

    y ahora apretamos retorno (o intro o return o enter o con un dibujo parecidoa , dependiendo del teclado) para obtener

    4>>>

    quedando IDLE a la espera de que ingresemos nuevos comandos.En un rapto de audacia, ingresamos 2 + 3 para ver qu sucede, y seguimos de

    este modo ingresando operaciones como en una calculadora. Si queremos modicaralguna entrada anterior, podemos movernos conalt-p (previous oprevio ) oalt-n(next osiguiente ) donde alt indica la tecla modicadoraalterna marcada con alt,o bien dependiendo del sistema y la instalacin con ctrl-p y ctrl-n , dondectrl es la tecla modicadoracontrol . En todo caso se pueden mirar las preferenciasde IDLE para ver qu otros atajos hay o modicarlos a gusto. Para salir de IDLEpodemos elegir el men correspondiente.

    A partir de este momento, suponemos que sabemos cmo arrancar y salir de IDLE, e ingresar comandos en su terminal.

    http://www.activestate.com/http://www.activestate.com/http://www.activestate.com/
  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    16/220

    Captulo 3

    Tipos de datos bsicos

    En este captulo hacemos un estudio ms sistemtico de Python como calculado-ra, empezando con varias operaciones con nmeros. Vemos que hay distintas clasesde nmeros, que podemos hacer preguntas esperando respuestas de verdadero ofalso, y que podemos poner carteles en las respuestas.

    3.1. Enteros y decimalesEjercicio 3.1 (operaciones con nmeros). En la terminal de IDLE ingresar123 +45 , y comprobar que el resultado es entero (no tiene punto decimal).

    Repetir en cada uno de los siguientes, reemplazando + (suma) por el operadorindicado y ver el tipo de resultado que se obtiene (si tiene o no coma decimal).

    a ) - (resta, es decir, calcular123 - 45 ),b ) (producto, en matemticas ),c ) (exponenciacin, en matemticas 12345 )d ) / (divisin),e ) // (divisin con cociente entero), f ) %(resto de la divisin con cociente entero, no confundir con porcentaje!).Observar que, excepto el caso de la divisin123/45 , todos los resultados son

    enteros (no tienen coma decimal). e

    Ejercicio 3.2. Repetir los apartados del ejercicio anterior considerando 12.3 y 4.5 (envez de, respectivamente, 123 y 45), y ver si los resultados tienen o no coma decimal.

    Observar que el resultado de12.3 // 4.5 es 2.0 y no2. e

    Ejercicio 3.3. Qu pasa si ponemos cualquiera de las siguientes?a ) 12 / 0 b ) 34.5 / 0 c ) 67 // 0 e

    Ejercicio 3.4. Cunto es 00 segn las matemticas? Y segn Python? e

    Ejercicio 3.5. Si tenemos ms de una operacin, podemos agrupar con parntesiscomo hacemos en matemticas. Ejecutar las siguientes instrucciones, comprobandoque los resultados son los esperados.

    a ) 4 - (3 + 2) b ) (4 - 3 ) + 2 c ) 4 - 3 + 2d ) 4 - 3 - 2 e ) 4 - (3 - 2 ) f ) (4 - 3 ) - 2 e

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    17/220

    3.1. Enteros y decimales Pg. 11

    Cuando no usamos parntesis, tenemos que tener cuidado con la precedencia (cul se aplica primero) de los operadores. Por ejemplo, si en matemticas ponemos2 + 3

    4, sabemos que tenemos que calcular primero 3

    4 y a eso agregarle 2, o

    sea, tiene mayor precedencia que + . Si en cambio tenemos 23+ 45, nohay precedencias entre + y , y evaluamos de izquierda a derecha. La cosa secomplica si consideramos 3/ 45: en matemticas no tiene sentido.

    Python sigue reglassimilares, aunque evalacosas como3 / 4 5 de izquierdaa derecha, como en el caso de sumas y restas. Como veremos en laseccin 3.6, en elcurso evitaremos este tipo de construcciones y otras que parecen retorcidas desdelas matemticas.

    Ejercicio 3.6. Adems de las operaciones entre nmeros, podemos usar algunasfunciones como el valor absoluto de x , |x |, que se escribe abs(x) en Python, o elredondeo de decimal a entero, round(x) , que nos da el entero ms prximo ax .

    Cuando escribimos comandos como help o round en IDLE, es posible ponerunas pocas letras y completar el comando o al menos obtener una lista deposibilidades introduciendo una tabulacin (tecla tab o similar).

    a ) Ver qu hacen estas funciones poniendohelp(abs) y help(round) .b ) Conjeturar y evaluar el resultado:

    i ) abs(12) ii ) abs(12.3) iii ) abs(-12.3)iv ) round(12.3) v ) round(12.7) vi ) round(12.5)

    vii ) round(-12.3) viii ) round(-12.7) ix ) round(-12.5)c ) Evaluar:

    i ) abs ii ) round y observar que al poner una funcin (como abs ) sin argumento, Pythonresponde diciendo que es una funcin (en este caso, propia).

    d ) Python diferencia entre maysculas y minsculas. Probar con los siguientes,viendo que da error:i ) Abs(2) ii ) ABS(2) e

    Ejercicio 3.7. Cuando x es un nmero, type(x) nos dice si x es entero (int ) odecimal (float ) segn Python.

    Ver los resultados de las siguientes instrucciones:a ) type(12.3) b ) round(12.3) c ) type(round(12.3))d ) 98 // 76 e ) type(98 // 76) f ) 98.0 // 76.0 g ) type(98.0 // 76.0) e

    k int viene de int eger, o entero. Por otro lado,float viene de punto otante , el nombre de la codicacin para nmeros decimales, tema que vemos con detalle en el captulo 15 .

    Es posible pasar de uno a otro tipo de nmero usandoint (para pasar de floata int ) o float (para pasar de int a float ). Claro que al pasar de decimal a enteroperdemos los decimales despus de la coma.

    Ejercicio 3.8. Analizar los resultados de:a ) type(12.3) b ) int(12.3) c ) type(int(12.3))d ) type(-45) e ) float(-45) f ) type(float(-45))g ) int(float(89)) h ) float(int(7.65)) e

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    18/220

    Pg. 12 Captulo 3. Tipos de datos bsicos

    Ejercicio 3.9. Explorar la diferencia entreint y round cuando aplicados a nmerosdecimales. Por ejemplo, calcular estas funciones para 1.2, 1.7,1.2,1.7.

    Tambin poner help(round) y help(int) . e

    3.2. Por qu hay distintos tipos de datos?Uno se pregunta por qu distinguir entre entero y decimal. Despus de todo, las

    calculadoras comnmente no hacen esta distincin, trabajando exclusivamente condecimales, y en matemticas 2 y 2.0 son distintas representaciones de un mismoentero.

    Parte de la respuesta es que todos los objetos se guardan como ristras de ceros y unos en la memoria, y ante algo como 10010110 la computadora debe saber sies un nmero, o parte de l, o una letra o alguna otra cosa, para poder trabajar.Una calculadora sencilla, en cambio, siempre trabaja con el mismo tipo de objetos:

    nmeros decimales.Lavariedad deobjetoscon los que trabaja lacompu severeejadaen los lenguajesde programacin. Por ejemplo, Pascal y C trabajan con enteros, decimales, caracteres y otros objetos construidos a partir de ellos. De modo similar, entre los tipos bsicosde Python tenemos los dos que hemos visto, int o entero (como 123 ) y float odecimal (como 45.67 ) y ahora veremos dos ms:

    bool o lgico , siendo los nicos valores posibles True (verdadero) y False(falso).

    Haciendohelp(bool) , vemos que a diferencia de otros lenguajes paraPython bool es una subclase de int , lo que tiene sus ventajas e inconve-nientes, como estudiamos en la seccin 3.6.bool es una abreviacin deBoolean, que podemos traducir comobooleanos

    y pronunciar buleanos . Los valores lgicos tambin reciben ese nombre enhonor a G. Boole (18151864), quien hizo importantes progresos al algebri-zar la lgica.

    str o cadena de caracteres , como Mateo Adolfo .str esunaabreviacindel inglsstring, literalmentecuerda , que traducimoscomo cadena , en este caso de caracteres (character string ).

    3.3. Tipo lgicoRepasemos un poco, recordando que en matemticas representamos con a la

    conjuncin y, cona la disyuncin o y cona la negacin no.Ejercicio 3.10. En cada caso, decidir si la expresin matemtica es verdadera o falsa:

    a ) 1= 2 b ) 1> 2 c ) 12 d ) 1= 2e ) 35 >> 4 < 5True>>> 4 > 5False

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    19/220

    3.3. Tipo lgico Pg. 13

    Matemticas: = = > < (y) (o) (no)Python: == != > >= < >> 4 == 5False>>> 4 != 5True

    En Python el signicado de = no es el mismo que en matemticas, lo que da lugar a numerosos errores:

    la igualdad ( = ) en matemticas se representa con == en Python, la instruccin = en Python es la asignacin que veremos en el captulo 4 .

    Ejercicio 3.11. Usar Python para determinar la validez de las expresiones delejerci-cio 3.10, observando que en Python (como en matemticas) la expresina < b < ces equivalente a (a < b) and (b < c) . e

    Ejercicio 3.12. Conjeturar y vericar en Python:a ) not True b ) True and Falsec ) True or False d ) False and (not True) e

    Ejercicio3.13. Usando type , ver que las expresiones4 < 5, 4 != 5 , 4 == 5 son detipo bool . e

    Ejercicio 3.14. Cul es el resultado de1 > 2 + 5?, cul es la precedencia entre > y + ? Y entre> y otras operaciones aritmticas (como , / , )? e

    Ejercicio 3.15. Python considera que 1 y 1.0 son de distinto tipo, pero que susvalores son iguales. Evaluar:

    a ) type(1) == type(1.0) b ) 1 == 1.0 e

    Ejercicio 3.16 (errores numricos). Usando ==,

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    20/220

    Pg. 14 Captulo 3. Tipos de datos bsicos

    evaluacin de expresiones en las que aparecen conjunciones (y ) o disyunciones(o ) sehacede izquierdaa derecha y dejando laevaluacin en cuanto seobtieneunaexpresin falsa al usar y o una expresin verdadera al usar o . Python tambinusa esta convencin. Esto hace que, a diferencia de matemticas, and y or no seanoperadores conmutativos.

    Estamos considerando que slo aparece y o slo aparece o . Cuando aparecenambos, hay que tener en cuenta la precedencia de or y and que estudiamos en elejercicio 3.32.

    Ejercicio 3.17 (cortocircuitosen lgica). Evaluar y comparar:a ) 1 < 1/0b ) False and (1 < 1/0) c ) (1 < 1/0) and Falsed ) True or (1 < 1/0) e ) (1 < 1/0) or True

    Aunque incorrectas desde las matemticas (pues las operaciones lgicas de con-

    juncin y disyuncin son conmutativas), aceptaremos el uso de cortocircuitosporque su uso est muy difundido en programacin. e

    Otra diferencia con las matemticas es quea los efectos de evaluaciones lgicas, Python considera que todo objeto tiene un valor verdadero o falso,

    lo cual es muy confuso y no sucede en otros lenguajes de programacin. Vemos unpoco de esto en laseccin 3.6, pero mientras tanto:

    Aunque vlidas en Python, en el curso estn prohibidas las cons-trucciones que mezclan valores u operaciones numricas con l-

    gicas como: 1 and 2 or 3 , False + True , -1 < False ,

    que son ridculas en matemticas.

    3.4. Cadenas de caracteres

    Loscaracteres son las letras, signos de puntuacin, dgitos, y otros smbolos queusamos para la escritura. Lascadenas de caracteres son sucesiones de estos caracteresque en Python van encerradas entre comillas, ya sean sencillas, , como en AnaLuisa , o dobles, , como en "Ana Luisa" .

    A diferencia de los tipos que acabamos de ver (entero, decimal y lgico), las cade-nas de caracteres son objetos compuestos, constituidos por objetos ms sencillos(los caracteres).

    Python no tiene el tipo carcter y esta descripcin no es completamente cierta.Para representar un carcter en Python, simplemente consideramosuna cadena

    de un elemento . Por ejemplo, la letra a se puede poner como la cadenaa .

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    21/220

    3.4. Cadenas de caracteres Pg. 15

    Ejercicio 3.18. Entrar en la terminal Ana Luisa y averiguar su tipo poniendotype(Ana Luisa) . e

    Ejercicio3.19 (comparacin de cadenas).a ) Ver que para Pythonmi mama y "mi mama" son lo mismo usando ==.b ) Evaluarmi mama < mi mama me mima.

    Repetir cambiando < por == y despus por

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    22/220

    Pg. 16 Captulo 3. Tipos de datos bsicos

    a ) Nohay queconfundir (comilla-comilla) con (comilla-espacio-comilla).Conjeturar el resultado y luego evaluar:

    i ) len() ii ) len()b ) Cul ser el resultado de + mi mama ? Vericarlo con Python. e

    Ejercicio 3.24.

    a ) + puede usarse tanto para sumar nmeros como para concatenar cadenas decaracteres, perono podemos mezclar nmeros con cadenas: verqu resultadoda 2 + mi .

    b ) Podra usarse- (en vez de+) con cadenas como en mi - mama ?c ) Cambiando ahora + por *, vericar si los siguientes son vlidos en Python, y

    en caso armativo cul es el efecto:i ) 2 * ma ii ) 2 * ma e

    Ejercicio 3.25 (isinstance I). Para cerrar el tema de los tipos de datos, en esteejercicio vemos la funcinisinstance , que de alguna manera es la inversa detype .

    a ) Usando help(isinstance) , ver qu hace esta funcin.b ) Evaluar

    i ) isinstance(1, int) ii ) isinstance(1.0, int)iii ) isinstance(1.2, int) iv ) isinstance(1, bool)v ) isinstance(mama, float) vi ) isinstance(True, int)

    vii ) isinstance(True, bool) viii ) isinstance(True, float) e

    Con help(str) podemos ver las muchas operaciones que tiene Python para ca-denas. Nosotros veremos slo unas pocas en el curso, algunas de ellas en elcaptulo 8,dentro del contexto general de sucesiones.

    3.5. printprint nos permite imprimir en la terminal expresiones que pueden involucrar

    elementos de distinto tipo.

    Ejercicio 3.26.a ) Cul es la diferencia entre poner en la terminal123 y print(123) ?

    Repetir cuando en vez de123 se ponei ) -7.89 ii ) True iii ) mi mama me mima

    b ) print puede no tener argumentos explcitos. Evaluar:i ) print() ii ) print() iii ) print() iv ) printc ) Y tambin puede tener ms de un argumento, no necesariamente del mismo

    tipo, en cuyo caso se separan con un espacio al imprimir. Evaluar

    print(Segn Mara,, 1.23, lo que dice Pepe es, 1 > 2)

    d ) Evaluar y observar las diferencias entre:

    i ) print(123456) y print(123, 456) .ii ) print(Hola mundo) y print(Hola, mundo) . e

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    23/220

    3.6. En el lo de la navaja Pg. 17

    Ejercicio3.27. Aunque matemticamente no tiene mucho sentido, la multiplicacinde un entero por una cadena que vimos en el ejercicio 3.24es til para imprimir.Evaluar:

    a ) print(70 * -)b ) print(2 * - + 3 * + 4 * *) e

    Ejercicio 3.28. Observar las diferencias entre los resultados de los siguientes aparta-dos, y determinar el efecto de agregar\n :

    a ) print(mi, mama, me, mima)b ) print(mi\n, mama, me\n\n, mima)c ) print(mi, \n, mama, me, \n\n, mima) e

    Ejercicio 3.29. Cuando la cadena es muy larga y no cabe en un rengln, podemosusar \ para dividir. Por ejemplo, evaluar:

    print(Este texto es muy largo, no entra en un rengln y \tengo que ponerlo en ms de uno.)

    Cmo podra usarse+ (concatenacin) para obtener resultados similares? Ayuda : + puede ponerse al principio o nal de un rengln. e

    Como vimos, \ se usa para indicar que el rengln contina, o, en la forma \n ,para indicar que debe comenzarse un nuevo rengln. Si queremos que se imprima\ , tenemos que poner \\ dentro del argumento de print .

    Ejercicio 3.30.a ) Ver el resultado deprint(/\\) .b ) Imprimir una casita usandoprint :

    /\/__\| ||__| e

    3.6. En el lo de la navaja En esta seccin vemos cosas que no tienen sentido en matemticas, pero s en

    Python, y algunos remedios posibles. Recordando que en este curso usamos Pythoncomo herramienta, pero no es un curso de Python , huiremos de estas construcciones.

    Ejercicio 3.31. En este ejercicio seguimos analizando la precedencia de operadores,encontrando expresiones no muy elegantes.

    a ) Evaluar 3 / 4 5 y decidir si corresponde a (3 / 4) 5 o a 3 / (4 5) .

    b ) Poner 2 + - 2 y explicar el resultado.c ) Repetir el apartado anterior para

    i ) 2 + + 2 ii ) 2 + + + 2 iii ) 2 + - + 2d ) La expresin de Python- 3 ** - 4 , es equivalente en matemticas a(3)4

    o a34?

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    24/220

    Pg. 18 Captulo 3. Tipos de datos bsicos

    e ) Conjeturar y vericar el resultado dei ) 2 + 3 * - 4 ii ) 2 * - 3 ** - 4 + 1 .

    Ms vale poner algunos parntesis antes que dejar algo de signicado dudoso.e

    Ejercicio 3.32. Como en el caso de la expresin 3/ 45, en matemticas tratamosde evitar expresiones como a b c (que se lee a y b o c ), ya que no es claro si sedebe evaluar primeroo(no est denida la precedencia). Pero en Python...

    a ) Conjeturar el valor de False and False or True , luego evaluarlo en Py-thon y decidir si corresponde a (False and False) or True o a Falseand (False or True) .

    b ) Decidir si al mezclar and y or hay precedencia de uno sobre otro, o si serealizan las evaluaciones de izquierda a derecha (como en 12+ 3, recordarel ejercicio 3.31). e

    Ejercicio 3.33. Como ya mencionamos, a los efectos de evaluaciones lgicas Pythonconsidera que todo objeto tiene un valor verdadero o falso . Afortunadamente, son pocas las cosas que evalan aFalse , y bastar acordarse

    de stas ya que todas las otras darn True . De las que hemos visto, slo 0, 0.0 , lacadena vaca , y (claro)False se evalan (en lgica) como falsos.

    a ) Evaluar con Python:i ) bool(1) ii ) bool(0) iii ) bool(1.2)

    iv ) int(False) v ) int(True) vi ) float(False)vii ) 0 < True viii ) 3 + False ix ) False + True

    x ) bool() xi ) bool() xii ) bool(0)b ) Recordando elejercicio 3.32, conjeturar y luego comprobar el valor de

    i ) 1 and 2 or 3 ii ) 3 or 1 and 2c ) En Python, las expresiones -1 + 3 + 2 , (-1 + 3) + 2 y -1 + (3 + 2)

    dan todas el mismo resultado. Ver que, en cambio,-1 < 3 < 2 da un resultado distinto de (-1 < 3) 0,elalgoritmo de la divisin encuentra enteros q y r , 0r < b tales que a = qb + r , an cuando a no sea positivo, y esto se traduce en Python poniendo

    q = a // b y r = a % b. (4.1)

    En el captulo 9 veremos la funcin divmod que hace una tarea similar con unanica instruccin.

    Para ver el comportamiento de Python, probamos los siguientes tomando distin-tos valores dea y b: positivos, negativos, enteros o decimales.

    a ) Qu pasa sib es 0?, y sia y b son ambos 0?b ) Qu hace Python cuandob es entero pero negativo? (o sea: qu valores deq

    y r se obtienen?).c ) Sib es positivo pero decimal, al realizar las operaciones en(4.1), Python pone

    q decimal y r decimal, pero esencialmente q es entero pues q == int(q) . Vericar esto tomando distintos valores decimales dea y b (b positivo).

    d ) Si a es decimal y b = 1, determinar si el valor de q coincide con int(a) oround(a) o ninguno de los dos.

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    29/220

    4.2. Comentarios Pg. 23

    e ) Dar ejemplos (de la vida real) donde tenga sentido considerar b decimal y positivo.

    Ayuda : hay varias posibilidades, una es pensar en radianes y b = 2 , otraes pensar en horas, y en general en cosas cclicas.

    f ) Qu hace Python cuandob es negativo y decimal? e

    4.2. Comentarios Es posible ver cules son las variables denidas usando globals , obteniendo

    un diccionario , con entradas de la formaidentificador: valor .Como tantas otras cosas de Python, en este curso no veremos niglobals ni

    la estructura de diccionario.

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    30/220

    Captulo 5

    Mdulos

    La asignacin nos permite referir a algo complejo con un nombre sencillo. Delmismo modo, a medida que vamos haciendo acciones ms complejas, el uso de laterminal se hace incmodo y es conveniente ir agrupando las instrucciones, guardn-dolas en algn archivo para uso posterior, como ya mencionamos en la seccin 2.3.En Python estos archivos se llamanmdulos , y para distinguirlos en estas notas indi-camos sus nombres conestasletras , en general omitiendo la extensin (que puedenno tener).

    Los mdulos de Python vienen bsicamente en dos sabores:

    Los mdulos estndares , que forman parte de la distribucin de Python y queamplan las posibilidades del lenguaje. Nosotros vamos a usar muy pocos destos, slomath , random , y un breve pasaje poros .

    El mdulobuiltins se instala automticamente al iniciar Python en la termi-nal.

    Los mdulos que construimos nosotros, ya sea porque Python no tiene unmdulo estndar que haga lo que queremos (o no sabemos que lo tiene), o,como en este curso, porque queremos hacer las cosas nosotros mismos.

    Estos mdulos son archivos de texto, en donde guardamos varias instruccio-nes, eventualmente agrupadas en una o ms funciones (tema que veremos enel captulo 6).

    Por otro lado, los mdulos se pueden usar de dos formas distintas:

    Si el mdulo se llamapepe , usando la instruccin

    import pepe

    ya sea en la terminal o desde otro mdulo. Si el mdulo est en un archivo de texto y se puede abrir en una ventana de

    IDLE, con el menRun Module de IDLE.En la prctica, este segundo mtodo es equivalente a escribir todas las

    sentencias del mdulo en la terminal de IDLE y ejecutarlas.

    Estas dos formas dan resultados distintos, y nos detendremos a explorar estasdiferencias en la seccin 5.4. En la gran mayora de los casos, usaremos el primermtodo con los mdulos estndares y el segundo con los mdulos que construimos.

    Veamos algunos ejemplos.

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    31/220

    5.1. Mdulos estndares: math Pg. 25

    Matemticas: e x sen cos tan log Python: pi e sqrt(x) sin cos tan log

    Cuadro 5.1: Traducciones entre matemticas y el mdulo math .

    5.1. Mdulos estndares: mathMuchas funciones matemticas no estn entre las predeterminadas (no estn en

    el mdulo builtins ) de Python, y a nosotros nos van a interesar particularmente lasfunciones trigonomtricas seno, coseno y tangente, la exponencial y su inversa ellogaritmo, as como las constantes relacionadas = 3.14159... y e = 2.71828...

    Para agregar estas funciones y constantes apelamos al mdulo estndar math ,usando las traducciones de matemtica a Python del cuadro 5.1, y recordando queen las instrucciones de Python hay que anteponer math. , por ejemplo, en mate-mticas se escribe como math.pi en Python.

    Ejercicio 5.1. Poner import math en la terminal, y luego realizar los siguientesapartados:

    a ) Poner help(math) , para ver las nuevas funciones disponibles.b ) Evaluar math.sqrt(2) . Qu pasa si ponemos slosqrt(2) (sin math )?c ) Es 4 entero? De qu tipo es math.sqrt(4) ? eHay otras formas de importar mdulos o parte de sus contenidos, pero

    en el curso slo usaremos la forma

    import nombre_del_mduloimportando siempre todo el contenido del mdulo.

    Ejercicio 5.2. Usando el mdulo math :a ) Ver qu hace math.trunc usando help(math.trunc) .b ) Cul es la diferencia entreround y math.trunc ? Encontrar valores del argu-

    mento donde se aprecie esta diferencia.c ) Cul es la diferencia entreint(x) y math.trunc(x) cuando x es un nmero

    decimal? e

    Ejercicio 5.3 (funciones trigonomtricas). En Python, como en matemticas engeneral, las funciones trigonomtricas toman los argumentos en radianes, y en todocaso podemos pasar de grados a radianes multiplicando por / 180. As, 45= 45/ 180= / 4 (radianes).

    Poniendo import math en la terminal, realizar los siguientes apartados:

    a ) Evaluar math.pi .b ) Cul es el valor decos0 y sen 0? Comparar con la respuesta de Python a

    math.cos(0) y math.sin(0) .c ) Calcular sen/ 4 usando Python.

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    32/220

    Pg. 26 Captulo 5. Mdulos

    d ) Calcular tan60usando math.tan con argumento 60/ 180.e ) Averiguar qu hacen las funciones math.radians y math.degrees usando

    help , y luego calcular nuevamentetan 60usando math.tan y alguna de esasfunciones. f ) Calcular seno, coseno y tangente de 30 usando Python (las respuestas, por

    supuesto, deberan ser aproximadamente 1/ 2, 3/ 2 y 3/ 3).g ) Cunto es tan90?, y segn Python?

    Observar que Python no puede calcularlo: math.pi y math.tan son sloaproximaciones a y tan. e

    Con log a b denotamos el logaritmo en base a de b , recordando que log a b = c a

    c = b (suponiendo que a y b son nmeros reales positivos). Es usual ponerlnx = log e x , aunque siguiendo la notacin de Python ac entenderemos que log x (sin base explcita) es log e x = lnx .

    Ejercicio 5.4 (exponenciales y logaritmos). Poniendo import math en la terminal,realizar los siguientes apartados:

    a ) Calcular math.e .b ) Ver qu hace math.log (usando help ) y calcular math.log(math.e) . Es

    razonable el valor obtenido?c ) Para encontrar el logaritmo en base 10, podemos usar math.log10 : ver qu

    hace esta funcin.d ) Calculara = log 105 aproximadamente, y vericar el resultado calculando 10a

    (cunto debera ser 10a ?).e ) Ver qu hace math.exp . Cul es la diferencia entre calcular math.exp(x) y

    (math.e)**x ? Calcularambas funcionesy su diferencia para distintos valores

    de x (e. g.,1,10,100). eEjercicio 5.5. Cul es mayor,e o e ? e

    Ejercicio 5.6. Recordemos que para x , la funcinpiso se dene como

    x = max {n :n x }, y la funcintecho se dene como

    x = mn{n :n x }.En el mdulo math , estas funciones se representan como math.floor (piso )

    y math.ceil (techo ) respectivamente. Ver el funcionamiento de estas funcionescalculando el piso y el techo de1,2.3 y 5.6. eEjercicio 5.7 (cifras I). La cantidad de cifras (en base 10) para n puede en-contrarse usando log 10 (el logaritmo en base 10), ya que n tiene k cifras si y s-lo si 10k 1 n < 10k , es decir, si y slo sik 1 log 10n < k , o sea si y slo sik = 1+ log 10n .

    a ) Recordando el ejercicio 4.6, usar estas ideas para encontrar la cantidad decifras (en base 10) de 876123.

    b ) Encontrar la cantidad de cifras en base 2 de 264 y de 1023. e

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    33/220

    5.2. Mdulos propios Pg. 27

    5.2. Mdulos propiosEn esta seccin construiremos nuestros mdulos, esto es, archivos de texto con

    extensin .py donde se guardan instrucciones de Python.Los archivos deben estar codicados en utf-8, lo que IDLE hace automticamente.

    Ejercicio5.8 (Hola Mundo).a ) Abrir una ventana nueva en IDLE distinta de la terminal (men File New

    Window ), escribir en ella (en un nico rengln) print(Hola Mundo) , y guardar en un archivo con nombre holamundo.py , prestando atencin aldirectorio en donde se guarda.

    Python es muy quisquilloso con las sangras : el rengln no debe tenerespacios (ni tabulaciones) antes deprint .Para evitar problemas, guardaremos todos nuestros mdulos en el mismodirectorio (veremosms adelante por qu).Adems, porprolijidad es mejorque el directorio no sea el directorio principal del usuario.

    Por ejemplo, podran ponerse todos en un directorioPython dentro deldirectorio Documentos (o similar) del usuario.

    b ) Buscando el men correspondiente en IDLE ( Run Run Module ), ejecutarlos contenidos de la ventana y vericar que en la terminal de IDLE se imprimeHola Mundo .

    c ) holamundo es una versin donde se agregaron renglones al principio, queconstituyen la documentacin que explica qu hace el mdulo.

    Incluir estos renglones (donde el texto completo empieza y termina con ), y ejecutar nuevamente el mdulo, vericando que el comportamientono vara.

    Es una sana costumbre (lase: exmenes) documentar los mdulos. En estecaso es un poco redundante, pues el mdulo tiene pocos renglones y sepuede entender qu hace leyndolos: ms vale que sobre y no que falte, lo que abunda no daa,...El uso de es similar al de las comillas simples y dobles para encerrarcadenas decaracteres, conalgunas diferencias.Porejemplo, no es necesariala barra invertida\ al nal de un rengln para indicar que el texto continaen el siguiente.

    d ) Poniendo ahora print(__doc__) , aparecer el texto que agregamos al prin-cipio de holamundo .

    e ) Sin embargo, poniendohelp(holamundo) da error.

    Porque no hemos usado import .

    f ) Poner import os y luegoos.getcwd() : aparecerel nombrede un directorio(o carpeta), llamadodirectorio actual de trabajo (current working directory ).

    Vericar que coincide con el directorio donde hemos guardado el archivoholamundo.py . e

    5.3. Ingreso interactivo de datosCuando trabajamos slo con la terminal de IDLE, podemos asignar o cambiar

    valores sin mucho problema, pero la situacin es diferente cuando se ejecuta o

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    34/220

    Pg. 28 Captulo 5. Mdulos

    importa un mdulo y queremos ingresar los datos a medida que se requieren. Unaforma de ingresarlos es interactivamente, donde el mdulo nos los va pidiendo amedida que son necesarios.

    Ejercicio 5.9 (holapepe). holapepe es una variante deholamundo , donde el usuarioingresa su nombre, y la computadora responde con ese nombre. La funcininput seencarga de leer el dato requerido.

    a ) Ejecutar el mdulo en IDLE, comprobando su comportamiento, y usandotambin print(__doc__) para leer la documentacin.

    b ) pepe es una variable donde se guarda el nombre ingresado. El nombre ingre-sado puede no ser pepe, y puede tener espacios como en Mateo Adolfo.

    Vericar el nombre ingresado poniendopepe en la terminal de IDLE.c ) Al ingresar el nombre no es necesario poner comillas: Python toma cualquier

    entrada como cadena de caracteres.

    Probar con las siguientes entradas, ejecutando cada vez el mdulo y veri-cando cada una de ellas poniendo pepe antes de ejecutar la siguiente.i ) paque ii ) 123123" iii ) agu"ero

    d ) Los renglones quese escriben en la ventanaholapepe no deben tener sangras,aunque puede haber renglones en blanco (pero sin espacios ni tabulaciones):agregar un rengln sin caracteres (con retorno o similar) entre el renglncon el primer print y el rengln que empieza conpepe , y comprobar que elcomportamiento no vara. e

    Ejercicio 5.10 (comentarios en el cdigo). Cuando un rengln tiene el smbolo #,Python ignora este smbolo y todo lo que le sigue en ese rengln. Esta accin se llamacomentar el texto.

    Veamos el efecto en el mduloholapepe :a ) Agregar# al principio del primer rengln que empieza conprint y el rengln

    siguiente cambiar input() por input(Cmo te llams?) . Cul es elefecto?

    b ) El nombre ingresado queda demasiado junto a la pregunta eninput . Cmose podra agregar un espacio a la pregunta para que aparezcan separados?

    c ) Descomentar el rengln conprint o sea, sacar el# y cambiar la instruc-cin por print(Hola, soy la compu) viendo el efecto.

    d ) Cmo podramos modicar el rengln nal para que se agregue una coma , inmediatamente despus del nombre? Por ejemplo, si el nombre ingresa-do es Mateo, debera imprimirse algo comoHola Mateo, encantada deconocerte .

    Sugerencia : usar concatenacin (ejercicio 3.22). e

    Cuando se programa profesionalmente, es muy importante que el programa fun-cione an cuando los datos ingresados sean errneos, por ejemplo si se ingresa unaletra en vez de un nmero, o el nmero 0 como divisor de un cociente. Posiblementese dedique ms tiempo a esta fase, y a la interfase entre la computadora y el usuario,que a hacer un programa que funcione cuando las entradas son correctas.

    Nosotros supondremos que siempre se ingresan datos apropiados, y no haremos(salvo excepcionalmente) deteccin de errores. Tampoco nos preocuparemos porofrecer una interfase estticamente agradable. En cambio:

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    35/220

    5.4. Usando import Pg. 29

    Siempre trataremos de dejar claro mediante la documen-

    tacin qu hace el programa y preguntando qu datos han de ingresarse en cada momento.

    Ejercicio 5.11. sumardos es un mdulo donde el usuario ingresa dos objetos, y seimprime la suma de ambos. Adems, al comienzo se imprime la documentacin delmdulo.

    a ) Sin ejecutar el mdulo, qu resultado esperaras si las entradas fueran mi y mama(sin comillas)?

    Ejecutar el mdulo, viendo si se obtiene el resultado esperado.b ) Qu resultado esperaras si las entradas fueran2 y 3?

    Ejecutar el mdulo, viendo si se obtiene el resultado esperado.Python siempre toma las entradas de input como cadenas de caracteres.c ) Si queremos que las entradas se tomen como nmeros enteros, debemos

    pasar de cadenas de caracteres a enteros, por ejemplo cambiando

    a = input(Ingresar algo: )

    por

    a = int(input(Ingresar un entero: ))

    y de modo similar parab.Hacer estos cambios, cambiar tambin la documentacin y guardar los

    cambios en el mdulo sumardosenteros .

    Probar el nuevo mdulo (ejecutndolo cada vez) con las entradas:i ) 2 y 3 ii ) 4.5 y 6 iii ) mi y mamad ) Cmo modicaras el mdulo para que Python interprete las entradas como

    dos nmeros decimales? e

    5.4. Usando import Al poner import mdulo , Python no busca el mdulo en toda la computadora

    (lo que llevara tiempo) sino en ciertos directorios, dentro los cuales siempre estnlos mdulos estndares como os o math .

    Cuando se ejecuta un mdulo en IDLE (como hicimos conholamundo ), el direc-torio donde est el archivo correspondiente pasa a estar entre esos directorios. Deall la recomendacin de poner todos los mdulos construidos por nosotros en unmismo directorio.

    La lista inicial dedirectoriospuedeverseen el menFile Path Browser de Python.Es posible (usando instrucciones que no veremos) encontrar la lista completa

    de directorios y tambin cambiar la lista, por ejemplo, agregando otros directorios.

    Ejercicio 5.12. Abrir una nueva sesin de IDLE para realizar este ejercicio.a ) Poner import os y luego os.getcwd() (como en el ejercicio 5.8. f )). Si se

    siguieron las instrucciones delejercicio 5.8.a ), el directorio no ser el mismodonde reside el archivoholamundo.py .

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    36/220

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    37/220

    5.4. Usando import Pg. 31

    marco o espacio global

    variablesglobales

    math holapepe

    Mara Jos 3.14...

    pepe pi pepe

    Figura 5.1: Espacio o marcos global y de mdulos en elejercicio 5.13.

    Preguntando por pepe volvemos a obtenerMara , pero si ahora ponemosholapepe.pepe , obtendremos Jos .

    holapepe.pepe es una variable dentro del espacio determinado por ho-lapepe , y su valor es Jos . En cambio,pepe es una variable global y su valor es Mara .

    En lagura 5.1vemos un esquema de la situacin planteada, con los espacios delos mdulos en azul. e

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    38/220

    Captulo 6

    Funciones

    Como hemos visto, por ejemplo en el ejercicio 5.9.c ), se hace tedioso ejecutarel mdulo cada vez que queremos probar con distintas entradas, y una solucin es juntar las instrucciones en unafuncin . Como en el caso de asignaciones y mdulos,la idea es no repetir acciones. Aunque la ventaja de su uso ir quedando ms claraa lo largo del curso, en general podemos decir que las funciones son convenientespara:

    poner en un nico lugar clculos idnticos que se realizan en distintas oportu-nidades,

    o poner por separado alguna accin permitiendo su fcil reemplazo (y conmenor posibilidad de error),

    y no menos importante, haciendo el programa ms fcil de entender, dejandouna visin ms global y no tan detallada en cada parte.

    Para denir una funcin en Python usamos el esquema:

    def funcin ( argumento / s ):instrucciones

    6.1. Ejemplos simplesEjercicio 6.1. Siguiendo las ideas delejercicio 5.9, vamos a denir una funcinholaque dado un argumento, imprime Hola seguido del argumento. Por ejemplo, que-remos que hola(Mateo) imprima Hola Mateo.

    a ) Poner en una nueva ventana de IDLE (no la terminal):

    def hola(nombre):print(Hola, nombre)

    El primer renglnno debe tener sangras y debe terminar con : , y el segun-do debe tener una sangra de exactamente 4 espacios . IDLE pone la sangraautomticamente cuando el rengln anterior termina en : .

    b ) Guardar el mdulo comoholas , ejecutarlo (conRun Run Module ) y probarla funcin con las siguientes entradas:i ) hola(Mateo) ii ) hola(123) iii ) hola(123)

    iv ) hola(1 + 2) v ) hola(2 > 5)

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    39/220

    6.1. Ejemplos simples Pg. 33

    Como en matemticas, primero se evala el argumento y luego la funcin(en este casohola ).

    c ) Qu pasa si ponemos hola (sin argumentos) en la terminal? Ver que la res-puesta es similar a poner, por ejemplo,abs (sin argumentos).d ) Qu pasa si ponemosnombre en la terminal?

    La variable nombre es locala la funcin hola y no se conoce afuera, siguien-do un mecanismo de contextos ( ejercicio 5.13 ) . El tema se explica con ms detalle en la seccin 6.2 .

    e ) Conjeturar el valor dea despusde la asignacin a = hola(toto) ,yluegovericarlo (poniendoa en la terminal).

    No aparece un resultado visible, siendo None, un valor de Python para indicar que no hay resultado visible (pero no que hay error).

    f ) Siempre con a = hola(toto) , poner a == None para ver que, efectiva-mente, el valor dea es None.

    g ) Tambin poner None en la terminal, y ver que no se imprime resultado alguno.h ) Como vamos a agregar otras funciones al mdulo, no ponemos por ahora la

    documentacin del mdulo mismo, pero s vamos a agregar documentacina la funcinhola , poniendo

    def hola(nombre):"""Imprime Hola seguido del argumento."""

    print(Hola, nombre)

    Ejecutar nuevamente el mdulo y ponerhelp(hola) .La funcinhola que acabamos de denir toma el argumento que hemos llamado

    nombre , pero podemos denir funciones sin argumentos:i ) Imitando lo hecho conholapepe , en la ventana holas poner:

    def hola2():print(Hola, soy la compu)nombre = input(Cul es tu nombre? )print(Encantada de conocerte, nombre)

    hola2 no tiene argumentos, pero tenemos que poner los parntesis tantoal denirla como al invocarla.Atencin a las sangras!

    j ) Guardar los cambios, ejecutar el mdulo, y vericar la funcin y su documen-

    tacin poniendo hola2() y help(hola2) .k ) Repetir los apartadose ) y f ) cambiando hola por hola2 .l ) nombre es una variablelocal a la funcinhola2 : poner nombre en terminal y

    ver que da error. A diferencia de las variables locales a mdulos, no es fcil acceder a lasvariables locales dentro de una funcin.

    holas es una versin nal del mdulo, que incluye documentacin. e

    El ejercicio anterior nos muestra varias cosas. Por un lado, vemos que en unmismo mdulo se pueden denir varias funciones. Por otro lado, las funciones

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    40/220

    Pg. 34 Captulo 6. Funciones

    del mdulo holas tienen el resultado visible de imprimir, pero no podemos hacerasignaciones como lasque estamos acostumbrados en matemticas del tipo y = f (x ),obteniendo en cambio None.

    En la jerga de programacin, cuando ponemosy = f(x) decimos que hacemosuna llamada a f , que x se pasa a o es un argumento de f , y que f(x) retorna odevuelve y.

    Ejercicio 6.2. Basados en el ejercicio 5.11, ahora denimos una funcin que tomados argumentos y que retorna un valor que podemos usar.

    a ) En una ventana nueva de IDLE, poner

    def suma(a, b):return a + b

    Guardar en un archivo adecuado, y ejecutar el mdulo.b ) Hacer la asignacina = suma(8, 9) y vericar que el valor dea no es None

    sino el esperado.c ) Conjeturar y vericar el resultado de los siguientes

    i ) suma(2, 3) ii ) suma(4.5, 6) iii ) suma(pi, pa)iv ) suma(pi, pa) v ) suma(1) vi ) suma(1, 2, 3)

    vii ) suma(1, None) e

    Ejercicio 6.3. En cada una de las funciones hola y hola2 del ejercicio 6.1incluir lainstruccin return None , y volver a hacer las asignacionesa = hola(toto) y a= hola2() , viendo que el resultado es efectivamenteNone.

    Si en vez de ponerreturn algo se pone return y nada ms, el efecto es el mis-moqueponer return None o directamenteno poner return : vericarlo cambiandoel return None anterior por slo return . e

    Ejercicio 6.4. En este ejercicio tratamos de deshacer los entuertos de Python conlas variables lgicas que vimos en el ejercicio 3.33, apoyndonos en la funcinisinstance (ejercicio 3.25).

    a ) Denir una funcin esbool que determine si el argumento ingresado esuna variable lgica o no desde las matemticas (no de Python), retornandoverdadero o falso. Por ejemplo:

    con argumento mi mama 1 1.2 1.0 Truedebe dar False False False False True

    b ) Denir una funcin esnumero que determine si el argumento ingresado esun nmero. Por ejemplo:

    con argumento mi mama 1 1.2 1.0 Truedebe dar False True True True False

    Ayuda : usar el apartado anterior y operadores lgicos comoand y not .c ) Denir una funcin esentero que determine si el argumento ingresado es

    un nmero entero. Por ejemplo:con argumento mi mama 1 1.2 1.0 True

    debe dar False True False True Falsed ) Denir una funcin esnatural que determine si el argumento ingresado es

    un nmero entero y positivo. e

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    41/220

    6.2. Variables globales y locales Pg. 35

    6.2. Variables globales y localesLas funciones tambin son objetos, y cuando denimos una funcin se fabrica

    un objeto de tipo funcin , con su propio espacio o marco, y se construye una variableque tiene por identicador el de la funcin y hace referencia a ella.

    As como para los mdulos, en el marco de una funcin hay objetos como ins-trucciones y variables, que son locales a la funcin.

    Los argumentos (si los hubiera) en la denicin de una funcin se llaman par-metros formales y los que se especican en cada llamada se llamanparmetros reales . Al hacer la llamada a la funcin, se realiza un mecanismo similar al de asignacin,asignando cada uno de los parmetros formales a sus correspondientes parmetrosreales.

    As, sif est denida por

    def f(a, b):

    ...a y b son variables locales a la funcin, y cuando hacemos la llamada f(x, y) sehacen las asignacionesa = x y b = y antes de continuar con las otras instruccionesen f .

    Ejercicio 6.5. En una nueva sesin de IDLE, poner en la terminal:

    def f(x):a = 3return x + a

    La variablea en la denicin es local a la funcin, y puede existir una variable afuera de la funcin que seaglobal .

    a ) Poner sucesivamente:

    f(2)ftype(f)

    y estudiar los resultados.b ) Poner

    g = fg(2)gtype(g)

    y comprobar que los tres ltimos resultados son idnticos al anterior.c ) Poner

    a = 1f(a)a

    y observar que el valor de la variable globala no ha cambiado. e

    Podemos pensar que los distintos elementos que intervienen en el ejercicio 6.5estn dispuestos como se muestra en la gura 6.1:

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    42/220

    Pg. 36 Captulo 6. Funciones

    marco o espacio global

    marco de la funcin

    instruccionesde la funcin

    instruccionesglobales

    variables locales

    variables globales

    2 3

    a f g

    x a

    Figura 6.1: Variables globales y locales.

    La funcin tiene instrucciones, datos y variables locales, que ocupan un lu-gar propio en memoria, formando un objeto que puede referenciarse comocualquier otro objeto.

    En este caso,f y g referencian a la misma funcin. La variable globala referencia a2, mientras que la variablea local a la funcin

    referencia a 3. La instruccinf(a) hace que se produzca la asignacinx = a, pero x es local

    a la funcin mientras quea es global.

    Como vemos, el tema se complica cuando los identicadores (los nombres) de losparmetros formales en la denicin de la funcin coinciden con los de otros fuerade ella, o aparecen nuevas variables en la denicin de la funcin con los mismosnombres que otras denidas fuera de ella.

    En lneas generales, cuando dentro del cuerpo de una funcinencontramos una variable, entonces:

    si la variable es un argumento formal, es local a la funcin. si la variable nunca est en el miembro izquierdo de una asignacin (siem-

    pre est a la derecha), la variable es globaly tendr que ser asignada antesde llamar la funcin,

    si la variable est en el miembro izquierdo de una asignacin, la variable es local a la funcin y se desconoce afuera (como en los espacios denidos por mdulos),...

    ... salvo que se declare como globalcon global , y en este casoser ... global!

    El siguiente ejercicio muestra varias alternativas, pero alentamos a pensar otras.

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    43/220

    6.2. Variables globales y locales Pg. 37

    Ejercicio 6.6. El mdulo globyloc tiene las funciones denidas en este ejercicio. A diferencia de otros, no es un mdulo para ejecutar o importar, pues algunas deni-ciones son incorrectas y darn error. Lo incluimos para tener un lugar sencillo desdedonde copiar y luego pegar en algn lugar adecuado.

    a ) En la terminal de IDLE poner

    def f(x):print( el argumento ingresado fue:, x)return x

    y explicar los resultados de los siguientes:i ) a = f(1234)

    a == 1234x

    ii ) a = 1234b = f(a)a == b

    iii ) x = 12y = f(34)x == yx

    b ) Reiniciar la terminal (Shell Restart Shell ), de modo que ni a ni x estndenidas, poner

    def f(x):return x + a # a es global (no se asigna en f)

    y explicar los resultados de los siguientes:i ) f(1) ii ) a = 1

    f(2)iii ) a = 1

    f(a)

    Si a no tiene valor denido, no tiene sentido llamar a f .

    c ) Reiniciar la terminal, poner

    def f(x):a = 5 # a es local porque se hace una asignacinreturn x + a

    y explicar los resultados de los siguientes:i ) f(1) ii ) a = 2

    f(1)a

    d ) Reiniciar la terminal, poner

    def f(x):b = a # b es local y a es global

    return x + a + b y volver a resolver las preguntas del apartado anterior.

    e ) Repetir elapartado c ) con

    def f(x):b = a # b es local y a podra ser globala = 1 # a es local porque se asigna

    # y entonces estamos en problemas porque la# usamos antes de asignar

    return x + a + b

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    44/220

    Pg. 38 Captulo 6. Funciones

    Cambiar el orden de los renglones poniendo primero a = 1 y luegob =a , y repetir.

    f ) Reiniciar la terminal, ponerdef f(x):

    global aa = 5 # a es... global!return x + a

    y explicar los resultados de las siguientes:i ) f(1)

    aii ) a = 2

    f(1)a

    g ) Ponerdef f(x):

    global xx = 2 # el argumento no puede ser global, da errorreturn x

    y ver que da error: una variable no puede ser a la vez argumento formal y global.

    h ) En otra tnica, podemos usar una variable local con el mismo identicadorque la funcin como en

    def f(x):f = x + 1 # x y f son localesreturn f

    y ejecutar el bloqueff(1)f

    Desde ya que este uso es slo para esquizofrnicos y masoquistas. Y va a ser confuso cuando veamos recursin en elcaptulo 17. e

    Ejercicio 6.7. Las funciones pueden considerarse como objetos de la misma catego-ra que las variables, y podemos tener funciones locales a una funcin como en elmdulo ocal .

    a ) Ejecutar ese mdulo y explicar el resultado del bloque:x = 1

    fexterna()x

    b ) Cul es el resultado de ejecutarfinterna() ?, por qu? e

    Ejercicio 6.8. Siendo como variables, las funciones tambin pueden pasarse comoargumentos a otras funciones, como se ilustra en el mdulo argumento .

    Predecir los resultados de las siguientes y luego vericarlos:a ) aplicar(f, 1) b ) aplicar(g, 1)c ) aplicar(f, aplicar(f, 1)) d ) aplicar(g, aplicar(f, 1))e ) aplicar(g, aplicar(g, 1)) e

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    45/220

    6.3. Comentarios Pg. 39

    6.3. Comentarios Ocasionalmente vamos a necesitar variables que no son ni locales ni globales,

    pero posponemos su introduccin hasta la seccin 17.3, cuando tengamos queusarlas.

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    46/220

    Captulo 7

    Funciones numricas y susgrcos

    Sobre todo en temas de clculo o anlisis matemtico, el inters es en trabajarcon funciones que toman valores reales, es decir, de la forma f : A , dondemuchas vecesA es un intervalo o quizs todo . Una gran ayuda para entender estasfunciones es ver sus grcos (o aproximaciones a ellos). El tema de este captulo esver cmo Python nos puede ayudar con el estudio de estas funciones y sus grcos.

    7.1. Funciones numricasEjercicio 7.1. Si f indica la temperatura en grados Fahrenheit, el valor en gradoscentgrados (o Celsius) est dado porc = 5( f 32)/ 9.

    a ) Expresar en Python la ecuacin que relacionac y f .b ) En la terminal de IDLE, usar la expresin anterior para encontrarc cuando f

    es 0, 10 , 98 .c ) Recprocamente, encontrar f cuando c es -15 , 10 , 36.7 .d ) Para qu valores def el valor dec (segn Python) es entero? Y matemtica-

    mente?e ) En qu casos coinciden los valores en grados Fahrenheit y centgrados? f ) Denir una funcinacelsius en Python tal que sif es el valor de la tempera-

    tura en grados Fahrenheit, acelsius(f) da el valor en grados centgrados, y vericar el comportamiento repitiendo los valores obtenidos enb ).

    g ) Recprocamente, denir la funcinafahrenheit que dado el valor en gradoscentgrados retorne el valor en grados Fahrenheit, y vericarlo con los valoresobtenidos en c ). e

    Ejercicio 7.2. En este ejercicio consideramos funciones de varias variables.

    a ) Construir una funcin hmsas(h, m, s) que dado un tiempo expresado enhoras (h), minutos ( m) y segundos (s ), lo pase a segundos.

    Por ejemplo, en matemticas tendremos 12 hs 34 m 56.78 s45296.78 s, y en Python,hmsas(12, 34, 56.78) debe dar 45296.78 .

  • 7/31/2019 Notas para los cursos de Computacin y Programacin con Python

    47/220

    7.2. El mdulo grpc Pg. 41

    b ) De modo similar, construir una funcingmsar(g, m, s) que ingresando lamedida de un ngulo en grados, minutos y segundos, retorne la medida enradianes.

    Por ejemplo, 1234 56.78 0.21960... e

    7.2. El mdulo grpc Aprovechando las facilidades grcas del mdulotkinter de Python, usaremos el

    mdulo grpc (por grcos de puntos y curvas) para hacer grcos en dos dimensio-nes.

    grpc es muy elemental, muy lejos de las posibilidades grcas de, por ejemplo,Mathematica , pero ser bastante adecuado para nuestros propsitos, no tenemosque instalar programas adicionales para grcos, y es independiente del sistemaoperativo pues est escrito (claro) en Python.

    En el curso usaremos grpc como caja negra, como hacemos con math , slousaremos algunos comandos y no estudiaremos las instrucciones en l. En estaseccin nos concentramos en los grcos de funciones, pero grpc tambin nospermite agregar otros elementos, como puntos, poligonales, texto y otros ms (ponerhelp(grpc) ).

    grpc es muy largo para incluirlo aqu y no tiene mucho sentido hacerlo ya que noestudiaremos su contenido. Se puede bajar de la pgina del libro, como los otrosmdulos mencionados no incluidos en la distribucin de Python.

    Ejercicio 7.3.

    a ) Copiar el mdulogrpc en el directorio donde se guardan nuestros mdulos, y poner help(grpc) y help(grpc.funcion) (funcion sin tildes).

    Recordarque antes deusar help hayquecolocarse en el directorio correcto y usarimport .

    b ) Ejecutar el mdulo grseno para hacer un grco del seno entre 0 y , con losvalores de las opciones por defecto.

    En el contenido degrseno , observamos que:

    El primer argumento degrpc.funcion es la funcin, que debe estar denidacon anterioridad, y los otros dos son los extremos del intervalo (cerrado) dondehacer el grco.

    grpc espera que primero se denan los elementos del grco, y luego lo co