[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