UNIDAD II

Lenguajes Imperativos

Profesor Miguel Cantillana

INS240 – Lenguajes de Programación
Ingeniería en Computación e Informática
Semestre 2017-1

Programación orientada a objetos con Python

Índice

  • Python básico
    • Sintaxis
    • Instrucciones básicas
    • Tipo de datos
    • Estructuras de control
  • Orientación a objetos

Python

  • Python fue creado por Guido van Rossum (http://www.python.org/~guido/)
    • Da este nombre al lenguaje inspirado por el popular grupo cómico británico Monty Python    
  • Guido creó Python durante unas vacaciones de navidad en las que (al parecer) se estaba aburriendo

Hola Mundo en Python

#!/usr/bin/env python 
print "Hola Mundo" # "Hola Mundo"

print "hola", "mundo" # "hola mundo"

print "Hola" + "Mundo" # "HolaMundo"

Características de Python I

  • Muy legible y elegante
    • Imposible escribir código ofuscado
  • Simple y poderoso
    • Minimalista: todo aquello innecesario no hay que escribirlo (;, {, }, '\n')
    • Muy denso: poco código hace mucho
    • Soporta objetos y estructuras de datos de alto nivel: strings, listas, diccionarios, etc.
    • Múltiples niveles de organizar código: funciones, clases, módulos, y paquetes
  • Si hay áreas que son lentas se pueden reemplazar por plugins en C o C++, siguiendo la API para extender o empotrar Python en una aplicación.

Características de Python II

  • De scripting
    • No tienes que declarar constantes y variables antes de utilizarlas
    • No requiere paso de compilación/linkage
      • La primera vez que se ejecuta un script de Python se compila y genera bytecode que es luego interpretado
    • Alta velocidad de desarrollo y buen rendimiento
  • Código interoperable (como en Java "write once run everywhere")
    • Se puede utilizar en múltiples plataforma (más aún que Java)
    • Puedes incluso ejecutar Python dentro de una JVM (Jython)

Características de Python II

  • Open source
    • Razón por la cual la Python Library sigue creciendo
  • De propósito general
    • Puedes hacer en Python todo lo que puedes hacer con C# o Java, o más

Peculiaridades sintácticas

  • Python usa tabulación (o espaciado) para mostrar estructura de bloques
    • Tabula una vez para indicar comienzo de bloque
    • Des-tabula para indicar el final del bloque
if (x) {
   if (y) {
      f1();
   }
   f2();
}

Código en C/Java

if x:
   if y: 
      f1() 
   f2() 

Código en Python

Python vs. Java

  • Java es un lenguaje de programación muy completo que ofrece:
    • Amplio abanico de tipos de datos
    • Soporte para threads
    • Strong typing
    • Y mucho más ...
  • Python es un lenguaje de scripting:
    • No ofrece strong typing (fuertemente tipado)
      • Bueno para prototipos pero malo para grandes sistemas
    • Todo lo que puedes hacer con Java también lo puedes hacer con Python
      • Incluso puedes acceder a través de Python a las API de Java si usas Jython (http://www.jython.org)

¿Para qué [no] es útil?

  • Python no es el lenguaje perfecto, no es bueno para:
    • Programación de bajo nivel (system-programming), como programación de drivers y kernels
    • Python es de demasiado alto nivel, no hay control directo sobre memoria y otras tareas de bajo nivel
    • Aplicaciones que requieren alta capacidad de computo
      • No hay nada mejor para este tipo de aplicaciones que el viejo C

¿Para qué [no] es útil?

  • Python es ideal:
    • Como lenguaje "pegamento" para combinar varios componentes juntos
    • Para llevar a cabo prototipos de sistema
    • Para la elaboración de aplicaciones cliente
    • Para desarrollo web y de sistemas distribuidos
    • Para el desarrollo de tareas científicas, en los que hay que simular y prototipar rápidamente

Instalar Python

https://www.python.org/downloads/

Python interactivo

mcantillana :: ~ » python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

# Un comando simple:
>>> print "Hola Mundo"
Hola Mundo
>>>
# Para salir del intérprete Ctrl-D (en Linux) o Ctrl-Z (en Windows) o:
>>> import sys 
>>> sys.exit() 
mcantillana :: ~

Ejecutando programa holamundo.py

#!/usr/bin/env python
print “Hola Mundo!"
$ python helloworld.py 
Hola Mundo! 
  • Python desde script:
    • Guardar las siguientes sentencias en fichero: holamundo.py
  • Ejecutar el script desde línea de comando:

Sentencias y bloques

# comentarios de línea se indican con carácter '#'
name = "Diego1" # asignación de valor a variable  
if name == "Diego":
    print "Aupa Diego" 
else:
    print "¿Quién eres?" 
    print "¡No eres Diego!"  


$ python bloque.py
¿Quién eres? 
¡No eres Diego!
  • Las sentencias acaban en nueva línea, no en ;
  • Los bloques son indicados por tabulación que sigue a una sentencia acabada en ':'. E.j. (bloque.py):

Identificadores

  • Los identificadores sirven para nombrar variables, funciones y módulos
    • Deben empezar con un carácter no numérico y contener letras, números y '_'
    • Python es case sensitive
  • Palabras reservadas:
    • and elif global or assert else if pass break except import print class exec in raise continue finally is return def for lambda try del from not while  

Identificadores

  • Variables y funciones delimitadas por __ corresponden a símbolos implícitamente definidos:
    • __name__ nombre de función
    • __doc__ documentación sobre una función
    • __init__() constructor de una clase
    • __dict__, diccionario utilizado para guardar los atributos de un objeto

Tipos de datos I

  • Numéricos (integer, long integer, floating-point, and complex)
>>> x = 4 
>>> int (x) 
4 
>>> long(x) 
4L 
>>> float(x) 
4.0 
>>> complex (4, .2) 
(4+0.2j) 

Tipos de datos III

  • El módulo string de la Python library define métodos para manipulación de strings:
>>> import string 
>>> s1 = 'La vida es mejor con Python' 
>>> string.find(s1, 'Python') 
21
  • '%' es el operador de formateo de cadenas:
>>> provincia = 'Araba' 
>>> "La capital de %s es %s"  % (provincia, "Gasteiz")
'La capital de Araba es Gasteiz'
  • Los caracteres de formateo son los mismos que en C, p.e. d, f, x

Tipos de datos II

  • Algunos de los métodos que se pueden aplicar a un string son:
>>> len('La vida es mucho mejor con Python.')
>>> 34 
>>> 'La vida es mucho mejor con Python.'.upper() 
'LA VIDA ES MUCHO MEJOR CON PYTHON'
>>> "La vida es mucho mejor con Python".find("Python")
27 
>>> "La vida es mucho mejor con Python".find('Perl') 
-1 
>>> 'La vida es mucho mejor con Python'.replace('Python', 'Jython') 
'La vida es mucho mejor con Jython' 

Tipos de datos IV

  • Para poder escribir caracteres con acentos es necesario introducir la siguiente línea al comienzo de un programa Python:
    • # -*- coding: iso-8859-1 -*-
  • Los strings en formato unicode se declaran precediendo el string de una ‘u’:
    • print u'¿Qué tal estás?'

Tipos de datos V

Listas []

  • Indexadas por un entero comienzan en 0:
>>> meses = ["Enero", "Febrero"] 
>>> print meses[0] 
Enero 
>>> meses.append("Marzo") 
>>> print meses 
['Enero', 'Febrero', 'Marzo'] 
  • Dos puntos (:) es el operador de rodajas, permite trabajar con una porción de la lista, el elemento indicado por el segundo parámetro no se incluye:
>>> print meses[1:2]
['Febrero']

Tipos de datos V

  • Más (+) es el operador de concatenación:
>>> print meses+meses
['Enero', 'Febrero', 'Marzo', 'Enero', 'Febrero', 'Marzo']

Tipos de datos VI

  • Las listas pueden contener cualquier tipo de objetos Python:
>>> meses.append (meses) 
>>> print meses 
['Enero', 'Febrero', 'Marzo', ['Enero', 'Febrero', 'Marzo' ]]
>>> meses.append(1)
['Enero', 'Febrero', 'Marzo', ['Enero', 'Febrero', 'Marzo' ], 1]
  • Para añadir un elemento a una lista: 
>>> items = [4, 6]
>>> items.insert(0, -1) 
>>> items 
[-1, 4, 6] 

Tipos de datos VI

  • Para usar una lista como una pila, se pueden usar append y pop:
>>> items.append(555) 
>>> items [-1, 4, 6, 555] 
>>> items.pop() 
555 
>>> items [-1, 4, 6] 

Tipos de datos VII

  • Tuplas (), lo mismo que listas, pero no se pueden modificar
    D:\>python
mcantillana :: ~ » python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> mitupla = ('a', 1, "hola")
>>> mitupla[2]
'hola'
>>> mitupla[0] = 20

Tipos de datos VIII

  • Diccionarios {} arrays asociativos o mapas, indexados por una clave, la cual puede ser cualquier objeto Python, aunque normalmente es una tupla:D:\>python
>>> mydict = {"altura" : "media", "habilidad" : "intermedia", "salario" : 1000 } 
>>> print mydict 
{altura': 'media', 'habilidad': 'intermedia', 'salario': 1000} 
>>> print mydict["habilidad"] 
intermedia
  • Puedes comprobar la existencia de una clave en un diccionario usando has_key:
if mydict.has_key('altura'):
    print 'Nodo encontrado'
  • Lo mismo se podría hacer:
if 'altura' in mydict:
    print 'Nodo encontrado' 

 condicionales

  • E.j.  (condicional.py)
q = 4 
h = 5 
if q < h : 
   print "primer test pasado" 
elif q == 4:
   print “q tiene valor 4”
else: 
   print "segundo test pasado" 
>>> python condicional.py
primer test pasado
  • Operadores booleanos: "or," "and," "not"
  • Operadores relacionales: ==, >, <, !=

Bucles / For

  • for se utiliza para iterar sobre los miembros de una secuencia
  • Se puede usar sobre cualquier tipo de datos que sea una secuencia (lista, tupla, diccionario)
# Ej. bucle.py
for x in range(1,5):
   print x 
$ python bucle.py
1 2 3 4
  • La función range crea una secuencia descrita por ([start,] end [,step]), donde los campos start y step son opcionales. Start es 0 y step es 1 por defecto. 

Bucles / While

  • while es otra sentencia de repetición.
  • Ejecuta un bloque de código hasta que una condición es falsa.
  • break nos sirve para salir de un bucle
  • Por ejemplo: 
reply = 'repite' 
while reply == 'repite': 
   print 'Hola'
   reply = raw_input('Introduce "repite" para hacerlo de nuevo: ') 
   
Hola 
Introduce "repite" para hacerlo de nuevo: repite 
Hola 
Introduce "repite" para hacerlo de nuevo: adiós 

Funciones I

  • Una función se declara usando la palabra clave def
# funcionsimple.py
def myfunc(a,b):
   sum = a + b
   return sum 
print myfunc (5,6) 
$ python funcionsimple.py
11
  • A una función se le pueden asignar parámetros por defecto:
# funcionvaloresdefecto.py
def myfunc(a=4,b=6):
   sum = a + b
   return sum
print myfunc() 
print myfunc(b=8) # a es 4, sobreescribir b a 8
$ python funcion.py
10
12

Funciones II

  • Listas de argumentos y argumentos basados en palabras clave:
# funcionargumentosvariablesyconclave.py
def testArgLists_1(*args, **kwargs): 
   print 'args:', args 
   print 'kwargs:', kwargs 
testArgLists_1('aaa', 'bbb', arg1='ccc', arg2='ddd') 
def testArgLists_2(arg0, *args, **kwargs): 
   print 'arg0: "%s"' % arg0 
   print 'args:', args 
   print 'kwargs:', kwargs 
print '=' * 40 
testArgLists_2('un primer argumento', 'aaa', 'bbb', arg1='ccc',\
                                                 arg2='ddd')

Funciones II

  • Visualizaría: 
args: ('aaa', 'bbb') 
kwargs: {'arg1': 'ccc', 'arg2': 'ddd'}
======================================== 
arg0: "un primer argumento" 
args: ('aaa', 'bbb') 
kwargs: {'arg1': 'ccc', 'arg2': 'ddd'}

Orientación a Objetos

Conceptos

  • Objeto
  • Clase
  • Mensaje
  • Método
  • Interfaz
  • Herencia

Python: Clases y Objetos

  • Python está completamente orientado a objetos: puede definir sus propias clases, heredar de las que usted defina o de las incorporadas en el lenguaje, e instanciar las clases que haya definido.
  • En Python las clases se definen mediante la palabra reservada class seguida del nombre de la clase, dos puntos (:) y a continuación, indentado, el cuerpo de la clase.

Python: Clases y Objetos

  • En este ejemplo el nombre de la clase es Ejemplo
    y no hereda de otra clase. Por convención las clases empiezan en Mayúscula.
  • Esta clase no define atributos pero no puede estar vacía para eso usamos la función pass, equivalente en otros lenguajes a usar {}
# Ejemplo:
class Ejemplo:
    pass

El método __init__

Las clases de Python no tienen constructores o destructores explícitos. Las clases de Python tienen algo
similar a un constructor: el método __init__.

import math

class Complejo(Object):
    def __init__(self, real, imaginario):
        self.real = real
        self.img = imaginario

    def abs(self):
        print math.sqrt((self.real*self.real)+(self.img*self.img))

El método __init__

  • __init__ se llama inmediatamente tras crear una instancia de la clase.
  • Sería tentador pero incorrecto denominar a esto el constructor de la clase.
  • Es tentador porque parece igual a un constructor (por convención, __init__ es el primer método definido para la clase), actúa como uno (es el primer pedazo de código que se ejecuta en una instancia de la clase recién creada), e incluso suena como uno. 
  • Incorrecto, porque el objeto ya ha sido construido para cuando se llama a __init__, y ya tiene una referencia válida a la nueva instancia de la clase. Pero __init__ es lo más parecido a un constructor que va a encontrar en Python, y cumple el mismo papel.

El método __init__

  • El primer atributo o variable de cada método de clase, incluido __init__, es siempre una referencia a la instancia actual de la clase.
  • Por convención, este argumento siempre se denomina self. En el método __init__, self se refiere al objeto recién creado; en otros métodos de la clase, se refiere a la instancia cuyo método ha sido llamado.
  • Los métodos __init__ pueden tomar cualquier cantidad de argumentos, e igual que las funciones, éstos pueden definirse con valores por defecto, haciéndoles opcionales para quien invoca.

El método __init__

  • Por convención, el primer argumento de cualquier clase de Python (la referencia a la instancia) se denomina self.
  • Cumple el papel de la palabra reservada this en C++ o Java, pero self no es una palabra reservada en Python, sino una mera convención.
  • Aunque necesita especificar self de forma explícita cuando define el método, no se especifica al invocar el método; Python lo añadirá de forma automática.

Instanciación de las
Clases

  • Crear un objeto o instanciar una clase en Python es muy sencillo.
  • Para instanciar una clase, simplemente se invoca a la clase como si fuera una función, pasando los argumentos que defina el método __init__. El valor de retorno será el objeto recién creado.

Instanciación de las
Clases

import math

class Complejo(Object):
    def __init__(self, real, imaginario):
        self.real = real
        self.img = imaginario

    def abs(self):
        print math.sqrt((self.real*self.real)+(self.img*self.img))

def main():
    numero = Complejo(3,4)
    numero.abs()

if __name__ == '__main__':
    main()

Borrar Objetos

  • Crear instancias nuevas es sencillo, destruirlas lo es más.
  • En general, no hay necesidad de liberar de forma explícita las instancias, porque se eliminan automáticamente.
  • Son raras las pérdidas de memoria en Python.

Atributos de datos

  • Python admite atributos de datos (llamados variables de
    instancia en Java, y variables miembro en C++).
  • Para hacer referencia a este atributo desde código que esté fuera de la clase, debe calificarlo con el nombre de la instancia, instancia.data, de la misma manera que calificaría una función con el nombre de su módulo.
  • Para hacer referencia a atributos de datos desde dentro de la clase, use self como calificador.
  • Por convención, todos los atributos de datos se inicializan en el método __init__. Sin embargo, esto no es un requisito, ya que los atributos, al igual que las variables locales, comienzan a existir cuando se les asigna su primer valor.

Atributos de datos

import math

class Complejo(Object):
    def __init__(self, real, imaginario):
        self.real = real
        self.img = imaginario

    def abs(self):
        print math.sqrt((self.real*self.real)+(self.img*self.img))

def main():
    numero = Complejo(3,4)
    numero.abs()

    print numero.real
    print numero.img 
        
if __name__ == '__main__':
    main()

Ejercicio 1 en clases

Diseñar un programa que modele acciones y atributos de un perrro. El programa debe permitir realizar las acciones de caminar, comer, ladrar y que tenga la posibilidad de enfermarse. Al crear un objeto perro debe comenzar con 1000 unidades de energía.

Las reglas para implementar estas acciones son las siguientes:

  • Cada vez que se alimenta al perro este se debe acumular 300 unidades de energía
  • Cada vez que el perro camine se debe restar 200 unidades de energía
  • Cada vez que el perro se enferme debe restar unidades de energía de forma aleatoria

Ejercicio 2 en clases

Crea una clase llamada Libro que guarde la información de cada uno de los libros de una biblioteca.

La clase debe guardar el título del libro, autor, número de ejemplares del libro y número de ejemplares prestados. La clase contendrá los siguientes métodos:

  • Posibilidad de crear un libro con titulo, autor y numero de ejemplares
  • Métodos que permitan actualizar el numero de ejemplares
  • Método to_string para mostrar los datos de los libros.
  • Método préstamo que incremente el atributo correspondiente cada vez que se realice un préstamo del libro. Debe devolver true si se ha podido realizar la operación y false en caso contrario. No se podrán prestar libros de los que no queden ejemplares disponibles para prestar.
  • Método devolución que decremente el atributo correspondiente cuando se produzca la devolución de un libro. No se podrán devolver libros que no se hayan prestado. Devuelve true si se ha podido realizar la operación y false en caso contrario.

UNAB: LP08

By Miguel Cantillana

UNAB: LP08

Clase 8

  • 422