Sesión 3

Anuncio
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Índice de Contenidos :.
Introducción :: 1
Intérprete :: 2
Conceptos Básicos :: 3
Estructuración de código :: 4
Programación OO :: 5
Pygame :: 6
Scripting Python – C :: 7
Referencias :: 8
Sesión 3 :: Transp. 2
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
¿Qué es Python? :.
●
Python no es un lenguaje únicamente de consola.
●
Python es potente y rápido.
●
Python es muy sencillo.
●
Python está en continuo crecimiento.
Sesión 3 :: Transp. 3
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Características I :.
●
Alto nivel
●
Interpretado
●
Interactivo
●
Orientado a objetos
●
OpenSource(certificación OSI)
- copyright pero su uso no tiene restricciones
- compatible licencia GPL a partir de versión 2.1.1
Sesión 3 :: Transp. 4
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Características II :.
●
Extensible
- C / C++ / Fortran
- Java( utilizando Jython)
●
Encastrable en aplicaciones
●
Multiplataforma. Portable.
Unix/Linux, Windows, Mac, PalmOS, WindowsCE, RiscOS, VxWorks, QNX,
OS/2, OS/390, AS/400, PlayStation, Sharp Zaurus, BeOS, VMS…
●
Seguro(no: “core dumps”, “segmentation fault” )
●
Rápido y cómodo
Sesión 3 :: Transp. 5
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Propiedades del Lenguaje :.
●
Cualquier elemento es un objeto
●
Paquetes, módulos, clases, funciones
●
Manejo de excepciones
●
Tipado dinámico, polimorfismo
●
Tipado fuerte
●
Sobrecarga de operadores
●
Bloques estructurales identificados por tabulación
●
Sensible a mayúsculas/minúsculas
Sesión 3 :: Transp. 6
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
¿Para que se utiliza? :.
●
Prototipado rápido
●
Programación Web(tanto en cliente como en servidor)
●
Scripting
●
En aplicaciones científicas
●
Procesamiento de XML
●
Aplicaciones de bases de datos
●
Aplicaciones GUI
●
Educación
Sesión 3 :: Transp. 7
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Interfaces con... :.
XML
● DOM
● XMLRPC, SOAP, Web Services
● Bases de datos relacionales
● MySQL, PostgreSQL, Oracle , ODBC, Sybase, Informix
● Java (via Jython)
● Objective C
● COM, DCOM (.NET también)
● Muchas librerías GUI
● Multiplataforma(Tk, wxWindows, GTK, Qt)
● Específicas de plataforma(MFC, Mac (classic, Cocoa), X11
●
Sesión 3 :: Transp. 8
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Arquitectura de Python :.
Script Fuente
Modulo Fuente
Extensión C/C++
Compilador
Python
Extensión
C/C++
Librería
C/C++
Externa
Bytecode
Compilado
Máquina
Virtual Python
¿Disponible
módulo
compilado?
Sentencia Import
Salida
Sesión 3 :: Transp. 9
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Python vs. otros lenguajes I :.
Sesión 3 :: Transp. 10
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Python vs. otros lenguajes II :.
Java
class Hola {
public static void main(String argumentos[ ]){
System.out.println("Hola, mundo");
}
}
C
Pascal
Program Hola;
Begin
writeln('Hola, mundo');
End.
void main(){
printf ("Hola, mundo");
}
Python
print 'Hola, mundo'
Sesión 3 :: Transp. 11
[Contenido] 1. Introducción :: 2. Intérprete :: 3. Conceptos Básicos
Python vs. otros lenguajes III :.
Escribir programas en Python requiere menos de la mitad de tiempo
que en Java, C o C++.
●
●
El código resultante es la mitad de largo.
●
No hay diferencias en la fiabilidad de los programas.
El consumo de memoria es alrededor del doble frente a C y C++. Java
consume alrededor del doble de Python.
●
●
El código en Python es más rápido que en Java.
●
Los lenguajes de script más rápidos son Python y Perl.
La variación en rendimiento de los programas se debe más a los
programadores que a los lenguajes.
●
Sesión 3 :: Transp. 12
[Contenido] 2. Intérprete :: 3.Conceptos Básicos :: 4. Estructuración
¿Qué es un intérprete? :.
Aquel programa que recibe como entrada un programa
escrito en lenguaje no máquina y lo convierte a código
máquina ejecutable por el computador.
●
●
Ejecución secuencial de instrucciones
●
No generación de ejecutables
●
Portabilidad: cambiando el intérprete no el código...
Sesión 3 :: Transp. 13
[Contenido] 2. Intérprete :: 3.Conceptos Básicos :: 4. Estructuración
Instalación :.
Windows:
Selección del directorio de destino
Si/No copia de seguridad de archivos reemplazados
Seleccionar componentes
...
URL de descarga:
Linux:
http://www.python.org
Red Hat : rpm
Debian: apt-get install python
...
Source: python-2.X.tgz
tar -zxvf python-2.X.tgz
"./configure", "make", "make install"
Sesión 3 :: Transp. 14
[Contenido] 2. Intérprete :: 3.Conceptos Básicos :: 4. Estructuración
Primera toma de contacto... :.
●
●
Iniciar intérprete:python
python fichero.py
Salir del intéprete:
Unix: Ctrl-D ó Ctrl-Z
 Windows: Ctrl-Z + return
 En ambos: “ import sys; sys.exit() ”

●
Modo interactivo:
“>>>”
“...”
●
Gestión de errores
Ejemplo A:
>>> x = 1
>>> if x:
...
print “hola mundo”
...
Ejemplo B: Como calculadora
Sesión 3 :: Transp. 15
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Sintaxis :.
●
¡Sin delimitadores de bloque! ⇨Tabuladores
●
Esto obliga a “código sangrado”
●
La instrucción termina con la línea (salvo uso “\”)
●
Uso de “:” como separador de sentencias compuestas.
●
Uso de “;” para separar sentencias en la misma línea.
●
Recolector
Referencias”.
●
de
Basura:
Uso
del
“Contador
de
Sesión 3 :: Transp. 16
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Variables :.
●
“Nacen” cuando se les asigna valor
●
“Desaparecen” cuando se sale de su ámbito
●
Peligros:
- utilizar variables sin valor previamente asignado
- se tiene la variable i = 5 y se cometer el error de j=7
cuando se quiere i=7... Se crea una nueva variable
●
Recordar: Python es sensible a mayúsculas/minúsculas
Sesión 3 :: Transp. 17
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos I :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
Sesión 3 :: Transp. 18
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos II :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Operaciones: + - * / **
●
Paréntesis para agrupaciones
●
Trunca la división entera
>>>1 / 2
0
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
●
●
>>>1.0 / 2.0
0.5
La división entera retorna el valor “suelo”
>>>7 / 3
2
>>>7 / -3
-3
Sesión 3 :: Transp. 19
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos III :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
●
Tamaño arbitrario
●
“L”
●
Ejemplos:
>>>2L * 100
200L
>>>2L ** 50
1125899906842624L
>>>123456789987654321123456789 * 2
246913579975308642246913578L
Sesión 3 :: Transp. 20
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos IV :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
●
Soporte completo para punto flotante
>>>2.20 / 5.0
0.44000000000000006
>>>10. * ( 3.5 / 2.)
17.5
Operaciones con operadores mixtos se
convierten a punto flotante:
●
>>>3
*
4.78
/
3.
4.7800000000000002
>>>9.75 / 4
2.4375
Sesión 3 :: Transp. 21
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos V :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
●
Sufijo parte imaginaria: “j” or “J”
●
Formato: “(real+imagj)”
●
Función complex(real,imag)
>>>1j + 4J
5j
>>>4j * 10j
(-40+0j)
>>> 4+5j / 3J
(5.666666666666667+0j)
>>> 1j * complex(1,1)
(-1+1j)
Sesión 3 :: Transp. 22
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos VI :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
Representados como números en punto
flotante. Ejemplo:
>>> a = 1.5 + 0.5j
>>> a.real
1.5
>>> a.imag
0.5
●
●
Funciones de conversión:
●
float()
●
int()
●
long()
Sesión 3 :: Transp. 23
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos VII :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
●
Definidos por:
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
Sesión 3 :: Transp. 24
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos VIII :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
●
Operaciones:
“hola”+“mundo” ‘hola mundo’
“hola”*2
‘holahola’
“hola”[0]
‘h’
“hola”[-1]
‘a’
“hola”[1:3]
‘ol’
“hola”[:2]
‘ho’
“hola”[1:]
‘ola’
‘h’+‘ola’[:2] ‘hol’
len(“hola”)
4
“hola” < “lola” true
‘o’ in “hola”
true
Concatenación
Repetición
Indexado positivo
Indexado negativo
Particionado
Longitud
Comparación
Búsqueda
Sesión 3 :: Transp. 25
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos IX :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
●
Agrupaciones de elementos de cualquier tipo
>>>a =[“hola”,100,’j’,“mundo”]
●
Los mismos operadores que para las cadenas
●
Indexado y particionado
●
Ejemplos:
>>>a[0] = 96
>>>a[1:2] = [“hola”,”mundo”,”...”]
>>>del a[-1]
>>>len(a)
>>>a[1:-1]
>>>2*a
Sesión 3 :: Transp. 26
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos X :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
●
Más operaciones...
>>>a = range(5)
#[0,1,2,3,4]
>>>a.append(5)
#[0,1,2,3,4,5]
>>>a.extend([6])
#[0,1,2,3,4,5,6]
>>>a.count(3)
#1
>>>a.insert(0,-1)
#[-1,0,1,2,3,4,5,6]
>>>a.pop()
#6
>>>a.pop(0)
#-1
>>>a.remove(3)
#[0,1,2,4,5]
>>>a.reverse()
#[5,4,2,1,0]
>>>a.sort()
#[0,1,2,4,5]
Sesión 3 :: Transp. 27
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos XI :.
●
Numéricos
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
●
Lista inmutable
●
Se definen igual que una lista
●
●
●
Secuencia
●
●
●
Cadenas
Listas
Tuplas
Diccionarios
●
El conjunto de elementos se encierra entre
paréntesis en lugar de entre corchetes.
Los elementos presentan un orden definido
[0..n] ó [-n..-1]
●
Porciones (se obtienen nuevas = listas)
●
No presentan métodos
●
¿por qué su existencia?
Más rápidas que las listas ⇒ Ideales para
- conjunto constante de valores
- claves de un diccionario
Sesión 3 :: Transp. 28
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos XII :.
●
Numéricos
●
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Secuencia
●
●
●
Cadenas
Listas
Tuplas
●
Ejemplos...
>>> t = ("a","b","10","z","example")
>>> t
('a','b','10','z','example')
>>> t[0]
'a'
>>> t[-1]
'example'
>>> t[1:3]
('b','10')
Diccionarios
●
Sesión 3 :: Transp. 29
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos XIII :.
●
Numéricos
●
●
●
●
●
Secuencia
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Cadenas
Listas
Tuplas
Diccionarios
●
“arrays asociativos”, “tablas hash”
●
Indexados por “claves”
●
Las claves = cualquier tipo inmutable
●
Las claves pueden ser números o cadenas
●
●
Formación:
{ clave:valor, clave:valor,...}
Ejemplo:
>>>tel={'juan':2324, 'paco':6217}
>>>tel['paco']
6217
Sesión 3 :: Transp. 30
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Tipos de Datos XIV :.
●
Numéricos
●
●
●
●
●
Secuencia
●
●
●
●
Enteros (32 bits)
Enteros Largos
Reales
Complejos
Cadenas
Listas
Tuplas
Diccionarios
●
Operaciones...
>>>tel={'juan':2324,'paco':6217} #crear
>>>tel['juan']=2335
#modificar
>>>tel['luis']=3839
#insertar
>>>del tel[‘juan’]
#eliminar
>>>tel.keys()
['luis', 'paco']
#claves
>>>tel.values()
[3839, 6217]
#valores
>>>tel.items()
#elementos
[('luis', 3839), ('paco', 6217)]
>>>tel.has_key(‘carlos’)
False
#Presencia
Sesión 3 :: Transp. 31
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Estructuras de Control I :.
●
if condición:
instrucciones
[elif condición:
instrucciones]...
else:
instrucciones
●
Ejemplo...
>>>x = int(raw_input("Numero?"))
>>>if x < 0:
...
print "numero negativo"
...elif x==0:
...
print 'cero'
...elif x > 0:
...
print "numero positivo"
...else:
...
print "error“
...
Sesión 3 :: Transp. 32
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Estructuras de Control II :.
●
for var in secuencia:
instrucciones
Función: range()
●
Ejemplo...
>>>s = ['coche','casa','abrigo']
>>>for x in s:
...
print x,len(x)
...
>>>range(5)
[0,1,2,3,4]
>>>for x in range(len(s)):
...
print x, s[x]
...
NB: si se precisa modificar la lista sobre la que se
itera debe iterarse sobre una copia: for x in s[:]:
Sesión 3 :: Transp. 33
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Estructuras de Control III :.
●
while condición:
instrucciones
●
Ejemplo...
>>>s = int(raw_input("Numero?"))
>>>x=0
>>>while x < s:
...
print x
...
x += 2
...
Sesión 3 :: Transp. 34
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Estructuras de Control IV :.
●
break
continue
● pass
● return
● else:
●
instrucciones
●
Ejemplo...
>>>for n in range(2,10):
...
for x in range(2,n):
...
if n % x == 0:
...
print n,’=’,x,’*’,n/x
...
break
...
else:
...
print n,’es numero primo’
...
>>>while True:
...
Pass
...
Sesión 3 :: Transp. 35
[Contenido] 3.Conceptos Básicos :: 4. Estructuración de código
Estructuras de Control V :.
●
try:
instrucciones
except tipo_excepción:
instrucciones
else:
instrucciones
●
try:
instrucciones
finally:
instrucciones
●
Ejemplo...
>>>for arg in sys.argv[1:]:
... try:
...
f = open(arg,’r’)
... except IOError:
...
print ‘no se puede abrir’,arg
... else:
...
print arg,’tiene’,len(f.readlines()),’lineas’
...
f.close()
...
>>>f = open(miFichero)
>>>try:
... ordenaFichero(f)
...finally:
... close(f)
...
Sesión 3 :: Transp. 36
[Contenido] 4. Estructuración de código :: 5. Programación OO
Funciones I :.
●
def name(arg1, arg2,...):
"""documentación"""
Instrucciones
return
return expresión
●
#cadena de documentación oficial
#para procedimiento. Similar a:return None
#para función
Ejemplo...
>>>def
...
...
...
...
...
...
fib(n):
"""Genera la serie de Fibonacci hasta n"""
a, b = 0, 1
while b < n:
print b
a,b= b, a+b
return
Sesión 3 :: Transp. 37
[Contenido] 4. Estructuración de código :: 5. Programación OO
Funciones II :.
●
Paso de argumentos:
● paso por valor aunque... paso por referencia de objeto
● si cambio de referencia de una variable dentro de una función, no se
afecta a la variable de la llamada.
●
sin embargo se puede modificar el objeto al que referencia un
parámetro.
●
Ejemplo 1:
def func1(n):
n = n + 4
print n
x = 10
func1(x)
print x
●
Ejemplo 2:
●
Ejemplo 3:
def func2(l):
l.append("tres")
def func3(lista):
lista=["L","M","X"]
miLista=["uno","dos"]
print miLista
func2(miLista)
print miLista
miLista=["uno","dos"]
print miLista
func3(miLista)
print miLista
Sesión 3 :: Transp. 38
[Contenido] 4. Estructuración de código :: 5. Programación OO
Funciones III :.
Las parámetros pueden presentar valores por defecto
● Los valores por defecto sólo se evalúan una vez
● Un función puede aceptar un secuencia arbitraria de parámetros(se
recogen en una tupla)
●
●
●
Ejemplo 1:
def func5(n, cont=1):
i=0
while i<n:
print i
i += cont
func5(4)
print "-----"
func5(7,2)
print "-----"
func5(100,cont=10)
Ejemplo 2:
def f(a,l=[]):
l.append(a)
return l
print f(1)
print f(2)
print f(3)
●
Ejemplo 3:
def printList(*args):
for arg in args:
print "arg: "+arg
printList("casa", "os", "hola")
Sesión 3 :: Transp. 39
[Contenido] 4. Estructuración de código :: 5. Programación OO
Módulos :.
●
Módulo ≈ agrupación de funciones relacionadas... ≈ script
Las definiciones de un módulo se pueden importar en otros
módulos
●
●
Nombre de archivo( *.py ) ≡ Nombre módulo
Importación:
● import nombre_módulo
● nombre_módulo.nombreelemento
● from nombre_módulo import función1, función2
● from nombre_módulo import *
● Búsqueda de módulos en la variable de entorno PYTHONPATH y en
el directorio actual
●
Sesión 3 :: Transp. 40
[Contenido] 4. Estructuración de código :: 5. Programación OO
Paquetes :.
●
Paquete ≈ agrupación de módulos relacionados
Puede ser en varios niveles
● Importación:
● from nombrePaquete.nombreMódulo... import *
● from nombrePaquete.nombreMódulo... import función
●
Sesión 3 :: Transp. 41
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Introducción :.
●
●
●
Soporta gran parte de los aspectos de la programación OO
Aspectos:
✔ herencia – herencia múltiple
✔ polimorfismo
✔ clases abstractas
Todos los tipos de datos son objetos
Sesión 3 :: Transp. 42
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Clases I :.
class name
"""documentación"""
atributos
def nombreMétodo (args):
instrucciones
...
class coche:
numRuedas=0
numPuertas=0
def __init__(self,numR,numP):
coche.numRuedas = numR
coche.numPuertas = numP
def setRuedas(self, num):
coche.numRuedas = num
def setPuertas(self,num):
coche.numPuertas = num
def getRuedas(self):
return coche.numRuedas
def getPuertas(self):
return coche.numPuertas
Sesión 3 :: Transp. 43
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Clases II :.
●
Creación de instancias de objetos
●
Ejemplo...
c = coche(4,5)
c.setPuertas(3)
print c.getPuertas()
●
Variable de clase vs. Instancia de variable
●
Ejemplo...
c1 = coche(4,3)
c2 = coche(4,5)
print c1.getPuertas()
print c2.getPuertas()
Sesión 3 :: Transp. 44
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Clases III :.
●
Ejemplo...
class coche:
numRuedas=0
numPuertas=0
●
Utilización del parámetro self
def __init__(self,numR,numP):
self.numRuedas = numR
self.numPuertas = numP
def setRuedas(self, num):
self.numRuedas = num
def setPuertas(self,num):
self.numPuertas = num
def getRuedas(self):
return self.numRuedas
def getPuertas(self):
return self.numPuertas
●
Ejemplo...
c1 = coche(4,3)
c2 = coche(4,5)
print c1.getPuertas()
print c2.getPuertas()
Sesión 3 :: Transp. 45
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Clases IV :.
●
En cualquier momento se puede añadir, modificar o borrar atributos
●
Ejemplo...
c1 = coche(4,5)
coche.marca = 'seat'
c2 = coche(4,3)
print c2.marca
print c1.marca
●
Atributos privados
●
Ejemplo...
class coche:
__numRuedas=0
__numPuertas=0
def __init__(self,numR,numP):
self.__numRuedas = numR
self.__numPuertas = numP
NB: Afecta a todas las
instancias de la clase
def setRuedas(self, num):
self.__numRuedas = num
.
.
.
Sesión 3 :: Transp. 46
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Herencia I :.
●
Herencia simple:
class clase1:
...
class clase2(clase1):
...
●
Ejemplo...
class coche:
.
.
.
class deportivo(coche):
__velocidadMax=0

Ejemplo...
c1 = deportivo(4,5)
c1.setVelocidadMax(200)
print c1.getVelocidadMax()
print c1.getPuertas()
def setVelocidadMax(self, v):
self.__velocidadMax = v
def getVelocidadMax(self):
return self.__velocidadMax
Sesión 3 :: Transp. 47
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Herencia II :.
●
Herencia múltiple:
class clase1:
...
class clase2:
...
class clase3(clase1,clase2):
...
coche
avion
deportivo
Sesión 3 :: Transp. 48
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Herencia III :.
 class avion:
__potencia=0
class coche:
__numRuedas=0
__numPuertas=0
def __init__(self,pot):
self.__potencia=pot
def getPotencia(self):
return self.__potencia
def setPotencia(self,pot):
self.__potencia=pot
class deportivo(coche,avion):
__velocidadMax=0
def __init__(self,nR,nP,pot):
coche.__init__(self,nR,nP)
avion.__init__(self,pot)
def setVelocidadMax(self, v):
self.__velocidadMax = v
def __init__(self,numR,numP):
self.__numRuedas=numR
self.__numPuertas=numP
def setRuedas(self, num):
self.__numRuedas = num
def setPuertas(self,num):
self.__numPuertas = num
def getRuedas(self):
return self.__numRuedas
def getPuertas(self):
return self.__numPuertas
def getVelocidadMax(self):
return self.__velocidadMax
Sesión 3 :: Transp. 49
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Herencia IV :.
●
Ejemplo...
c1 = deportivo(4,5,1000)
c1.setVelocidadMax(200)
print c1.getVelocidadMax()
print c1.getPuertas()
print c1.getPotencia()
●
Pueden generarse problemas de ambigüedad con la herencia múltiple.
Solución: Se analizan los ancestros de la clase por orden
de declaración en la lista de herencias.
Sesión 3 :: Transp. 50
[Contenido] 5. Programación OO :: 6. Pygame :: 7 Scripting Python - C
Otros Aspectos :.
●
Las clases pueden agruparse en módulos y en paquetes.
●
Se pueden sobrescribir métodos
●
Se adecuan fácilmente para la implementación de “patrones software”
Sesión 3 :: Transp. 51
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Introducción :.
Conjunto de módulos Python (escritos en Python y C) diseñados para
el desarrollo juegos.
●
●
●
Recubren la librería SDL(Simple Directmedia Library)
● SDL: Librería multiplataforma para manejar elementos multimedia
(audio, teclado, ratón, joystick, hardware 3D via OpenGL,...) escrita
en C ≅ DirectX
Pygame + SDL adecuados para juegos 2D
Sesión 3 :: Transp. 52
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Instalación :.
●
●
Windows:
●
Previamente instalado Python
●
pygame-1.X.win32-py2.X.exe
Linux:
●
Red-Hat: RPM
●
Debian: apt-get install pygame
URL de descarga:
http://www.pygame.org
Sesión 3 :: Transp. 53
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Ejemplo I :.
import sys, pygame
pygame.init()
size = width, height = 640, 480
speed1 = [2 , 2]
speed2 = [2 , -2]
#color background: RGB
darkblue= 2,7,10
#create screen
screen = pygame.display.set_mode(size)
#create images
ball1 = pygame.image.load("ball.png")
ball1Rect = ball1.get_rect()
ball2 = pygame.image.load("ball.png")
ball2Rect = ball2.get_rect()
explo = pygame.image.load("bang.jpeg")
exploRect = explo.get_rect()
Sesión 3 :: Transp. 54
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Ejemplo II :.
#Ball2: initial position
ball2Rect.centerx = 400
ball2Rect.centery = 200
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
#Move balls
ball1Rect = ball1Rect.move(speed1)
if ball1Rect.left < 0 or ball1Rect.right > width:
speed1[0] = -speed1[0]
if ball1Rect.top < 0 or ball1Rect.bottom > height:
speed1[1] = -speed1[1]
ball2Rect = ball2Rect.move(speed2)
if ball2Rect.left < 0 or ball2Rect.right > width:
speed2[0] = -speed2[0]
if ball2Rect.top < 0 or ball2Rect.bottom > height:
speed2[1] = -speed2[1]
screen.fill(darkblue)
Sesión 3 :: Transp. 55
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Ejemplo III :.
#collision detection
if (ball1Rect.colliderect(ball2Rect) or ball2Rect.colliderect(ball1Rect)) :
speed1[0] = -speed1[0]
speed2[0] = -speed1[0]
exploRect.centerx = (ball1Rect.centerx+ball2Rect.centerx)/2
exploRect.centery = (ball1Rect.centery+ball2Rect.centery)/2
screen.blit(explo,exploRect)
else:
screen.blit(ball1, ball1Rect)
screen.blit(ball2,ball2Rect)
pygame.display.flip()
Sesión 3 :: Transp. 56
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Imágenes ... :.
def load_image(name, colorkey=None):
fullname = os.path.join('data',name)
try:
image = pygame.image.load(fullname)
except pygame.error, message:
print 'No se pudo cargar imagen', fullname
raise SystemExit, message
image = image.convert()
if colorkey is not None:
if colorkey is -1:
colorkey = image.get_at((0,0))
image.set_colorkey(colorkey, RLEACCEL)
return image, image.get_rect()
Sesión 3 :: Transp. 57
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Sonido y texto... :.
def load_sound(name):
fullname = os.path.join('data',name)
try:
sound = pygame.mixer.Sound(fullname)
except pygame.error, message:
print 'No se pudo cargar sonido:', fullname
raise SystemExit, message
return sound
if pygame.font:
font = pygame.font.Font(None,36)
text = font.render(“Curso de Desarrollo de Videojuegos”,1,(10,10,10))
textpos = text.get_rect(centerx=background.get_width()/2)
background.blit(text, textpos)
Sesión 3 :: Transp. 58
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Eventos ... :.
...
for event in pygame.event.get():
if event.type == QUIT:
return
elif event.type == KEYDOWN and event.key == K_ESCAPE:
return
elif event.type == MOUSEBUTTONDOWN:
...
elif event.type == MOUSEBUTTONUP:
...
Sesión 3 :: Transp. 59
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
“Sprites” I :.
●
Sprite ≈ objeto animado en un juego 2D
●
Objetivo: mejorar la “rapidez” del juego
●
Módulo “sprite” = clase sprite + clase group
●
Un grupo es un contenedor de “sprites”
●
Todo “sprite” siempre pertenece a un grupo como mínimo
●
Ejemplos: “PACMAN” = pac + fantasmas + cerezas
“SPACE INVADERS” = nave + naves enemigas + disparos
Sesión 3 :: Transp. 60
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
“Sprites” II :.
●
Tipos de grupos:
●
Group
●
GroupSingle
●
●
●
●
Contiene el último “sprite” añadido
RenderPlain
●
Varios sprites
●
Método draw()
RenderClear
●
Varios sprites
●
Método clear()
RenderUpdates
●
Varios sprites
Permite obtener una lista de los objetos pygame “Rects”, los cuales
representan áreas que han cambiado.
●
Sesión 3 :: Transp. 61
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
“Sprites” III :.
●
Detección de colisiones:
● spritecollide(sprite,group,dokill) -> list
for bomba in sprite.spritecollide(jugador, bombas, 1):
bomba_sonido.play()
explosion(bomba,0)
●
groupcollide(group1,group2,dokill1,dokill2) -> dictionary
for alien in sprite.groupcollide(aliens, disparos, 1, 1).keys():
bomba_sonido.play()
explosion(alien, 0)
Sesión 3 :: Transp. 62
[Contenido] 6. Pygame :: 7 Scripting Python – C :: 8 Referencias
Propuesta :.
●
Implementar el juego de:
“ Las tres en raya ”
Sesión 3 :: Transp. 63
[Contenido] 7. Scripting Python – C :: 8. Referencias
Introducción :.
●
●
Ventajas
✔
descomponer el código en componentes específicos. (P.e.: AI)
✔
flexibilizar y agilizar el desarrollo y mantenimiento
✔
prevención y control de errores
✔
aislar el código del motor del juego...
Desventajas
¿?Pueden mermar el rendimiento
C/C++
Python
JNI(Java Native Interface)
Java
Sesión 3 :: Transp. 64
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C I :.
●
Acciones que se pueden ejecutar...:
●
funcionalidades disponibles en Python
●
un script Python
●
una función contenida en un módulo Python
●
●
convertir los valores de los datos de C a Python
realizar la llamada a la función Python utilizando los valores
convertidos
●
convertir los valores de los datos de Python a C
Sesión 3 :: Transp. 65
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C II :.
●
Archivo de cabecera: <Python.h>
●
Intérprete de Python: Py_Initialize() - Py_Finalize()
●
Existen llamadas para ejecutar código en el intérprete como:
●
●
int PyRun_SimpleString(char *command)
●
int PyRun_SimpleFile(FILE *fp, char *filename)
Ejemplo...
#include <Python.h>
int main(int argc, char *argv[]){
Py_Initialize();
PyRun_SimpleString("import socket");
PyRun_SimpleString("address = socket.gethostbyname('localhost')");
PyRun_SimpleString("print \"[Ejemplo1]: Direccion IP(localhost): %s\" %address");
Py_Finalize();
return 0;
}
Sesión 3 :: Transp. 66
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C III :.
●
PyObject:
●
●
Puntero a un tipo de datos que representa un objeto Python
En más profundidad...¿cómo utilizar un función de un módulo Python?
●
Inicializar el intérprete de Python: Py-Initialize()
●
Importar el módulo Python:
●
PyObject* PyImport_ImportModule(char *name)
●
PyObject* PyString_FromString(const char *v)
PyObject* PyImport_Import(PyObject *name)
Sesión 3 :: Transp. 67
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C IV :.
●
Acceder a la función:
PyObject* PyObject_GetAttrString(PyObject *o, char *attr_name)
●
Convertir valores de datos de C a Python:
PyObject* Py_BuildValue(char *format, ...)
Py_BuildValue("")
Py_BuildValue("i", 123)
Py_BuildValue("iii", 123, 456, 789)
Py_BuildValue("s", "hello")
Py_BuildValue("ss", "hello", "world")
Py_BuildValue("()")
Py_BuildValue("(i)", 123)
Py_BuildValue("(i,i)", 123, 456)
Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456)
Py_BuildValue("((ii)(ii)) (ii)", 1, 2, 3, 4, 5, 6)
None
123
(123, 456, 789)
'hello'
('hello', 'world')
()
(123,)
(123, 456)
{'abc': 123, 'def': 456}
(((1, 2), (3, 4)), (5, 6))
Sesión 3 :: Transp. 68
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C V :.
●
Llamar a la función:
PyObject* PyEval_CallObject(PyObject* func, PyObject* args)
●
Convertir valores de datos de Python a C:
int PyArg_Parse(PyObject *args, char *format, ...)
●
Comprobación de excepciones:
PyObject* PyErr_Occurred( )
void PyErr_Print()
●
Finalizar el intérprete: Py_Finalize()
Sesión 3 :: Transp. 69
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C VI :.
#include <Python.h>
#define NELEM 3
int main(int argc, char *argv[]){
PyObject *mymod, *pFunc, *pName, *pValue, *pArgs, *pList;
char *cReverse;
int i;
float num = 15.0;
int lista[NELEM]={1,2,3};
int listaR[NELEM];
Py_Initialize();
/* Annadir a PYTHONPATH el directorio actual de trabajo */
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('.')");
/* Importar modulo */
pName = PyString_FromString("reverse");
mymod = PyImport_Import(pName);
Sesión 3 :: Transp. 70
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C VII :.
if(mymod != NULL){
/* Invertir una cadena de texto */
pFunc = PyObject_GetAttrString (mymod, "rString");
pArgs = Py_BuildValue ("(s)","Hola Mundo");
pValue = PyEval_CallObject(pFunc, pArgs);
PyArg_Parse(pValue, "s", &cReverse);
printf("Inversa de la cadena -Hola Mundo- : %s \n", cReverse);
if (PyErr_Occurred()) PyErr_Print();
/* Inversa de un numero */
pFunc = PyObject_GetAttrString (mymod, "rNum");
pArgs = Py_BuildValue ("(f)", num);
pValue = PyEval_CallObject(pFunc, pArgs);
PyArg_Parse(pValue, "f", &num);
printf("Inversa del numero 15.0 : %f \n", num);
if (PyErr_Occurred()) PyErr_Print();
Sesión 3 :: Transp. 71
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C VIII :.
/* Inversa de una lista */
pFunc = PyObject_GetAttrString (mymod, "rList");
pArgs = Py_BuildValue ("([i,i,i])",lista[0],lista[1],lista[2]);
pList = PyEval_CallObject(pFunc, pArgs);
if( PyList_Check(pList)){
for(i=0; i<NELEM; i++){
pValue = PyList_GetItem(pList, i);
listaR[i] =(int)PyInt_AsLong(pValue);
}
}else
printf("No devuelto tipo lista");
printf("Inversa de la lista [%i,%i,%i]: [%i %i %i] \n",lista[0],lista[1],
lista[2],listaR[0],listaR[1],listaR[2]);
if (PyErr_Occurred()) PyErr_Print();
}else{
PyErr_Print();
fprintf(stderr, "Error al cargar el modulo \n");
return -1;
}
Py_Finalize();
return 0;
}
Sesión 3 :: Transp. 72
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C IX :.
LINUX(Debian) - makefile
CFLAGS = -c -g -ansi -Wall
LNKFLAGS = -g -Wall
CC
= gcc
LIBS = -L"/usr/lib/python2.3" -lpython2.3
INCS = -I"/usr/include/python2.3"
OBJS = ejemplo2.o
BIN = ejemplo2
all: $(BIN)
clean:
rm -f $(OBJ) $(BIN)
$(BIN): $(OBJS)
$(CC) $(LNKFLAGS) $(INCS) $(LIBS) $(OBJS) -o$(BIN)
ejemplo2.o: ejemplo2.c
$(CC) $(CFLAGS) $(INCS) $(LIBS) -o ejemplo2.o ejemplo2.c
Sesión 3 :: Transp. 73
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C X :.
Windows – Dev-c++
Sesión 3 :: Transp. 74
[Contenido] 7. Scripting Python – C :: 8. Referencias
Integrando Python en C XI :.
Windows – Dev-c++
●
Generar libpython2X.a (libpython22.a, libpython23.a, ...)
1. Descargarse pexport(http://starship.python.net/crew/kernr/mingw32/pexports-0.42h.zip)
2. Obtener Python2X.dll (Python22.dll, Python23.dll)
3. Ejecutar: pexports python2X.dll > python2X.def
4. Ejecutar: (dlltoll es una utilidad de MinGW)
dlltool --dllname python2X.dll --def python2X.def --output-lib libpython2X.a
5. Copiar libpython2X.a en X:\XXX\python2X\libs\ (en la misma
ubicación que python2X.lib)
Sesión 3 :: Transp. 75
[Contenido] 8. Referencias
Referencias :.
●
●
http://www.python.org
Web oficial del lenguaje.
http://www.cbel.com/python_programming_language/
Enlaces a gran cantidad de librerías para python.
http://pyspanishdoc.sourceforge.net/
Proyecto en sourceforge de traducción de la documentación de
python al Castellano.
●
●
http://www.pygame.org
Sesión 3 :: Transp. 76
[Contenido] Anexo
Anexo. Tipado Dinámico :.
Tipado dinámico
>>> a = 7
>>> # a es un entero ...
>>> a = ‘C2P'
>>> # a es una cadena ...
>>> a = [1,7,‘C2P']
>>> # a es una lista
Tipado fuerte
>>>'C2P' + 1
Traceback (most recent call last): File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
>>>'C2P' + str(1)
'C2P1'
Sesión 3 :: Transp. 77
Descargar