SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
Programación Orientada a Objetos
                                                mayo, 2003




El lenguaje de programación Python


             Manuel Casado Martín
           Santiago Guadalajara Pérez




     Departamento de Informática y Automática
            Universidad de Salamanca
Información de los autores:


Manuel Casado Martín
    macamart@terra.es
Santiago Guadalajara Pérez
    darksnt@hotmail.com




Este documento puede ser libremente distribuido.
© 2003 Departamento de Informática y Automática - Universidad de Salamanca.
Resumen

Este documento pretende ser una introducción a las características generales del lenguaje, como
la sintaxis o el modelo objetos.
    Aunque este documento no sea un tutorial, proporciona la suficiente información para
ayudar a auto-orientarse a los posibles futuros programadores de Python.




PYTHON                                                                                            i
Abstract
This document intends to be an introduction to the general features of the language, like syntax
or the object model.
    Although this document is not a tutorial, it provides enough information to help prospective
Python programmers orient themselves.




ii                                                  ¡Error! No se encuentra el origen de la referencia.
Tabla de Contenidos
1. Una visión general                                              ______1
            1.1. Un poco de historia                        _______       1
            1.2. ¿Qué es Python?                                          1
2.   El lenguaje de programación Python                                   2
            2.1. Sintaxis                                                 2
            2.2. Funciones                                                4
            2.3. Tipos de datos                                           5
            2.4. Módulos                                                  7
            2.5. Errores y excepciones                                    8
3.   Python como lenguaje orientado a objetos                      ______10
            3.1. Clases                                                   10
            3.2. Herencia                                                 14
4.   Usando Python                                                        15
            4.1. Python como lenguaje de scripts                          16
5.   Conclusiones                                                         19
6.   Referencias                                                          19




Índice de Figuras

1. Ejemplo de herencia____________________________________________________15




PYTHON                                                                         iii
1.          Una visión general de Python

    1.1          Un poco de historia
     El lenguaje de programación Python fue creado a principios de 1990 por Guido van
Rossum en Holanda como sucesor de un lenguaje anterior llamado ABC. En 1995 Guido
continuó trabajando en Python en el CNRI (Corporación internacional para la búsqueda de
iniciativas) en Reston, Virginia. Durante esta época lanzó varias versiones del lenguaje.
     A finales del año 2000 el equipo de Python se trasladó a Zope Corporation y un año
después se formó PSF (Python Software Fundation), siendo Zope Corporation su principal
patrocinador.
     Todas las versiones de Python son Open Source. Además, la mayoría de las versiones de
Python que han sido liberadas desde su creación también han tenido licencia GPL (las únicas sin
licencia GPL son la 1.6, 2.0, 1.6.1 y 2.1).
    La última versión del lenguaje es la 2.2.1 y está en continuo desarrollo (aproximadamente
cada seis meses se publica una nueva versión).


    1.2         ¿Qué es Python?
     Python es un lenguaje de programación interpretado orientado a objetos de muy alto nivel.
Sus estructuras de datos de alto nivel, combinadas con tipado dinámico y ligadura dinámica lo
hacen especialmente atractivo para el desarrollo de aplicaciones rápidas, así como lenguaje de
scripts o medio de conexión de otros componentes ya existentes.
    Además, la claridad y sencillez de su sintaxis mejora notablemente la legibilidad de los
programas escritos en Python y por lo tanto reduce el coste de mantenimiento del software.
      Python soporta además módulos y paquetes, lo que incrementa la modularidad y la
reutilización de código. Permite incorporar rutinas compiladas en C para realizar funciones
críticas a alta velocidad. También implementa estructuras de datos muy avanzadas (lista, tuplas,
diccionarios) que pueden ser combinadas para crear otras estructuras más complejas.
    Su intérprete y la librería de Python están disponibles para las principales plataformas
(Linux, Windows, UNIX...) en código fuente o binario y pueden ser distribuidas libremente.
Asimismo, Python se caracteriza por disponer de una excelente documentación y una de las
mejores guías de aprendizaje.
     Python está escrito en C. Existe una implementación del lenguaje Python implementada
únicamente en Java: Jython. La mayoría de las librerías del Python estándar han sido ya
portadas a Jython, sin embargo el desarrollo de Python es tan rápido que los desarrolladores de
Jython tienen problemas para portar todas las innovaciones.


    1.2.1       Python es un lenguaje interpretado
     Se entiende por “lenguaje interpretado” aquel lenguaje cuyas instrucciones se ejecutan
directamente a partir del código fuente.
     Para ejecutar el código de este lenguaje es necesario un intérprete, que va recibiendo líneas
de código y las traducirá a lenguaje máquina para que se ejecuten. A diferencia de los lenguajes
compilados no se produce código ejecutable, de modo que para ejecutar el código en diferentes
plataformas solo hay que cambiar el intérprete, no el código.


                                               -1-
El lenguaje de programación Python



     El hecho de ser un lenguaje interpretado hace que Python sea, a priori, más lento que los
lenguajes compilados. Sin embargo, dado que Python se suele utilizar en programas cortos, las
diferencias al final no resultan muy significativas. Además, si necesitamos velocidad y
eficiencia en una determinada rutina podemos implementarla en C e importarla a nuestro
código.


    2. El lenguaje de programación Python
    Las posibilidades que ofrece este lenguaje como lenguaje de programación son muy
amplias y completas. Esta es una pequeña introducción a las características más destacables.
    2.1.        Sintaxis
     Uno de los rasgos más importantes de Python es la claridad de su sintaxis. Se debe tener en
cuenta que Python es un lenguaje de programación muy cercano al pseudo-código. De hecho
llega a ser considerado como pseudo-código ejecutable.
     La sintaxis de Python es realmente sencilla. No hay palabras reservadas para iniciar o
finalizar bloques ni programas, no es necesario declarar variables...
    Ejemplo código en Python:


    # Ejemplo
    opcion = “salir”
    if opcion == “salir”:
        print “Ha decidido salir”
        valor = 1
    print “saliendo...”


    Para definir bloques de código se usa solamente la tabulación, sin llaves ni begin/end. En el
ejemplo, el código


    print “Ha decidido salir”
        valor = 1
    constituiría un bloque, que se ejecutará en caso de que la variable opcion contenga la
cadena salir.
     El hecho de usar la tabulación para marcar el inicio y fin de un bloque hace que Python
presente siempre y obligatoriamente una estructura muy ordenada.
    Las líneas que comiencen por # son comentarios y el intérprete hace caso omiso de ellas.


    2.2         Estructuras de control


    2.2.1.      Sentencia while
    El bucle while funciona de manera similar a otros lenguajes:



PYTHON                                                                                         2
Casado y Guadalajara




    while i<10:
        print i
        i = i+3
     Podemos incluir una sentencia else en un bucle while, que se ejecutará cuando éste finalice,
a no se que hayamos salido de él con una sentencia break:
    while i<10:
        print i
        i = i+3
    else:
        print “i ya no es menor que 10”


    2.2.2.      Sentencia if
    El bucle if es también muy similar a otros lenguajes:
    if nota >= 5:
        print “Aprobado”
    else:
        print “Suspenso”


    Tanto en Python como en C, 0 es falso y lo demás es cierto. Se usa como negación la
    palabra not.
    if not(x%2):
        return 1


    2.2.3.      Sentencia for
     El bucle for es ligeramente diferente a como lo conocemos en otros lenguajes. En Python
la sentencia for debe ir seguida por una lista o tupla.
      Se dispone de la instrucción range para generar un conjunto de valores desde 0 hasta el
valor que fijemos o entre dos valores que queramos.
    for x in range(3):
        print x


    La salida sería:
    0
    1
    2




3                                                                                       PYTHON
El lenguaje de programación Python



    En este otro ejemplo:
    numero = 10
    secuencia = [1,2,’Salamanca’,’Avila’,numero]
    for x in secuencia:
         print x


    Obtendríamos la salida
    1
    2
    Salamanca
    Avila
    10


    2.3        Funciones
     Las funciones se definen con la palabra reservada def seguida del identificador de la
función y entre paréntesis los parámetros sin especificar el tipo. Ejemplo:


    def mi_funcion(x):
         print “Digo”,x


    mi_funcion(‘Hola’)


    La salida sería:


    Digo Hola


     En Python todos los parámetros se pasan por referencia. Tiene la posibilidad de pasar
argumentos con nombre, argumentos por omisión o manejar un número de argumentos variable
para una función.
     Otra cosa que lo hace peculiar es el hecho de poder tratar las funciones como valores. Así
se pueden hacer cosas como:



    def mi_funcion(x):
          print "Digo",x
    decir = mi_funcion
    decir("Que tal")



PYTHON                                                                                       4
Casado y Guadalajara



    decir(10)


    Cuya salida es:
    Digo Que tal
    Digo 10


     Al igual que en C, en Python no se distingue entre funciones y procedimientos. Las
funciones devuelven por defecto el valor None. Para devolver un valor determinado se emplea
la sentencia return.
      def mi_funcion(x):
          argumento = x
          return 0


    valor = mi_funcion(10)
    print "La funcion 'mi_funcion' devuelve el valor:",valor


    Cuya salida sería


    La funcion 'mi_funcion' devuelve el valor: 0


     Todo en Python son objetos, incluso las funciones. Un atributo especialmente interesante es
__doc__. En este atributo se almacenan las llamadas “cadenas de documentación”, que son
cadenas de texto que se colocan en la línea siguiente a la definición de la función. Sirven para
aclarar que hace la función y son muy útiles cuando trabajamos sobre código que ha escrito otro
programador. Un ejemplo muy simple:


    def cuad(x):
       “Devuelve el cuadrado del valor pasado como argumento”
       return x*x
    print cuad.__doc__


    Cuya salida es


    Devuelve el cuadrado del valor pasado como argumento


    2.4        Tipos de datos
     Merecen especialmente atención tres tipos de datos complejos que Python implementa
