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)
- No ofrece strong typing (fuertemente tipado)
¿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