Professional Documents
Culture Documents
Compupalace
Porqu
...y Antonio Ognio Cesti
antonio@linux.org.pe
Coordinador
Agenda
Qu es Python? Porqu puede ser una buena idea usarlo? Un vistazo a Python como lenguaje Django, un framework web para Python Mi experiencia usando Python Ideas para proyectos en el PLUG Conclusiones y recursos de inters
Antonio Ognio, iqueo, 32 aos, limeo desde 1994 :) Programador BASIC, 10 aos (Commodore 64) Pascal / Visual Basic a los 15 aos (386) C / C++ / Delphi / Java a los 18 aos (UPC, aos 90's) Miembro del PLUG desde 1998 PHP, Perl, Bash + Linux (Conectiva, Pantel 2000) Coordinador del PLUG desde 2000 PHP, Java, C# en Mono Peruserver (2003 2005) Java, LISP, Prolog (UPC, aos 2005 - 2009) PHP, Python El Pedregal (2006 2007) Python, Javascript, Ruby, PHP Aureal (2008 2009) Aprendiendo Erlang, Objective-C y otros lenguajes...
Qu es Python?
Lenguaje de programacin de propsito general Lenguaje de alto nivel (de abstraccin) Enfatiza la legibilidad del cdigo Permite hacer mucho trabajo manteniendo una sintaxis clara Sentencias relativamente cortas Varios paradigmas: imperativo, orientado a objetos, funcional Lenguaje dinmico, generalmente usado para escribir scripts y disponible en mltiples plataformas.
Orgenes / Historia
Creado a principios de los 90's (1991) Autor: Guido Van Rossum (GvR) CWI (Centro de Investigacon en Holanda) En 1994 adquire caractersticas de programacin funcional En 1995 se muda a USA al CNRI Desde 2001 es desarrollado por la Python Software Foundation Desde el 2005 Guido trabaja para Google
La serpiente es la mascota...
Logo
Implementaciones
Implementaciones
CPython (Implementacin original) Jython Java / JVM IronPython CLR/DLR/.Net PyPy Python Python for S60 Symbian / Nokia
Versiones en uso
Python 2.5 (RHEL, Ubuntu LTS, Mac OS X) Python 2.6 (Fedora 11+, Ubuntu 9.04+) Python 3.0 (Instalacin bajo demanda)
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Disponibilidad de binarios
Windows
(Binarios Python.org / ActiveState / Instant Python)
Linux
Todas las distribuciones incluyen Python
Mac OS X
(Pre-instalado por Apple, MacPorts, etc)
Cmo se ve el cdigo?
#!/usr/bin/env python # -*- coding: utf-8 -*import random numero = random.randrange(1, 100) respuesta = None print "Ud. deber adivinar un numero entre 1 y 100." while respuesta != numero: print "Ingrese un numero entre 1 y 100: " x = raw_input() try: x = int(x) except ValueError: print "Ud. no ha ingresado un numero entre 1 y 100!" if x > numero: print "El numero es menor" elif x < numero: print "El numero es mayor" else: print "Adivino! La respuesta era %d" % numero break
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Ejecutando el cdigo
Rendimiento
Bastante bueno pero no comparable con C, C++ Competitivo con PHP, mejor que Ruby por el momento Si hay un compilador (reporte errores de sintaxis) Se crea un archivo .pyc a la hora de ejecutar el .py Ejecuciones posteriores usan el .pyc Se puede acelerar la ejecucin con Psyco Es posible extender Python con extensiones binarias Existe una API en C para extender Python Existe Cython un lenguaje estilo Python para escribir extensiones binarias en C Google y otros estn haciendo mucho por optimizar Python para obtener el mximo rendimiento :)
El Zen de Python
Sintaxis de Python
- Un programa en Python est compuesto por una o ms lineas
lgicas. - Un linea lgica puede estar compuesta por una o ms lineas fsicas. - Las sentencias no requiere de un delimitador entre ellas como el famoso ; en C, C++, Java, JavaScript, PHP, etc. - La indentacin es significativa ya que no hay otra manera de indicar bloques de cdigo subordinados a estructuras de control o definiciones de clases y funciones.
Intrprete interactivo
Python 2.5.2 (r252:60911, Jul 22 2009, 15:35:03) [GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 1 + 1 2 >>> 'Hola' + ' ' + 'mundo' + '!' 'Hola mundo!' >>> '[repetir]' * 5 '[repetir][repetir][repetir][repetir][repetir]' >>> try: ... n = 12 / 0 ... exception ZeroDivisionError: File "<stdin>", line 3 exception ZeroDivisionError: ^ SyntaxError: invalid syntax >>> try: ... n = 12 / 0 ... except ZeroDivisionError: ... print "No se puede dividir por cero!" ... No se puede dividir por cero! >>>
Colecciones (Listas)
>>> vocales = ['a', 'e', 'i', 'o', 'u'] >>> vocales ['a', 'e', 'i', 'o', 'u'] >>> vocales[0] 'a' >>> vocales[4] 'u' >>> vocales[-1] 'u' >>> vocales[-5] 'a' >>> vocales[0:3] ['a', 'e', 'i'] >>> vocales[3:] ['o', 'u'] >>> vocales[2] = 'X' >>> vocales ['a', 'e', 'X', 'o', 'u'] >>> del(vocales[2]) >>> vocales ['a', 'e', 'o', 'u'] >>> vocales.insert(2, 'i') >>> vocales ['a', 'e', 'i', 'o', 'u']
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Colecciones (Diccionarios)
>>> colores = { ... 'amarillo': 'yellow', ... 'rojo': 'red', ... 'azul': 'blue' ... } >>> colores['rojo'] 'red' >>> colores['azul'] 'blue' >>> colores {'rojo': 'red', 'azul': 'blue', 'amarillo': 'yellow'} >>> colores['marron'] = 'brown' >>> colores['marron'] 'brown' >>> colores {'rojo': 'red', 'azul': 'blue', 'marron': 'brown', 'amarillo': 'yellow'} >>> 'rojo' in colores True >>> 'verde' in colores False >>> colores['verde'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'verde'
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Estructuras de control
>>> hora = 14 >>> if hora >= 1 and hora <= 6: ... turno = 'Madrugada' ... elif hora >=7 and hora <= 11: ... turno = 'Maana' ... elif hora >= 12 and hora <= 17: ... turno = 'Tarde' ... elif hora >= 18 and hora <= 23: ... turno = 'Noche' ... else: ... print 'Fuera de rango!' ... >>> turno 'Tarde' >>> i = 1 >>> while i<= 100: ... print i ... i += 1 ... 1 2 3 ... 100
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Valores por omisin para los parmetros de los mtodos No se declaran los tipos de datos
Duck Typing
>>> 1 + 1 2 >>> 'Hola ' + 'mundo!' 'Hola mundo!' >>> def sumar(a, b): ... return a + b ... >>> sumar(10, 10) 20 >>> sumar('Hola ', 'mundo!') 'Hola mundo!' >>> [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] >>> sumar([1, 2, 3], [4, 5, 6]) [1, 2, 3, 4, 5, 6]
Si el objeto tiene los mtodos necesarios funciona La semntica del objeto la determinan sus mtodos y propiedades
base=5)
Argumentos variables
>>> def funcion50(a, b, *args, **kwargs): ... print "a: %s" % a ... print "b: %s" % b ... print "Argumentos por posicin:" ... i = 0 ... for elem in args: ... print "*args[%d]: %s" % (i, args[i]) ... i += 1 ... print "Argumentos por nombre:" ... for k,v in kwargs.items(): ... print "**kwargs['%s'] = %s" % (k,v) ... >>> funcion50(1, 2, 3, 4, param1=5, param2=6) a: 1 b: 2 Argumentos por posicin: *args[0]: 3 *args[1]: 4 Argumentos por nombre: **kwargs['param2'] = 6 **kwargs['param1'] = 5
Lambdas y closures
>>> lambda a,b: a + b <function <lambda> at 0x8392c34> >>> (lambda a,b: a + b)(1, 1) 2 >>> sumar = lambda a,b: a + b >>> sumar(1, 1) 2 >>> def crear_funcion_sumadora(sumando=1): ... def funcion(parametro): ... return parametro + sumando ... return funcion ... >>> sumadora_de_cincos = crear_funcion_sumadora(5) >>> sumadora_de_cincos(0) 5 >>> sumadora_de_cincos(10) 15 >>> sumadora_de_nueves = crear_funcion_sumadora(9) >>> sumadora_de_nueves(9) 18
Lambdas y closures
>>> lambda a,b: a + b <function <lambda> at 0x8392c34> >>> (lambda a,b: a + b)(1, 1) 2 >>> sumar = lambda a,b: a + b >>> sumar(1, 1) 2 >>> def crear_funcion_sumadora(sumando=1): ... def funcion(parametro): ... return parametro + sumando ... return funcion ... >>> sumadora_de_cincos = crear_funcion_sumadora(5) >>> sumadora_de_cincos(0) 5 >>> sumadora_de_cincos(10) 15 >>> sumadora_de_nueves = crear_funcion_sumadora(9) >>> sumadora_de_nueves(9) 18
Comprensiones de listas
En matemticas, es comn la definicin de conjuntos por comprensin: S = { x2 : x in {0 .. 9}} V = { 2, 4, 8 ... 2 } X = { x | x en S y S es par }
16
Ms sobre objetos...
>>> class A(object): ... a = 10 ... b = 20 ... def sumar(a=None, b=None): ... if a is None: ... a = self.a ... if b is None: ... b = self.b ... return a + b ... >>> 'a' in dir(A) True >>> 'sumar' in dir(A) True >>> hasattr(A, 'a') True >>> hasattr(A, 'sumar') True >>> hasattr(A, 'restar') False >>> attr = getattr(A, 'a') >>> attr 10 >>> callable(attr) False >>> attr = getattr(A, 'sumar') >>> callable(attr) True
Decoradores
>>> def publicidad(func):
... def crear_nueva_funcion(func): ... def nueva_funcion(*args, **kwargs): ... print "Esta funcin est auspiciada por el PLUG! :)" ... return func(*args, **kwargs) ... return nueva_funcion ... return crear_nueva_funcion(func) ... >>> def multiplicacion(a, b): ... return a * b ... >>> multiplicacion = publicidad(multiplicacion) >>> multiplicacion(2, 2) Esta funcin est auspiciada por el PLUG! :) 4 >>> @publicidad ... def division(a, b): ... return a / b ... >>> division(8, 4) Esta funcin est auspiciada por el PLUG! :) 2
Herencia
>>> class Padre(object): ... def __init__(self): ... print "Hago cosas que hacen los padres..." ... def trabajar(self): ... print "Trabajando..." ... >>> class Hijo(Padre): ... def __init__(self): ... super(Hijo, self).__init__() ... print "Hago cosas que hacen los hijos..." ... def jugar(self): ... print "Jugando..." ... >>> padre = Padre() Hago cosas que hacen los padres... >>> hijo = Hijo() Hago cosas que hacen los padres... Hago cosas que hacen los hijos... >>> padre.trabajar() Trabajando... >>> hijo.trabajar() Trabajando... >>> padre.jugar() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Padre' object has no attribute 'jugar' >>> hijo.jugar() Jugando...
Herencia (2)
>>> dir(Padre) ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'trabajar'] >>> dir(Hijo) ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'jugar', 'trabajar'] >>> padre.jugar = hijo.jugar >>> padre.jugar() Jugando... >>> padre2 = Padre() Hago cosas que hacen los padres... >>> dir(padre2) ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'trabajar'] >>> padre2.jugar() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Padre' object has no attribute 'jugar'
Herencia mltiple
>>> ... ... ... >>> ... ... ... >>> ... ... >>> >>> 10 >>> 20 >>> 300 >>> 40 class A(object): a = 10 b = 20 class B(object): a = 100 c = 300 class C(A, B): d = 40 x = C() x.a x.b x.c x.d
Mdulos
operaciones.py def suma(a, b): return a + b >>> suma(1, 1) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'suma' is not defined >>> from operaciones import suma >>> suma(1, 1) 2 >>> from operaciones import suma >>> suma(1, 1) 2
Mdulos (2)
operaciones/ __init__.py adicion.py def suma(a, b): return a + b (archivo vacio)
Mdulos (3)
operaciones/ __init__.py from adicion import * adicion.py def suma(a, b): return a + b >>> from operaciones import suma >>> suma(1, 1) 2
XKCD y Python
Django
Qu es?
Un framework web escrito en Python (2.2+) Emplea el patrn MVC (Modelo-Vista-Controlador) como Rails on Rails En Django el patrn MTV recibe el nombre MTV (Model-View-Template) Las vistas de Django son los controladores en el MVC clsico Las plantillas o templates con las vistas en el MVC clsico Incluye sus propios compomentes: ruteador, despachador, controladores, ORM y lenguaje de plantillas
Orgenes
Nace de un peridico en Kansas, USA Producto de la bsqueda de agilidad en el desarrollo web Programacin con plazos para periodistas (yo he vivo un poco eso!) Autores originales: Adrian Holovaty (periodista) y Jakob Kaplan-Moss El nombre viene de Django Reinhardt, guitarrista gitano de jazz (belga) Adrian Holovaty es un guitarrista aficionado al jazz La mascota es un pony :)
Modelo-Vista-Controlador
Modelo-Vista-Controlador
Modelo-Vista-Controlador
Caractersticas de Django
Documentacin! Servidor HTTP de pruebas. ORM URL dispatcher Templates Admin Forms Middleware y Signals Internacionalizacion Cache Autenticacin Muchas aplicaciones enchufables disponibles (killer app)
Django
Cmo es la API?
Las rutas con objetos URLConf (urls.py) Relacionan expresiones regulares con vistas (funciones) Se puede delegar una coincidencia a otro grupo de URLconfs El despachador invoca a las vistas y ejecuta middlewares Se crea un objeto request que es pasado a la funcin (vista) Este objeto request puede haber sido alterado por uno o ms middlewares Cuando la vista devuelve una respuesta tambin puede actuar el middleware Las vistas son funciones o mtodos de clases, aunque es ms raro: Reciben un objeto request que representa a la peticin HTTP Devuelve un objeto response que representa a la respuesta HTTP Las redirecciones, mensajes de error: 403, 404, 500 son subclases El manejo de sesiones es mediante cookies y via middleware El objeto sesin se instancia y se coloca dentro del request Django se comunica con el servidor web utilizando alguna de varias formas: mod_python, mod_fastcgi, mod_wsgi, etc
Arquitectura
Una redireccin
from django.http import HttpResponseRedirect def ir_a_google(request): return HttpResponseRedirect("http://www.google.com")
La plantilla
<html> <head><title`>Fecha actual</title></head> <body>Fecha actual: {{ fecha_actual }}.</body> </html>
La vista
from django.shortcuts import render_to_response import datetime def current_datetime(request): now = datetime.datetime.now() return render_to_response( 'fecha_actual.html', {'fecha_actual': now}) )
Pgina principal
from mysite.views import pagina_principal urlpatterns = patterns('', ('^$', pagina_principal), # ... )
Un URLconf ms tpico
from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Example: # (r'^mysite/', include('mysite.foo.urls')), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # (r'^admin/', include(admin.site.urls)),
La vista correspondiente
from django.shortcuts import get_object_or_404, render_to_response From revista.models import Articulo def mostrar_articulo(request, id_articulo): articulo = get_object_or_404(Articulo, id=id_articulo) return render_to_response( 'revista/articulo.html', {'articulo': articulo}) )
Modelos
from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField()
Generacin de SQL
BEGIN; CREATE TABLE "books_publisher" ( "id" serial NOT NULL PRIMARY KEY, "name" varchar(30) NOT NULL, "address" varchar(50) NOT NULL, "city" varchar(60) NOT NULL, "state_province" varchar(30) NOT NULL, "country" varchar(50) NOT NULL, "website" varchar(200) NOT NULL ) ; CREATE TABLE "books_author" ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(40) NOT NULL, "email" varchar(75) NOT NULL ) ; CREATE TABLE "books_book" ( "id" serial NOT NULL PRIMARY KEY, "title" varchar(100) NOT NULL, "publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id") DEFERRABLE INITIALLY DEFERRED, "publication_date" date NOT NULL ) ; CREATE TABLE "books_book_authors" ( "id" serial NOT NULL PRIMARY KEY, "book_id" integer NOT NULL REFERENCES "books_book" ("id") DEFERRABLE INITIALLY DEFERRED, "author_id" integer NOT NULL REFERENCES "books_author" ("id") DEFERRABLE INITIALLY DEFERRED, UNIQUE ("book_id", "author_id") ) ; CREATE INDEX "books_book_publisher_id" ON "books_book" ("publisher_id"); COMMIT;
Haciendo consultas
>>> Publisher.objects.filter(country="U.S.A.", state_province="CA") [<Publisher: Apress>] >>> Publisher.objects.filter(name__contains="press") [<Publisher: Apress>] SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name LIKE '%press%';
>>> try: ... p = Publisher.objects.get(name='Apress') ... except Publisher.DoesNotExist: ... print "Apress isn't in the database yet." ... else: ... print "Apress is in the database." >>> Publisher.objects.order_by("name") [<Publisher: O'Reilly>, <Publisher: Apress>] >>> Publisher.objects.order_by("-name") [<Publisher: Apress>, <Publisher: O'Reilly>]
Django Admin
Django cuenta con una interfaz de administracin muy pulida y generada automticamente. En ella se pueden agregar, editar, visualizar y eliminar datos. Para verla generamos un archivo admin.py en la aplicacin:
Django Admin
Django cuenta con una interfaz de administracin muy pulida y generada automticamente. En ella se pueden agregar, editar, visualizar y eliminar datos. Para verla generamos un archivo admin.py en la aplicacin:
Produje cdigo para proyectos en dos das (con la supervisin y gua de gente con ms experiencia)
Mi editor de textos
$HOME/.vimrc
syntax on set tabstop=4 set shiftwidth=4 set smarttab set expandtab set softtabstop=4
...en Linux
http://twitpic.com/9idjb
...en Windows
http://twitpic.com/bdls7
...en Mac
http://twitpic.com/fb3ai
Recursos
Sitios web Libros y revistas Listas y grupos de usuarios Dnde conseguir cdigo? Como aprender ms...
Sitios Web
http://www.python.org http://www.python.org/doc/ http://pypi.python.org/pypi http://www.diveintopython.org http://www.djangoproject.org http://www.djangobook.com/en/2.0/
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Libros
http://mundogeek.net/tutorial-python/
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Libros
http://es.diveintopython.org
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Libros
Libros
Libros
+
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Libros
Libros
Libros
Python Per
http://www.python-peru.org
Proyecto plugbullet
http://github.com/charlieman/plugbullet
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Proyecto plugbullet
Gestor de boletn de noticias Gente de muchas comunidades y empresas se registra Envan elementos a publicar Eventos, cursos, productos, servicios, noticias Eligen en que ediciones quierne que aparezcan Un moderador las acepta o rechaza (por edicin) Se genera automticamente un correo y se enva La lista de suscriptores la gestionamos con mailman Informacin disponible via web Recordatorios via Twitter en la cuenta @plugperu
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Proyecto plugbullet
$ sudo apt-get install git-core $ mkdir -p $HOME/proyectos/plug $ cd $HOME/proyectos/plug $ git-clone git://github.com/charlieman/plugbullet.git Initialized empty Git repository in /home/gnrfan/proyectos/plug/plugbullet/.git/ remote: Counting objects: 123, done. remote: Compressing objects: 100% (115/115), done. remote: Total 123 (delta 63), reused 0 (delta 0) Receiving objects: 100% (123/123), 20.62 KiB, done. Resolving deltas: 100% (63/63), done. $ manage.py syncdb $ manage.py runserver
Conclusiones
Python es un lenguaje dinmico de alto nivel Es simple y ordenado adems de potente y flexible Est disponible para casi todas las plataformas Viende instalado en Linux Muchos programas opensource estn escritos en l Permite combinar paradgmas Imperativo, Orientado a objetos, Funcional Bibliotecas para todo tipo de cosas Interoperatividad y extensibilidad: Java, .Net, C Usado por grandes empresas En crecimiento en Per Nos interesa usarlo en el PLUG!
Eso es todo!!
Gracias!!!
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace
Preguntas?
Sbado 17 de Octubre 2009 Reunin mensual PLUG C.C. Compupalace