directamente. Estos son las listas, tuplas y diccionarios



5                                                                                      PYTHON
El lenguaje de programación Python




    2.4.1       Listas
     El tipo de datos más versátil e interesante en Python son las listas. Las listas en Python se
escriben como un conjunto de valores entre corchetes separados por comas. Estos valores no
tienen por que ser del mimo tipo:


        >>> a = ['hola', 'adios', 100, 1234]
        >>> a
        ['hola', 'adios', 100, 1234]


      Existen numerosas funciones implementadas que permiten fácilmente insertar un elemento
en la lista, extraerlo, concatenar listas, etc. Gracias a estos métodos es muy sencillo utilizar una
lista como pila...:
        >>> 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]


    o como cola:


        >>> queue = ["Luis", "Daniel", "Lucia"]
        >>> queue.append("Miguel")
        >>> queue.append("Elena")
        >>> queue.pop(0)
        'Luis'
        >>> queue.pop(0)



PYTHON                                                                                            6
Casado y Guadalajara



         'Daniel'
         >>> queue
         ['Lucia', 'Miguel', 'Elena']


         En este caso, para extraer un elemento del principio de la cola será necesario llamar a la
         función pop() con el argumento 0


     2.4.2       Tuplas
Las tuplas son similares a las listas, salvo que en este caso no son mutables, no se pueden
modificar sus elementos:
>>> tupla = (1,4324,233.45,'hola')
>>> tupla[1] = 'noooo'
Traceback (most recent call last):
    File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment


     2.4.3       Diccionarios
Los diccionarios o memorias asociativas son pares clave-valor donde clave puede ser cualquier
objeto no mutable. Las claves han de ser únicas dentro de un diccionario. Ejemplo:
>>> telefono = {'maria':3331234,'luis':5551235}
>>> telefono
{'luis': 5551235, 'maria': 3331234}
>>> telefono['maria']
3331234
>>> telefono.keys()
['luis', 'maria']
>>> telefono.has_key('maria')
1
>>> telefono.has_key('alberto')
     0


     2.5         Módulos
    Un módulo en Python es un fichero con extensión .py que contiene definiciones e
implementaciones de funciones.
      Existe en Python un gran conjunto de módulos, cada uno de ellos especializado en un
campo de aplicación determinado. Precisamente, una de las razones por las que Python es un
lenguaje potente y extremadamente útil es por la gran colección de módulos con que se
distribuye. Cualquier programador de Python puede crear sus propios módulos añadiendo así
funciones que simplifican la programación en un ámbito cualquiera y poniéndolas a disposición
de otros programadores.


7                                                                                         PYTHON
El lenguaje de programación Python



     Estos módulos pueden ser importados dentro de otros módulos o dentro del módulo
principal. Las sentencias import ... from permiten a un módulo hacer referencia a objetos del
espacio de nombres de otro módulo, con la diferencia de que


    from Matematicas import integral


     añade integral al espacio de nombres del módulo actual como una referencia al objeto
externo en cuestión mientras que


    import Matematicas


    importa el módulo Matemáticas permitiendo hacer referencia a cualquier objeto del
espacio de nombres de Matemáticas, como por ejemplo Matemáticas.integral


    2.6         Errores y excepciones
    Se pueden distinguir en Python dos tipos de errores: errores de sintaxis y excepciones.


    2.6.1       Errores de sintaxis
     Se producen al escribir algo erróneo en el intérprete, este señala lo sucedido marcando el
error, el nombre del fichero y el número de línea del que procede el error (los dos últimos, si la
entrada viene de un fichero).

            while 1 print ’Hola mundo’
                                   ^
    SyntaxError: invalid syntax




    2.6.2       Excepciones
     Aunque una expresión sea sintácticamente correcta, puede originar un error al intentar
ejecutarla, a este tipo de error que se produce durante la ejecución se le llama excepción, que no
implican la destrucción de la aplicación y se pueden gestionar en Python. Una excepción es de
la forma:


    >>> 10 * (1/0)
    Traceback (innermost last):
       File "<stdin>", line 1
    ZeroDivisionError: integer division or modulo


     Las excepciones pueden ser de diversos tipos. En la biblioteca de referencia que incorpora
la distribución del lenguaje se enumeran las excepciones internas y sus respectivos significados.


PYTHON                                                                                          8
Casado y Guadalajara



      Las excepciones se pueden gestionar dentro de un programa, como muestra el ejemplo:


>>> while 1:
...         try:
...                x = int(raw_input("Introduzca un numero: "))
...                break
...         except ValueError:
...                print "El valor introducido no es un numero valido"
...


     Primero se ejecuta la cláusula try. Si no se produce ningún error la cláusula except es
saltada. Si se produce un error que corresponde con el tipo de error que indica alguna sentencia
except, se ejecuta su código (en este caso, si el tipo de error fuese ValueError, se
imprimiría “EL valor introducido no es un numero valido”).


    Se puede usar la cláusula except omitiendo el nombre de la excepción para hacerla de
propósito general:
import string, sys
try:
       f = open('myfile.txt')
       s = f.readline()
       i = int(string.strip(s))
except IOError, (errno, strerror):
       print "I/O error(%s): %s" % (errno, strerror)
except ValueError:
       print "Could not convert data to an integer."
except:
       print "Unexpected error:", sys.exc_info()[0]
       raise


    En el ejemplo, si no se produce un error de entrada/salida ni un error de valor, se mostraría
el mensaje "Unexpected error:".


    Existe también la posibilidad de forzar excepciones o de crear excepciones definidas por el
usuario.


      3.        Python como lenguaje orientado a objetos



9                                                                                       PYTHON
El lenguaje de programación Python



    3.1         Clases
Las clases en Python no ponen una barrera absoluta entre la definición y el usuario, sino que
más bien se fían de la buena educación del programador para no invadir la definición. El
mecanismo de herencia soporta la herencia múltiple, los métodos pueden ser redefinidos en las
clases derivadas y un método puede llamar a otro del mismo nombre de una clase base. Los
objetos pueden contener una cantidad arbitraria de atributos. Como se diría en C++ todos los
miembros de una clase son públicos y todas las funciones método son virtuales. No hay
constructores ni destructores. En Python todo son objetos, lo que implica que una clase (como
un tipo de datos) es en si misma un objeto. Esto proporciona la semántica de importar y
renombrar. Es posible redefinir los operadores internos con sintaxis especial.
     Normalmente se define objeto como una instancia de una clase, pero en Python esta
definición no es correcta, ya que en hay tipos de datos que no son clases (enteros, listas,
ficheros...), sin embargo, todos los tipos de Python comparten algo de semántica común,
descrita adecuadamente mediante la palabra “objeto”.
       Los objetos tienen individualidad y en Python se pueden asignar varios nombres a un
   mismo objeto (“generación de alias”, que en algunos aspectos se parecen a los punteros), que
   cuando el objeto es inmutable no es importante, pero cuando el objeto es mutable y se
   cambia su estado, se acceda con el nombre que se acceda el objeto esta actualizado (de esta
   forma también se elimina el tener que traspasar parámetros mediante dos mecanismos).


    3.1.1       Ámbitos y espacios nominales:
Un espacio nominal es una correspondencia entre nombres y objetos. Ejemplos de espacios
nominales:
        -   Conjunto de nombres internos (funciones y excepciones internas).
        -   Los nombres globales de un módulo.
        -   Los nombres locales dentro de una llamada a función.


    En cierto sentido, los atributos de un objeto también forman un espacio nominal. No hay
ninguna relación entre los nombres de dos espacios nominales distintos.
     Los espacios nominales se crean en diferentes momentos y tienen tiempos de vida
diferentes. El espacio nominal que contiene los nombres internos se crea al arrancar el intérprete
de Python y no se borra nunca. El espacio nominal de un módulo se crea al leer la definición del
módulo y normalmente duran hasta que se sale del intérprete. El espacio nominal local de una
función se crea al llamar a la función, y se borra cuando se sale de la misma, mediante una
sentencia return, o bien mediante alguna excepción que la función no captura.
     Un ámbito es una región textual de un programa Python donde el espacio nominal es
directamente accesible, es decir, los nombres que encuentra una referencia sin calificar (sin
puntos). Aunque los ámbitos se determinan estáticamente, se usan dinámicamente. En cualquier
punto de la ejecución existen tres ámbitos anidados (accesibles directamente): el interior
(nombres locales), el medio (nombres globales del módulo) y el externo (nombres internos).
     Un asunto especial de Python es que las asignaciones siempre van en el ámbito más
interno, no copian datos, simplemente asignan nombres a objetos. Lo mismo es válido para los
borrados.
     Las operaciones que introducen nombres nuevos utilizan el ámbito local, y se puede utilizar
la sentencia global para indicar que la variable reside en el ámbito global.



PYTHON                                                                                         10
Casado y Guadalajara




     3.1.2        Sintaxis:
     La forma más fácil de definir una clase es de la forma:
        class nombreClase:
              <sentencia-1>
              .
              .
              .
              <sentencia-N>
     Cuando se crea una clase nueva, se genera un nuevo “espacio nominal” (correspondencia
entre nombres y objetos) que se utiliza como ámbito local.
     Para que la definición de una clase tenga efecto tiene que ejecutarse, esto implica que sea
válido introducir una definición de una clase dentro de una sentencia “if” o similar.
     En un primer momento las sentencias dentro de una clase deberían ser funciones, aunque es
posible poner cualquier otro tipo de sentencia, lo que puede resultar en algunos casos muy útil.
     Cuando se abandona una definición de clase de manera normal (se ejecuta la última línea
de su código), se crea un objeto de clase. Es, sencillamente, un envoltorio del contenido del
espacio nominal creado por la definición de la clase. El ámbito local original (el que estaba
activo cuando se entró en la definición de clase) se reinstancia y el objeto clase se enlaza con el
nombre de clase dado en la cabecera de la función (en el ejemplo nombreClase).


     3.1.3        Objetos clase:
