tutorial python 3

97
http://www.python.org.ar Traducido y empaquetado por la comunidad de Python Argentina P y A r

Upload: jaime-j-saravia-h

Post on 25-Nov-2015

78 views

Category:

Documents


1 download

TRANSCRIPT

  • http://www.python.org.ar

    Traducido y empaquetado porla comunidad de Python Argentina

    Py Ar

  • Autor original: Guido van Rossum

    Editor original: Fred L. Drake, Jr.

    Este material fue traducido por voluntarios del

    grupo de usuarios de Python de Argentina.

    Una versin actualizada de este Tutorial

    puede encontrarse en:

    http://python.org.ar/pyar/Tutorial

    Febrero 2013

    Este PDF fue generado usando la herramienta rst2pdf

    Copyright Python Software Foundation

    Esta documentacin est cubierta por la Licencia PSF para Python 3.3.0, que basicamente permite que use, copies, modiques y distribuyas este contenido.

    Para un mayor detalle: http://www.python.org/doc/3.3.0/copyright.html

  • ContenidoIntroduccin 1Abriendo tu apetito 2

    Usando el intrprete de Python 4Invocando al intrprete 4

    Pasaje de argumentos 5Modo interactivo 5

    El intrprete y su entorno 5

    Manejo de errores 5Programas ejecutables de Python 5Codificacin del cdigo fuente 6El archivo de inicio interactivo 6

    Los mdulos de customizacin 7

    Una introduccin informal a Python 8Usar Python como una calculadora 8

    Nmeros 8

    Cadenas de caracteres 10Sobre Unicode 14Listas 14

    Primeros pasos hacia la programacin 16Ms herramientas para control de flujo 18

    La sentencia if 18

    La sentencia for 18

    La funcin range() 19

    Las sentencias break, continue, y else en lazos 20

    La sentencia pass 20

    Definiendo funciones 21

    Ms sobre definicin de funciones 22

    Argumentos con valores por omisin 22Palabras claves como argumentos 23Listas de argumentos arbitrarios 25Desempaquetando una lista de argumentos 25Formas con lambda 26

    Cadenas de texto de documentacin 26Anotacin de funciones 27

    Intermezzo: Estilo de codificacin 27

    Estructuras de datos 28

    Ms sobre listas 28

    Usando listas como pilas 29

    Usando listas como colas 29

    Comprensin de listas 30

    i

  • Listas por comprensin anidadas 31

    La instruccin del 32

    Tuplas y secuencias 32

    Conjuntos 33Diccionarios 34

    Tcnicas de iteracin 35

    Ms acerca de condiciones 36

    Comparando secuencias y otros tipos 37Mdulos 38

    Ms sobre los mdulos 39

    Ejecutando mdulos como scripts 39El camino de bsqueda de los mdulos 40

    Archivos "compilados" de Python 40

    Mdulos estndar 41

    La funcin dir() 41

    Paquetes 43

    Importando * desde un paquete 44

    Referencias internas en paquetes 45

    Paquetes en mltiples directorios 45

    Entrada y salida 46

    Formateo elegante de la salida 46Viejo formateo de cadenas 49

    Leyendo y escribiendo archivos 49

    Mtodos de los objetos Archivo 49El mdulo pickle 51

    Errores y excepciones 52

    Errores de sintaxis 52

    Excepciones 52

    Manejando excepciones 53Levantando excepciones 54

    Excepciones definidas por el usuario 55

    Definiendo acciones de limpieza 56

    Acciones predefinidas de limpieza 57

    Clases 58Unas palabras sobre nombres y objetos 58mbitos y espacios de nombres en Python 58

    Ejmplo de mbitos y espacios de nombre 60Un primer vistazo a las clases 60

    Sintaxis de definicin de clases 60Objetos clase 61Objetos instancia 62Objetos mtodo 62

    ii

  • Algunas observaciones 63Herencia 64

    Herencia mltiple 65

    Variables privadas 65

    Cambalache 66Las excepciones tambin son clases 66

    Iteradores 67

    Generadores 68Expresiones generadoras 69

    Pequeo paseo por la Biblioteca Estndar 70Interfaz al sistema operativo 70

    Comodines de archivos 70Argumentos de linea de rdenes 70Redireccin de la salida de error y finalizacin del programa 71Coincidencia en patrones de cadenas 71Matemtica 71

    Acceso a Internet 71

    Fechas y tiempos 72

    Compresin de datos 72Medicin de rendimiento 73

    Control de calidad 73Las pilas incluidas 74

    Pequeo paseo por la Biblioteca Estndar - Parte II 75Formato de salida 75

    Plantillas 76

    Trabajar con registros estructurados conteniendo datos binarios 77Multi-hilos 77

    Registrando 78Referencias dbiles 78

    Herramientas para trabajar con listas 79Aritmtica de punto flotante decimal 80

    Y ahora qu? 81Edicin de entrada interactiva y sustitucin de historial 82

    Edicin de lnea 82

    Sustitucin de historial 82Atajos de teclado 82Alternativas al intrprete interactivo 84

    Aritmtica de Punto Flotante: Problemas y Limitaciones 85Error de Representacin 87

    Links a la documentacin de Python 90La referencia de la biblioteca 90

    Tipos integrados 90

    iii

  • Excepciones integradas 90La referencia del lenguaje 90

    Expresiones 90

    Declaraciones simples 90

    Declaraciones compuestas 91

    Instalando mdulos de Python 91

    iv

  • Introduccin

    Python es un lenguaje de programacin poderoso y fcil de aprender. Cuenta con estructuras de datos eficientes y de altonivel y un enfoque simple pero efectivo a la programacin orientada a objetos. La elegante sintaxis de Python y su tipadodinmico, junto con su naturaleza interpretada, hacen de ste un lenguaje ideal para scripting y desarrollo rpido deaplicaciones en diversas reas y sobre la mayora de las plataformas.

    El intrprete de Python y la extensa biblioteca estndar estn a libre disposicin en forma binaria y de cdigo fuente para lasprincipales plataformas desde el sitio web de Python, http://www.python.org/, y puede distribuirse libremente. El mismo sitiocontiene tambin distribuciones y enlaces de muchos mdulos libres de Python de terceros, programas y herramientas, ydocumentacin adicional.

    El intrprete de Python puede extenderse fcilmente con nuevas funcionalidades y tipos de datos implementados en C oC++ (u otros lenguajes accesibles desde C). Python tambin puede usarse como un lenguaje de extensiones paraaplicaciones personalizables.

    Este tutorial introduce de manera informal al lector a los conceptos y caractersticas bsicas del lenguaje y el sistema dePython. Es bueno tener un interprete de Python a mano para experimentar, sin embargo todos los ejemplos estn aislados,por lo tanto el tutorial puede leerse estando desconectado.

    Para una descripcin de los objetos y mdulos estndar, mir La referencia de la biblioteca. La referencia de la bibliotecaprovee una definicin ms formal del lenguaje. Para escribir extensiones en C o C++, le Extendiendo e Integrando elIntrprete de Python y la Referencia de la API Python/C. Hay tambin numerosos libros que tratan a Python en profundidad.

    Este tutorial no pretende ser exhaustivo ni tratar cada una de las caractersticas, o siquiera las caractersticas ms usadas.En cambio, introduce la mayora de las caractersticas ms notables de Python, y te dar una buena idea del gusto y estilodel lenguaje. Luego de leerlo, sers capaz de leer y escribir mdulos y programas en Python, y estars listo para aprenderms de los variados mdulos de la biblioteca de Python descriptos en La referencia de la biblioteca.

    Tambin vale la pena mirar el glosario.

    1

  • Abriendo tu apetito

    Si trabajs mucho con computadoras, eventualmente encontrars que te gustara automatizar alguna tarea. Por ejemplo,podras desear realizar una bsqueda y reemplazo en un gran nmero de archivos de texto, o renombrar y reorganizar unmontn de archivos con fotos de una manera compleja. Tal vez quieras escribir alguna pequea base de datospersonalizada, o una aplicacin especializada con interfaz grfica, o un juego simple.Si sos un desarrollador de software profesional, tal vez necesites trabajar con varias bibliotecas de C/C++/Java peroencuentres que se hace lento el ciclo usual de escribir/compilar/testear/recompilar. Tal vez ests escribiendo una batera depruebas para una de esas bibliotecas y encuentres que escribir el cdigo de testeo se hace una tarea tediosa. O tal vez hasescrito un programa al que le vendra bien un lenguaje de extensin, y no quieres disear/implementar todo un nuevolenguaje para tu aplicacin.Python es el lenguaje justo para ti.Podras escribir un script (o programa) en el interprete de comandos o un archivo por lotes de Windows para algunas deestas tareas, pero los scripts se lucen para mover archivos de un lado a otro y para modificar datos de texto, no paraaplicaciones con interfaz de usuario o juegos. Podras escribir un programa en C/C++/Java, pero puede tomar mucho tiempode desarrollo obtener al menos un primer borrador del programa. Python es ms fcil de usar, est disponible para sistemasoperativos Windows, Mac OS X y Unix, y te ayudar a realizar tu tarea ms velozmente.

    Python es fcil de usar, pero es un lenguaje de programacin de verdad, ofreciendo mucho mucho mayor estructura ysoporte para programas grandes que lo que lo que pueden ofrecer los scripts de Unix o archivos por lotes. Por otro lado,Python ofrece mucho ms chequeo de error que C, y siendo un lenguaje de muy alto nivel, tiene tipos de datos de alto nivelincorporados como arreglos de tamao flexible y diccionarios. Debido a sus tipos de datos ms generales Python puedeaplicarse a un dominio de problemas mayor que Awk o incluso Perl, y an as muchas cosas siguen siendo al menos igualde fcil en Python que en esos lenguajes.Python te permite separar tu programa en mdulos que pueden reusarse en otros programas en Python. Viene con una grancoleccin de mdulos estndar que puedes usar como base de tus programas, o como ejemplos para empezar a aprender aprogramar en Python. Algunos de estos mdulos proveen cosas como entrada/salida a archivos, llamadas al sistema,sockets, e incluso interfaces a sistemas de interfaz grfica de usuario como Tk.

    Python es un lenguaje interpretado, lo cual puede ahorrarte mucho tiempo durante el desarrollo ya que no es necesariocompilar ni enlazar. El intrprete puede usarse interactivamente, lo que facilita experimentar con caractersticas del lenguaje,escribir programas descartables, o probar funciones cuando se hace desarrollo de programas de abajo hacia arriba. Estambin una calculadora de escritorio prctica.

    Python permite escribir programas compactos y legibles. Los programas en Python son tpicamente ms cortos que susprogramas equivalentes en C, C++ o Java por varios motivos:

    los tipos de datos de alto nivel permiten expresar operaciones complejas en una sola instruccin la agrupacin de instrucciones se hace por sangra en vez de llaves de apertura y cierre

    no es necesario declarar variables ni argumentos.Python es extensible: si ya sabes programar en C es fcil agregar una nueva funcin o mdulo al intrprete, ya sea pararealizar operaciones crticas a velocidad mxima, o para enlazar programas Python con bibliotecas que tal vez slo estndisponibles en forma binaria (por ejemplo bibliotecas grficas especficas de un fabricante). Una vez que ests realmenteentusiasmado, pods enlazar el intrprete Python en una aplicacin hecha en C y usarlo como lenguaje de extensin o decomando para esa aplicacin.

    2

  • Por cierto, el lenguaje recibe su nombre del programa de televisin de la BBC "Monty Python's Flying Circus" y no tienenada que ver con reptiles. Hacer referencias a sketches de Monty Python en la documentacin no slo esta permitido, sinoque tambin est bien visto!

    Ahora que ya ests emocionado con Python, querrs verlo en ms detalle. Como la mejor forma de aprender un lenguaje esusarlo, el tutorial te invita a que juegues con el intrprete de Python a medida que vas leyendo.En el prximo captulo se explicar la mecnica de uso del intrprete. Esta es informacin bastante mundana, pero esesencial para poder probar los ejemplos que aparecern ms adelante.El resto del tutorial introduce varias caractersticas del lenguaje y el sistema Python a travs de ejemplos, empezando conexpresiones, instrucciones y tipos de datos simples, pasando por funciones y mdulos, y finalmente tocando conceptosavanzados como excepciones y clases definidas por el usuario.

    3

  • Usando el intrprete de Python

    Invocando al intrprete Por lo general, el intrprete de Python se instala en file:/usr/local/bin/python3.4 en las mquinas dnde est disponible;poner /usr/local/bin en el camino de bsqueda de tu intrprete de comandos Unix hace posible iniciarlo ingresando la orden:

    python3.4

    ...en la terminal. 1 Ya que la eleccin del directorio dnde vivir el intrprete es una opcin del proceso de instalacin, puedeestar en otros lugares; consult a tu Gur Python local o administrador de sistemas. (Por ejemplo, /usr/local/python es unaalternativa popular).En mquinas con Windows, la instalacin de Python por lo general se encuentra en C:\Python34, aunque se puede cambiardurante la instalacin. Para aadir este directorio al camino, podes ingresar la siguiente orden en el prompt de DOS:

    set path=%path%;C:\python34

    Se puede salir del intrprete con estado de salida cero ingresando el carcter de fin de archivo (Control-D en Unix, Control-Zen Windows) en el prompt primario. Si esto no funciona, se puede salir del intrprete ingresando: quit().Las caractersticas para editar lneas del intrprete no son muy sofisticadas. En Unix, quien instale el intrprete tendrhabilitado el soporte para la biblioteca GNU readlines, que aade una edicin interactiva ms elaborada e historia. Tal vez laforma ms rpida de detectar si las caractersticas de edicin estn presentes es ingresar Control-P en el primer prompt dePython que aparezca. Si se escucha un beep, las caractersticas estn presentes; ver Apndice Edicin de entradainteractiva y sustitucin de historial para una introduccin a las teclas. Si no pasa nada, o si aparece ^P, estascaractersticas no estn disponibles; solo vas a poder usar backspace para borrar los caracteres de la lnea actual.

    La forma de operar del intrprete es parecida a la lnea de comandos de Unix: cuando se la llama con la entrada estndarconectada a una terminal lee y ejecuta comandos en forma interactiva; cuando es llamada con un nombre de archivo comoargumento o con un archivo como entrada estndar, lee y ejecuta un script del archivo.Una segunda forma de iniciar el intrprete es python -c comando [arg] ..., que ejecuta las sentencias en comando,similar a la opcin -c de la lnea de comandos. Ya que las sentencias de Python suelen tener espacios en blanco u otroscaracteres que son especiales en la lnea de comandos, es normalmente recomendado citar comando entre comillas dobles.

    Algunos mdulos de Python son tambin tiles como scripts. Pueden invocarse usando python -m module [arg] ...,que ejecuta el cdigo de module como si se hubiese ingresado su nombre completo en la lnea de comandos.Cuando se usa un script, a veces es til correr primero el script y luego entrar al modo interactivo. Esto se puede hacerpasndole la opcin -i antes del nombre del script.

    4

  • Pasaje de argumentos

    Cuando son conocidos por el intrprete, el nombre del script y los argumentos adicionales son entonces convertidos a unalista de cadenas de texto asignada a la variable argv del mdulo sys. Pods acceder a esta lista haciendo import sys.El largo de esta lista es al menos uno; cuando ningn script o argumentos son pasados, sys.argv[0] es una cadenavaca. Cuando se pasa el nombre del script con '-' (lo que significa la entrada estndar), sys.argv[0] vale '-'.Cuando se usa -c command, sys.argv[0] vale '-c'. Cuando se usa -m module, sys.argv[0] toma el valor delnombre completo del mdulo. Las opciones encontradas luego de -c command o -m module no son consumidas por elprocesador de opciones de Python pero de todas formas almacenadas en sys.argv para ser manejadas por el comando omdulo.

    Modo interactivo

    Se dice que estamos usando el intrprete en modo interactivo, cuando los comandos son ledos desde una terminal. En estemodo espera el siguiente comando con el prompt primario, usualmente tres signos mayor-que (>>>); para las lneas decontinuacin espera con el prompt secundario, por defecto tres puntos (...). Antes de mostrar el prompt primario, elintrprete muestra un mensaje de bienvenida reportando su nmero de versin y una nota de copyright:$ python3.4Python 3.4 (default, Sep 24 2012, 09:25:04)[GCC 4.6.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>>

    Las lneas de continuacin son necesarias cuando queremos ingresar un constructor multilnea. Como en el ejemplo, mir lasentencia if:

    >>> el_mundo_es_plano = 1>>> if el_mundo_es_plano:... print("Ten cuidado de no caerte!")...

    Ten cuidado de no caerte!

    El intrprete y su entorno

    Manejo de errores

    Cuando ocurre un error, el intrprete imprime un mensaje de error y la traza del error. En el modo interactivo, luego retornaal prompt primario; cuando la entrada viene de un archivo, el programa termina con cdigo de salida distinto a cero luego deimprimir la traza del error. (Las excepciones manejadas por una clausula except en una sentencia try no son errores eneste contexto). Algunos errores son incondicionalmente fatales y causan una terminacin con cdigo de salida distinto decero; esto se debe a inconsistencias internas o a que el intrprete se queda sin memoria. Todos los mensajes de error seescriben en el flujo de errores estndar; las salidas normales de comandos ejecutados se escriben en la salida estndar.Al ingresar el caracter de interrupcin (por lo general Control-C o DEL) en el prompt primario o secundario, se cancela laentrada y retorna al prompt primario. 2 Tipear una interrupcin mientras un comando se estn ejecutando lanza la excepcinKeyboardInterrupt, que puede ser manejada con una sentencia try.

    Programas ejecutables de Python

    En los sistemas Unix y tipo BSD, los programas Python pueden convertirse directamente en ejecutables, como programasdel intrprete de comandos, poniendo la linea:

    #! /usr/bin/env python3.4

    ...al principio del script y dndole al archivo permisos de ejecucin (asumiendo que el intrprete estn en la variable de entorno PATH del usuario). #! deben ser los primeros dos caracteres del archivo. En algunas plataformas, la primer lnea

    5

  • debe terminar al estilo Unix ('\n'), no como en Windows ('\r\n'). Not que el caracter numeral '#' se usa en Pythonpara comenzar un comentario.

    Se le puede dar permisos de ejecucin al script usando el comando chmod:$ chmod +x myscript.py

    En sistemas Windows, no existe la nocin de "modo ejecutable". El instalador de Python asocia automticamente laextensin .py con python.exe para que al hacerle doble click a un archivo Python se corra el script. La extensintambin puede ser .pyw, en este caso se omite la ventana con la consola que normalmente aparece.

    Codicacin del cdigo fuente Por default, los archivos fuente de Python son tratados como codificados en UTF-8. En ese codificacin, los caracteres de lamayora de los lenguajes del mundo pueden ser usados simultneamente en literales, identificadores y comentarios, a pesarde que la biblioteca estndar usa solamente caracteres ASCII para los identificadores, una convencin que debera seguircualquier cdigo que sea portable. Para mostrar estos caracteres correctamente, tu editor debe reconocer que el archivoest en UTF-8 y usar una tipografa que soporte todos los careacteres del archivo.

    Tambin es posible especificar una codificacin distinta para los archivos fuente. Para hacer esto, pon una o ms lineas decomentarios especiales luego de la linea del #! para definir la codificacin del archivo fuente:

    # -*- coding: encoding -*-

    Con esa declaracin, todo en el archivo fuente ser tratado utilizando la codificacin encoding en lugar de UTF-8. La lista deposibles codificaciones se puede encontrar en la Referencia de la Biblioteca de Python, en la seccin sobre codecs.

    Por ejemplo, si tu editor no soporta la codificacin UTF-8 e insiste en usar alguna otra, digamos Windows-1252, podsescribir:

    # -*- coding: cp-1252 -*-

    y usar todos los caracteres del conjunto de Windows-1252 en los archivos fuente. El comentario especial de la codificacindebe estar en la primera o segunda linea del archivo.

    El archivo de inicio interactivo

    Cuando uss Python en forma interactiva, suele ser til que algunos comandos estndar se ejecuten cada vez que elintrprete se inicia. Pods hacer esto configurando la variable de entorno PYTHONSTARTUP con el nombre de un archivoque contenga tus comandos de inicio. Esto es similar al archivo .profile en los intrpretes de comandos de Unix.

    Este archivo es solo ledo en las sesiones interactivas del intrprete, no cuando Python lee comandos de un script ni cuandofile:/dev/tty se explicita como una fuente de comandos (que de otro modo se comporta como una sesin interactiva). Seejecuta en el mismo espacio de nombres en el que los comandos interactivos se ejecutan, entonces los objetos que define oimporta pueden ser usados sin cualificaciones en la sesin interactiva. En este archivo tambin pods cambiar los promptssys.ps1 y sys.ps2.

    Si quers leer un archivo de inicio adicional desde el directorio actual, pods programarlo en el archivo de inicio globalusando algo como if os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read()). Si quersusar el archivo de inicio en un script, tens que hacer lo siguiente de forma explcita en el script:

    import osnombrearchivo = os.environ.get('PYTHONSTARTUP')if nombrearchivo and os.path.isfile(nombrearchivo): exec(open(nombrearchivo).read())

    6

  • Los mdulos de customizacin

    Python provee dos formas para customizarlo: sitecustomize y usercustomize. Para ver como funciona, necesitsprimero encontrar dnde est tu directorio para tu usuario de paquetes del sistema. Arranc Python y ejecut el siguientecdigo:

    >>> import site>>> site.getusersitepackages()'/home/user/.local/lib/python3.2/site-packages'

    Ahora pods crear un archivo llamado usercustomize.py en ese directorio y poner lo que quieras en l. Eso afectar cadaejecucin de Python, a menos que se arranque con la opcin -s para deshabilitar esta importacin automtica.sitecustomize funciona de la misma manera, pero normalmente lo crea el administrador de la computadora en eldirectorio global de paquetes para el sistema, y se importa antes que usercustomize. Para ms detalles, mir ladocumentacin del mdulo site.

    1 En Unix, el intrprete de Python 3.x no se instala por default con el ejecutable llamdo python para que noconflicte con un ejecutable de Python 2.x que est instalado simultaneamente.

    2 Un problema con el paquete GNU Readline puede evitar que funcione.

    7

  • Una introduccin informal a Python

    En los siguientes ejemplos, las entradas y salidas son distinguidas por la presencia o ausencia de los prompts (`>>>` and`...`): para reproducir los ejemplos, debs escribir todo lo que est despus del prompt, cuando este aparezca; las lneasque no comiencen con el prompt son las salidas del intrprete. Ten en cuenta que el prompt secundario que aparece por sislo en una lnea de un ejemplo significa que debs escribir una lnea en blanco; esto es usado para terminar un comandomultilnea.

    Muchos de los ejemplos de este manual, incluso aquellos ingresados en el prompt interactivo, incluyen comentarios. Loscomentarios en Python comienzan con el carcter numeral, #, y se extienden hasta el final fsico de la lnea. Un comentarioquizs aparezca al comienzo de la lnea o seguidos de espacios blancos o cdigo, pero sin una cadena de caracteres. Uncarcter numeral dentro de una cadena de caracteres es slo un carcter numeral. Ya que los comentarios son para aclararcdigo y no son interpretados por Python, pueden omitirse cuando se escriben ejemplos.Algunos ejemplos:# este es el primer comentarioSPAM = 1 # y este es el segundo comentario # ... y ahora un tercero!STRING = "# Este no es un comentario".

    Usar Python como una calculadora

    Vamos a probar algunos comandos simples en Python. Inici un intrprete y esper por el prompt primario, >>>. (Nodebera demorar tanto).

    Nmeros

    El intrprete acta como una simple calculadora; pods ingrsar una expresin y este escribir los valores. La sintaxis essencilla: los operadores +, -, * y / funcionan como en la mayora de los lenguajes (por ejemplo, Pascal o C); losparntesis pueden ser usados para agrupar. Por ejemplo:>>> 2+24>>> # Este es un comentario... 2+24>>> 2+2 # y un comentario en la misma lnea que el cdigo4>>> (50-5*6)/45.0>>> 8 / 5 # las fracciones no se pierden al dividir enteros1.6

    Nota: Quizs no veas exactamente el mismo resultado; los resultados de punto flotante pueden diferir de una computadoraa otra. Hablaremos luego sobre cmo controlar la apariencia de las salidas de punto flotante. Tambin mir Aritmtica dePunto Flotante: Problemas y Limitaciones para una discusin completa de algunas de las sutilezas de los nmeros de puntoflotante y sus representaciones.

    Para hacer divisin de enteros y obtener un resultado entero, descartando cualquier parte decimal, hay otro operador, //:

    8

  • >>> # La divisin entera retorna redondeado al piso:... 7//32>>> 7//-3-3

    El signo igual (=) es usado para asignar un valor a una variable. Luego, ningn resultado es mostrado antes del prximoprompt:

    >>> ancho = 20>>> largo = 5*9>>> ancho * largo900

    Un valor puede ser asignado a varias variables simultneamente:

    >>> x = y = z = 0 # Cero a x, y, y z>>> x

    0>>> y

    0>>> z

    0

    Las variables deben estar "definidas" (con un valor asignado) antes de que puedan usarse, o un error ocurrir:>>> n # tratamos de acceder a una variable no definidaTraceback (most recent call last): File "", line 1, in NameError: name 'n' is not defined

    Se soporta completamente los nmeros de punto flotante; las operaciones con mezclas en los tipos de los operandosconvierten los enteros a punto flotante:

    >>> 3 * 3.75 / 1.57.5>>> 7.0 / 23.5

    Los nmeros complejos tambin estn soportados; los nmeros imaginarios son escritos con el sufijo de j o J. Losnmeros complejos con un componente real que no sea cero son escritos como (real+imagj), o pueden ser escrito conla funcin complex(real, imag).

    >>> 1j * 1J(-1+0j)>>> 1j * complex(0, 1)(-1+0j)>>> 3+1j*3(3+3j)>>> (3+1j)*3(9+3j)>>> (1+2j)/(1+1j)(1.5+0.5j)

    Los nmeros complejos son siempre representados como dos nmeros de punto flotante, la parte real y la imaginaria. Paraextraer estas partes desde un nmero complejo z, us z.real y z.imag.>>> a=1.5+0.5j>>> a.real1.5

    9

  • >>> a.imag0.5

    La funcin de conversin de los punto flotante y enteros (float() y int()) no funcionan para nmeros complejos; no hayuna forma correcta de convertir un nmero complejo a un nmero real. Us abs(z) para obtener esta magnitud (como unflotante) o z.real para obtener la parte real.>>> a=3.0+4.0j>>> float(a)Traceback (most recent call last):...

    TypeError: can't convert complex to float>>> a.real3.0>>> a.imag4.0>>> abs(a) # sqrt(a.real**2 + a.imag**2)5.0

    En el modo interactivo, la ltima expresin impresa es asignada a la variable _. Esto significa que cuando ests usandoPython como una calculadora de escritorio, es ms fcil seguir calculando, por ejemplo:>>> impuesto = 12.5 / 100>>> precio = 100.50>>> precio * impuesto12.5625>>> precio + _113.0625>>> round(_, 2)113.06

    Esta variable debera ser tratada como de slo lectura por el usuario. No le asignes explcitamente un valor; crears unavariable local independiente con el mismo nombre enmascarando la variable con el comportamiento mgico.

    Cadenas de caracteres

    Adems de nmeros, Python puede manipular cadenas de texto, las cuales pueden ser expresadas de distintas formas.Pueden estar encerradas en comillas simples o dobles:

    >>> 'huevos y pan''huevos y pan'>>> 'doesn\'t'"doesn't">>> "doesn't""doesn't">>> '"Si," le dijo.''"Si," le dijo.'>>> "\"Si,\" le dijo."'"Si," le dijo.'>>> '"Isn\'t," she said.''"Isn\'t," she said.'

    El intrprete muestra el resultado de las operaciones sobre cadenas de la misma manera que si fueran escritas paraingresarlas: dentro de comillas, y con comillas y otros caracteres extraos escapados por barras invertidas, para podermostrar el valor exacto. La cadena se encierra entre comillas dobles si la cadena contiene un apstrofo y ninguna comilladoble, sino se encierra entre apstrofos. La funcin print() produce una salida ms legible para tales cadenas.

    Las cadenas de texto literales pueden contener mltiples lneas de distintas formas. Las lneas continuas se pueden usar,con una barra invertida como el ltimo carcter de la lnea para indicar que la siguiente lnea es la continuacin lgica de la

    10

  • lnea:

    hola = "Esta es una larga cadena que contiene\n\varias lneas de texto, tal y como se hace en C.\n\ Notar que los espacios en blanco al principio de la linea\ son significantes."

    print(hola)

    Not que de todas formas se necesita embeber los salto de lneas con \n; la nueva lnea que sigue a la barra invertida finales descartada. Este ejemplo imprimira:Esta es una larga cadena que contienevarias lneas de texto, tal y como se hace en C. Notar que los espacios en blanco al principio de la linea son significantes.

    O, las cadenas de texto pueden ser rodeadas en un par de comillas triples: """ o '''. No se necesita escapar los finalesde lnea cuando se utilizan comillas triples, pero sern incluidos en la cadena. Entonces el siguiente ejemplo usa un escapepara evitar una linea blanca inicial no deseada.

    print("""\Uso: algo [OPTIONS] -h Muestra el mensaje de uso -H nombrehost Nombre del host al cual conectarse""")

    ...produce la siguiente salida:

    Uso: algo [OPTIONS] -h Muestra el mensaje de uso -H nombrehost Nombre del host al cual conectarse

    Si se hace de la cadena de texto una cadena "cruda", la secuencia \n no es convertida a salto de lnea, pero la barrainvertida al final de la lnea y el carcter de nueva lnea en la fuente, ambos son incluidos en la cadena como datos. As, elejemplo:hola = r"Esta es una larga cadena que contiene\n\varias lneas de texto, tal y como se hace en C."

    print(hola)

    ...imprimir:

    Esta es una larga cadena que contiene\n\varias lneas de texto, tal y como se hace en C.

    Las cadenas de texto pueden ser concatenadas (pegadas juntas) con el operador + y repetidas con *:>>> palabra = 'Ayuda' + 'A'>>> palabra'AyudaA'>>> ''''

    Dos cadenas de texto juntas son automticamente concatenadas; la primer lnea del ejemplo anterior podra haber sidoescrita palabra = 'Ayuda' 'A'; esto solo funciona con dos literales, no con expresiones arbitrarias:

    >>> 'cad' 'ena' # >> 'cad'.strip() + 'ena' #

  • 'cadena'>>> 'cad'.strip() 'ena' # >> palabra[4]'a'

    >>> palabra[0:2]'Ay'

    >>> palabra[2:4]'ud'

    Los ndices de las rebanadas tienen valores por defecto tiles; el valor por defecto para el primer ndice es cero, el valor pordefecto para el segundo ndice es la longitud de la cadena a rebanar.

    >>> palabra[:2] # Los primeros dos caracteres'Ay'

    >>> palabra[2:] # Todo menos los primeros dos caracteres'udaA'

    A diferencia de las cadenas de texto en C, en Python no pueden ser modificadas. Intentar asignar a una posicin de lacadena es un error:

    >>> palabra[0] = 'x'Traceback (most recent call last):...

    TypeError: 'str' object does not support item assignment>>> palabra[:1] = 'Mas'Traceback (most recent call last): File "", line 1, in ?TypeError: 'str' object does not support item assignment

    Sin embargo, crear una nueva cadena con contenido combinado es fcil y eficiente:

    >>> 'x' + palabra[1:]'xyudaA'>>> 'Mas' + palabra[5]'MasA'

    Algo til de las operaciones de rebanada: s[:i] + s[i:] es s.

    >>> palabra[:2] + palabra[2:]'AyudaA'>>> palabra[:3] + palabra[3:]'AyudaA'

    Los ndices degenerados en las rebanadas son manejados bien: un ndice muy largo es reemplazado por la longitud de lacadena, un lmite superior ms chico que el lmite menor retorna una cadena vaca.

    >>> palabra[1:100]'yudaA'>>> palabra[10:]''

    >>> palabra[2:1]''

    12

  • Los ndices pueden ser nmeros negativos, para empezar a contar desde la derecha. Por ejemplo:>>> palabra[-1] # El ltimo caracter'A'

    >>> palabra[-2] # El penltimo caracter'a'

    >>> palabra[-2:] # Los ltimos dos caracteres'aA'

    >>> palabra[:-2] # Todo menos los ltimos dos caracteres'Ayud'

    Pero not que -0 es en realidad lo mismo que 0, por lo que no cuenta desde la derecha!

    >>> palabra[-0] # (ya que -0 es igual a 0)'A'

    Los ndices negativos fuera de rango son truncados, pero esto no funciona para ndices de un solo elemento (no rebanada):>>> palabra[-100:]'AyudaA'>>> palabra[-10] # errorTraceback (most recent call last): File "", line 1, in ?IndexError: string index out of range

    Una forma de recordar cmo funcionan las rebanadas es pensar en los ndices como puntos entre caracteres, con el puntoa la izquierda del primer carcter numerado en 0. Luego, el punto a la derecha del ltimo carcter de una cadena de ncaracteres tienen ndice n, por ejemplo: +---+---+---+---+---+---+

    | A | y | u | d | a | A | +---+---+---+---+---+---+

    0 1 2 3 4 5 6-6 -5 -4 -3 -2 -1

    La primer fila de nmeros da la posicin de los ndices 0...6 en la cadena; la segunda fila da los correspondientes ndicesnegativos. La rebanada de i a j consiste en todos los caracteres entre los puntos etiquetados i y j, respectivamente.Para ndices no negativos, la longitud de la rebanada es la diferencia de los ndices, si ambos entran en los lmites. Porejemplo, la longitud de palabra[1:3] es 2.La funcin incorporada len() devuelve la longitud de una cadena de texto:

    >>> s = 'supercalifrastilisticoespialidoso'>>> len(s)33

    Ver tambinTipos integrados

    Las cadenas de texto son ejemplos de tipos secuencias, y soportan las operaciones comunes para esos tipos.Tipos integrados

    Las cadenas de texto soportan una gran cantidad de mtodos para transformaciones bsicas y bsqueda.

    Tipos integradosAqu se da informacin sobre formateo de cadenas de texto con str.format().

    Tipos integrados

    13

  • Aqu se describe con ms detalle las operaciones viejas para formateo usadas cuando una cadena de texto o unacadena Unicode estn a la izquierda del operador %.

    Sobre Unicode

    Desde la versin 3.0 de Python todas las cadenas soportan Unicode (ver http://www.unicode.org/).Unicode tiene la ventaja de tener un nmero ordinal para cada carcter usado tanto en textos modernos como antiguos.Previamente, haba slo 256 ordinales posibles para los caracteres en scripts. Los textos eran tpicamente asociados a uncdigo que relaciona los ordinales a caracteres en scripts. Esto lleva a mucha confusin, especialmente al internacionalizarsoftware. Unicode resuelve estos problemas definiendo una sola codificacin para todos los scripts.

    Si quers incluir caracteres especiales en una cadena, pods hacerlo usando una forma de escapar caracteres Unicodeprovista por Python. El siguiente ejemplo muestra cmo:>>> 'Hola\u0020Mundo!''Hola Mundo!'

    La secuencia de escape \u0020 indica que se debe insertar el carcter Unicode con valor ordinal 0x0020 (el espacio enblanco) en la posicin dada.Otros caracteres son interpretados usando su respectivo valor ordinal como ordinales Unicode. Si tens cadenas de textoliterales en la codificacin estndar Latin-1 que es muy usada en pases occidentales, encontrars conveniente que losprimeros 256 caracteres de Unicode son los mismos primeros 256 caracteres de Latin-1.

    Adems de estas codificaciones estndar, Python provee muchas ms formas de crear cadenas de texto Unicode en lasbases de codificaciones conocidas.

    Para convertir una cadena de texto en secuencia de bytes utilizando un cdigo en particular, los objetos string tienen unmtodo encode() que toma un argumento, el nombre del cdigo. Se prefieren los nombres en minsculas para losnombres de los cdigos.

    >>> "pfel".encode('utf-8')b'\xc3\x84pfel'

    Listas

    Python tiene varios tipos de datos compuestos, usados para agrupar otros valores. El ms verstil es la lista, la cual puedeser escrita como una lista de valores separados por coma (tems) entre corchetes. No es necesario que los tems de unalista tengan todos el mismo tipo.

    >>> a = ['pan', 'huevos', 100, 1234]>>> a

    ['pan', 'huevos', 100, 1234]

    Como los ndices de las cadenas de texto, los ndices de las listas comienzan en 0, y las listas pueden ser rebanadas,concatenadas y todo lo dems:

    >>> a[0]'pan'

    >>> a[3]1234>>> a[-2]100>>> a[1:-1]['huevos', 100]>>> a[:2] + ['carne', 2*2]['pan', 'huevos', 'carne', 4]

    14

  • >>> 3*a[:3] + ['Boo!']['pan', 'huevos', 100, 'pan', 'huevos', 100, 'pan', 'huevos', 100, 'Boo!']

    Todas las operaciones de rebanado devuelven una nueva lista conteniendo los elementos pedidos. Esto significa que lasiguiente rebanada devuelve una copia superficial de la lista a:

    >>> a[:]['pan', 'huevos', 100, 1234]

    A diferencia de las cadenas de texto, que son inmutables, es posible cambiar un elemento individual de una lista:

    >>> a

    ['pan', 'huevos', 100, 1234]>>> a[2] = a[2] + 23>>> a

    ['pan', 'huevos', 123, 1234]

    Tambin es posible asignar a una rebanada, y esto incluso puede cambiar la longitud de la lista o vaciarla totalmente:

    >>> # Reemplazar algunos elementos:... a[0:2] = [1, 12]>>> a

    [1, 12, 123, 1234]>>> # Borrar algunos:... a[0:2] = []>>> a

    [123, 1234]>>> # Insertar algunos:... a[1:1] = ['bruja', 'xyzzy']>>> a

    [123, 'bruja', 'xyzzy', 1234]>>> # Insertar (una copia de) la misma lista al principio>>> a[:0] = a>>> a

    [123, 'bruja', 'xyzzy', 1234, 123, 'bruja', 'xyzzy', 1234]>>> # Vaciar la lista: reemplazar todos los items con una lista vaca>>> a[:] = []>>> a

    []

    La funcin predefinida len() tambin sirve para las listas:

    >>> a = ['a', 'b', 'c', 'd']>>> len(a)4

    Es posible anidar listas (crear listas que contengan otras listas), por ejemplo:>>> q = [2, 3]>>> p = [1, q, 4]>>> len(p)3>>> p[1][2, 3]>>> p[1][0]2

    Pods agregar algo al final de la lista:

    >>> p[1].append('extra')>>> p

    15

  • [1, [2, 3, 'extra'], 4]>>> q

    [2, 3, 'extra']

    Not que en el ltimo ejemplo, p[1] y q realmente hacen referencia al mismo objeto! Volveremos a la semntica de losobjetos ms adelante.

    Primeros pasos hacia la programacin Por supuesto, podemos usar Python para tareas ms complicadas que sumar dos y dos. Por ejemplo, podemos escribir unasubsecuencia inicial de la serie de Fibonacci as:

    >>> # Series de Fibonacci:... # la suma de dos elementos define el siguiente... a, b = 0, 1>>> while b < 10:... print(b)... a, b = b, a+b...

    112358

    Este ejemplo introduce varias caractersticas nuevas.

    La primer lnea contiene una asignacin mltiple: las variables``a`` y b toman en forma simultanea los nuevos valores0 y 1. En la ltima linea esto es vuelto a usar, demostrando que las expresiones a la derecha son evaluadas antes deque suceda cualquier asignacin. Las expresiones a la derecha son evaluadas de izquierda a derecha.

    El bucle while se ejecuta mientras la condicin (aqu: b < 10) sea verdadera. En Python, como en C, cualquierentero distinto de cero es verdadero; cero es falso. La condicin tambin puede ser una cadena de texto o una lista,de hecho cualquier secuencia; cualquier cosa con longitud distinta de cero es verdadero, las secuencias vacas sonfalsas. La prueba usada en el ejemplo es una comparacin simple. Los operadores estndar de comparacin seescriben igual que en C: < (menor qu), > (mayor qu), == (igual a), = (mayor o igualqu) y != (distinto a).

    El cuerpo del bucle est sangrado: la sangra es la forma que usa Python para agrupar declaraciones. En el intrpreteinteractivo debs teclear un tab o espacio(s) para cada lnea sangrada. En la prctica vas a preparar entradas mscomplicadas para Python con un editor de texto; todos los editores de texto decentes tienen la facilidad de agregar lasangra automticamente. Al ingresar una declaracin compuesta en forma interactiva, debs finalizar con una lneaen blanco para indicar que est completa (ya que el analizador no puede adivinar cuando tecleaste la ltima lnea).Not que cada lnea de un bloque bsico debe estar sangrada de la misma forma.

    La funcin print() escribe el valor de el o los argumentos que se le pasan. Difiere de simplemente escribir laexpresin que se quiere mostrar (como hicimos antes en los ejemplos de la calculadora) en la forma en que manejamltiples argumentos, cantidades en punto flotante, y cadenas. Las cadenas de texto son impresas sin comillas, y unespacio en blanco es insertado entre los elementos, as pods formatear cosas de una forma agradable:

    >>> i = 256*256>>> print('El valor de i es', i)El valor de i es 65536

    El parmetro nombrado end puede usarse para evitar el salto de linea al final de la salida, o terminar la salida con unacadena diferente:

    16

  • >>> a, b = 0, 1>>> while b < 1000:... print(b, end=',')... a, b = b, a+b...

    1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

    17

  • Ms herramientas para control de ujo Adems de la sentencia while que acabamos de introducir, Python soporta las sentencias de control de flujo que podemosencontrar en otros lenguajes, con algunos cambios.

    La sentencia if

    Tal vez el tipo ms conocido de sentencia sea el if. Por ejemplo:>>> x = int(input("Ingresa un entero, por favor: "))Ingresa un entero, por favor: 42>>> if x < 0:... x = 0... print('Negativo cambiado a cero')... elif x == 0:... print('Cero')... elif x == 1:... print('Simple')... else:... print('Ms')...

    'Mas'

    Puede haber cero o ms bloques elif, y el bloque else es opcional. La palabra reservada 'elif' es una abreviacin de'else if', y es til para evitar un sangrado excesivo. Una secuencia if ... elif ... elif ... sustituye las sentencias switcho case encontradas en otros lenguajes.

    La sentencia for

    La sentencia for en Python difiere un poco de lo que uno puede estar acostumbrado en lenguajes como C o Pascal. Enlugar de siempre iterar sobre una progresin aritmtica de nmeros (como en Pascal) o darle al usuario la posibilidad dedefinir tanto el paso de la iteracin como la condicin de fin (como en C), la sentencia for de Python itera sobre los temsde cualquier secuencia (una lista o una cadena de texto), en el orden que aparecen en la secuencia. Por ejemplo:>>> # Midiendo cadenas de texto... palabras = ['gato', 'ventana', 'defenestrado']>>> for p in palabras:... print(p, len(p))...

    gato 4ventana 7defenestrado 12

    Si necesits modificar la secuencia sobre la que ests iterando mientras ests adentro del ciclo (por ejemplo para borraralgunos tems), se recomienda que hagas primero una copia. Iterar sobre una secuencia no hace implcitamente una copia.La notacin de rebanada es especialmente conveniente para esto:

    >>> for p in palabras[:]: # hace una copia por rebanada de toda la lista... if len(p) > 6:... palabras.insert(0, p)...

    18

  • >>> palabras['defenestrado', 'ventana', 'gato', 'ventana', 'defenestrado']

    La funcin range() Si se necesita iterar sobre una secuencia de nmeros, es apropiado utilizar la funcin integrada range(), la cual generaprogresiones aritmticas:

    >>> for i in range(5):... print(i)...

    01234

    El valor final dado nunca es parte de la secuencia; range(10) genera 10 valores, los ndices correspondientes para lostems de una secuencia de longitud 10. Es posible hacer que el rango empiece con otro nmero, o especificar un incrementodiferente (incluso negativo; algunas veces se lo llama 'paso'):range(5, 10) 5 through 9

    range(0, 10, 3) 0, 3, 6, 9

    range(-10, -100, -30) -10, -40, -70

    Para iterar sobre los ndices de una secuencia, pods combinar range() y len() as:

    >>> a = ['Mary', 'tenia', 'un', 'corderito']>>> for i in range(len(a)):... print(i, a[i])...

    0 Mary1 tenia2 un3 corderito

    En la mayora de los casos, sin embargo, conviene usar la funcin enumerate(), mir Tcnicas de iteracin.

    Algo extrao sucede si mostrs un range:

    >>> print(range(10))range(0, 10)

    De muchas maneras el objeto devuelto por range() se comporta como si fuera una lista, pero no lo es. Es un objeto quedevuelve los tems sucesivos de la secuencia deseada cuando iters sobre l, pero realmente no construye la lista,ahorrando entonces espacio.

    Decimos que tal objeto es iterable; esto es, que se lo puede usar en funciones y construcciones que esperan algo de lo cualobtener tems sucesivos hasta que se termine. Hemos visto que la declaracin for es un iterador en ese sentido. Lafuncin list() es otra; crea listas a partir de iterables:

    >>> list(range(5))[0, 1, 2, 3, 4]

    19

  • Ms tarde veremos ms funciones que devuelven iterables y que toman iterables como entrada.

    Las sentencias break, continue, y else en lazos

    La sentencia break, como en C, termina el lazo for o while ms anidado.

    Las sentencias de lazo pueden tener una clusula else que es ejecutada cuando el lazo termina, luego de agotar la lista(con for) o cuando la condicin se hace falsa (con while), pero no cuando el lazo es terminado con la sentencia break.Se ejemplifica en el siguiente lazo, que busca nmeros primos:>>> for n in range(2, 10):... for x in range(2, n):... if n % x == 0:... print(n, 'es igual a', x, '*', n/x)... break... else:... # sigue el bucle sin encontrar un factor... print(n, 'es un numero primo')...

    2 es un numero primo3 es un numero primo4 es igual a 2 * 25 es un numero primo6 es igual a 2 * 37 es un numero primo8 es igual a 2 * 49 es igual a 3 * 3

    (S, este es el cdigo correcto. Fijate bien: el else pertenece al ciclo for, no al if.)Cuando se usa con un ciclo, el else tiene ms en comn con el else de una declaracin try que con el de un if: elelse de un try se ejecuta cuando no se genera ninguna excepcin, y el else de un ciclo se ejecuta cuando no hayningn break. Para ms sobre la declaracin try y excepciones, mir Manejando excepciones.La declaracin continue, tambin tomada de C, continua con la siguiente iteracin del ciclo:

    >>> for num in range(2, 10):... if num % 2 == 0:... print("Encontr un nmero par", num)... continue... print("Encontr un nmero", num)Encontr un nmero par 2Encontr un nmero 3Encontr un nmero par 4Encontr un nmero 5Encontr un nmero par 6Encontr un nmero 7Encontr un nmero par 8Encontr un nmero 9

    La sentencia pass

    La sentencia pass no hace nada. Se puede usar cuando una sentencia es requerida por la sintxis pero el programa norequiere ninguna accin. Por ejemplo:>>> while True:... pass # Espera ocupada hasta una interrupcin de teclado (Ctrl+C)...

    20

  • Se usa normalmente para crear clases en su mnima expresin:

    >>> class MyEmptyClass:... pass

    ...

    Otro lugar donde se puede usar pass es como una marca de lugar para una funcin o un cuerpo condicional cuando eststrabajando en cdigo nuevo, lo cual te permite pensar a un nivel de abstraccin mayor. El pass se ignora silenciosamente:>>> def initlog(*args):... pass # Acordate de implementar esto!...

    Deniendo funciones Podemos crear una funcin que escriba la serie de Fibonacci hasta un lmite determinado:

    >>> def fib(n): # escribe la serie de Fibonacci hasta n... """Escribe la serie de Fibonacci hasta n."""... a, b = 0, 1... while a < n:... print(a, end=' ')... a, b = b, a+b... print()...

    >>> # Ahora llamamos a la funcion que acabamos de definir:... fib(2000)0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

    La palabra reservada def se usa para definir funciones. Debe seguirle el nombre de la funcin y la lista de parmetrosformales entre parntesis. Las sentencias que forman el cuerpo de la funcin empiezan en la lnea siguiente, y deben estarcon sangra.

    La primer sentencia del cuerpo de la funcin puede ser opcionalmente una cadena de texto literal; esta es la cadena detexto de documentacin de la funcin, o docstring. (Pods encontrar ms acerca de docstrings en la seccin Cadenas detexto de documentacin.)Hay herramientas que usan las docstrings para producir automticamente documentacin en lnea o imprimible, o parapermitirle al usuario que navegue el cdigo en forma interactiva; es una buena prctica incluir docstrings en el cdigo queuno escribe, por lo que se debe hacer un hbito de esto.

    La ejecucin de una funcin introduce una nueva tabla de smbolos usada para las variables locales de la funcin. Msprecisamente, todas las asignaciones de variables en la funcin almacenan el valor en la tabla de smbolos local; as mismola referencia a variables primero mira la tabla de smbolos local, luego en la tabla de smbolos local de las funcionesexternas, luego la tabla de smbolos global, y finalmente la tabla de nombres predefinidos. As, no se les puede asignardirectamente un valor a las variables globales dentro de una funcin (a menos se las nombre en la sentencia global),aunque si pueden ser referenciadas.

    Los parmetros reales (argumentos) de una funcin se introducen en la tabla de smbolos local de la funcin llamadacuando esta es ejecutada; as, los argumentos son pasados por valor (dnde el valor es siempre una referencia a un objeto,no el valor del objeto). 3 Cuando una funcin llama a otra funcin, una nueva tabla de smbolos local es creada para esallamada.

    La definicin de una funcin introduce el nombre de la funcin en la tabla de smbolos actual. El valor del nombre de lafuncin tiene un tipo que es reconocido por el interprete como una funcin definida por el usuario. Este valor puede serasignado a otro nombre que luego puede ser usado como una funcin. Esto sirve como un mecanismo general pararenombrar:

    21

  • >>> fib

    >>> f = fib>>> f(100)0 1 1 2 3 5 8 13 21 34 55 89

    Viniendo de otros lenguajes, pods objetar que fib no es una funcin, sino un procedimiento, porque no devuelve un valor.De hecho, tcnicamente hablando, los procedimientos s retornan un valor, aunque uno aburrido. Este valor se llama None(es un nombre predefinido). El intrprete por lo general no escribe el valor None si va a ser el nico valor escrito. Sirealmente se quiere, se puede verlo usando la funcin print():

    >>> fib(0)>>> print(fib(0))None

    Es simple escribir una funcin que retorne una lista con los nmeros de la serie de Fibonacci en lugar de imprimirlos:

    >>> def fib2(n): # devuelve la serie de Fibonacci hasta n... """Devuelve una lista conteniendo la serie de Fibonacci hasta n."""... result = []... a, b = 0, 1... while a < n:... result.append(a) # ver abajo... a, b = b, a+b... return result...

    >>> f100 = fib2(100) # llamarla>>> f100 # escribir el resultado[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

    Este ejemplo, como es usual, demuestra algunas caractersticas ms de Python:

    La sentencia return devuelve un valor en una funcin. return sin una expresin como argumento retorna None. Sise alcanza el final de una funcin, tambin se retorna None.

    La sentencia result.append(a) llama a un mtodo del objeto lista result. Un mtodo es una funcin que'pertenece' a un objeto y se nombra obj.methodname, dnde obj es algn objeto (puede ser una expresin), ymethodname es el nombre del mtodo que est definido por el tipo del objeto. Distintos tipos definen distintosmtodos. Mtodos de diferentes tipos pueden tener el mismo nombre sin causar ambigedad. (Es posible definir tiposde objetos propios, y mtodos, usando clases, mir Clases). El mtodo append() mostrado en el ejemplo estdefinido para objetos lista; aade un nuevo elemento al final de la lista. En este ejemplo es equivalente aresult = result + [a], pero ms eficiente.

    Ms sobre denicin de funciones Tambin es posible definir funciones con un nmero variable de argumentos. Hay tres formas que pueden ser combinadas.

    Argumentos con valores por omisin

    La forma ms til es especificar un valor por omisin para uno o ms argumentos. Esto crea una funcin que puede serllamada con menos argumentos que los que permite. Por ejemplo:def pedir_confirmacion(prompt, reintentos=4, queja='Si o no, por favor!'): while True: ok = input(prompt) if ok in ('s', 'S', 'si', 'Si', 'SI'): return True

    if ok in ('n', 'no', 'No', 'NO'):

    22

  • return False reintentos = reintentos - 1 if reintentos < 0: raise IOError('usuario duro') print(queja)

    Esta funcin puede ser llamada de distintas maneras:

    pasando slo el argumento obligatorio: pedir_confirmacion('Realmente queres salir?')

    pasando uno de los argumentos opcionales: pedir_confirmacion('Sobreescribir archivo?', 2)

    o pasando todos los argumentos:pedir_confirmacion('Sobreescribir archivo?', 2, "Vamos, solo si o no!)

    Este ejemplo tambin introduce la palabra reservada in, la cual prueba si una secuencia contiene o no un determinadovalor.

    Los valores por omisin son evaluados en el momento de la definicin de la funcin, en el mbito de la definicin, entonces:

    i = 5

    def f(arg=i): print(arg)

    i = 6f()

    ...imprimir 5.

    Advertencia importante: El valor por omisin es evaluado solo una vez. Existe una diferencia cuando el valor por omisines un objeto mutable como una lista, diccionario, o instancia de la mayora de las clases. Por ejemplo, la siguiente funcinacumula los argumentos que se le pasan en subsiguientes llamadas:

    def f(a, L=[]): L.append(a) return L

    print(f(1))print(f(2))print(f(3))

    Imprimir:

    [1][1, 2][1, 2, 3]

    Si no se quiere que el valor por omisin sea compartido entre subsiguientes llamadas, se pueden escribir la funcin as:

    def f(a, L=None): if L is None: L = [] L.append(a) return L

    Palabras claves como argumentos

    Las funciones tambin puede ser llamadas usando argumentos de palabras clave (o argumentos nombrados) de la formakeyword = value. Por ejemplo, la siguiente funcin:

    23

  • def loro(tension, estado='muerto', accion='explotar', tipo='Azul Nordico'): print("-- Este loro no va a", accion, end=' ') print("si le aplics", tension, "voltios.") print("-- Gran plumaje tiene el", tipo) print("-- Est", estado, "!")

    ...acepta un argumento obligatorio (tension) y tres argumentos opcionales (estado, accion, y tipo). Esta funcin puedellamarse de cualquiera de las siguientes maneras:

    loro(1000) # 1 argumento posicionalloro(tension=1000) # 1 argumento nombradoloro(tension=1000000, accion='VOOOOOM') # 2 argumentos nombradosloro(accion='VOOOOOM', tension=1000000) # 2 argumentos nombradosloro('un milln', 'despojado de vida', 'saltar') # 3 args posicionalesloro('mil', state='viendo crecer las flores desde abajo') # uno y uno

    ...pero estas otras llamadas seran todas invlidas:

    loro() # falta argumento obligatorioloro(tension=5.0, 'muerto') # argumento posicional luego de uno nombradoloro(110, tension=220) # valor duplicado para el mismo argumentoloro(actor='Juan Garau') # nombre del argumento desconocido

    En una llamada a una funcin, los argumentos nombrados deben seguir a los argumentos posicionales. Cada uno de losargumentos nombrados pasados deben coincidir con un argumento aceptado por la funcin (por ejemplo, actor no es unargumento vlido para la funcin loro), y el orden de los mismos no es importante. Esto tambin se aplica a losargumentos obligatorios (por ejemplo, loro(tension=1000) tambin es vlido). Ningn argumento puede recibir ms deun valor al mismo tiempo. Aqu hay un ejemplo que falla debido a esta restriccin:>>> def funcion(a):... pass

    ...

    >>> funcion(0, a=0)Traceback (most recent call last):...

    TypeError: funcion() got multiple values for keyword argument 'a'

    Cuando un parmetro formal de la forma **nombre est presente al final, recibe un diccionario (ver Tipos integrados)conteniendo todos los argumentos nombrados excepto aquellos correspondientes a un parmetro formal. Esto puede sercombinado con un parmetro formal de la forma *nombre (descripto en la siguiente seccin) que recibe una tuplaconteniendo los argumentos posicionales adems de la lista de parmetros formales. (*nombre debe ocurrir antes de**nombre). Por ejemplo, si definimos una funcin as:def ventadequeso(tipo, *argumentos, **palabrasclaves): print("-- Tiene", tipo, "?") print("-- Lo siento, nos quedamos sin", tipo) for arg in argumentos: print(arg) print("-" * 40) claves = sorted(palabrasclaves.keys()) for c in claves: print(c, ":", palabrasclaves[c])

    Puede ser llamada as:

    ventadequeso("Limburger", "Es muy liquido, sr.", "Realmente es muy muy liquido, sr.", cliente="Juan Garau", vendedor="Miguel Paez",

    24

  • puesto="Venta de Queso Argentino")

    ...y por supuesto imprimir:

    -- Tiene Limburger ?-- Lo siento, nos quedamos sin LimburgerEs muy liquido, sr.Realmente es muy muy liquido, sr.----------------------------------------

    cliente : Juan Garauvendedor : Miguel Paezpuesto : Venta de Queso Argentino

    Se debe notar que la lista de nombres de argumentos nombrados se crea al ordenar el resultado del mtodo keys() deldiccionario antes de imprimir su contenido; si esto no se hace, el orden en que los argumentos son impresos no estdefinido.

    Listas de argumentos arbitrarios

    Finalmente, la opcin menos frecuentemente usada es especificar que una funcin puede ser llamada con un nmeroarbitrario de argumentos. Estos argumentos sern organizados en una tupla (mir Tuplas y secuencias). Antes del nmerovariable de argumentos, cero o ms argumentos normales pueden estar presentes.:

    def muchos_items(archivo, separador, *args): archivo.write(separador.join(args))

    Normalmente estos argumentos de cantidad variables son los ltimos en la lista de parmetros formales, porque toman todoel remanente de argumentos que se pasan a la funcin. Cualquier parmetro que suceda luego del *args ser 'slonombrado', o sea que slo se pueden usar como nombrados y no posicionales.:

    >>> def concatenar(*args, sep="/"):... return sep.join(args)...

    >>> concatenar("tierra", "marte", "venus")'tierra/marte/venus'>>> concatenar("tierra", "marte", "venus", sep=".")'tierra.marte.venus'

    Desempaquetando una lista de argumentos

    La situacin inversa ocurre cuando los argumentos ya estn en una lista o tupla pero necesitan ser desempaquetados parallamar a una funcin que requiere argumentos posicionales separados. Por ejemplo, la funcin predefinida range() esperalos argumentos inicio y fin. Si no estn disponibles en forma separada, se puede escribir la llamada a la funcin con eloperador para desempaquetar argumentos de una lista o una tupla *::

    >>> list(range(3, 6)) # llamada normal con argumentos separados[3, 4, 5]>>> args = [3, 6]>>> list(range(*args)) # llamada con argumentos desempaquetados de la lista[3, 4, 5]

    Del mismo modo, los diccionarios pueden entregar argumentos nombrados con el operador **::

    >>> def loro(tension, estado='rostizado', accion='explotar'):... print("-- Este loro no va a", accion, end=' ')... print("si le aplics", tension, "voltios.", end=' ')... print("Est", estado, "!")...

    >>> d = {"tension": "cinco mil", "estado": "demacrado",

    25

  • ... "accion": "VOLAR"}>>> loro(**d)-- Este loro no va a VOLAR si le aplics cinco mil voltios. Est demacrado !

    Formas con lambda

    Por demanda popular, algunas caractersticas comnmente encontradas en lenguajes de programacin funcionales comoLisp fueron aadidas a Python. Con la palabra reservada lambda se pueden crear pequeas funciones annimas. Esta esuna funcin que devuelve la suma de sus dos argumentos: lambda a, b: a+b. Las formas con lambda pueden serusadas en cualquier lugar que se requieran funciones. Semnticamente, son solo azcar sintctica para la definicin defunciones. Cmo en la definicin de funciones anidadas, las formas con lambda pueden hacer referencia a variables delmbito en el que son contenidas:

    >>> def hacer_incrementador(n):... return lambda x: x + n...

    >>> f = hacer_incrementador(42)>>> f(0)42>>> f(1)43

    Cadenas de texto de documentacin

    Ac hay algunas convenciones sobre el contenido y formato de las cadenas de texto de documentacin.

    La primer lnea debe ser siempre un resumen corto y conciso del propsito del objeto. Para ser breve, no se debe mencionarexplcitamente el nombre o tipo del objeto, ya que estos estn disponibles de otros modos (excepto si el nombre es un verboque describe el funcionamiento de la funcin). Esta lnea debe empezar con una letra mayscula y terminar con un punto.Si hay ms lneas en la cadena de texto de documentacin, la segunda lnea debe estar en blanco, separando visualmenteel resumen del resto de la descripcin. Las lneas siguientes deben ser uno o ms prrafos describiendo las convencionespara llamar al objeto, efectos secundarios, etc.El analizador de Python no quita el sangrado de las cadenas de texto literales multi-lneas, entonces las herramientas queprocesan documentacin tienen que quitarlo si as lo desean. Esto se hace mediante la siguiente convencin. La primerlnea que no est en blanco siguiente a la primer lnea de la cadena determina la cantidad de sangra para toda la cadenade documentacin. (No podemos usar la primer lnea ya que generalmente es adyacente a las comillas de apertura de lacadena y el sangrado no se nota en la cadena de texto). Los espacios en blanco "equivalentes" a este sangrado son luegoquitados del comienzo de cada lnea en la cadena. No deberan haber lneas con una sangra menor, pero si las hay todoslos espacios en blanco del comienzo deben ser quitados. La equivalencia de espacios en blanco debe ser verificada luegode la expansin de tabs (a 8 espacios, normalmente).Este es un ejemplo de un docstring multi-lnea:>>> def mi_funcion():... """No hace mas que documentar la funcion....

    ... No, de verdad. No hace nada.

    ... """

    ... pass

    ...

    >>> print(mi_funcion.__doc__)No hace mas que documentar la funcion.

    No, de verdad. No hace nada.

    26

  • Anotacin de funciones

    Las anotaciones de funciones es informacin arbitraria y completamente opcional en funciones definidas por el usuario. NiPython mismo ni la biblioteca estndar usan anotaciones de funciones de ninguna manera; esta seccin slo muestra lasintaxis. Proyectos de terceros son libres de usar las anotaciones de funciones para documentacin, control de tipos, y otroscasos.

    Las anotaciones se almacenan en el atributo __annotations__ de la funcin como un diccionario y no tienen efecto enninguna otra parte de la funcin. Las anotaciones de los parmetros se definen luego de dos puntos despus del nombre delparmetro, seguido de una expresin que evala al valor de la anotacin. Las anotaciones de retorno son definidas por elliteral ->, seguidas de una expresin, entre la lista de parmetros y los dos puntos que marcan el final de la declaracindef. El siguiente ejemplo tiene un argumento posicional, uno nombrado, y el valor de retorno anotado sin sentido:>>> def f(jamon: 42, huevos: int = 'carne') -> "nada nada":... print("Anotaciones:", f.__annotations__)... print("Argumentos:", jamon, huevos)...

    >>> f('maravillosa')Anotaciones: {'huevos: , 'return': 'nada nada', 'jamon': 42}Argumentos: maravillosa carne

    Intermezzo: Estilo de codicacin Ahora que ests a punto de escribir piezas de Python ms largas y complejas, es un buen momento para hablar sobre estilode codificacin. La mayora de los lenguajes pueden ser escritos (o mejor dicho, formateados) con diferentes estilos;algunos son mas fciles de leer que otros. Hacer que tu cdigo sea ms fcil de leer por otros es siempre una buena idea, yadoptar un buen estilo de codificacin ayuda tremendamente a lograrlo.

    Para Python, PEP 8 se erigi como la gua de estilo a la que ms proyectos adhirieron; promueve un estilo de codificacinfcil de leer y visualmente agradable. Todos los desarrolladores Python deben leerlo en algn momento; aqu estnextrados los puntos ms importantes:

    Usar sangras de 4 espacios, no tabs.

    4 espacios son un buen compromiso entre una sangra pequea (permite mayor nivel de sangrado)y una sangragrande (ms fcil de leer). Los tabs introducen confusin y es mejor dejarlos de lado.

    Recortar las lneas para que no superen los 79 caracteres.

    Esto ayuda a los usuarios con pantallas pequeas y hace posible tener varios archivos de cdigo abiertos, uno al ladodel otro, en pantallas grandes.

    Usar lneas en blanco para separar funciones y clases, y bloques grandes de cdigo dentro de funciones.

    Cuando sea posible, poner comentarios en una sola lnea.

    Usar docstrings.

    Usar espacios alrededor de operadores y luego de las comas, pero no directamente dentro de parntesis:a = f(1, 2) + g(3, 4).

    Nombrar las clases y funciones consistentemente; la convencin es usar NotacionCamello para clases yminusculas_con_guiones_bajos para funciones y mtodos. Siempre us self como el nombre para el primerargumento en los mtodos (mir Un primer vistazo a las clases para ms informacin sobre clases y mtodos).

    No uses codificaciones estrafalarias si espers usar el cdigo en entornos internacionales. El default de Python,UTF-8, o incluso ASCII plano funcionan bien en la mayora de los casos.

    De la misma manera, no uses caracteres no-ASCII en los identificadores si hay incluso una pequesima chance deque gente que hable otro idioma tenga que leer o mantener el cdigo.

    3 En realidad, llamadas por referencia de objeto sera una mejor descripcin, ya que si se pasa un objeto mutable,quien realiza la llamada ver cualquier cambio que se realice sobre el mismo (por ejemplo tems insertados enuna lista).

    27

  • Estructuras de datos

    Este captulo describe algunas cosas que ya aprendiste en ms detalle, y agrega algunas cosas nuevas tambin.

    Ms sobre listas

    El tipo de dato lista tiene algunos mtodos ms. Aqu estn todos los mtodos de los objetos lista:

    list.append (x)Agrega un tem al final de la lista. Equivale a a[len(a):] = [x].

    list.extend (L)Extiende la lista agregndole todos los tems de la lista dada. Equivale a a[len(a):] = L.

    list.insert (i, x)Inserta un tem en una posicin dada. El primer argumento es el ndice del tem delante del cual se insertar, por lo tantoa.insert(0, x) inserta al principio de la lista, y a.insert(len(a), x) equivale a a.append(x).

    list.remove (x)Quita el primer tem de la lista cuyo valor sea x. Es un error si no existe tal tem.

    list.pop ([, i])Quita el tem en la posicin dada de la lista, y lo devuelve. Si no se especifica un ndice, a.pop() quita y devuelve elltimo tem de la lista. (Los corchetes que encierran a i en la firma del mtodo denotan que el parmetro es opcional, noque deberas escribir corchetes en esa posicin. Vers esta notacin con frecuencia en la Referencia de la Biblioteca dePython.)

    list.index (x)Devuelve el ndice en la lista del primer tem cuyo valor sea x. Es un error si no existe tal tem.

    list.count (x)Devuelve el nmero de veces que x aparece en la lista.

    list.sort ()Ordena los tems de la lista in situ.

    list.reverse ()Invierte los elementos de la lista in situ.

    Un ejemplo que usa la mayora de los mtodos de lista:>>> a = [66.25, 333, 333, 1, 1234.5]>>> print(a.count(333), a.count(66.25), a.count('x'))2 1 0>>> a.insert(2, -1)>>> a.append(333)>>> a

    [66.25, 333, -1, 333, 1, 1234.5, 333]>>> a.index(333)

    28

  • 1>>> a.remove(333)>>> a

    [66.25, -1, 333, 1, 1234.5, 333]>>> a.reverse()>>> a

    [333, 1234.5, 1, 333, -1, 66.25]>>> a.sort()>>> a

    [-1, 1, 66.25, 333, 333, 1234.5]

    Quizs hayas notado que mtodos como insert, remove o sort, que modifican a la lista, no tienen impreso un valor deretorno -- devuelven None. 4 Esto es un principio de diseo para todas las estructuras de datos mutables en Python.

    Usando listas como pilas

    Los mtodos de lista hacen que resulte muy fcil usar una lista como una pila, donde el ltimo elemento aadido es elprimer elemento retirado ("ltimo en entrar, primero en salir"). Para agregar un tem a la cima de la pila, use append().Para retirar un tem de la cima de la pila, use pop() sin un ndice explcito. Por ejemplo:>>> stack = [3, 4, 5]>>> stack.append(6)>>> stack.append(7)>>> stack[3, 4, 5, 6, 7]>>> stack.pop()7>>> stack[3, 4, 5, 6]>>> stack.pop()6>>> stack.pop()5>>> stack[3, 4]

    Usando listas como colas

    Tambin es posible usar una lista como una cola, donde el primer elemento aadido es el primer elemento retirado ("primeroen entrar, primero en salir"); sin embargo, las listas no son eficientes para este propsito. Agregar y sacar del final de la listaes rpido, pero insertar o sacar del comienzo de una lista es lento (porque todos los otros elementos tienen que serdesplazados por uno).Para implementar una cola, us collections.deque el cual fue diseado para agregar y sacar de ambas puntas deforma rpida. Por ejemplo:>>> from collections import deque>>> queue = deque(["Eric", "John", "Michael"])>>> queue.append("Terry") # llega Terry>>> queue.append("Graham") # llega Graham>>> queue.popleft() # el primero en llegar ahora se va'Eric'>>> queue.popleft() # el segundo en llegar ahora se va'John'>>> queue # el resto de la cola en rden de llegada['Michael', 'Terry', 'Graham']

    29

  • Comprensin de listas

    Las comprensiones de listas ofrecen una manera concisa de crear listas. Sus usos comunes son para hacer nuevas listasdonde cada elemento es el resultado de algunas operaciones aplicadas a cada miembro de otra secuencia o iterable, o paracrear una subsecuencia de esos elementos para satisfacer una condicin determinada.

    Por ejemplo, asumamos que queremos crear una lista de cuadrados, como:>>> cuadrados = []>>> for x in range(10):... cuadrados.append(x**2)...

    >>> cuadrados[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    Podemos obtener el mismo resultado con:

    cuadrados = [x ** 2 for x in range(10)]

    Esto es equivalente tambin a squares = list(map(lambda x: x**2, range(10))) pero es ms conciso y legible.

    Una lista de comprensin consiste de corchetes rodeando una expresin seguida de la declaracin for y luego cero o msdeclaraciones for o if. El resultado ser una nueva lista que sale de evaluar la expresin en el contexto de los for o ifque le siguen. Por ejemplo, esta lista de comprensin combina los elementos de dos listas si no son iguales:>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y][(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

    y es equivalente a:

    >>> combs = []>>> for x in [1,2,3]:... for y in [3,1,4]:... if x != y:... combs.append((x, y))...

    >>> combs[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

    Not como el orden de los for y if es el mismo en ambos pedacitos de cdigo.

    Si la expresin es una tupla (como el (x, y) en el ejemplo anterior), debe estar entre parntesis.>>> vec = [-4, -2, 0, 2, 4]>>> # crear una nueva lista con los valores duplicados>>> [x * 2 for x in vec][-8, -4, 0, 4, 8]>>> # filtrar la lista para excluir nmeros negativos>>> [x for x in vec if x >= 0][0, 2, 4]>>> # aplica una funcin a todos los elementos>>> [abs(x) for x in vec][4, 2, 0, 2, 4]>>> # llama un mtodo a cada elemento>>> frutafresca = [' banana', ' mora de Logan ', 'maracuya ']>>> [arma.strip() for arma in frutafresca]['banana', 'mora de Logan', 'maracuya']>>> # crea una lista de tuplas de dos como (nmero, cuadrado)>>> [(x, x ** 2) for x in range(6)][(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]>>> # la tupla debe estar entre parntesis, sino es un error>>> [x, x ** 2 for x in range(6)]

    30

  • Traceback (most recent call last):...

    [x, x ** 2 for x in range(6)] ^

    SyntaxError: invalid syntax>>> # aplanar una lista usando comprensin de listas con dos 'for'>>> vec = [[1,2,3], [4,5,6], [7,8,9]]>>> [num for elem in vec for num in elem][1, 2, 3, 4, 5, 6, 7, 8, 9]

    Las comprensiones de listas pueden contener expresiones complejas y funciones anidadas:>>> from math import pi>>> [str(round(pi, i)) for i in range(1, 6)]['3.1', '3.14', '3.142', '3.1416', '3.14159']

    Listas por comprensin anidadas

    La expresin inicial de una comprensin de listas puede ser cualquier expresin arbitraria, incluyendo otra comprensin delistas.

    Consider el siguiente ejemplo de una matriz de 3x4 implementada como una lista de tres listas de largo 4:>>> matriz = [... [1, 2, 3, 4],... [5, 6, 7, 8],... [9, 10, 11, 12],... ]

    La siguiente comprensin de lista transpondr las filas y columnas:

    >>> [[fila[i] for fila in matriz] for i in range(4)][[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

    Como vimos en la seccin anterior, la lista de comprensin anidada se evalua en el contexto del for que lo sigue, por loque este ejemplo equivale a:>>> transpuesta = []>>> for i in range(4):... transpuesta.append([fila[i] for fila in matriz])...

    >>> transpuesta

    [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

    el cual, a la vez, es lo mismo que:

    >>> transpuesta = []>>> for i in range(4):... # las siguientes 3 lineas hacen la comprensin de listas anidada... fila_transpuesta = []... for fila in matriz:... fila_transpuesta.append(fila[i])... transpuesta.append(fila_transpuesta)...

    >>> transpuesta

    [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

    En el mundo real, deberas preferir funciones predefinidas a declaraciones con flujo complejo. La funcin zip() hara unbuen trabajo para este caso de uso:

    31

  • >>> list(zip(*matriz))[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

    Ver Desempaquetando una lista de argumentos para detalles en el asterisco de esta lnea.

    La instruccin del

    Hay una manera de quitar un tem de una lista dado su ndice en lugar de su valor: la instruccin del. Esta es diferente delmtodo pop(), el cual devuelve un valor. La instruccin del tambin puede usarse para quitar secciones de una lista ovaciar la lista completa (lo que hacamos antes asignando una lista vaca a la seccin). Por ejemplo:>>> a = [-1, 1, 66.25, 333, 333, 1234.5]>>> del a[0]>>> a

    [1, 66.25, 333, 333, 1234.5]>>> del a[2:4]>>> a

    [1, 66.25, 1234.5]>>> del a[:]>>> a

    []

    del puede usarse tambin para eliminar variables:

    >>> del a

    Hacer referencia al nombre a de aqu en ms es un error (al menos hasta que se le asigne otro valor). Veremos otros usospara del ms adelante.

    Tuplas y secuencias

    Vimos que las listas y cadenas tienen propiedades en comn, como el indizado y las operaciones de seccionado. Estas sondos ejemplos de datos de tipo secuencia (ver Tipos integrados). Como Python es un lenguaje en evolucin, otros datos detipo secuencia pueden agregarse. Existe otro dato de tipo secuencia estndar: la tupla.

    Una tupla consiste de un nmero de valores separados por comas, por ejemplo:>>> t = 12345, 54321, 'hola!'>>> t[0]12345>>> t

    (12345, 54321, 'hola!')>>> # Las tuplas pueden anidarse:... u = t, (1, 2, 3, 4, 5)>>> u

    ((12345, 54321, 'hola!'), (1, 2, 3, 4, 5))>>> # Las tuplas son inmutables:... t[0] = 88888Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment>>> # pero pueden contener objetos mutables:... v = ([1, 2, 3], [3, 2, 1])>>> v

    ([1, 2, 3], [3, 2, 1])

    Como puedes ver, en la salida las tuplas siempre se encierran entre parntesis, para que las tuplas anidadas puedaninterpretarse correctamente; pueden ingresarse con o sin parntesis, aunque a menudo los parntesis son necesarios de

    32

  • todas formas (si la tupla es parte de una expresin ms grande). No es posible asignar a los tems individuales de una tupla,pero sin embargo s se puede crear tuplas que contengan objetos mutables, como las listas.A pesar de que las tuplas puedan parecerse a las listas, frecuentemente se utilizan en distintas situaciones y para distintospropsitos. Las tuplas son inmutables y normalmente contienen una secuencia heterognea de elementos que sonaccedidos al desempaquetar (ver ms adelante en esta seccin) o indizar (o incluso acceder por atributo en el caso de lasnamedtuples). Las listas son mutables, y sus elementos son normalmente homogneos y se acceden iterando a la lista.Un problema particular es la construccin de tuplas que contengan 0 o 1 tem: la sintaxis presenta algunas peculiaridadespara estos casos. Las tuplas vacas se construyen mediante un par de parntesis vaco; una tupla con un tem se construyeponiendo una coma a continuacin del valor (no alcanza con encerrar un nico valor entre parntesis). Feo, pero efectivo.Por ejemplo:>>> vacia = ()>>> singleton = 'hola', # >> len(vacia)0>>> len(singleton)1>>> singleton('hola',)

    La declaracin t = 12345, 54321, 'hola!' es un ejemplo de empaquetado de tuplas: los valores 12345, 54321 y'hola!' se empaquetan juntos en una tupla.La operacin inversa tambin es posible:

    >>> x, y, z = t

    Esto se llama, apropiadamente, desempaquetado de secuencias, y funciona para cualquier secuencia en el lado derechodel igual. El desempaquetado de secuencias requiere que la cantidad de variables a la izquierda del signo igual sea eltamao de la secuencia. Not que la asignacin mltiple es en realidad slo una combinacin de empaquetado de tuplas ydesempaquetado de secuencias.

    Conjuntos

    Python tambin incluye un tipo de dato para conjuntos. Un conjunto es una coleccin no ordenada y sin elementosrepetidos. Los usos bsicos de stos incluyen verificacin de pertenencia y eliminacin de entradas duplicadas. Losconjuntos tambin soportan operaciones matemticas como la unin, interseccin, diferencia, y diferencia simtrica.Las llaves o la funcin set() pueden usarse para crear conjuntos. Not que para crear un conjunto vaco tens que usarset(), no {}; esto ltimo crea un diccionario vaco, una estructura de datos que discutiremos en la seccin siguiente.

    Una pequea demostracin:

    >>> canasta = {'manzana', 'naranja', 'manzana', 'pera', 'naranja', 'banana'}>>> print fruta # muestra que se removieron los duplicados{'pera', 'manzana', 'banana', 'naranja'}>>> 'naranja' in canasta # verificacin de pertenencia rpidaTrue

    >>> 'yerba' in canastaFalse

    >>> # veamos las operaciones para las letras nicas de dos palabras...

    >>> a = set('abracadabra')>>> b = set('alacazam')>>> a # letras nicas en a{a', 'r', 'b', 'c', 'd'}

    33

  • >>> a - b # letras en a pero no en b{'r', 'b', 'd'}>>> a | b # letras en a o en b{'a', 'c', 'b', 'd', 'm', 'l', 'r', 'z'}>>> a & b # letras en a y en b{'a', 'c'}>>> a ^ b # letras en a o b pero no en ambos{'b', 'd', 'm', 'l', 'r', 'z'}

    De forma similar a las comprensiones de listas, est tambin soportada la comprensin de conjuntos:>>> a = {x for x in 'abracadabra' if x not in 'abc'}>>> a

    {'r', 'd'}

    Diccionarios

    Otro tipo de dato til includo en Python es el diccionario (ver Tipos integrados). Los diccionarios se encuentran a veces enotros lenguajes como "memorias asociativas" o "arreglos asociativos". A diferencia de las secuencias, que se indexanmediante un rango numrico, los diccionarios se indexan con claves, que pueden ser cualquier tipo inmutable; las cadenas ynmeros siempre pueden ser claves. Las tuplas pueden usarse como claves si solamente contienen cadenas, nmeros otuplas; si una tupla contiene cualquier objeto mutable directa o indirectamente, no puede usarse como clave. No pods usarlistas como claves, ya que las listas pueden modificarse usando asignacin por ndice, asignacin por seccin, o mtodoscomo append() y extend().

    Lo mejor es pensar en un diccionario como un conjunto no ordenado de pares clave: valor, con el requerimiento de que lasclaves sean nicas (dentro de un diccionario en particular). Un par de llaves crean un diccionario vaco: {}. Colocar una listade pares clave:valor separados por comas entre las llaves aade pares clave:valor iniciales al diccionario; esta tambin es laforma en que los diccionarios se presentan en la salida.

    Las operaciones principales sobre un diccionario son guardar un valor con una clave y extraer ese valor dada la clave.Tambin es posible borrar un par clave:valor con del. Si uss una clave que ya est en uso para guardar un valor, el valorque estaba asociado con esa clave se pierde. Es un error extraer un valor usando una clave no existente.

    Hacer list(d.keys()) en un diccionario devuelve una lista de todas las claves usadas en el diccionario, en un ordenarbitrario (si las quers ordenadas, us en cambio sorted(d.keys()). 5 Para controlar si una clave est en el diccionario,us el in.

    Un pequeo ejemplo de uso de un diccionario:>>> tel = {'jack': 4098, 'sape': 4139}>>> tel['guido'] = 4127>>> tel{'sape': 4139, 'jack': 4098, 'guido': 4127}>>> tel['jack']4098>>> del tel['sape']>>> tel['irv'] = 4127>>> tel{'jack': 4098, 'irv': 4127, 'guido': 4127}>>> list(tel.keys())['irv', 'guido', 'jack']>>> sorted(tel.keys())['guido', 'irv', 'jack']>>> 'guido' in telTrue

    >>> 'jack' not in telFalse

    34

  • El constructor dict() crea un diccionario directamente desde secuencias de pares clave-valor:

    >>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]){'sape': 4139, 'jack': 4098, 'guido': 4127}

    Adems, las comprensiones de diccionarios se pueden usar para crear diccionarios desde expresiones arbitrarias de clave yvalor:

    >>> {x: x ** 2 for x in (2, 4, 6)}{2: 4, 4: 16, 6: 36}

    Cuando las claves son cadenas simples, a veces resulta ms fcil especificar los pares usando argumentos por palabraclave:

    >>> dict(sape=4139, guido=4127, jack=4098){'sape': 4139, 'jack': 4098, 'guido': 4127}

    Tcnicas de iteracin

    Cuando iteramos sobre diccionarios, se pueden obtener al mismo tiempo la clave y su valor correspondiente usando elmtodo items().

    >>> caballeros = {'gallahad': 'el puro', 'robin': 'el valiente'}>>> for k, v in caballeros.items():... print(k, v)...

    gallahad el purorobin el valiente

    Cuando se itera sobre una secuencia, se puede obtener el ndice de posicin junto a su valor correspondiente usando lafuncin enumerate().

    >>> for i, v in enumerate(['ta', 'te', 'ti']):... print(i, v)...

    0 ta1 te2 ti

    Para iterar sobre dos o ms secuencias al mismo tiempo, los valores pueden emparejarse con la funcin zip().>>> preguntas = ['nombre', 'objetivo', 'color favorito']>>> respuestas = ['lancelot', 'el santo grial', 'azul']>>> for p, r in zip(preguntas, respuestas):... print('Cual es tu {0}? {1}.'.format(p, r))...

    Cual es tu nombre? lancelot.Cual es tu objetivo? el santo grial.Cual es tu color favorito? azul.

    Para iterar sobre una secuencia en orden inverso, se especifica primero la secuencia al derecho y luego se llama a lafuncin reversed().

    >>> for i in reversed(range(1, 10, 2)):... print(i)...

    9753

    35

  • 1Para iterar sobre una secuencia ordenada, se utiliza la funcin sorted() la cual devuelve una nueva lista ordenadadejando a la original intacta.>>> canasta = ['manzana', 'naranja', 'manzana', 'pera', 'naranja', 'banana']>>> for f in sorted(set(canasta)):... print(f)...

    bananamanzana

    naranjapera

    Para cambiar una secuencia sobre la que ests iterando mientras ests adentro del ciclo (por ejemplo para duplicar algunostems), se recomienda que primera hagas una copia. Ciclar sobre una secuencia no hace implcitamente una copia. Lanotacin de rebanadas es especialmente conveniente para esto:

    >>> palabras = ['gato', 'ventana', 'defenestrar']>>> for p in palabras[:]: # ciclar sobre una copia de la lista entera... if len(p) > 6:... palabras.insert(0, p)...

    >>> palabras['defenestrar', 'gato', 'ventana', 'defenestrar']

    Ms acerca de condiciones

    Las condiciones usadas en las instrucciones while e if pueden contener cualquier operador, no slo comparaciones.

    Los operadores de comparacin in y not in verifican si un valor est (o no est) en una secuencia. Los operadores ise is not comparan si dos objetos son realmente el mismo objeto; esto es significativo slo para objetos mutables comolas listas. Todos los operadores de comparacin tienen la misma prioridad, la cual es menor que la de todos los operadoresnumricos.

    Las comparaciones pueden encadenarse. Por ejemplo, a < b == c verifica si a es menor que b y adems si b es iguala c.

    Las comparaciones pueden combinarse mediante los operadores booleanos and y or, y el resultado de una comparacin(o de cualquier otra expresin booleana) puede negarse con not. Estos tienen prioridades menores que los operadores decomparacin; entre ellos not tiene la mayor prioridad y or la menor, o sea que A and not B or C equivale a(A and (not B)) or C. Como siempre, los parntesis pueden usarse para expresar la composicin deseada.

    Los operadores booleanos and y or son los llamados operadores cortocircuito: sus argumentos se evalan de izquierda aderecha, y la evaluacin se detiene en el momento en que se determina su resultado. Por ejemplo, si A y C son verdaderaspero B es falsa, en A and B and C no se evala la expresin C. Cuando se usa como un valor general y no como unbooleano, el valor devuelto de un operador cortocircuito es el ltimo argumento evaluado.

    Es posible asignar el resultado de una comparacin u otra expresin booleana a una variable. Por ejemplo,>>> cadena1, cadena2, cadena3 = '', 'Trondheim', 'Paso Hammer'>>> non_nulo = cadena1 or cadena2 or cadena3>>> non_nulo'Trondheim'

    Not que en Python, a diferencia de C, la asignacin no puede ocurrir dentro de expresiones. Los programadores de Cpueden renegar por esto, pero