Apendice A Python

download Apendice A Python

of 19

Transcript of Apendice A Python

  • 8/7/2019 Apendice A Python

    1/19

    Apendice A

    Python

    En este apendice resumimos aquellos aspectos del lenguaje de programacion Python (version 2.4) de los

    que hacemos uso, prestando especial atencion a las caractersticas que no encontramos en otros lenguajes

    imperativos u orientados a objetos. Este apendice no es un tutorial y solo entra en detalle al considerar

    cuestiones que diferencian a Python de otros lenguajes convencionales como C o C++. Para aprender el

    lenguaje de programacion se recomienda el tutorial de Guido van Rossum que se incluye en la distribucion

    del interprete.

    A.1. Formato

    Los programas Python se escriben en ficheros de texto con formato y se organizan en lneas logicas. Estas

    sueles corresponderse con lneas fsicas, aunque no siempre es as. En ciertos caso, por ejemplo, el punto y

    coma permite unir dos lneas logicas en una lnea fsica y la barra invertida permite dos lneas fsicas para

    formar una lnea logica. Si un parentesis esta abierto y finaliza una lnea fsica, se entiende que la lnea

    logica continua hasta el cierre del parentesis.

    Hay sentencias simples y compuestas. Las sentencias simples (expresiones, salida por pantalla, etc.)

    son parte de una sola lnea logica. Las estructuras de control y las definiciones de funciones y clases son

    sentencias compuestas, y se componen de una o mas clausulas. Una clausula es una cabecera y una suite.

    Las clausulas presentan el mismo nivel de indentacion y las suites presentan mayor indentacion que susrespectivas cabeceras. Cada cabecera empieza con una palabra clave y finaliza con dos puntos. Python no

    es, pues, un lenguaje de formato libre. Una suite no puede estar vaca. Si se desea que no contenga accion

    alguna puede usarse la sentencia pass.

    Todos los caracteres desde la almohadilla (((#))) hasta el fin de lnea fsica constituyen un comentario y

    son ignorados.

    Un fichero de texto que solo contiene definiciones de funciones, clases y variables (y quiza codigo de

    inicializacion) es un modulo. Un programa puede hacer uso de funciones, clases y variables definidas en

    un modulo.

    A.2. Salida por pantalla

    La palabra reservada print puede ir seguida de una o mas expresiones (separadas por comas) y muestra enpantalla el resultado de evaluarlas (separadas por espacios).

    1 print 1

    2 print 2, 3

    1

    2 3

    Si una sentencia print finaliza en una coma, no se anade un salto de lnea:

    1 print 1,

    2 print 2, 3

    1 2 3

    Una sentencia print sin expresiones imprime un salto de lnea.

    Apuntes de Algortmica A-1

  • 8/7/2019 Apendice A Python

    2/19

    A.3 Variables 2004/09/24-15:53

    A.3. Variables

    Python es un lenguaje tipado dinamicamente: las variables no tienen tipo, pero s los valores que se asignana variables y/o que participan en expresiones. Se puede asignar un valor a una variable con el operador ((=)).En este ejemplo se asigna el valor 2 a la variable 2 y se muestra por pantalla el valor asignado:

    1 a = 2

    2 print a

    2

    Debe tenerse en cuenta que una variable no ((contiene)) el valor que se le asigna, sino que mantiene una

    referencia al lugar de memoria en el que este reside. La gestion de memoria dinamica es tarea del interprete

    y no es necesario liberar explcitamente la memoria reservada: Python usa conteo de referencias y tecnicas

    de deteccion de ciclos para liberar la memoria no utilizada.

    A.4. Tipos basicos

    A.4.1. EscalaresPython permite trabajar directamente con datos de tipo logico (o booleano), enteros, numeros en coma

    flotante y numeros complejos.

    Logicos

    Los valores logicos son True (((cierto))) y False (((False))), si bien muchos valores especiales de otros tipos

    pueden jugar el papel de ((cierto)) o ((falso)): el entero 0 es falso y cualquier otro entero es cierto, una

    coleccion vaca es falso y cualquier otra es cierto, etc.

    Enteros

    Los literales de enteros siguen las reglas lexicas de C y pueden codificarse en decimal, octal y hexadecimal.

    Los enteros pueden formarse con un numero arbitrariamente grande de dgitos.

    Versiones anteriores de Python distinguan entre enteros y ((enteros largos)) (enteros con un numero

    arbitrariamente grande cifras), que hoy son tipos unificados. No obstante, al mostrar en pantalla un entero

    largo aparece el caracter L al final del mismo. Este sufijo explicita que se trata de un entero largo.

    En coma flotante

    Los numeros en coma flotante son asimilables a los datos de tipo double en C y sus literales se expresan

    del mismo modo que en dicho lenguaje. El resultado de operar un entero con un valor en coma flotante

    proporciona un valor en coma flotante.

    Complejos

    Un numero complejo puro se representa con un numero entero o en coma flotante finalizado con la letra j.Un complejo con parte real e imaginaria se obtiene, por ejemplo, sumando un numero en coma flotante aun numero imaginario.

    1 print (2 + 2j)/(2 - 4j)

    (-0.2+0.6j)

    None

    None es un valor especial que se usa para indicar la ausencia de valor o para senalar una situacion excep-

    cional.

    A-2 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    3/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    A.4.2. Colecciones

    Un coleccion es un multiconjunto de datos. Una secuencia es un multiconjunto ordenado de datos, cada

    uno de los cuales es accesible mediante un ndice. Un mapeo es una correspondencia entre claves y valores.

    Un conjunto propiamente dicho es una coleccion sin repeticiones (ni orden alguno). Python ofrece soporte

    directo para secuencias (listas y tuplas), mapeos (diccionarios) y conjuntos propiamente dichos. Ofrece

    implementaciones de otros tipos estructurados (deques y heaps, por ejemplo) a traves de bibliotecas.

    Listas

    Las listas Python equivalen a vectores dinamicos (con informacion de longitud) en lenguajes de progra-macion como C, o al tipo vector de la STL en C++. Podemos expresar literales encerrando sus elementosentre un par de corchetes y separandolos con comas:

    1 an array = [1, 2, 3, 5, 7, 11]

    2 empty array = []

    El primer elemento de una lista tiene ndice 0. El operador de indexacion accede a un elemento y se expresasintacticamente anadiendo a la lista su ndice entre corchetes, lista[ndice]:

    1 an array = [1, 2, 3, 5, 7, 11]

    2 print Losdosprimeroselementos:,an array[0], an array[1]

    Los dos primeros elementos: 1 2

    Es posible utilizar ndices negativos, en cuyo caso se empieza a contar desde el final: 1 es el ultimoelemento, 2 el penultimo, etc:

    1 an array = [1, 2, 3, 5, 7, 11]

    2 print Ultimosdoselementos:, an array[-2], an array[-1]

    Ultimos dos elementos: 7 11

    El posible concatenar listas con el operador suma:

    1 an array = [1, 2, 3, 5, 7, 11]

    2 another array = [13, 17]3 result = an array + another array

    4 print result

    [1, 2, 3, 5, 7, 11, 13, 17]

    O extender una lista con el metodo extend:

    1 an array = [1, 2, 3, 5, 7, 11]

    2 another array = [13, 17]

    3 an array.extend(another array)

    4 print an array

    [1, 2, 3, 5, 7, 11, 13, 17]

    Notese que el metodo modifica la lista sobre la que se invoca.El metodo appendextiende una lista elemento a elemento:

    1 an array = [1, 2, 3, 5, 7, 11]

    2 an array.append(13)

    3 an array.append(17)

    4 print an array

    [1, 2, 3, 5, 7, 11, 13, 17]

    El redimensionamiento puede resultar relativamente costoso en tiempo de ejecucion, pues en ocasiones

    comporta la reserva de nueva memoria y la liberacion de la usada hasta el momento. Cuando se conoce el

    tamano maximo de la lista puede resultar conveniente efectuar una reserva previa de toda la memoria que

    ha de ocupar. Podemos hacerlo con el operador de repeticion, que se representa con un asterisco:

    Apuntes de Algortmica A-3

  • 8/7/2019 Apendice A Python

    4/19

    A.4 Tipos basicos 2004/09/24-15:53

    1 an array = [0] * 10

    2 an array[5] = 3

    3 print an array

    [0, 0, 0, 0, 0, 3, 0, 0, 0, 0]

    La funcion range devuelve una lista formada con elementos en un rango determinado. La forma general

    de range usa tres argumentos: el valor inicial, el lmite superior (que se excluye) y el incremento entreelementos consecutivos. He aqu un ejemplo de uso:

    1 an array = range(1, 100, 15)

    2 print an array

    [1, 16, 31, 46, 61, 76, 91]

    Si se invoca a range con dos argumentos, el incremento toma el valor uno. Si se invoca con un solo

    argumento, el valor inicial es 0.

    1 print range(6), range(1,6), range(1,6,2)

    [0, 1, 2, 3, 4, 5] [1, 2, 3, 4, 5] [1, 3, 5]

    Una forma elegante de construir listas en Python es mediante la denominada comprension de listas,Comprension de lista:List comprehension. que imita la notacion matematica de descripcion de conjuntos como esta:

    A= {i2 | 0 i < 10}.

    1 A = [ i**2 for i in range(10) ]

    2 print A

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

    Se pueden utilizar condiciones complejas a la hora de decir que elementos forman parte de una lista:

    A= {i2 | i es par,0 i < 10}.

    1 print [ i**2 for i in range(10) ifi % 2 == 0]

    [0, 4, 16, 36, 64]

    El operador de corte permite seleccionar una serie de elementos contiguos o equiespaciados en la lista.El rango de ndices de los elementos seleccionados se indica entre corchetes y separados por dos puntos:

    1 an array = range(0, 20, 2)

    2 print an array

    3 print an array[2:6], an array[2:8:2]

    4 print an array[1:-1]

    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

    [4, 6, 8, 10] [4, 8, 12]

    [2, 4, 6, 8, 10, 12, 14, 16]

    Notese que el elemento cuyo ndice coincide con el segundo elemento del corte no se selecciona.Algunos elementos del corte pueden omitirse y tomar valor por defecto. El primero ndice vale 0 si no

    se explicita y la omision del segundo hace que sea igual a la longitud de la lista:

    1 an array = range(0, 10)

    2 print an array[:6], an array[6:], an array[:]

    [0, 1, 2, 3, 4, 5] [6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    En la tabla 3.1 se recogen algunos operadores y metodos de uso comun en Python (acompanados de sus

    respectivos costes temporales).

    A-4 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    5/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    Tuplas

    Python ofrece, ademas, la posibilidad de trabajar con tuplas, que son listas inmutables. Sintacticamente,

    los literales de tupla se expresan como los de las listas, pero con parentesis en lugar de corchetes. Solo hay

    un problema: la tupla de un solo elemento se puede confundir con una expresion entre parentesis, as que

    requiere anadir una coma tras su unico elemento para romper la ambiguedad.

    1 a tuple = (1, 2, 3, 5, 7, 11)

    2 empty tuple = ()

    3 unitary tuple = (1,)

    Una ultima observacion: salvo para la tupla vaca, los parentesis son opcionales:

    1 a tuple = 1, 2, 3, 5, 7, 11

    2 empty tuple = ()

    3 unitary tuple = 1,

    Podemos usar los operadores (indexacion, corte, etc.) y metodos de las listas que no modifican su

    contenido. Podemos, por ejemplo, concatenar dos tuplas (se genera una nueva tupla resultante de unir

    ambas), pero no podemos usar el metodo extend (modificara el contenido de la tupla, que es inmutable).

    Podemos obtener una tupla a partir de una lista con la funci on tuple:

    1 print tuple([1,5,3])

    (1, 5, 3)

    Se pueden efectuar asignaciones multiples o intercambios del valor de dos variables mediante expre-siones idiomaticas de Python que hacen uso de tuplas:

    1 a, b = 1, 2

    2 a, b = b, a

    3 print a, b

    2 1

    Cadenas

    Las cadenas Python pueden encerrarse entre comillas simples o dobles. En principio, sigue las reglas de Cpara expresar caracteres especiales, es decir, usa la barra invertida para expresar caracteres especiales:

    1 print una\ncadena

    2 a = "otra\ncadena"

    3 print a

    una

    cadena

    otra

    cadena

    Una cadena que se abre con triples comillas (simples o dobles) puede ocupar varias lneas:

    1 print una

    2 cadena

    3 queocupa

    4 variaslneas

    una

    cadena

    que ocupavarias lneas

    Apuntes de Algortmica A-5

  • 8/7/2019 Apendice A Python

    6/19

    A.4 Tipos basicos 2004/09/24-15:53

    No hay un tipo de datos ((caracter)): un caracter es una cadena de longitud unitaria. Podemos acceder a

    un caracter con el operador de indexacion y a una subcadena de cualquier longitud con el operador de corte.

    Las cadenas son inmutables. Si se desea ((modificar)) el contenido de una cadena se debe generar otra a

    partir de la primera.

    Es posible concatenar cadenas con el operador ((+)) y repetir una cadena con el operador ((*)). El op-

    erador de formato, (( %)), genera una cadena a partir de otra (operando izquierdo) sustituyendo las denom-

    inadas ((marcas de formato)) por uno o mas valores (operando derecho). Las marcas de formato (y sus

    modificadores) se((

    inspiran))

    en las que encontramos en funciones de C como printf.

    1 a = 3

    2 print Valor: %d % a

    Valor: 3

    Si hay mas de una marca de formato, los valores deben proporcionarse con una tupla:

    1 a = 3.2

    2 print Dosvalores: %fy%d % (a, 4)

    Dos valores: 3.200000 y 4

    Si deseamos obtener una lista de palabras podemos usar el metodo split:

    1 print unafrasecorta.split()

    [una, frase, corta]

    El metodo splitpermite especificar un separador:

    1 print una:frase::corta.split(:)

    [una, frase, , corta]

    El metodo strip elimina los blancos iniciales y finales de una cadena, y rstrip, solo los finales.

    1 print |, unacadena.strip(), |

    | una cadena |

    Diccionarios

    Los diccionarios permiten asociar valores con claves. Una clave es cualquier objeto inmutable (lo son losescalares, las tuplas y las cadenas, pero no las listas). Se puede acceder al valor asociado a una clave con el

    operador de indexacion. En Python, los diccionarios se implementan mediante tablas de dispersion.

    Los literales de diccionario son una sucesion de pares (tuplas) clave-valor separados por comas y encer-rados entre llaves. Los componentes de cada par clave-valor se separan entre s con dos puntos:

    1 a dict= {a: 1, b: 2, c: 3}

    2 empty dict= {}

    3 print Contenidoasociadoa"a":, a dict[a]

    Contenido asociado a "a": 1

    En la tabla 3.3 se recogen algunos operadores y metodos de uso comun con diccionarios (acompanados

    de sus respectivos costes temporales).

    A-6 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    7/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    Conjuntos

    Python ofrece una implementacion de conjuntos basada en tablas de dispersion. La funcion set construyeun conjunto a partir de una secuencia:

    1 a = set([1, 3, 4])

    2 print a

    set([1, 3, 4])

    Los conjuntos soportan operaciones de union, interseccion, pertenencia, etc.

    1 a = set([1, 3, 4])

    2 b = set([2, 3, 5])

    3 print a.union(b), a.intersection(b), 3 in a

    set([1, 2, 3, 4, 5]) set([3]) True

    En la tabla 3.4 se muestran algunos operadores y metodos para conjuntos.

    A.4.3. CoercionHay reglas de promocion automatica de tipos que permiten operar entre, por ejemplo, un entero y un

    flotante. El resultado es siempre del tipo mas general.

    Es posible convertir datos de un tipo en otro mediante ciertas funciones predefinidas. Estas suelen

    presentar como identificador el nombre del tipo o una abreviatura suya: intpara enteros, floatpara numero

    en coma flotante, complex para numeros complejos, listpara listas, tuple para tuplas, strpara cadenas y dict

    para diccionarios.La funcion intobtiene la parte entera de un numero en coma flotante:

    1 print int(2.1), int(2.5), int(2.9)

    2 print int(-2.1), int(-2.5), int(-2.9)

    2 2 2-2 -2 -2

    La misma funcion puede aplicarse para interpretar como valor entero un numero codificado en unacadena:

    1 print int(2+1)+1

    22

    La funcion floatproporciona un numero en coma flotante equivalente al entero o cadena (si esta codifica

    un valor numerico) que se le suministra como parametro.

    La funcion list puede construir una lista con los elementos de una secuencia (una tupla, una cadena,

    etc.). La funcion tuple puede construir una tupla con los elementos de una secuencia.Se puede transformar una cadena en una lista de caracteres (cadenas de longitud uno) con la funci on

    list:

    1 print list( (1, 2, 3) )

    2 print list(cadena)

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

    4 print tuple(cadena)

    [1, 2, 3]

    [c, a, d, e, n, a]

    (1, 2, 3)

    (c, a, d, e, n, a)

    La funcion strpermite obtener una cadena a partir de cualquier tipo basico:

    Apuntes de Algortmica A-7

  • 8/7/2019 Apendice A Python

    8/19

    A.5 Expresiones 2004/09/24-15:53

    1 print (str(2) + str(3.1)) * 2

    2 print str([1,2])

    23.123.1

    [1, 2]

    Se puede inicializar un diccionario con la funcion dicty una secuencia de pares clave-valor:

    1 print dict([(a,1), (b, 2), (c, 3)])2 print dict([(i, i**2) for i in range(10) ifi % 2 == 0])

    {a: 1, c: 3, b: 2}

    {0: 0, 8: 64, 2: 4, 4: 16, 6: 36}

    A.5. Expresiones

    Al operar con escalares, los operadores Python son los mismos que encontramos en el lenguaje C y siguen

    sus reglas de precedencia y asociatividad, con algunas excepciones:

    Los operadores logicos se denotan con las palabras reservadas and, or y not.

    Los operadores de comparacion no siguen las reglas de precedencia convencionales en otros lengua-

    jes. Una expresion como a < b d equivale a a < b and b d.

    No hay operador de pre o postincremento ni operador de pre o postdecremento.

    Se puede efectuar asignaciones con operador para simplicar operaciones de incremento (((+=))), decre-mento (((-=))), etc.:

    1 a = 2

    2 print a,

    3 a += 2

    4 print a

    2 4

    Python ofrece operadores que no tienen correlato en C o C++:

    Operador de exponenciacion, que se denota con ((**)) y que es asociativo por la derecha.

    Operador de pertenencia. Se denota con la palabra clave in. Devuelve ((cierto)) si el operando izquier-

    do esta incluido al operando derecho (normalmente, un contenedor). El operador not in devuelve

    ((cierto)) cuando in devuelve ((falso)) y viceversa.

    A.6. Estructuras de control

    Las estructuras de control permiten ejecutar bloques de codigo condicionalmente o iterar su ejecucion

    mientras se observe cierta condicion.

    A.6.1. De seleccion

    Para supeditar la ejecucion de un bloque a la satisfaccion de una condicion se usa la sentencia if:

    1 a = 102

    2 ifa % 2 == 0:

    3 print %despar % a

    102 es par

    La sentencia if puede extenderse con varios elif (abreaviatura de ((else if))), cado uno con su propia

    condicion, y opcionalmente un else final. Solo se ejecuta uno de los bloques: el de la primera condici on

    que se cumple o, si no se cumple ninguna, el asociado al else (si lo hay).

    A-8 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    9/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    1 a = 45

    2 ifa % 2 == 0:

    3 print %despar % a

    4 elifa % 3 == 0:

    5 print %dnoesparyesdivisiblepor3 % a

    6 else:

    7 print %dnoesparnidivisiblepor3 % a

    45 no es par y es divisible por 3

    A.6.2. De repeticion (o bucle)

    La sentencia while permite iterar la ejecucion de un bloque mientras se cumpla una condicion:

    1 a = 10

    2 while a > 0:

    3 print a,

    4 a -= 1

    10 9 8 7 6 5 4 3 2 1

    La sentencia for-in permite recorrer una secuencia de valores. Una variable ndice toma, ordenada-

    mente, un valor de la secuencia con cada iteracion:

    1 for indice in 1, "dos", 3:

    2 print indice,

    3 print

    4

    5 for i in range(2, 6):

    6 print i,

    7 print

    1 dos 3

    2 3 4 5

    Si se desea recorrer los elementos en orden inverso se puede recurrir a la funcion reversed:

    1 for i in reversed(range(2, 6)):

    2 print i,

    3 print

    5 4 3 2

    La sentencia break interrumpe la ejecucion de un bucle (while o for-in) y la sentencia continue hacepasar inmediatamente a la siguiente iteracion, sin ejecutar el resto del bloque. Tanto break como continue

    afectan unicamente al bucle que las contiene directamente.

    A.6.3. Excepciones

    Al cargar un programa o modulo, el interprete efectua comprobaciones lexicas y sintacticas. Solo aquellos

    que superan esta etapa pasan a ser interpretados. En ejecucion pueden producirse errores semanticos: op-

    eradores aplicados sobre operandos de tipos no compatibles con la operacion, divisiones por cero, intentos

    de acceso fuera de rango a elementos de una lista, etc. Cuando se produce un error en tiempo de ejecuci on,

    el interprete de Python lanza una excepcion y, si no es tratada, aborta la ejecucion del programa.

    1 a = 1/02 print Fin

    Apuntes de Algortmica A-9

  • 8/7/2019 Apendice A Python

    10/19

    A.6 Estructuras de control 2004/09/24-15:53

    E Traceback (most recent call last):

    File "test_sel.py", line 1, in ?

    a = 1/0

    ZeroDivisionError: integer division or modulo by zero

    Las excepciones pueden tratarse con la estructura try-except:

    1 try:

    2 a = 1/0

    3 except:

    4 print Excepcionenelbloqueentretryyexcept.

    5 print Fin

    Excepcion en el bloque entre try y except.

    Fin

    Una excepcion es una instancia de cierta clase que hereda de la clase Exception. Hay toda una jerarqua

    de excepciones, lo que permite que podamos capturar y tratar por separado cada tipo de error detectado:

    1 a = 12 array = []

    3 try:

    4 ifa == 0:

    5 print 1/0

    6 else:

    7 print array[10000]

    8 except ZeroDivisionError:

    9 print Divisionporceroenelbloqueentretryyexcept:

    10 except IndexError:

    11 print Errordeindexacionenelbloqueentretryyexcept:

    Error de indexacion en el bloque entre try y except:

    Las excepciones pueden venir acompanadas de un mensaje que detalla el error:

    1 a = 1

    2 array = []

    3 try:

    4 ifa == 0:

    5 print 1/0

    6 else:

    7 print array[10000]

    8 except ZeroDivisionError, msg:

    9 print Divisionporceroenelbloqueentretryyexcept,msg

    10 except IndexError, msg:

    11 print Errordeindexacionenelbloqueentretryyexcept,msg

    Error de indexacion en el bloque entre try y except list index out of range

    Si el codigo donde se produce un error es parte de una funci on que esta siendo invocada desde el

    programa principal o desde otra funcion, su ejecucion se interrumpe a menos que la lnea causante de la

    excepcion este en un bloque try-except capaz de capturar esa excepcion. Ocurre lo mismo con la funcion,

    si la hay, desde la que se produjo la llamada. Las tramas de activacion van desapilandose hasta que una

    funcion o el programa principal atrapen la excepcion. Si nadie lo hace, el interprete la captura e interrumpe

    la ejecucion del programa.Podemos generar nuestras propias excepciones con la sentencia raise:

    1 raise IndexError

    A-10 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    11/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    E Traceback (most recent call last):

    File "test_sel.py", line 1, in ?

    raise IndexError

    IndexError

    1 raise IndexError, Textoexplicativo.

    E Traceback (most recent call last):File "test_sel.py", line 1, in ?

    raise IndexError, Texto explicativo.

    IndexError: Texto explicativo.

    Y podemos crear nuestros propios ((tipos)) de excepcion definiendo una nueva clase que hereda de la

    clase Exception.

    A.7. Funciones

    A.7.1. Funciones con nombre

    Las funciones se definen con la palabra def seguida del identificador de funcion, una lista de parametrosencerrados entre parentesis y separados por comas y un bloque (indentado) que describe su cuerpo. Para

    invocar una funcion basta con usar su identificador y suministrar los argumentos separados por comas y

    encerrados en un par de parentesis. El paso de parametros se realiza por referencia a objeto. A efectos

    practicos podemos considerar que los valores escalares se pasan por valor y el resto se pasa por referencia:

    1 defmyfunction(a, b):

    2 a += 1

    3 b.append(0)

    4

    5 x = 1

    6 y = [2, 1]

    7 myfunction(x, y)

    8 print x, y

    1 [2, 1, 0]

    El valor devuelto por una funcion se indica con la sentencia return, que finaliza la activacion de la

    funcion tan pronto se ejecuta:

    1 defcontains(sequence, item):

    2 for element in sequence:

    3 ifitem == element:

    4 return True

    5 return False

    6

    7 print contains([1,2,3,5,7,11,13], 5)

    True

    La asociacion entre argumentos en la invocacion a una funcion y los parametros de la definicion es

    posicional. Existe una forma alternativa de establecer esta asociacion: haciendo alusion al identificador de

    cada parametro para ((asignarle)) un valor.

    1 defcontains(sequence, item):

    2 for element in sequence:

    3 ifitem == element:

    4 return True

    5 return False

    6

    7 print contains(item=3, sequence=[1,2,3,5,7,11,13])

    Apuntes de Algortmica A-11

  • 8/7/2019 Apendice A Python

    12/19

    A.7 Funciones 2004/09/24-15:53

    True

    Se pueden definir parametros con valor por defecto. En la definicion de la funcion el identificador delparametro se acompana del smbolo ((=)) y una expresion con el valor por defecto. Si en la llamada noproporcionamos un valor al argumento, este toma el valor por defecto:

    1 defmultiply(value, factor=2):

    2 return value * factor

    3

    4 print multiply(3, 3), multiply(3)

    9 6

    No es posible alternar parametros con y sin valor por defecto en la definicion de una funcion: todos los

    parametros deben llevar valor por defecto a partir del punto en el que aparece uno.

    Al invocar o definir una funcion siempre debe proporcionarse, entre parentesis, la relacion de paramet-

    ros. Si no hay parametros o si todos tienen valor por defecto y se desea usar este, los parentesis no con-

    tendran nada, pero deben aparecer igualmente.

    Las funciones son objetos de primera clase a los que se puede acceder por su identificador. Es posible,

    pues, suministrar un funcion como argumento en la llamada a otra o almacenar funciones en variables,

    listas, diccionario, etc.1 defsummation(a, b, f):

    2 s = 0

    3 for i in range(a, b+1):

    4 s += f(i)

    5 return s

    6

    7 defsquare(x):

    8 return x*x

    9

    10 defcube(x):

    11 return x*x*x

    12

    13 functions = [square, cube]

    14

    15 for function in functions:

    16 print summation(1, 3, function)

    14

    36

    A.7.2. Algunas funciones predefinidas

    Python ofrece varias funciones predefinidas. Entre ellas tenemos:

    abs(value): valor absoluto.

    cmp(x, y): devuelve un valor negativo si x < y, cero si x=y y un valor positivo si x > y.

    divmod(a, b): devuelve un tupla con el cociente (a / b) y el resto (a % b).

    Se puede consultar la relacion completa en la seccion 2.1 de la referencia de bibliotecas de Python, que es

    parte de la documentacion estandar.

    A.7.3. Funciones anonimas

    En ocasiones hemos de suministrar funciones como argumentos en la llamada a otras funciones y resul-

    ta tedioso definirlas previamente. Las funciones anonimas o lambda-funciones son funciones sencillas

    (basicamente expresiones parametrizadas) que no se asocian a identificador alguno. Para definirlas se usa la

    palabra reservada lambda con uno o mas identificadores separados por comas (los parametros), dos puntos

    y una expresion.

    A-12 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    13/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    1 defsummation(a, b, f):

    2 s = 0

    3 for i in range(a, b+1):

    4 s += f(i)

    5 return s

    6

    7 print summation(1, 3, lambda x: x*x)

    14

    Las lambda-funciones resultan utiles para, por ejemplo, ordenar con diferentes criterios de ordenacion

    mediante funciones predefinidas. La funcion sorted, por ejemplo, ordena una secuencia de elemento y

    permite indicar la clave de ordenacion mediante el parametro key, que es una funcion que se aplica a cada

    tem antes de compararlo con otros:

    1 names = [Juan, Ana, Luisa, Federico, Adriana]

    2 print sorted(names)

    3 print sorted(names, key=lambda x: len(x))

    4 print sorted(names, key=lambda x: x[0])

    [Adriana, Ana, Federico, Juan, Luisa][Ana, Juan, Luisa, Adriana, Federico]

    [Ana, Adriana, Federico, Juan, Luisa]

    A.8. Clases

    A.8.1. Definicion de clases e instanciacion de objetos

    Python es un lenguaje orientado a objetos y permite definir clases e instanciar objetos a partir de dichas

    definiciones. Un bloque encabezado por una sentencia class es una definicion de clase. Las funciones que

    se definen en el bloque son sus metodos (o ((funciones miembro)), segun la nomenclatura de C++).

    Ciertos identificadores corresponden a metodos especiales. El constructor, por ejemplo, tiene por iden-

    tificador__

    init__

    .

    1 class Person:

    2 def init (self, name, age):

    3 self.name = name

    4 self.age = age

    5

    6 deflast name(self):

    7 return self.name.split()[-1]

    8

    9 somebody = Person(JuanNadie, 35)

    10 print somebody.name, somebody.age

    11 print Apellido:, somebody.last name()

    Juan Nadie 35

    Apellido: Nadie

    Notese que el primer parametro de los metodos es especial y suele usarse el identificador self. Se trata

    de una referencia al propio objeto y proporciona un modo de acceso a los atributos y m etodos del mismo.

    El parametro self es asimilable al puntero this de C++. En Python, self es, obligatoriamente, el primer

    parametro de los metodos convencionales y a traves suyo puede una instancia acceder a sus atributos y

    metodos.

    A.8.2. Algunos metodos especiales

    Ciertos metodos cuyo identificador empieza y acaba con doble subrayado pueden ser invocados de modo

    especial. He aqu los que usamos en el texto:

    Apuntes de Algortmica A-13

  • 8/7/2019 Apendice A Python

    14/19

    A.8 Clases 2004/09/24-15:53

    __contains__ (self, item): Se usa para determinar la pertenencia de item al objeto. Se puede invocar

    con el operador in.

    __len__ (self): Proporciona la longitud del objeto (en el caso de una secuencia, por ejemplo, el

    numero de elementos que la forman). Se invoca con la funcion len.

    __getitem__ (self, key): Acceso al objeto con indexacion para consulta. Se invoca con el operador

    de indexacion.

    __

    setitem__

    (self, key, value): Acceso al objeto con indexacion para asignacion. Se invoca con el

    operador de indexacion sobre un objeto que aparece en la parte izquierda de una asignacion.

    __iter__ (self): Iterador que recorre los elementos de la estructura.

    __getattr__ (self, id): Acceso al atributo idde un objeto para su consulta. Se invoca con el operador

    de indexacion.

    __setattr__ (self, id, value): Acceso al atributo id de un objeto para asignacion de un valor. Se

    invoca con el operador de indexacion sobre un objeto que aparece en la parte izquierda de una asig-

    nacion.

    1 class MultiSet:

    2 def init (self):

    3 self.content= {}

    4

    5 defadd(self, item):

    6 try:

    7 self.content[item] += 1

    8 except KeyError:

    9 self.content[item] = 1

    10

    11 def len (self):

    12 total = 0

    13 for key in self.content:

    14 total += self.content[key]

    15 return total16

    17 def contains (self, item):

    18 return item in self.content

    19

    20 def getitem (self, item):

    21 return self.content[item]

    22

    23 def setitem (self, item, value):

    24 self.content[item] = value

    25

    26 A = MultiSet()

    27 for i in 2, 3, 3, 3, 3, 4, 4, 6: A.add(i)

    28 print len(A)

    29 print 3 in A, A[3]

    30 A[3] = 2

    31 print A[3]

    8

    True 4

    2

    A.8.3. Herencia

    Es posible definir una clase a partir de otra, heredando sus atributos y metodos. Al definir la clase basta con

    acompanar al identificador de la clase con el de la clase (o clases) padre encerrado entre parentesis. Python

    permite tomar por clase padre a tipos basicos, como las listas o los diccionarios:

    A-14 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    15/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    1 class MyList(list):

    2 defmin and max(self):

    3 return min(self), max(self)

    4

    5 a = MyList()

    6 a.extend([5, 2, 10, 6])

    7 print a

    8

    print a.min and max()

    [5, 2, 10, 6]

    (2, 10)

    La nueva clase puede redefinir metodos del padre.

    Si se define un constructor para la nueva clase y se desea que el constructor de la clase padre se ejecute,

    se debe invocar explcitamente:

    1 class A:

    2 def init (self, n):

    3 self.n = n

    4

    5 class B(A):6 def init (self, n, m):

    7 A. init (self, n)

    8 self.m = m

    9

    10 b = B(2,3)

    11 print b.n, b.m

    2 3

    A.8.4. Creacion de alias para metodos

    Es posible asociar mas de un identificador a un mismo metodo. Basta para ello con asignar, en el cuerpo de

    la clase, un identificador existente al identificador alias:

    1 class A:

    2 def init (self, n):

    3 self.n = n

    4

    5 defmy method(self, a):

    6 return self.n * a

    7

    8 an alias = my method

    9

    10 a = A(2)11 print a.my method(4), a.an alias(4)

    8 8

    A.9. Modulos

    Un modulo es una coleccion de funciones, clases, variables, etc. que podemos utilizar desde un progra-

    ma. Hay una gran coleccion de modulos disponible con la distribucion estandar de Python. El modulo

    math, por ejemplo, ofrece implementaciones de las funciones matematicas y define algunas constantes con

    aproximaciones a y e.

    La sentencia import seguida del nombre del modulo (sin extension) da acceso a los objetos definidos

    en el. Un objeto importado pasa a estar accesible desde el programa o modulo que lo importa, pero a traves

    del identificador del modulo, el operador punto y el identificador del objeto en cuestion:

    Apuntes de Algortmica A-15

  • 8/7/2019 Apendice A Python

    16/19

    A.10 Iteradores y generadores 2004/09/24-15:53

    1 import math

    2

    3 print math.pi, math.sin(math.pi/3)

    3.14159265359 0.866025403784

    Se puede importar un solo objeto de un modulo con una sentencia from modulo import object. En ese

    caso, se puede usar directamente el identificador del objeto:

    1 from math import sin

    2

    3 print sin(0)

    0.0

    Se puede importar con una sola sentencia from-import mas de un objeto: basta con separarlos con

    comas.

    1 from math import sin, pi

    2

    3 print sin(pi/2)

    1.0

    Hay una forma especial de la sentencia from-import para importar el contenido completo de un modu-

    lo:

    1 from math import *

    2

    3 print sin(pi/4)

    0.707106781187

    A.10. Iteradores y generadores

    Es frecuente que surja la necesidad de recorrer todos los elementos de una coleccion de datos. Python

    permite definir iteradores, es decir, objetos que permiten efectuar estos recorridos. C++ ofrece una fun-

    cionalidad equivalente a traves de los iteradores para el recorrido de estructuras de datos de la STL.

    Los generadores son objetos que proporcionan nuevos valores con cada llamada a un metodo propio sin

    que dichos valores formen, necesariamente, parte de una estructura de datos.

    Muchas funciones de las bibliotecas Python permiten recorrer transparentemente colecciones de datos

    y funcionar sobre secuencias de datos generados al vuelo gracias a los iteradores y generadores. Un objeto

    que para que se ha definido el protocolo de los iteradores (y ello incluye a los generadores) es un iterable.

    A.10.1. Iterables

    Como ya hemos visto, las listas Python son iterables y, por tanto, sus elementos pueden recorrerse con unbucle:

    1 for item in [0, 4, 16, 36, 64]:

    2 print item,

    3 print

    0 4 16 36 64

    La funcion enumerate permite recorrer los elementos de una lista y conocer, para cada uno, su ndice:

    1 for index, item in enumerate([i**2 for i in range(10) ifi % 2 == 0]):

    2 print (index, item),

    3 print

    A-16 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    17/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    (0, 0) (1, 4) (2, 16) (3, 36) (4, 64)

    Las claves de un diccionario pueden recorrerse con un bucle, aunque se debe tener presente que el ordende recorrido es arbitrario:

    1 a dict= dict([(a,1), (b, 2), (c, 3)])

    2 for k in a dict:

    3 print k, a dict[k]

    a 1

    c 3

    b 2

    Tambien son iterables las cadenas (se recorren caracter a caracter) y los ficheros (se recorren lnea a

    lnea).

    A.10.2. Iteradores

    Una estructura de datos es iterable si es capaz de proporcionar un iterador, esto es, un objeto capaz deefectuar un recorrido de la estructura paso a paso. Si invocamos itersobre una lista obtenemos un iterador:

    1 a = iter([1,2,3])

    2 print a

    El iterador permite recorre los elementos de la estructura de datos mediante sucesivas invocaciones al

    metodo next. Una vez el recorrido finaliza, next provoca una excepcion StopIteration:

    1 iterator= iter([1,2,3])

    2 print iterator.next()

    3 print iterator.next()

    4 print iterator.next()

    5 print iterator.next()

    1

    2

    3

    E Traceback (most recent call last):

    File "test_dict_3.py", line 5, in ?

    print iterator.next()

    StopIteration

    Al recorrer una seriede valores con un bucle for-in podemos usar la expresion idiomatica for i in range(n).Esta construccion es espacialmente ineficiente, pues construye una lista con n elementos para, inmediata-mente, construir un iterador con el que recorrerla. La funcion xrange permite efectuar el mismo recorridosin construir explcitamente la lista:

    1 for element in xrange(3):

    2 print element

    0

    1

    2

    El iterable que devuelve xrange usa un simple contador y una par de variables (el lmite y el incremento)

    para generar la secuencia de valores.

    Apuntes de Algortmica A-17

  • 8/7/2019 Apendice A Python

    18/19

    A.10 Iteradores y generadores 2004/09/24-15:53

    A.10.3. Generadores

    Un generador es un objeto que proporciona un nuevo valor con cada llamada al metodo next. Podemos

    definir facilmente un generador mediante una funcion que hace uso de la sentencia yield. La llamada a la

    funcion devuelve un generador sobre el que cada llamada al metodo next devuelve el valor que acompana

    a palabra clave yield. El generador recuerda el estado entre llamadas a next. Podemos usar generadores en

    bucles for-in.

    1 defn squares(n):

    2 for i in xrange(n):

    3 yield i*i

    4

    5 a = n squares(3)

    6 print a.next(), a.next(), a.next()

    7

    8 for i in n squares(8):

    9 print i,

    10 print

    0 1 4

    0 1 4 9 1 6 2 5 3 6 4 9

    Es posible definir expresiones que devuelven un iterador: las expresiones generatrices, similares a las

    listas especificadas por comprension.

    1 iterator= (n*n for n in xrange(3))

    2 print iterator.next(), iterator.next(), iterator.next()

    0 1 4

    A.10.4. Algunas funciones predefinidas que actuan sobre iterables

    Python ofrece varias funciones predefinidas. Entre ellas tenemos:

    min(iterable): valor mnimo de una secuencia.

    max(iterable): valor maximo de una secuencia.

    sum(iterable): suma de todos los valores de una secuencia.

    sorted(iterable): devuelve una lista con los elementos del iterable ordenados.

    Podemos construir una lista con todos los valores y aplicar la funcion min:

    1 print min([x-x**3 for x in xrange(10)])

    -720

    Si actuamos as, estamos reservando memoria para cada uno de los elementos y la liberamos inmediata-mente. Podemos reescribir esta sentencia haciendo uso de expresiones generatrices:

    1 print min(x-x**3 for x in xrange(10))

    -720

    La diferencia sintactica entre esta sentencia y la anterior es mnima: hemos eliminado los corchetes que

    rodean al argumento. El consumo de memoria de esta otra version es constante.

    A-18 Apuntes de Algortmica

  • 8/7/2019 Apendice A Python

    19/19

    c 2003, 2004 A. Marzal, M.J. Castro y P. Aibar A Python

    A.11. Ficheros

    Los ficheros se abren con la funcion predefinida open o file. El primer parametro es la ruta del fichero y

    el segundo indica el modo de apertura. Se usa w para escritura, r para lectura y a para adicion. El

    valor por defecto del segundo parametro es r.

    Por defecto se considera que los ficheros son de texto. Son iterables y, si estan abiertos en modo lectura,

    se recorren lnea a lnea con un bucle for-in. El metodo write permite escribir una cadena de texto arbitraria

    en un fichero abierto para escritura. Un fichero abierto se cierra con el metodo close.

    1 f = file(basura, w)

    2 f.write(unalnea\nyotra\n)

    3 f.write(unamas\n)

    4 f.close()

    5

    6 for line in file(basura):

    7 print line,

    una lnea

    y otra

    una mas

    Apuntes de Algortmica A-19