Los objetos en Python soportan dos tipos de operaciones:
     1.- Referencias a atributos: para acceder a un atributo de un objeto se sigue la sintaxis
estándar de Python (obj.nombre). Los nombres de atributos válidos son todos los nombres
que estaban en el espacio nominal de la clase cuando fue creada la clase.
     2.- Instanciación de una clase: para instanciar una clase se sigue la notación de funciones,
es decir, es suficiente con imaginar que la es una llamada a una función que no tiene parámetros
y que devuelve una instancia nueva de la clase.
     Así, para la definición de la clase:
        class MiClase:
              i = 12345
              def f(x):
                     return 'hola, mundo'
     MiClase.i y MiClase.f serían referencias a atributos válidas, que devuelven un
entero y un objeto método, respectivamente.
     Con la sentencia x = MiClase () se crea una nueva instancia de la clase y se la asigna
a la variable local “x”. Esta operación genera un objeto vacío. Para asignarle un estado inicial
conocido se puede definir un método especial llamado __init__(). Cuando se crea una clase
que define un método __init__() al instanciar un objeto de la clase se llama
automáticamente al método __init__().


11                                                                                        PYTHON
El lenguaje de programación Python



     El método __init__() puede recibir parámetros, lo que añade una gran cantidad de
posibilidades. Estos parámetros los recibirá de los argumentos proporcionados al operador de
instanciación de la clase, por ejemplo:


    class Complejo:
             def __init__(self, parteReal, parteImaginaria):
                  self.r = parteReal
                  self.i = parteImaginaria


    x = Complejo(3.0,-4.5)


    3.1.4       Objetos instancia:
Los objetos instancias poseen:
     1.- Atributos de datos: son aquellos que se denominan “miembros dato” en C++ y que en
Python no hace falta declarar, sino que aparecen cuando se les asigna por primera vez un valor.
Conviene recordar que estos atributos son siempre “públicos”, como se diría en C++ y que es
tarea del programador no romper y mantener el encapsulado.
    2.- Métodos: un método es una función que “pertenece a” un objeto.


    3.1.5       Objetos método:
Normalmente se llama a un método de forma inmediata (obj.método()) pero es posible no
hacerlo. obj.método es un objeto método y se puede almacenar para recuperar más tarde.
     Lo que tienen de especial los métodos es que el objeto que los llama se pasa como primer
argumento de la función. En general, llamar a un método con una lista de argumentos es
equivalente a llamar a la función correspondiente con la lista de argumentos resultante de
insertar el objeto del método al principio de la lista de argumentos original.
      Cuando se hace referencia a un atributo de una instancia que no es un atributo de datos, se
busca en su clase. Si el nombre denota un atributo de clase válido que resulta ser un objeto
función, se crea un objeto método empaquetando juntos (punteros hacia) el objeto instancia y el
objeto función recién encontrado en un objeto abstracto: el objeto método. Cuando se llama al
objeto método con una lista de argumentos, se desempaqueta de nuevo, se construye una nueva
lista de argumentos a partir del objeto instancia y la lista de argumentos original y se llama al
objeto función con la nueva lista de argumentos. Ejemplo:


    xf = x.f
    while 1:
            print xf()


     Los atributos de datos se tienen en cuenta en lugar de los atributos método con el mismo
nombre, para evitar estos conflictos nominales que son difíciles de detectar conviene usar un
patrón a la hora de escoger los nombres para los atributos y lo métodos. Por ejemplo empezar
los atributos con un guión bajo y los métodos con una letra mayúscula, o algo similar.




PYTHON                                                                                         12
Casado y Guadalajara



     Tanto los métodos como los usuarios de un objeto pueden acceder a los atributos del
objeto, puesto que todos los atributos y métodos son ‘públicos’, es decir, no se puede
implementar un tipo de datos abstracto puro. En Python no es posible “ocultar” los atributos,
todo se basa en convenciones y en la buena disciplina del programador.
     Los clientes deben utilizar los atributos de datos con sumo cuidado, ya que pueden
introducir nuevos atributos de datos propios a una instancia de un objeto, y si no se elige un
nombre acertado o coherente puede haber conflictos nominales o incluso afectar al buen
funcionamiento de un método.
     Por convención, el primer parámetro que recibe un método se suele denominar self, y
aunque no es obligatorio ayuda a que el código pueda ser más legible por otros programadores,
incluso no es extraño que pueda haber navegadores de clases que supongan que se sigue esta
notación.
     Cualquier objeto función que es atributo de una clase define un método para las instancias
de esa clase, aunque no es necesario que la implementación de esa función este encerrada en la
definición de la clase, es decir, asignar un objeto función a una variable local de una clase es
válido, por ejemplo:


     # Función definida fuera de la clase
     def f1(self, x, y):
          return min(x, x+y)
     class C:
          f = f1
                def g(self):
                return ’hola, mundo’
          h = g


     Ahora f, g y h son atributos de la clase C, que hacen referencia a objetos función, por lo
que los tres son métodos de las instancias de la clase C.
   Los métodos pueden llamar a otros métodos utilizando los atributos métodos del argumento
self. Por ejemplo:


     class Bolsa:
          def __init__(self):
                self.datos = []
          def agregar(self, x):
                self.datos.append(x)
          def agregarDosVeces(self, x):
                self.add(x)
                self.add(x)


     Los métodos pueden hacer referencia a las variables globales del mismo modo que lo hacen
las funciones. Aunque es raro encontrar un buen motivo para que un método use una variable



13                                                                                     PYTHON
El lenguaje de programación Python



global, hay casos en los que es legítimo el uso del ámbito global, es decir, los métodos pueden
utilizar las funciones y los módulos importados al ámbito global. Normalmente, la clase que
contiene al método esta definida en este ámbito global.


    3.2         Herencia
Python a diferencia de otros lenguajes soporta los dos tipos de herencia, simple y múltiple:
     Herencia simple: es el tipo de herencia en el cuál la clase derivada solo hereda las
características de una clase base. La sintaxis de definición de una clase derivada es de la forma:
    class nombreClaseDerivada(nombreClaseBase):
          <sentencia-1>
          .
          .
          .
          <sentencia-N>
     El nombre nombreClaseBase debe estar definido en un ámbito que contenga la
definición de la clase derivada. En lugar de una clase base también se permite una expresión,
que suele resultar útil cuando la clase base está definida en otro módulo.
     La ejecución de la definición de la ejecución de la clase derivada se lleva acabo del mismo
modo que en la clase base. Cuando se construye un objeto de la clase derivada se recuerda la
clase base. Esto se utiliza para resolver referencias a atributos: si no se encuentra el atributo
solicitado en la clase derivada se busca en la clase base, y así de forma recursiva.


     Se puede instanciar una clase derivada de forma similar a una clase base:
nombreClaseDerivada(). Las referencias a métodos se resuelve buscando el atributo en
la clase correspondiente, descendiendo por la cadena de clases base (si es necesario).
    Las clases derivadas pueden redefinir los métodos, si es necesario, de sus clases base (es
como si todas las funciones fueran virtuales en C++). También se permite que se amplíe un
método,     sin     remplazarlo     por      completo,     de     la     siguiente     forma:
nombreClaseBase.nombreMétodo(self, argumentos).


     Herencia múltiple: La clase derivada recibe las características de más de una clase base. La
sintaxis de definición es de la siguiente forma:




PYTHON                                                                                         14
Casado y Guadalajara



     class nombreClaseDerivada(Base1, Base2, Base3):
          <sentencia-1>
          .
          .
          .
          <sentencia-N>
     La única regla necesaria para explicar la semántica es la regla de resolución utilizada para
las referencias a los atributos de la clase. Se busca primero en profundidad y luego de izquierda
a derecha. Así pues, primero se busca en la clase derivada, sino se encuentra en la clase Base1
y sus clases base, sino en la clase Base2 y sus clases base y así sucesivamente.
     Parece más natural buscar primero en Base1 y luego en Base2 antes de entrar a examinar
las clases base de Base1, pero esta forma exigiría conocer si un atributo particular de Base1
esta realmente definido en Base1 o en sus clases base, pudiendo originar conflictos de nombres
con la Base2. Como Python no diferencia se recibe los atributos de una clase base de forma
directa o heredados, no se genera este problema. Un ejemplo es el de la figura:



                                  A


                                 B def f()


                C                                D def f() (nueva definición)


                                  E
Figura 1 – Ejemplo de herencia


        E es clase derivada de las clases base C y D, por lo que en E esta definido el método f.
Si desde una instancia de E se ejecutará el método f, la implementación que realmente se
ejecutaría sería la de B, porque primero buscaría en C, que es derivada de B pero no tiene la
implementación de f, luego buscaría en B (y no en D), y como tiene la definición de f no
seguiría buscando. Si se quisiera usar el método de la clase D, habría que indicarlo de la manera
D.f()


     De esto se puede deducir en una instancia de una clase derivada que hereda de dos clases
base que tienen una clase base común, solo tendrá una copia de los atributos y métodos de la
clase base común.


     4.         Usando Python
     Cuando se desarrolla un script para la shell de un sistema operativo, se comprueba que
conforme aumenta la complejidad, aumenta enormemente el tamaño del mismo y se hace más
difícil de entender, más lento...



15                                                                                      PYTHON
El lenguaje de programación Python



     Otra situación que puede resultar familiar es el desarrollo de un programa que requiere el
uso de numerosas librerías y donde el común ciclo escritura/compilación/prueba/re-compilación
es demasiado lento y se necesita desarrollar software más rápidamente.
    En ambos casos Python es el lenguaje ideal de programación. Permite desarrollar software
