¿Porqué Python? ...y Django
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

¿Porqué Python? ...y Django

  • 18,973 views
Uploaded on

Una charla en la que se presenta el lenguaje Python y el framework Django y se explica porqué puede ser una buena idea utilizarlos.

Una charla en la que se presenta el lenguaje Python y el framework Django y se explica porqué puede ser una buena idea utilizarlos.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • Muyyy bueno, muchas gracias!!
    Are you sure you want to
    Your message goes here
  • muy buena informacion gracias..
    Are you sure you want to
    Your message goes here
  • @jgabrielsinner10 claro, pero estos slides son del 2009 y el primer release 2.x de Symfony fue en Julio del 2011
    Are you sure you want to
    Your message goes here
  • Ya Existe un Framework de PHP estilo Django. Se llama Symfony2 y su motor de plantillas TWIG es Igual/Identico a Django.
    Are you sure you want to
    Your message goes here
  • Mil Gracias, entrando al mundo de python.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
18,973
On Slideshare
18,876
From Embeds
97
Number of Embeds
9

Actions

Shares
Downloads
513
Comments
9
Likes
9

Embeds 97

http://facilitador-tic.blogspot.com 53
http://www.slideshare.net 18
http://www.linkedin.com 6
https://si0.twimg.com 5
https://www.linkedin.com 5
http://facilitador-tic.blogspot.com.es 4
http://paper.li 2
http://facilitador-tic.blogspot.com.ar 2
http://facilitador-tic.blogspot.mx 2

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace ¿Porqué ? ...y Antonio Ognio Cesti antonio@linux.org.pe Coordinador Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 2. 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 interés Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 3. Para que me conozcan un poquito más... ... como programador y linuxero :) ● Antonio Ognio, iqueño, 32 años, “limeño” desde 1994 :) ● Programador BASIC, 10 años (Commodore 64) ● Pascal / Visual Basic a los 15 años (386) ● C / C++ / Delphi / Java a los 18 años (UPC, años 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, años 2005 - 2009) ● PHP, Python – El Pedregal (2006 – 2007) ● Python, Javascript, Ruby, PHP – Aureal (2008 – 2009) ● Aprendiendo Erlang, Objective-C y otros lenguajes... Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 4. ¿Qué es Python? ● Lenguaje de programación de propósito general ● Lenguaje de alto nivel (de abstracción) ● Enfatiza la legibilidad del código ● Permite hacer mucho trabajo manteniendo una sintaxis clara ● Sentencias relativamente cortas ● Varios paradigmas: imperativo, orientado a objetos, funcional ● Lenguaje dinámico, generalmente usado para escribir scripts y disponible en múltiples plataformas. Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 5. Orígenes / Historia ● Creado a principios de los 90's (1991) ● Autor: Guido Van Rossum (GvR) ● CWI (Centro de Investigacíon en Holanda) ● En 1994 adquire características de programación 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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 6. GvR (Guido Van Rosum) Dictador benevolente de por vida Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 7. ¿De donde viene el nombre? Monty Python Flying Circus (cómicos británicos) Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 8. ...pero la mayoría cree que... Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 9. La serpiente es la mascota... Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 10. Logo Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 11. ¿Porqué usar Python? ● Lo usan grandes empresas y proyectos ● Lenguaje simple pero potente ● Sintaxis compacta, ordenada y legible ● Suele aumentar la productividad* ● Utilizado en muchas áreas ● Disponibilidad de bibliotecas de código (librerías) ● Cada vez más conocido y usado ● Uno de los lenguajes dinámicos más maduro ● Bastante utilizado en el mundo del FLOSS ● Disponible para muchos entornos operativos * Cuando se viene de lenguajes como C, C++ o Java Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 12. ¿Quién usa Python? Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 13. Implementaciones ● CPython ● Jython ● IronPython ● PyPy ● Python for S60 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 14. Implementaciones ● CPython (Implementación original) ● Jython Java / JVM ● IronPython CLR/DLR/.Net ● PyPy Python ● Python for S60 Symbian / Nokia Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 15. Proyectos que lo usan ● Mailman ● Anaconda ● Launchpad ● Plone ● Bittorrent Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 16. Proyectos que lo usan ● Mailman (gestor de listas de correo) ● Anaconda (instalador de RedHat) ● Launchpad (plataforma de Ubuntu) ● Plone (CMS de la FSF) ● Bittorrent (Versión original en Windows) Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 17. Proyectos que lo usan Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 18. Versiones en uso Python 2.5 (RHEL, Ubuntu LTS, Mac OS X) Python 2.6 (Fedora 11+, Ubuntu 9.04+) Python 3.0 (Instalación bajo demanda) Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 19. 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) Código fuente / paquetes (Otras plataforma) Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 20. IDEs (Entornos de desarrollo) ● Komodo ● NetBeans ● PyDev (Eclipse) ● IDLE ● Boa Constructor ● XCode (IDE oficial de Apple) Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 21. ¿Cómo se ve el código? #!/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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 22. Ejecutando el código Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 23. 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 ejecución 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 están haciendo mucho por optimizar Python para obtener el máximo rendimiento :) Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 24. El Zen de Python Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 25. El Zen de Python (Filosofía) ● Hermoso es mejor que feo. ● Explícito es mejor que implícito. ● Simple es mejor que complejo. ● Complejo es mejor que complicado. ● Plano es mejor que anidado. ● Disperso es mejor que denso. ● La legibilidad cuenta. ● Los casos especiales no son suficientemente especiales como para romper las reglas. ● Aunque lo pragmático gana a la pureza. ● Los errores nunca deberían dejarse pasar silenciosamente. ● A menos que se silencien explícitamente. Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 26. El Zen de Python (2) ● Cuando te enfrentes a la ambigüedad, rechaza la tentación de adivinar. ● Debería haber una -- y preferiblemente sólo una -- manera obvia de hacerlo. ● Aunque puede que no sea obvia a primera vista a menos que seas holandés. (NT: Guido van Rossum, creador de Python, es holandés). ● Ahora es mejor que nunca. ● Aunque muchas veces nunca es mejor que ahora mismo. ● Si la implementación es difícil de explicar, es una mala idea. ● Si la implementación es sencilla de explicar, puede que sea una buena idea. ● Los espacios de nombres son una gran idea -- ¡tengamos más de esas! Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 27. Sintaxis de Python - Un programa en Python está compuesto por una o más lineas lógicas. - Un linea lógica puede estar compuesta por una o más lineas físicas. - Las sentencias no requiere de un delimitador entre ellas como el famoso “;” en C, C++, Java, JavaScript, PHP, etc. - La indentación es significativa ya que no hay otra manera de indicar bloques de código subordinados a estructuras de control o definiciones de clases y funciones. Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 28. Intérprete 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! >>> Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 29. Tipos y operadores básicos >>> 10 * 10 100 >>> 874854533434324 * 24323424321424 21279458036244482359970157376L >>> 9860948509850935809348504850438503485043542343434234 * 3948309483024803480394802343243948309483094803944324343432 38934076513063754615513224820483369228565090953244251715301778213629 782870944071332640212573080925678121851088L >>> 10 / 3 3 >>> 10 / 3.0 3.3333333333333335 1024 >>> 2 ** 8 256 >>> b1 = True >>> b1 True >>> not b1 False >>> moneda = 'S/.' >>> monto = 234.3212 >>> '%s %.2f' % (moneda, monto) 'S/. 234.32' Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 30. 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'] Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 31. 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' Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 32. Estructuras de control >>> hora = 14 >>> if hora >= 1 and hora <= 6: ... turno = 'Madrugada' ... elif hora >=7 and hora <= 11: ... turno = 'Mañana' ... 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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 33. Una clase en Java public class Employee { private String myEmployeeName; private int myTaxDeductions = 1; private String myMaritalStatus = "single"; //--------- constructor #1 ------------- public Employee(String EmployeName) { this(employeeName, 1); } //--------- constructor #2 ------------- public Employee(String EmployeName, int taxDeductions) { this(employeeName, taxDeductions, "single"); } //--------- constructor #3 ------------- public Employee(String EmployeName, int taxDeductions, String maritalStatus) { this.employeeName = employeeName; this.taxDeductions = taxDeductions; this.maritalStatus = maritalStatus; } ... Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 34. La misma clase en Python class Employee(object): def __init__(self, employeeName, taxDeductions=1, maritalStatus="single"): self.employeeName = employeeName self.taxDeductions = taxDeductions self.maritalStatus = maritalStatus ... ● Valores por omisión para los parámetros de los métodos ● No se declaran los tipos de datos Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 35. 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 métodos necesarios funciona ● La semántica del objeto la determinan sus métodos y propiedades Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 36. Argumentos con nombre >>> def area_triangulo(base, altura): ... print "Base: %.2f" % base ... print "Altura: %.2f" % altura ... area = base * altura / 2.0 ... print "Area: %.2f" % area ... >>> area_triangulo(5, 9) Base: 5.00 Altura: 9.00 Area: 22.50 >>> area_triangulo(altura=9, base=5) Base: 5.00 Altura: 9.00 Area: 22.50 >>> area_triangulo(9, 5) Base: 9.00 Altura: 5.00 Area: 22.50 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 37. Argumentos variables >>> def funcion50(a, b, *args, **kwargs): ... print "a: %s" % a ... print "b: %s" % b ... print "Argumentos por posición:" ... 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 posición: *args[0]: 3 *args[1]: 4 Argumentos por nombre: **kwargs['param2'] = 6 **kwargs['param1'] = 5 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 38. Argumentos variables (2) >>> def funcion60(**kwargs): ... print "Argumentos por nombre solamente:" ... for k, v in kwargs.items(): ... print "**kwargs['%s'] = %s" % (k,v) ... >>> funcion60(1, 2, 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: funcion60() takes exactly 0 arguments (3 given) >>> funcion60(x=1, y=2, z=3) Argumentos por nombre solamente: **kwargs['y'] = 2 **kwargs['x'] = 1 **kwargs['z'] = 3 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 39. Parámetros con defaults >>> def subrayar(cadena, subrayado='*'): ... print cadena ... print subrayado * len(cadena) ... >>> subrayar('Titulo') Titulo ****** >>> subrayar('Titulo', '-') Titulo ------ Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 40. Funciones como objetos >>> def funcion1(): ... print "Soy la funcion 1" ... >>> funcion1() Soy la funcion 1 >>> funcion_x = funcion1 >>> funcion_x() Soy la funcion 1 >>> def llamar_funcion_x(f): ... f() ... >>> llamar_funcion_x(funcion1) Soy la funcion 1 >>> funcion1.a = 10 >>> funcion1.a 10 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 41. Funciones como objetos (2) >>> funcion1.a = 10 >>> funcion1.__doc__ = 'Solo imprime su nombre' >>> help(funcion1) Help on function funcion1 in module __main__: funcion1() Solo imprime su nombre >>> def funcion1(): ... """Solo imprime su nombre""" ... print 'Soy la función 1' ... >>> funcion1.__doc__ 'Solo imprime su nombre' Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 42. Funciones como objetos (3) >>> def operaciones(operador='+'): ... def suma(a, b): ... return a + b ... def resta(a, b): ... return a - b ... if operador not in ['+', '-']: ... return None ... if operador == '+': ... return suma ... if operador == '-': ... return resta ... >>> operacion = operaciones('+') >>> operacion(1, 1) 2 >>> operacion = operaciones('-') >>> operacion(1, 1) 0 >>> operacion = operaciones('*') >>> operacion(1, 1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'NoneType' object is not callable Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 43. 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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 44. 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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 45. Comprensiones de listas En matemáticas, es común la definición de conjuntos por comprensión: S = { x2 : x in {0 .. 9}} 16 V = { 2, 4, 8 ... 2 } X = { x | x en S y S es par } Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 46. Comprensiones de listas (2) >>> S = [x**2 for x in range(10)] >>> S [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> V [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768] >>> M = [x for x in S if x % 2 == 0] >>> M [0, 4, 16, 36, 64] Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 47. Más 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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 48. Más sobre objetos... (2) >>> setattr(A, 'c', 30) >>> setattr(A, 'restar', lambda a,b: a - b) >>> dir(A) ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'a', 'b', 'c', 'restar', 'sumar'] >>> A.x Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: type object 'A' has no attribute >>> try: ... A.x ... except AttributeError: ... print "No existe el atributo" ... No existe el atributo Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 49. Decoradores >>> def publicidad(func): ... def crear_nueva_funcion(func): ... def nueva_funcion(*args, **kwargs): ... print "Esta función 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 función está auspiciada por el PLUG! :) 4 >>> @publicidad ... def division(a, b): ... return a / b ... >>> division(8, 4) Esta función está auspiciada por el PLUG! :) 2 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 50. 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... Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 51. 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' Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 52. Herencia múltiple >>> class A(object): ... a = 10 ... b = 20 ... >>> class B(object): ... a = 100 ... c = 300 ... >>> class C(A, B): ... d = 40 ... >>> x = C() >>> x.a 10 >>> x.b 20 >>> x.c 300 >>> x.d 40 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 53. Módulos 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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 54. Módulos (2) operaciones/ __init__.py (archivo vacio) adicion.py def suma(a, b): return a + b >>> from operaciones.adicion import suma >>> suma(1, 1) 2 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 55. Módulos (3) operaciones/ __init__.py from adicion import * adicion.py def suma(a, b): return a + b >>> from operaciones import suma >>> suma(1, 1) 2 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 56. XKCD y Python Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 57. Django (framework web) Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 58. Django ¿Qué es? ● Un framework web escrito en Python (2.2+) ● Emplea el patrón MVC (Modelo-Vista-Controlador) como Rails on Rails ● En Django el patrón MTV recibe el nombre MTV (Model-View-Template) ● Las “vistas” de Django son los controladores en el MVC clásico ● Las plantillas o “templates” con las “vistas” en el MVC clásico ● Incluye sus propios compomentes: ● ruteador, despachador, controladores, ORM y lenguaje de plantillas Orígenes ● Nace de un periódico en Kansas, USA ● Producto de la búsqueda de agilidad en el desarrollo web ● Programación 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 :) Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 59. http://www.mylittledjango.com Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 60. Modelo-Vista-Controlador Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 61. Modelo-Vista-Controlador Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 62. Modelo-Vista-Controlador Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 63. Características de Django • Documentación! • Servidor HTTP de pruebas. • ORM • URL dispatcher • Templates • Admin • Forms • Middleware y Signals • Internacionalizacion • Cache • Autenticación • Muchas aplicaciones “enchufables” disponibles (killer app)
  • 64. Django ¿Cómo 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 función (vista) ● Este objeto request puede haber sido alterado por uno o más middlewares ● Cuando la vista devuelve una respuesta también puede actuar el middleware ● Las vistas son funciones o métodos de clases, aunque es más raro: ● Reciben un objeto “request” que representa a la petición 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 sesión 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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 65. Arquitectura Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 66. Una vista muy simple from django.http import HttpResponse def hello(request): return HttpResponse("Hola mundo!") Una redirección from django.http import HttpResponseRedirect def ir_a_google(request): return HttpResponseRedirect("http://www.google.com")
  • 67. Una vista que no usa plantillas def current_datetime(request): now = datetime.datetime.now() html = "<html><body>Fecha actual: %s.</body></html>" % now return HttpResponse(html)       Una vista que si usa plantillas 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}) )      
  • 68. 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}) )      
  • 69. Una plantilla más compleja <html> <head><title>Ordering notice</title></head> <body> <h1>Ordering notice</h1> <p>Dear {{ person_name }},</p> <p>Thanks for placing an order from {{ company }}. It's scheduled to ship on {{ ship_date|date:"F j, Y" }}.</p> <p>Here are the items you've ordered:</p> <ul> {% for item in item_list %} <li>{{ item }}</li> {% endfor %} </ul> {% if ordered_warranty %} <p>Your warranty information will be included in the packaging.</p> {% else %} <p>You didn't order a warranty, so you're on your own when the products inevitably stop working.</p> {% endif %} <p>Sincerely,<br />{{ company }}</p> </body> </html>      
  • 70. Trabajando con una plantilla directamente >>> from django import template >>> t = template.Template('My name is {{ name }}.') >>> c = template.Context({'name': 'Adrian'}) >>> print t.render(c) My name is Adrian. >>> c = template.Context({'name': 'Jakob'}) >>> print t.render(c) My name is Jakob.
  • 71. Control del flujo y otros elementos Rendering básico de objetos if/else for ifequal/ifnotequal Comentarios Filtros Etiquetas personalizadas Ver: http://www.djangobook.com/en/2.0/chapter04/
  • 72. Un objeto URLconf simple from django.conf.urls.defaults import * from mysite.views import hola urlpatterns = patterns('', ('^hola/$', hola), ) Página principal from mysite.views import pagina_principal urlpatterns = patterns('', ('^$', pagina_principal), # ... )
  • 73. Un URLconf más típico 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)), )
  • 74. URLconf con expresión regular from django.conf.urls.defaults import * From revista.views import articulos urlpatterns = patterns('', (r'^articulo/(?P<id_articulo>d+)$', mostrar_articulo) ) 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}) )
  • 75. 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()
  • 76. Generación 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;
  • 77. Usando la API para DB (ORM) >>> from books.models import Publisher >>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue', ... city='Berkeley', state_province='CA', country='U.S.A.', ... website='http://www.apress.com/') >>> p1.save() >>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.', ... city='Cambridge', state_province='MA', country='U.S.A.', ... website='http://www.oreilly.com/') >>> p2.save() >>> publisher_list = Publisher.objects.all() >>> publisher_list [<Publisher: Publisher object>, <Publisher: Publisher object>] >>> p1.book_set() [<Book: Book object>, <Book: Book object>]
  • 78. Personalizando los 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() def __unicode__(self): return self.name class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() def __unicode__(self): return u'%s %s' % (self.first_name, self.last_name) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() def __unicode__(self): return self.title
  • 79. 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>]
  • 80. Django Admin Django cuenta con una interfaz de administración muy pulida y generada automáticamente. En ella se pueden agregar, editar, visualizar y eliminar datos. Para verla generamos un archivo admin.py en la aplicación:   import models from django.contrib import admin admin.site.register(models.Archivo) admin.site.register(models.Registro)  
  • 81. Django Admin Django cuenta con una interfaz de administración muy pulida y generada automáticamente. En ella se pueden agregar, editar, visualizar y eliminar datos. Para verla generamos un archivo admin.py en la aplicación:   import models from django.contrib import admin admin.site.register(models.Archivo) admin.site.register(models.Registro)  
  • 82. Django Admin (Login)
  • 83. Django Admin (Mantenimiento)
  • 84. Mi experiencia programando en Python con Django
  • 85. Mi experiencia usando Python ● Siempre lo miroseaba, no me animaba a aprenderlo ● Empecé a usarlo en un proyecto cliente servidor: ● Servidor (PHP) ● Cliente (PyGTK+) ● Mensajes: XML-RPC (Web services) ● Descubrí Django ● Empecé a escribir modelos en Django ● Empecé a usar el admin ● El frontend seguía siendo PHP ● Ingresé a Aureal y ahora lo uso a diario ● Estoy escribiendo un framework en PHP 5.3 estilo Django Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 86. Produje código para proyectos en dos días (con la supervisión y guía de gente con más experiencia)
  • 87. Mi editor de textos Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 88. $HOME/.vimrc syntax on set tabstop=4 set shiftwidth=4 set smarttab set expandtab set softtabstop=4 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 89. Algunas reglas sirven... ● 4 espacios por cada nivel de indentación ● Evita los caracteres de tabulación ● Nunca mezcles caracteres de tabulación y espacios. ● Una línea en blanco entre funciones. ● Seguir guía PEP-8 ● Programar Python idiomático http://www.python.org/dev/peps/pep-0008/ http://mundogeek.net/traducciones/python-idiomatico/ http://mundogeek.net/traducciones/modismos-python.htm Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 90. ...en Linux http://twitpic.com/9idjb Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 91. ...en Windows http://twitpic.com/bdls7 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 92. ...en Mac http://twitpic.com/fb3ai Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 93. Mi experiencia usando Python ● ¿Qué me gusta? ● Simple y potente! ● Ahora mi código es más ordenado y legible ● Mi código es más modular y uso más OOP ● Uso algunas (pocas) técnicas funcionales a diario ● Ya me siendo cómodo con Django ● Como sigo aprendiendo aún es divertido :) ● Muy valorado en Ubuntu y Google ● Usado mucho por startups ● ¿Qué no me gusta? ● Aún no es muy conocido ¿Pyqué!? :) ● Algunas construcciones de OOP se extrañan a veces: ● interfases, private, protected, final class Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 94. Feliz con el Pony! .. pero ya no me gustan mucho otros frameworks :(
  • 95. Ideas para proyectos en el PLUG ● CMS básico ● Páginas estáticas ● Miembros con perfil ● Cada miembro tiene su propio blog ● Posts destacados a la portada ● Página administrada por algunos miembros ● Cualquier miembro puede proponer un cambio a una página ● Los administradores aceptan los cambios (no es wiki) ● Aplicación para canal de quemadores ● Archivo de correos de la lista ● Aplicación de noticias (estilo Reddit) ● Sus ideas y contribuciones!!! Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 96. Recursos ● Sitios web ● Libros y revistas ● Listas y grupos de usuarios ● ¿Dónde conseguir código? ● Como aprender más... Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 97. 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/ Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 98. Libros http://mundogeek.net/tutorial-python/ Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 99. Libros http://es.diveintopython.org Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 100. Libros Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 101. Libros + Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 102. Libros + Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 103. Libros Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 104. Libros Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 105. Libros Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 106. Listas y grupos de usuarios Python en Español http://listas.aditel.org/listinfo/python-es Python Perú http://www.python-peru.org Python Argentina (PyAr) http://python.org.ar/pyar Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 107. ¿Dónde conseguir código? http://www.github.com http://code.google.com http://sourceforge.net http://launchpad.net http://djangosnippets.org http://djangoplugables.com http://snippets.dzone.com/tag/python Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 108. ¿Cómo aprender más? ● Leer un libro, seguir un tutorial ● Programando! ● Crear tu propio proyecto mascota ● Participar de otros proyectos (PLUG!) ● Leer el código de programas instalados ● Participar del bug triaging ● Crear y enviar parches a proyectos ● Usarlo en tu trabajo o buscar un trabajo con Python Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 109. Proyecto “plugbullet” http://github.com/charlieman/plugbullet Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 110. Proyecto “plugbullet” ● Proyecto escrito en Django ● Gestor de boletín de noticias ● Gente de muchas comunidades y empresas se registra ● Envían elementos a publicar ● Eventos, cursos, productos, servicios, noticias ● Eligen en que ediciones quierne que aparezcan ● Un moderador las acepta o rechaza (por edición) ● Se genera automáticamente un correo y se envía ● La lista de suscriptores la gestionamos con mailman ● Información disponible via web ● Recordatorios via Twitter en la cuenta @plugperu Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 111. 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 Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 112. Conclusiones ● Python es un lenguaje dinámico de alto nivel ● Es simple y ordenado además de potente y flexible ● Está disponible para casi todas las plataformas ● Viende instalado en Linux ● Muchos programas opensource están escritos en él ● Permite combinar paradígmas ● 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! Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 113. Eso es todo!! Gracias!!! Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
  • 114. ¿Preguntas? Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace