Transcript
[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
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:
●
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 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 #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 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 "", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects >>>'C2P' + str(1) 'C2P1' Sesión 3 :: Transp. 77