más rápidamente, más sencillo y de menor tamaño ya que:
    -      Los tipos de datos de alto nivel permiten expresar operaciones complejas en una sola
           sentencia
    -      No se necesita la declaración de variables
    -      Los bloques de código se identifican por el tabulado
     Se puede partir un programa en módulos que pueden emplearse en el desarrollo de otros
programas. Igualmente Python incorpora un conjunto de módulos básicos como de I/O,
llamadas al sistema, shockets, interfaz gráfica de usuario...
    Además es extensible, de manera que es posible incorporar funciones o módulos de otros
lenguajes que puedan resultar más eficientes en una determinada situación.
     Python puede ser usado como lenguaje de scripts, para la administración de sistemas, como
generador de código (especialmente en el ámbito de desarrollo web), para el desarrollo de
interfaces gráficas de usuario o cualquier otra tarea computacional.


    4.1 Python como lenguaje de scripts


     A menudo Python suele ser definido como “lenguaje de scripts”, lo cual es un error.
Python es un lenguaje de programación completo que soporta scripts, pero es mucho más que
eso. Aún así es en este campo donde mayor implantación tiene Python y probablemente donde
mayor eficacia presta.
    Pero ¿qué es un script? Un script es un conjunto de instrucciones que se ejecutan paso a
paso, instrucción a instrucción.
   Están especialmente indicados para pequeños programas que necesiten interactuar de
manera más o menos fluida con el Sistema Operativo.
     Los lenguajes de scripts se conocen con el nombre de middleware ya que son capaces de
gestionar transferencias de datos entre aplicaciones o entre aplicaciones y el SO. Habitualmente
se pueden ampliar mediante plugins o módulos (en el caso de Python) e incluso pueden ser
empotrados en otras aplicaciones.


    Ejemplo: script que realiza la búsqueda en Google y devuelve los resultados:




    import httplib


    URL = 'www.google.com'
    COD_BUSQUEDA = '/search?num=100&q='
    CABECERA = '<b>...</b> n<br><font color=#008000>'



PYTHON                                                                                       16
Casado y Guadalajara



     FIN = ' '
     NUM_RESULTADOS = 10
     MAX_RESULTADOS = 50


     def formateaQuery(query):
         from string import join
         a = query.split()
         return join(a,'+')
     def google(query=None,n=None):
         if n is None:
                n = NUM_RESULTADOS
         if query is None:
                print "No se ha efectuado la busqueda"
                return -1
         busqueda = run(query,n)


         if busqueda == -2:
             print 'La busqueda para %s no ha arrojado
     resultados.'%(query.replace('+',' '))
                return
         if busqueda == -1:
                print 'No se ha podido efectuar la conexion'
                return
         for x in busqueda:
                print x


     def run(query,n):
         try:
                conn = httplib.HTTPConnection(URL)
                conn.request("GET",COD_BUSQUEDA+formateaQuery(query))
                r = conn.getresponse()
         except:
                print 'No se ha podido efectuar la conexion'
                return -1
         if r.reason == 'OK':
                data = r.read()
         else:


17                                                                   PYTHON
El lenguaje de programación Python



               return -1
         conn.close
         aux = data.split(CABECERA)
         #Hay que desechar el primer elemento
         aux.pop(0)
         if len(aux)==0:
               return -2
         busqueda = []
         i=0
         while n!=0 and i<MAX_RESULTADOS:
               try:
                      a = aux[i].split(FIN,2)[0]
                      if a!=' ':
                           busqueda.append('http://'+a)
                           n-=1
               except:
                      pass
               i+=1
         return busqueda


    Ahora lo ejecutamos:


    >>> google("salamanca",10)
    http://www.readysoft.es/home/cisalamanca/salamanca/
    http://www.cyberspain.com/ciudades-patrimonio/isalaman.htm
    http://www.cyberspain.com/ciudades-patrimonio/esalaman.htm
    http://www.salamancaciudad.com/
    http://www3.usal.es/~sabus/bibliotecas/pagprincipalbib.htm
    http://www3.usal.es/~farmacia/
    http://www.elperiodico.es/salamanca/
    http://www.salamancawireless.net/
    http://www.arteguias.com/mudejar_salamanca.htm
    http://www.guiasalamanca.com/




PYTHON                                                           18
Casado y Guadalajara




     5.            Conclusiones


     El tipado dinámico, la ligadura tardía, la gran cantidad de módulos de Python y la
simplicidad de su sintaxis hacen que los programas escritos con este lenguaje sean realmente
cortos y rápidos de desarrollar, aunque el rendimiento baja bastante cuando el programa es un
poco extenso.
      La gran cantidad de módulos y librerías de las que dispone hacen que el ámbito de
utilización de Python sea muy extenso, abarcando desde gestión de sistemas y proyectos web
hasta interfaces gráficas de usuario, sin olvidarse de los scripts.
      Python es usado por grandes compañías como: Google, HP, IBM y Red Hat. Ejemplo de
utilización Python: un trabajo con muchos módulos o ficheros distintos, y al final de cada día se
quiere hacer una copia de seguridad en un disquete de todos ellos, en vez de estar copiándolos a
mano, o hacer un programa en C, o C++ (que puede ser un trabajo tedioso), lo mejor es hacer un
pequeño programa escrito en Python.


     6. Referencias

     [1]    La pagina oficial de Python: http://www.python.org
     [2]    Noticias sobre Python: http://www.pythonware.com/daily/index.htm
     [3]    Completa documentación de Python en español:
            http://usuarios.lycos.es/arturosa/index.html
     [4]    Documentación de Python en español de sourceforge:
            http://sourceforge.net/projects/pyspanishdoc
     [5]    Informes interesantes sobre programación (herencia múltiple):
            http://www.informit.com/index.asp?session_id={4C573D38-B34A-4B1B-95A1-
            A04A8129E780}
     [6]    Pagina de Zope Corporation: http://www.zope.com
     [7]    Interesante artículo general sobre Python: http://www.networkcomputing.com
     [8]    Eckel, Bruce “Thinking in Python, Design Patters and Problem Solving Techniques”
     [9]    Andrés Marzal “Introducción a la programación en Python”
     [10]   Pilgrim, Marck. “Dive into Python”




19                                                                                      PYTHON

Más contenido relacionado

La actualidad más candente

La actualidad más candente (6)

Parallel Python sistemas operativos avanzados
Parallel Python sistemas operativos avanzadosParallel Python sistemas operativos avanzados
Parallel Python sistemas operativos avanzados
 
Tutorial python3
Tutorial python3Tutorial python3
Tutorial python3
 
INFOSAN Tutorial python3 (1)
INFOSAN Tutorial python3 (1)INFOSAN Tutorial python3 (1)
INFOSAN Tutorial python3 (1)
 
El tutorial de pythonnnn
El tutorial de pythonnnnEl tutorial de pythonnnn
El tutorial de pythonnnn
 
Programador Jr. para Python Primera Parte
Programador Jr. para Python Primera ParteProgramador Jr. para Python Primera Parte
Programador Jr. para Python Primera Parte
 
Semana 2 Fundamentos de Python(Variables)
Semana 2   Fundamentos de Python(Variables)Semana 2   Fundamentos de Python(Variables)
Semana 2 Fundamentos de Python(Variables)
 

Destacado

Destacado (20)

Programa taller-gratuito-python
Programa taller-gratuito-pythonPrograma taller-gratuito-python
Programa taller-gratuito-python
 
Info nivel 1 avanzado
Info nivel 1 avanzadoInfo nivel 1 avanzado
Info nivel 1 avanzado
 
Todo Sobre El Lenguaje Python
Todo Sobre El Lenguaje PythonTodo Sobre El Lenguaje Python
Todo Sobre El Lenguaje Python
 
Manual Basico para Encantadores de Serpientes (Python)
Manual Basico para Encantadores de Serpientes (Python)Manual Basico para Encantadores de Serpientes (Python)
Manual Basico para Encantadores de Serpientes (Python)
 
Python (práctica 3)
Python (práctica 3)Python (práctica 3)
Python (práctica 3)
 
Excel ingenieria
Excel ingenieriaExcel ingenieria
Excel ingenieria
 
Python (práctica 2)
Python (práctica 2)Python (práctica 2)
Python (práctica 2)
 
Iniciación a python
Iniciación a pythonIniciación a python
Iniciación a python
 
Python (práctica 1)
Python (práctica 1)Python (práctica 1)
Python (práctica 1)
 
Cuaderno funcion excel
Cuaderno funcion excelCuaderno funcion excel
Cuaderno funcion excel
 
Programación de Videojuegos con Python y Pilas (VI)
Programación de Videojuegos con Python y Pilas (VI)Programación de Videojuegos con Python y Pilas (VI)
Programación de Videojuegos con Python y Pilas (VI)
 
107956 excel avanzado
107956 excel avanzado107956 excel avanzado
107956 excel avanzado
 
Programación de Videojuegos con Python y Pilas (II)
Programación de Videojuegos con Python y Pilas (II)Programación de Videojuegos con Python y Pilas (II)
Programación de Videojuegos con Python y Pilas (II)
 
Python - Programación para machos
Python - Programación para machosPython - Programación para machos
Python - Programación para machos
 
Practicas de excel sena
Practicas  de excel senaPracticas  de excel sena
Practicas de excel sena
 
Python power 1
Python power 1Python power 1
Python power 1
 
Algoritmos programacion-python
Algoritmos programacion-pythonAlgoritmos programacion-python
Algoritmos programacion-python
 
Python (ejercicios)
Python (ejercicios)Python (ejercicios)
Python (ejercicios)
 
Ejercicios python
Ejercicios pythonEjercicios python
Ejercicios python
 
Escenarios de EXCEL
Escenarios de EXCELEscenarios de EXCEL
Escenarios de EXCEL
 

Similar a Programacion orientada a objetos python manuel casado martín - universidad de salamanca 2003

Similar a Programacion orientada a objetos python manuel casado martín - universidad de salamanca 2003 (20)

python-para-todos.pdf
python-para-todos.pdfpython-para-todos.pdf
python-para-todos.pdf
 
Python para todos
Python para todosPython para todos
Python para todos
 
Python para Todos
Python para TodosPython para Todos
Python para Todos
 
python-para-todos.pdf
python-para-todos.pdfpython-para-todos.pdf
python-para-todos.pdf
 
Libro python para todos
Libro   python para todosLibro   python para todos
Libro python para todos
 
Python para todos
Python para todosPython para todos
Python para todos
 
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdf
 
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdf
 
El tutorial PYTHON EMERSON EDUARDO RODRIGUES
El tutorial PYTHON  EMERSON EDUARDO RODRIGUESEl tutorial PYTHON  EMERSON EDUARDO RODRIGUES
El tutorial PYTHON EMERSON EDUARDO RODRIGUES
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 
Tutorial python
Tutorial pythonTutorial python
Tutorial python
 
Raspberry Pi: El tutorial de Python
Raspberry Pi: El tutorial de PythonRaspberry Pi: El tutorial de Python
Raspberry Pi: El tutorial de Python
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 
Manual python2
Manual python2Manual python2
Manual python2
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 
Tutorial python2
Tutorial python2Tutorial python2
Tutorial python2
 
excelente Tutorial aprendizaje de Python3.pdf
excelente Tutorial aprendizaje de Python3.pdfexcelente Tutorial aprendizaje de Python3.pdf
excelente Tutorial aprendizaje de Python3.pdf
 
Parallel python sistemas operativos avanzados
Parallel python sistemas operativos avanzadosParallel python sistemas operativos avanzados
Parallel python sistemas operativos avanzados
 

Más de Wilson Bautista

Solucion de-problemas-de-ingenieria-con-matlab
Solucion de-problemas-de-ingenieria-con-matlabSolucion de-problemas-de-ingenieria-con-matlab
Solucion de-problemas-de-ingenieria-con-matlabWilson Bautista
 
Informe panel de control
Informe panel de controlInforme panel de control
Informe panel de controlWilson Bautista
 
Mapa de procesos proyecto inventfarm
Mapa de procesos proyecto inventfarmMapa de procesos proyecto inventfarm
Mapa de procesos proyecto inventfarmWilson Bautista
 
Tecnicas de recoleccion de datos esquema
Tecnicas de recoleccion de datos esquemaTecnicas de recoleccion de datos esquema
Tecnicas de recoleccion de datos esquemaWilson Bautista
 
Solucion guia mapa de procesos
Solucion guia mapa de procesosSolucion guia mapa de procesos
Solucion guia mapa de procesosWilson Bautista
 
Ensayo importancia de la fase de analisis de sistemas de informacion
Ensayo importancia de la fase de analisis de sistemas de informacionEnsayo importancia de la fase de analisis de sistemas de informacion
Ensayo importancia de la fase de analisis de sistemas de informacionWilson Bautista
 
Tecni cas recoleccion datos encuesta y entrevista.
Tecni cas recoleccion datos encuesta y entrevista.Tecni cas recoleccion datos encuesta y entrevista.
Tecni cas recoleccion datos encuesta y entrevista.Wilson Bautista
 
Fisicoculturismo guia movimientos musculacion
Fisicoculturismo   guia movimientos musculacionFisicoculturismo   guia movimientos musculacion
Fisicoculturismo guia movimientos musculacionWilson Bautista
 
Quien quiere ser millonario
Quien quiere ser millonarioQuien quiere ser millonario
Quien quiere ser millonarioWilson Bautista
 
Sistemas de informacion mercado
Sistemas de informacion mercadoSistemas de informacion mercado
Sistemas de informacion mercadoWilson Bautista
 

Más de Wilson Bautista (20)

Solucion de-problemas-de-ingenieria-con-matlab
Solucion de-problemas-de-ingenieria-con-matlabSolucion de-problemas-de-ingenieria-con-matlab
Solucion de-problemas-de-ingenieria-con-matlab
 
19 tips para css
19 tips para css19 tips para css
19 tips para css
 
Caso de uso
Caso de usoCaso de uso
Caso de uso
 
Tabla de saberes[2]
Tabla de saberes[2]Tabla de saberes[2]
Tabla de saberes[2]
 
Informe panel de control
Informe panel de controlInforme panel de control
Informe panel de control
 
Everest informe
Everest informeEverest informe
Everest informe
 
Mapa de procesos proyecto inventfarm
Mapa de procesos proyecto inventfarmMapa de procesos proyecto inventfarm
Mapa de procesos proyecto inventfarm
 
Tecnicas de recoleccion de datos esquema
Tecnicas de recoleccion de datos esquemaTecnicas de recoleccion de datos esquema
Tecnicas de recoleccion de datos esquema
 
Inventfarm avance
Inventfarm avanceInventfarm avance
Inventfarm avance
 
Inventfarm avance
Inventfarm avanceInventfarm avance
Inventfarm avance
 
Solucion guia mapa de procesos
Solucion guia mapa de procesosSolucion guia mapa de procesos
Solucion guia mapa de procesos
 
Guia mapa de procesos
Guia mapa de procesosGuia mapa de procesos
Guia mapa de procesos
 
Caso de estudio
Caso de estudioCaso de estudio
Caso de estudio
 
Algoritmo entrevista
Algoritmo entrevistaAlgoritmo entrevista
Algoritmo entrevista
 
Ensayo importancia de la fase de analisis de sistemas de informacion
Ensayo importancia de la fase de analisis de sistemas de informacionEnsayo importancia de la fase de analisis de sistemas de informacion
Ensayo importancia de la fase de analisis de sistemas de informacion
 
Taller
TallerTaller
Taller
 
Tecni cas recoleccion datos encuesta y entrevista.
Tecni cas recoleccion datos encuesta y entrevista.Tecni cas recoleccion datos encuesta y entrevista.
Tecni cas recoleccion datos encuesta y entrevista.
 
Fisicoculturismo guia movimientos musculacion
Fisicoculturismo   guia movimientos musculacionFisicoculturismo   guia movimientos musculacion
Fisicoculturismo guia movimientos musculacion
 
Quien quiere ser millonario
Quien quiere ser millonarioQuien quiere ser millonario
Quien quiere ser millonario
 
Sistemas de informacion mercado
Sistemas de informacion mercadoSistemas de informacion mercado
Sistemas de informacion mercado
 

Programacion orientada a objetos python manuel casado martín - universidad de salamanca 2003

  • 1. Programación Orientada a Objetos mayo, 2003 El lenguaje de programación Python Manuel Casado Martín Santiago Guadalajara Pérez Departamento de Informática y Automática Universidad de Salamanca
  • 2. Información de los autores: Manuel Casado Martín macamart@terra.es Santiago Guadalajara Pérez darksnt@hotmail.com Este documento puede ser libremente distribuido. © 2003 Departamento de Informática y Automática - Universidad de Salamanca.
  • 3. Resumen Este documento pretende ser una introducción a las características generales del lenguaje, como la sintaxis o el modelo objetos. Aunque este documento no sea un tutorial, proporciona la suficiente información para ayudar a auto-orientarse a los posibles futuros programadores de Python. PYTHON i
  • 4. Abstract This document intends to be an introduction to the general features of the language, like syntax or the object model. Although this document is not a tutorial, it provides enough information to help prospective Python programmers orient themselves. ii ¡Error! No se encuentra el origen de la referencia.
  • 5. Tabla de Contenidos 1. Una visión general ______1 1.1. Un poco de historia _______ 1 1.2. ¿Qué es Python? 1 2. El lenguaje de programación Python 2 2.1. Sintaxis 2 2.2. Funciones 4 2.3. Tipos de datos 5 2.4. Módulos 7 2.5. Errores y excepciones 8 3. Python como lenguaje orientado a objetos ______10 3.1. Clases 10 3.2. Herencia 14 4. Usando Python 15 4.1. Python como lenguaje de scripts 16 5. Conclusiones 19 6. Referencias 19 Índice de Figuras 1. Ejemplo de herencia____________________________________________________15 PYTHON iii
  • 6.
  • 7. 1. Una visión general de Python 1.1 Un poco de historia El lenguaje de programación Python fue creado a principios de 1990 por Guido van Rossum en Holanda como sucesor de un lenguaje anterior llamado ABC. En 1995 Guido continuó trabajando en Python en el CNRI (Corporación internacional para la búsqueda de iniciativas) en Reston, Virginia. Durante esta época lanzó varias versiones del lenguaje. A finales del año 2000 el equipo de Python se trasladó a Zope Corporation y un año después se formó PSF (Python Software Fundation), siendo Zope Corporation su principal patrocinador. Todas las versiones de Python son Open Source. Además, la mayoría de las versiones de Python que han sido liberadas desde su creación también han tenido licencia GPL (las únicas sin licencia GPL son la 1.6, 2.0, 1.6.1 y 2.1). La última versión del lenguaje es la 2.2.1 y está en continuo desarrollo (aproximadamente cada seis meses se publica una nueva versión). 1.2 ¿Qué es Python? Python es un lenguaje de programación interpretado orientado a objetos de muy alto nivel. Sus estructuras de datos de alto nivel, combinadas con tipado dinámico y ligadura dinámica lo hacen especialmente atractivo para el desarrollo de aplicaciones rápidas, así como lenguaje de scripts o medio de conexión de otros componentes ya existentes. Además, la claridad y sencillez de su sintaxis mejora notablemente la legibilidad de los programas escritos en Python y por lo tanto reduce el coste de mantenimiento del software. Python soporta además módulos y paquetes, lo que incrementa la modularidad y la reutilización de código. Permite incorporar rutinas compiladas en C para realizar funciones críticas a alta velocidad. También implementa estructuras de datos muy avanzadas (lista, tuplas, diccionarios) que pueden ser combinadas para crear otras estructuras más complejas. Su intérprete y la librería de Python están disponibles para las principales plataformas (Linux, Windows, UNIX...) en código fuente o binario y pueden ser distribuidas libremente. Asimismo, Python se caracteriza por disponer de una excelente documentación y una de las mejores guías de aprendizaje. Python está escrito en C. Existe una implementación del lenguaje Python implementada únicamente en Java: Jython. La mayoría de las librerías del Python estándar han sido ya portadas a Jython, sin embargo el desarrollo de Python es tan rápido que los desarrolladores de Jython tienen problemas para portar todas las innovaciones. 1.2.1 Python es un lenguaje interpretado Se entiende por “lenguaje interpretado” aquel lenguaje cuyas instrucciones se ejecutan directamente a partir del código fuente. Para ejecutar el código de este lenguaje es necesario un intérprete, que va recibiendo líneas de código y las traducirá a lenguaje máquina para que se ejecuten. A diferencia de los lenguajes compilados no se produce código ejecutable, de modo que para ejecutar el código en diferentes plataformas solo hay que cambiar el intérprete, no el código. -1-
  • 8. El lenguaje de programación Python El hecho de ser un lenguaje interpretado hace que Python sea, a priori, más lento que los lenguajes compilados. Sin embargo, dado que Python se suele utilizar en programas cortos, las diferencias al final no resultan muy significativas. Además, si necesitamos velocidad y eficiencia en una determinada rutina podemos implementarla en C e importarla a nuestro código. 2. El lenguaje de programación Python Las posibilidades que ofrece este lenguaje como lenguaje de programación son muy amplias y completas. Esta es una pequeña introducción a las características más destacables. 2.1. Sintaxis Uno de los rasgos más importantes de Python es la claridad de su sintaxis. Se debe tener en cuenta que Python es un lenguaje de programación muy cercano al pseudo-código. De hecho llega a ser considerado como pseudo-código ejecutable. La sintaxis de Python es realmente sencilla. No hay palabras reservadas para iniciar o finalizar bloques ni programas, no es necesario declarar variables... Ejemplo código en Python: # Ejemplo opcion = “salir” if opcion == “salir”: print “Ha decidido salir” valor = 1 print “saliendo...” Para definir bloques de código se usa solamente la tabulación, sin llaves ni begin/end. En el ejemplo, el código print “Ha decidido salir” valor = 1 constituiría un bloque, que se ejecutará en caso de que la variable opcion contenga la cadena salir. El hecho de usar la tabulación para marcar el inicio y fin de un bloque hace que Python presente siempre y obligatoriamente una estructura muy ordenada. Las líneas que comiencen por # son comentarios y el intérprete hace caso omiso de ellas. 2.2 Estructuras de control 2.2.1. Sentencia while El bucle while funciona de manera similar a otros lenguajes: PYTHON 2
  • 9. Casado y Guadalajara while i<10: print i i = i+3 Podemos incluir una sentencia else en un bucle while, que se ejecutará cuando éste finalice, a no se que hayamos salido de él con una sentencia break: while i<10: print i i = i+3 else: print “i ya no es menor que 10” 2.2.2. Sentencia if El bucle if es también muy similar a otros lenguajes: if nota >= 5: print “Aprobado” else: print “Suspenso” Tanto en Python como en C, 0 es falso y lo demás es cierto. Se usa como negación la palabra not. if not(x%2): return 1 2.2.3. Sentencia for El bucle for es ligeramente diferente a como lo conocemos en otros lenguajes. En Python la sentencia for debe ir seguida por una lista o tupla. Se dispone de la instrucción range para generar un conjunto de valores desde 0 hasta el valor que fijemos o entre dos valores que queramos. for x in range(3): print x La salida sería: 0 1 2 3 PYTHON
  • 10. El lenguaje de programación Python En este otro ejemplo: numero = 10 secuencia = [1,2,’Salamanca’,’Avila’,numero] for x in secuencia: print x Obtendríamos la salida 1 2 Salamanca Avila 10 2.3 Funciones Las funciones se definen con la palabra reservada def seguida del identificador de la función y entre paréntesis los parámetros sin especificar el tipo. Ejemplo: def mi_funcion(x): print “Digo”,x mi_funcion(‘Hola’) La salida sería: Digo Hola En Python todos los parámetros se pasan por referencia. Tiene la posibilidad de pasar argumentos con nombre, argumentos por omisión o manejar un número de argumentos variable para una función. Otra cosa que lo hace peculiar es el hecho de poder tratar las funciones como valores. Así se pueden hacer cosas como: def mi_funcion(x): print "Digo",x decir = mi_funcion decir("Que tal") PYTHON 4
  • 11. Casado y Guadalajara decir(10) Cuya salida es: Digo Que tal Digo 10 Al igual que en C, en Python no se distingue entre funciones y procedimientos. Las funciones devuelven por defecto el valor None. Para devolver un valor determinado se emplea la sentencia return. def mi_funcion(x): argumento = x return 0 valor = mi_funcion(10) print "La funcion 'mi_funcion' devuelve el valor:",valor Cuya salida sería La funcion 'mi_funcion' devuelve el valor: 0 Todo en Python son objetos, incluso las funciones. Un atributo especialmente interesante es __doc__. En este atributo se almacenan las llamadas “cadenas de documentación”, que son cadenas de texto que se colocan en la línea siguiente a la definición de la función. Sirven para aclarar que hace la función y son muy útiles cuando trabajamos sobre código que ha escrito otro programador. Un ejemplo muy simple: def cuad(x): “Devuelve el cuadrado del valor pasado como argumento” return x*x print cuad.__doc__ Cuya salida es Devuelve el cuadrado del valor pasado como argumento 2.4 Tipos de datos Merecen especialmente atención tres tipos de datos complejos que Python implementa directamente. Estos son las listas, tuplas y diccionarios 5 PYTHON
  • 12. El lenguaje de programación Python 2.4.1 Listas El tipo de datos más versátil e interesante en Python son las listas. Las listas en Python se escriben como un conjunto de valores entre corchetes separados por comas. Estos valores no tienen por que ser del mimo tipo: >>> a = ['hola', 'adios', 100, 1234] >>> a ['hola', 'adios', 100, 1234] Existen numerosas funciones implementadas que permiten fácilmente insertar un elemento en la lista, extraerlo, concatenar listas, etc. Gracias a estos métodos es muy sencillo utilizar una lista como pila...: >>> 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] o como cola: >>> queue = ["Luis", "Daniel", "Lucia"] >>> queue.append("Miguel") >>> queue.append("Elena") >>> queue.pop(0) 'Luis' >>> queue.pop(0) PYTHON 6
  • 13. Casado y Guadalajara 'Daniel' >>> queue ['Lucia', 'Miguel', 'Elena'] En este caso, para extraer un elemento del principio de la cola será necesario llamar a la función pop() con el argumento 0 2.4.2 Tuplas Las tuplas son similares a las listas, salvo que en este caso no son mutables, no se pueden modificar sus elementos: >>> tupla = (1,4324,233.45,'hola') >>> tupla[1] = 'noooo' Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesn't support item assignment 2.4.3 Diccionarios Los diccionarios o memorias asociativas son pares clave-valor donde clave puede ser cualquier objeto no mutable. Las claves han de ser únicas dentro de un diccionario. Ejemplo: >>> telefono = {'maria':3331234,'luis':5551235} >>> telefono {'luis': 5551235, 'maria': 3331234} >>> telefono['maria'] 3331234 >>> telefono.keys() ['luis', 'maria'] >>> telefono.has_key('maria') 1 >>> telefono.has_key('alberto') 0 2.5 Módulos Un módulo en Python es un fichero con extensión .py que contiene definiciones e implementaciones de funciones. Existe en Python un gran conjunto de módulos, cada uno de ellos especializado en un campo de aplicación determinado. Precisamente, una de las razones por las que Python es un lenguaje potente y extremadamente útil es por la gran colección de módulos con que se distribuye. Cualquier programador de Python puede crear sus propios módulos añadiendo así funciones que simplifican la programación en un ámbito cualquiera y poniéndolas a disposición de otros programadores. 7 PYTHON
  • 14. El lenguaje de programación Python Estos módulos pueden ser importados dentro de otros módulos o dentro del módulo principal. Las sentencias import ... from permiten a un módulo hacer referencia a objetos del espacio de nombres de otro módulo, con la diferencia de que from Matematicas import integral añade integral al espacio de nombres del módulo actual como una referencia al objeto externo en cuestión mientras que import Matematicas importa el módulo Matemáticas permitiendo hacer referencia a cualquier objeto del espacio de nombres de Matemáticas, como por ejemplo Matemáticas.integral 2.6 Errores y excepciones Se pueden distinguir en Python dos tipos de errores: errores de sintaxis y excepciones. 2.6.1 Errores de sintaxis Se producen al escribir algo erróneo en el intérprete, este señala lo sucedido marcando el error, el nombre del fichero y el número de línea del que procede el error (los dos últimos, si la entrada viene de un fichero). while 1 print ’Hola mundo’ ^ SyntaxError: invalid syntax 2.6.2 Excepciones Aunque una expresión sea sintácticamente correcta, puede originar un error al intentar ejecutarla, a este tipo de error que se produce durante la ejecución se le llama excepción, que no implican la destrucción de la aplicación y se pueden gestionar en Python. Una excepción es de la forma: >>> 10 * (1/0) Traceback (innermost last): File "<stdin>", line 1 ZeroDivisionError: integer division or modulo Las excepciones pueden ser de diversos tipos. En la biblioteca de referencia que incorpora la distribución del lenguaje se enumeran las excepciones internas y sus respectivos significados. PYTHON 8
  • 15. Casado y Guadalajara Las excepciones se pueden gestionar dentro de un programa, como muestra el ejemplo: >>> while 1: ... try: ... x = int(raw_input("Introduzca un numero: ")) ... break ... except ValueError: ... print "El valor introducido no es un numero valido" ... Primero se ejecuta la cláusula try. Si no se produce ningún error la cláusula except es saltada. Si se produce un error que corresponde con el tipo de error que indica alguna sentencia except, se ejecuta su código (en este caso, si el tipo de error fuese ValueError, se imprimiría “EL valor introducido no es un numero valido”). Se puede usar la cláusula except omitiendo el nombre de la excepción para hacerla de propósito general: import string, sys try: f = open('myfile.txt') s = f.readline() i = int(string.strip(s)) except IOError, (errno, strerror): print "I/O error(%s): %s" % (errno, strerror) except ValueError: print "Could not convert data to an integer." except: print "Unexpected error:", sys.exc_info()[0] raise En el ejemplo, si no se produce un error de entrada/salida ni un error de valor, se mostraría el mensaje "Unexpected error:". Existe también la posibilidad de forzar excepciones o de crear excepciones definidas por el usuario. 3. Python como lenguaje orientado a objetos 9 PYTHON
  • 16. El lenguaje de programación Python 3.1 Clases Las clases en Python no ponen una barrera absoluta entre la definición y el usuario, sino que más bien se fían de la buena educación del programador para no invadir la definición. El mecanismo de herencia soporta la herencia múltiple, los métodos pueden ser redefinidos en las clases derivadas y un método puede llamar a otro del mismo nombre de una clase base. Los objetos pueden contener una cantidad arbitraria de atributos. Como se diría en C++ todos los miembros de una clase son públicos y todas las funciones método son virtuales. No hay constructores ni destructores. En Python todo son objetos, lo que implica que una clase (como un tipo de datos) es en si misma un objeto. Esto proporciona la semántica de importar y renombrar. Es posible redefinir los operadores internos con sintaxis especial. Normalmente se define objeto como una instancia de una clase, pero en Python esta definición no es correcta, ya que en hay tipos de datos que no son clases (enteros, listas, ficheros...), sin embargo, todos los tipos de Python comparten algo de semántica común, descrita adecuadamente mediante la palabra “objeto”. Los objetos tienen individualidad y en Python se pueden asignar varios nombres a un mismo objeto (“generación de alias”, que en algunos aspectos se parecen a los punteros), que cuando el objeto es inmutable no es importante, pero cuando el objeto es mutable y se cambia su estado, se acceda con el nombre que se acceda el objeto esta actualizado (de esta forma también se elimina el tener que traspasar parámetros mediante dos mecanismos). 3.1.1 Ámbitos y espacios nominales: Un espacio nominal es una correspondencia entre nombres y objetos. Ejemplos de espacios nominales: - Conjunto de nombres internos (funciones y excepciones internas). - Los nombres globales de un módulo. - Los nombres locales dentro de una llamada a función. En cierto sentido, los atributos de un objeto también forman un espacio nominal. No hay ninguna relación entre los nombres de dos espacios nominales distintos. Los espacios nominales se crean en diferentes momentos y tienen tiempos de vida diferentes. El espacio nominal que contiene los nombres internos se crea al arrancar el intérprete de Python y no se borra nunca. El espacio nominal de un módulo se crea al leer la definición del módulo y normalmente duran hasta que se sale del intérprete. El espacio nominal local de una función se crea al llamar a la función, y se borra cuando se sale de la misma, mediante una sentencia return, o bien mediante alguna excepción que la función no captura. Un ámbito es una región textual de un programa Python donde el espacio nominal es directamente accesible, es decir, los nombres que encuentra una referencia sin calificar (sin puntos). Aunque los ámbitos se determinan estáticamente, se usan dinámicamente. En cualquier punto de la ejecución existen tres ámbitos anidados (accesibles directamente): el interior (nombres locales), el medio (nombres globales del módulo) y el externo (nombres internos). Un asunto especial de Python es que las asignaciones siempre van en el ámbito más interno, no copian datos, simplemente asignan nombres a objetos. Lo mismo es válido para los borrados. Las operaciones que introducen nombres nuevos utilizan el ámbito local, y se puede utilizar la sentencia global para indicar que la variable reside en el ámbito global. PYTHON 10
  • 17. Casado y Guadalajara 3.1.2 Sintaxis: La forma más fácil de definir una clase es de la forma: class nombreClase: <sentencia-1> . . . <sentencia-N> Cuando se crea una clase nueva, se genera un nuevo “espacio nominal” (correspondencia entre nombres y objetos) que se utiliza como ámbito local. Para que la definición de una clase tenga efecto tiene que ejecutarse, esto implica que sea válido introducir una definición de una clase dentro de una sentencia “if” o similar. En un primer momento las sentencias dentro de una clase deberían ser funciones, aunque es posible poner cualquier otro tipo de sentencia, lo que puede resultar en algunos casos muy útil. Cuando se abandona una definición de clase de manera normal (se ejecuta la última línea de su código), se crea un objeto de clase. Es, sencillamente, un envoltorio del contenido del espacio nominal creado por la definición de la clase. El ámbito local original (el que estaba activo cuando se entró en la definición de clase) se reinstancia y el objeto clase se enlaza con el nombre de clase dado en la cabecera de la función (en el ejemplo nombreClase). 3.1.3 Objetos clase: Los objetos en Python soportan dos tipos de operaciones: 1.- Referencias a atributos: para acceder a un atributo de un objeto se sigue la sintaxis estándar de Python (obj.nombre). Los nombres de atributos válidos son todos los nombres que estaban en el espacio nominal de la clase cuando fue creada la clase. 2.- Instanciación de una clase: para instanciar una clase se sigue la notación de funciones, es decir, es suficiente con imaginar que la es una llamada a una función que no tiene parámetros y que devuelve una instancia nueva de la clase. Así, para la definición de la clase: class MiClase: i = 12345 def f(x): return 'hola, mundo' MiClase.i y MiClase.f serían referencias a atributos válidas, que devuelven un entero y un objeto método, respectivamente. Con la sentencia x = MiClase () se crea una nueva instancia de la clase y se la asigna a la variable local “x”. Esta operación genera un objeto vacío. Para asignarle un estado inicial conocido se puede definir un método especial llamado __init__(). Cuando se crea una clase que define un método __init__() al instanciar un objeto de la clase se llama automáticamente al método __init__(). 11 PYTHON
  • 18. El lenguaje de programación Python El método __init__() puede recibir parámetros, lo que añade una gran cantidad de posibilidades. Estos parámetros los recibirá de los argumentos proporcionados al operador de instanciación de la clase, por ejemplo: class Complejo: def __init__(self, parteReal, parteImaginaria): self.r = parteReal self.i = parteImaginaria x = Complejo(3.0,-4.5) 3.1.4 Objetos instancia: Los objetos instancias poseen: 1.- Atributos de datos: son aquellos que se denominan “miembros dato” en C++ y que en Python no hace falta declarar, sino que aparecen cuando se les asigna por primera vez un valor. Conviene recordar que estos atributos son siempre “públicos”, como se diría en C++ y que es tarea del programador no romper y mantener el encapsulado. 2.- Métodos: un método es una función que “pertenece a” un objeto. 3.1.5 Objetos método: Normalmente se llama a un método de forma inmediata (obj.método()) pero es posible no hacerlo. obj.método es un objeto método y se puede almacenar para recuperar más tarde. Lo que tienen de especial los métodos es que el objeto que los llama se pasa como primer argumento de la función. En general, llamar a un método con una lista de argumentos es equivalente a llamar a la función correspondiente con la lista de argumentos resultante de insertar el objeto del método al principio de la lista de argumentos original. Cuando se hace referencia a un atributo de una instancia que no es un atributo de datos, se busca en su clase. Si el nombre denota un atributo de clase válido que resulta ser un objeto función, se crea un objeto método empaquetando juntos (punteros hacia) el objeto instancia y el objeto función recién encontrado en un objeto abstracto: el objeto método. Cuando se llama al objeto método con una lista de argumentos, se desempaqueta de nuevo, se construye una nueva lista de argumentos a partir del objeto instancia y la lista de argumentos original y se llama al objeto función con la nueva lista de argumentos. Ejemplo: xf = x.f while 1: print xf() Los atributos de datos se tienen en cuenta en lugar de los atributos método con el mismo nombre, para evitar estos conflictos nominales que son difíciles de detectar conviene usar un patrón a la hora de escoger los nombres para los atributos y lo métodos. Por ejemplo empezar los atributos con un guión bajo y los métodos con una letra mayúscula, o algo similar. PYTHON 12
  • 19. Casado y Guadalajara Tanto los métodos como los usuarios de un objeto pueden acceder a los atributos del objeto, puesto que todos los atributos y métodos son ‘públicos’, es decir, no se puede implementar un tipo de datos abstracto puro. En Python no es posible “ocultar” los atributos, todo se basa en convenciones y en la buena disciplina del programador. Los clientes deben utilizar los atributos de datos con sumo cuidado, ya que pueden introducir nuevos atributos de datos propios a una instancia de un objeto, y si no se elige un nombre acertado o coherente puede haber conflictos nominales o incluso afectar al buen funcionamiento de un método. Por convención, el primer parámetro que recibe un método se suele denominar self, y aunque no es obligatorio ayuda a que el código pueda ser más legible por otros programadores, incluso no es extraño que pueda haber navegadores de clases que supongan que se sigue esta notación. Cualquier objeto función que es atributo de una clase define un método para las instancias de esa clase, aunque no es necesario que la implementación de esa función este encerrada en la definición de la clase, es decir, asignar un objeto función a una variable local de una clase es válido, por ejemplo: # Función definida fuera de la clase def f1(self, x, y): return min(x, x+y) class C: f = f1 def g(self): return ’hola, mundo’ h = g Ahora f, g y h son atributos de la clase C, que hacen referencia a objetos función, por lo que los tres son métodos de las instancias de la clase C. Los métodos pueden llamar a otros métodos utilizando los atributos métodos del argumento self. Por ejemplo: class Bolsa: def __init__(self): self.datos = [] def agregar(self, x): self.datos.append(x) def agregarDosVeces(self, x): self.add(x) self.add(x) Los métodos pueden hacer referencia a las variables globales del mismo modo que lo hacen las funciones. Aunque es raro encontrar un buen motivo para que un método use una variable 13 PYTHON
  • 20. El lenguaje de programación Python global, hay casos en los que es legítimo el uso del ámbito global, es decir, los métodos pueden utilizar las funciones y los módulos importados al ámbito global. Normalmente, la clase que contiene al método esta definida en este ámbito global. 3.2 Herencia Python a diferencia de otros lenguajes soporta los dos tipos de herencia, simple y múltiple: Herencia simple: es el tipo de herencia en el cuál la clase derivada solo hereda las características de una clase base. La sintaxis de definición de una clase derivada es de la forma: class nombreClaseDerivada(nombreClaseBase): <sentencia-1> . . . <sentencia-N> El nombre nombreClaseBase debe estar definido en un ámbito que contenga la definición de la clase derivada. En lugar de una clase base también se permite una expresión, que suele resultar útil cuando la clase base está definida en otro módulo. La ejecución de la definición de la ejecución de la clase derivada se lleva acabo del mismo modo que en la clase base. Cuando se construye un objeto de la clase derivada se recuerda la clase base. Esto se utiliza para resolver referencias a atributos: si no se encuentra el atributo solicitado en la clase derivada se busca en la clase base, y así de forma recursiva. Se puede instanciar una clase derivada de forma similar a una clase base: nombreClaseDerivada(). Las referencias a métodos se resuelve buscando el atributo en la clase correspondiente, descendiendo por la cadena de clases base (si es necesario). Las clases derivadas pueden redefinir los métodos, si es necesario, de sus clases base (es como si todas las funciones fueran virtuales en C++). También se permite que se amplíe un método, sin remplazarlo por completo, de la siguiente forma: nombreClaseBase.nombreMétodo(self, argumentos). Herencia múltiple: La clase derivada recibe las características de más de una clase base. La sintaxis de definición es de la siguiente forma: PYTHON 14
  • 21. Casado y Guadalajara class nombreClaseDerivada(Base1, Base2, Base3): <sentencia-1> . . . <sentencia-N> La única regla necesaria para explicar la semántica es la regla de resolución utilizada para las referencias a los atributos de la clase. Se busca primero en profundidad y luego de izquierda a derecha. Así pues, primero se busca en la clase derivada, sino se encuentra en la clase Base1 y sus clases base, sino en la clase Base2 y sus clases base y así sucesivamente. Parece más natural buscar primero en Base1 y luego en Base2 antes de entrar a examinar las clases base de Base1, pero esta forma exigiría conocer si un atributo particular de Base1 esta realmente definido en Base1 o en sus clases base, pudiendo originar conflictos de nombres con la Base2. Como Python no diferencia se recibe los atributos de una clase base de forma directa o heredados, no se genera este problema. Un ejemplo es el de la figura: A B def f() C D def f() (nueva definición) E Figura 1 – Ejemplo de herencia E es clase derivada de las clases base C y D, por lo que en E esta definido el método f. Si desde una instancia de E se ejecutará el método f, la implementación que realmente se ejecutaría sería la de B, porque primero buscaría en C, que es derivada de B pero no tiene la implementación de f, luego buscaría en B (y no en D), y como tiene la definición de f no seguiría buscando. Si se quisiera usar el método de la clase D, habría que indicarlo de la manera D.f() De esto se puede deducir en una instancia de una clase derivada que hereda de dos clases base que tienen una clase base común, solo tendrá una copia de los atributos y métodos de la clase base común. 4. Usando Python Cuando se desarrolla un script para la shell de un sistema operativo, se comprueba que conforme aumenta la complejidad, aumenta enormemente el tamaño del mismo y se hace más difícil de entender, más lento... 15 PYTHON
  • 22. El lenguaje de programación Python Otra situación que puede resultar familiar es el desarrollo de un programa que requiere el uso de numerosas librerías y donde el común ciclo escritura/compilación/prueba/re-compilación es demasiado lento y se necesita desarrollar software más rápidamente. En ambos casos Python es el lenguaje ideal de programación. Permite desarrollar software más rápidamente, más sencillo y de menor tamaño ya que: - Los tipos de datos de alto nivel permiten expresar operaciones complejas en una sola sentencia - No se necesita la declaración de variables - Los bloques de código se identifican por el tabulado Se puede partir un programa en módulos que pueden emplearse en el desarrollo de otros programas. Igualmente Python incorpora un conjunto de módulos básicos como de I/O, llamadas al sistema, shockets, interfaz gráfica de usuario... Además es extensible, de manera que es posible incorporar funciones o módulos de otros lenguajes que puedan resultar más eficientes en una determinada situación. Python puede ser usado como lenguaje de scripts, para la administración de sistemas, como generador de código (especialmente en el ámbito de desarrollo web), para el desarrollo de interfaces gráficas de usuario o cualquier otra tarea computacional. 4.1 Python como lenguaje de scripts A menudo Python suele ser definido como “lenguaje de scripts”, lo cual es un error. Python es un lenguaje de programación completo que soporta scripts, pero es mucho más que eso. Aún así es en este campo donde mayor implantación tiene Python y probablemente donde mayor eficacia presta. Pero ¿qué es un script? Un script es un conjunto de instrucciones que se ejecutan paso a paso, instrucción a instrucción. Están especialmente indicados para pequeños programas que necesiten interactuar de manera más o menos fluida con el Sistema Operativo. Los lenguajes de scripts se conocen con el nombre de middleware ya que son capaces de gestionar transferencias de datos entre aplicaciones o entre aplicaciones y el SO. Habitualmente se pueden ampliar mediante plugins o módulos (en el caso de Python) e incluso pueden ser empotrados en otras aplicaciones. Ejemplo: script que realiza la búsqueda en Google y devuelve los resultados: import httplib URL = 'www.google.com' COD_BUSQUEDA = '/search?num=100&q=' CABECERA = '<b>...</b> n<br><font color=#008000>' PYTHON 16
  • 23. Casado y Guadalajara FIN = ' ' NUM_RESULTADOS = 10 MAX_RESULTADOS = 50 def formateaQuery(query): from string import join a = query.split() return join(a,'+') def google(query=None,n=None): if n is None: n = NUM_RESULTADOS if query is None: print "No se ha efectuado la busqueda" return -1 busqueda = run(query,n) if busqueda == -2: print 'La busqueda para %s no ha arrojado resultados.'%(query.replace('+',' ')) return if busqueda == -1: print 'No se ha podido efectuar la conexion' return for x in busqueda: print x def run(query,n): try: conn = httplib.HTTPConnection(URL) conn.request("GET",COD_BUSQUEDA+formateaQuery(query)) r = conn.getresponse() except: print 'No se ha podido efectuar la conexion' return -1 if r.reason == 'OK': data = r.read() else: 17 PYTHON
  • 24. El lenguaje de programación Python return -1 conn.close aux = data.split(CABECERA) #Hay que desechar el primer elemento aux.pop(0) if len(aux)==0: return -2 busqueda = [] i=0 while n!=0 and i<MAX_RESULTADOS: try: a = aux[i].split(FIN,2)[0] if a!=' ': busqueda.append('http://'+a) n-=1 except: pass i+=1 return busqueda Ahora lo ejecutamos: >>> google("salamanca",10) http://www.readysoft.es/home/cisalamanca/salamanca/ http://www.cyberspain.com/ciudades-patrimonio/isalaman.htm http://www.cyberspain.com/ciudades-patrimonio/esalaman.htm http://www.salamancaciudad.com/ http://www3.usal.es/~sabus/bibliotecas/pagprincipalbib.htm http://www3.usal.es/~farmacia/ http://www.elperiodico.es/salamanca/ http://www.salamancawireless.net/ http://www.arteguias.com/mudejar_salamanca.htm http://www.guiasalamanca.com/ PYTHON 18
  • 25. Casado y Guadalajara 5. Conclusiones El tipado dinámico, la ligadura tardía, la gran cantidad de módulos de Python y la simplicidad de su sintaxis hacen que los programas escritos con este lenguaje sean realmente cortos y rápidos de desarrollar, aunque el rendimiento baja bastante cuando el programa es un poco extenso. La gran cantidad de módulos y librerías de las que dispone hacen que el ámbito de utilización de Python sea muy extenso, abarcando desde gestión de sistemas y proyectos web hasta interfaces gráficas de usuario, sin olvidarse de los scripts. Python es usado por grandes compañías como: Google, HP, IBM y Red Hat. Ejemplo de utilización Python: un trabajo con muchos módulos o ficheros distintos, y al final de cada día se quiere hacer una copia de seguridad en un disquete de todos ellos, en vez de estar copiándolos a mano, o hacer un programa en C, o C++ (que puede ser un trabajo tedioso), lo mejor es hacer un pequeño programa escrito en Python. 6. Referencias [1] La pagina oficial de Python: http://www.python.org [2] Noticias sobre Python: http://www.pythonware.com/daily/index.htm [3] Completa documentación de Python en español: http://usuarios.lycos.es/arturosa/index.html [4] Documentación de Python en español de sourceforge: http://sourceforge.net/projects/pyspanishdoc [5] Informes interesantes sobre programación (herencia múltiple): http://www.informit.com/index.asp?session_id={4C573D38-B34A-4B1B-95A1- A04A8129E780} [6] Pagina de Zope Corporation: http://www.zope.com [7] Interesante artículo general sobre Python: http://www.networkcomputing.com [8] Eckel, Bruce “Thinking in Python, Design Patters and Problem Solving Techniques” [9] Andrés Marzal “Introducción a la programación en Python” [10] Pilgrim, Marck. “Dive into Python” 19 PYTHON