SlideShare ist ein Scribd-Unternehmen logo
1 von 114
Downloaden Sie, um offline zu lesen
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
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
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
¿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
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
GvR (Guido Van Rosum)




                        Dictador benevolente de por vida
Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
¿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
...pero la mayoría cree que...




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
La serpiente es la mascota...




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Logo




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
¿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
¿Quién usa Python?




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Implementaciones
 ● CPython
 ● Jython

 ● IronPython

 ● PyPy

 ● Python for S60




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
Proyectos que lo usan
 ● Mailman
 ● Anaconda

 ● Launchpad

 ● Plone

 ● Bittorrent




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
Proyectos que lo usan




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
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
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
¿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
Ejecutando el código




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
El Zen de Python




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
XKCD y Python




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Django (framework web)




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
http://www.mylittledjango.com
Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Modelo-Vista-Controlador




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Modelo-Vista-Controlador




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Modelo-Vista-Controlador




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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)
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
Arquitectura




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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")
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})
)
 
 
 
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})
)
 
 
 
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>

 
 
 
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.
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/
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),
    # ...
)
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)),
)
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})
)
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()
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;
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>]
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
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 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)
 
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)
 
Django Admin (Login)
Django Admin (Mantenimiento)
Mi experiencia
 programando
    en Python
   con Django
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
Produje código para proyectos en dos días
(con la supervisión y guía de gente con más experiencia)
Mi editor de textos




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
$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
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
...en Linux                                                   http://twitpic.com/9idjb




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
...en Windows                                                 http://twitpic.com/bdls7




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
...en Mac                                                     http://twitpic.com/fb3ai




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
Feliz con el Pony! ..
pero ya no me gustan mucho otros frameworks :(
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
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
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
Libros




                    http://mundogeek.net/tutorial-python/

Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Libros




                            http://es.diveintopython.org

Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Libros




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Libros



                                                        +



Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Libros



                                               +

Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Libros




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Libros




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
Libros




Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
¿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
¿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
Proyecto “plugbullet”




                      http://github.com/charlieman/plugbullet
Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
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
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
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
Eso es todo!!


                        Gracias!!!
Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace
¿Preguntas?

Sábado 17 de Octubre 2009 – Reunión mensual PLUG – C.C. Compupalace

Weitere ähnliche Inhalte

Was ist angesagt?

Scheduling in Android
Scheduling in AndroidScheduling in Android
Scheduling in AndroidOpersys inc.
 
Golang (Go Programming Language)
Golang (Go Programming Language)Golang (Go Programming Language)
Golang (Go Programming Language)ShubhamMishra485
 
Introduction to go lang
Introduction to go langIntroduction to go lang
Introduction to go langAmal Mohan N
 
Sistema Operativo Ubuntu
Sistema Operativo UbuntuSistema Operativo Ubuntu
Sistema Operativo UbuntuBrolin Oliva
 
Go Programming language, golang
Go Programming language, golangGo Programming language, golang
Go Programming language, golangBasil N G
 
Go language presentation
Go language presentationGo language presentation
Go language presentationparamisoft
 
Android's Multimedia Framework
Android's Multimedia FrameworkAndroid's Multimedia Framework
Android's Multimedia FrameworkOpersys inc.
 
The Go programming language - Intro by MyLittleAdventure
The Go programming language - Intro by MyLittleAdventureThe Go programming language - Intro by MyLittleAdventure
The Go programming language - Intro by MyLittleAdventuremylittleadventure
 
Golang and Eco-System Introduction / Overview
Golang and Eco-System Introduction / OverviewGolang and Eco-System Introduction / Overview
Golang and Eco-System Introduction / OverviewMarkus Schneider
 
Coding with golang
Coding with golangCoding with golang
Coding with golangHannahMoss14
 
Overview of Linux
Overview of LinuxOverview of Linux
Overview of LinuxThang Man
 
Overview of Android binder IPC implementation
Overview of Android binder IPC implementationOverview of Android binder IPC implementation
Overview of Android binder IPC implementationChethan Pchethan
 

Was ist angesagt? (20)

Android Internals
Android InternalsAndroid Internals
Android Internals
 
Scheduling in Android
Scheduling in AndroidScheduling in Android
Scheduling in Android
 
Golang (Go Programming Language)
Golang (Go Programming Language)Golang (Go Programming Language)
Golang (Go Programming Language)
 
Introduction to go lang
Introduction to go langIntroduction to go lang
Introduction to go lang
 
Presentacion ubuntu 20.04
Presentacion ubuntu 20.04Presentacion ubuntu 20.04
Presentacion ubuntu 20.04
 
Sistema Operativo Ubuntu
Sistema Operativo UbuntuSistema Operativo Ubuntu
Sistema Operativo Ubuntu
 
Go lang
Go langGo lang
Go lang
 
Go Programming language, golang
Go Programming language, golangGo Programming language, golang
Go Programming language, golang
 
Go language presentation
Go language presentationGo language presentation
Go language presentation
 
Slackware Linux
Slackware LinuxSlackware Linux
Slackware Linux
 
Android's Multimedia Framework
Android's Multimedia FrameworkAndroid's Multimedia Framework
Android's Multimedia Framework
 
PYTHON.pptx
PYTHON.pptxPYTHON.pptx
PYTHON.pptx
 
The Go programming language - Intro by MyLittleAdventure
The Go programming language - Intro by MyLittleAdventureThe Go programming language - Intro by MyLittleAdventure
The Go programming language - Intro by MyLittleAdventure
 
Golang and Eco-System Introduction / Overview
Golang and Eco-System Introduction / OverviewGolang and Eco-System Introduction / Overview
Golang and Eco-System Introduction / Overview
 
Informe en word
Informe en wordInforme en word
Informe en word
 
Coding with golang
Coding with golangCoding with golang
Coding with golang
 
Binder: Android IPC
Binder: Android IPCBinder: Android IPC
Binder: Android IPC
 
Overview of Linux
Overview of LinuxOverview of Linux
Overview of Linux
 
Overview of Android binder IPC implementation
Overview of Android binder IPC implementationOverview of Android binder IPC implementation
Overview of Android binder IPC implementation
 
Uso y manejo de DFD - Una aproximación
Uso y manejo de DFD - Una aproximaciónUso y manejo de DFD - Una aproximación
Uso y manejo de DFD - Una aproximación
 

Andere mochten auch

Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y DjangoDesarrollo web ágil con Python y Django
Desarrollo web ágil con Python y DjangoJaime Irurzun
 
Intro Python
Intro PythonIntro Python
Intro Pythonctme
 
Temario Primaria Sexto Grado
Temario Primaria Sexto GradoTemario Primaria Sexto Grado
Temario Primaria Sexto GradoIBIME
 
Introduction au droit des societes (formation ecole des mines 2010)
Introduction au droit des societes (formation ecole des mines 2010)Introduction au droit des societes (formation ecole des mines 2010)
Introduction au droit des societes (formation ecole des mines 2010)Lipskier
 
Ciclo de vida del producto
Ciclo de vida del productoCiclo de vida del producto
Ciclo de vida del productoPIEDAD SANDOVAL
 
Controle biológico
Controle biológicoControle biológico
Controle biológicounesp
 
Production Documentaire Interactif en France
Production Documentaire Interactif en FranceProduction Documentaire Interactif en France
Production Documentaire Interactif en FranceGerald Holubowicz
 
Synodiance > Outils SEO - Table Ronde EBG 11/06/2013
Synodiance > Outils SEO - Table Ronde EBG 11/06/2013Synodiance > Outils SEO - Table Ronde EBG 11/06/2013
Synodiance > Outils SEO - Table Ronde EBG 11/06/2013Search Foresight
 
Diagnostic maturité (11 septembre 2013)
Diagnostic maturité (11 septembre 2013)Diagnostic maturité (11 septembre 2013)
Diagnostic maturité (11 septembre 2013)cdpgestion
 
L’Esprit du Japon - La capacité du peuple japonais à surmonter l’adversité
L’Esprit du Japon - La capacité du peuple japonais à surmonter l’adversitéL’Esprit du Japon - La capacité du peuple japonais à surmonter l’adversité
L’Esprit du Japon - La capacité du peuple japonais à surmonter l’adversitéMehdi Reghai
 
Atelier veille et prospection en btob nouvelles techniques - 14112013 - dif...
Atelier   veille et prospection en btob nouvelles techniques - 14112013 - dif...Atelier   veille et prospection en btob nouvelles techniques - 14112013 - dif...
Atelier veille et prospection en btob nouvelles techniques - 14112013 - dif...echangeurba
 

Andere mochten auch (20)

Desarrollo web ágil con Python y Django
Desarrollo web ágil con Python y DjangoDesarrollo web ágil con Python y Django
Desarrollo web ágil con Python y Django
 
Intro Python
Intro PythonIntro Python
Intro Python
 
Temario Primaria Sexto Grado
Temario Primaria Sexto GradoTemario Primaria Sexto Grado
Temario Primaria Sexto Grado
 
Introduccion a python 3
Introduccion a python 3Introduccion a python 3
Introduccion a python 3
 
Introduction au droit des societes (formation ecole des mines 2010)
Introduction au droit des societes (formation ecole des mines 2010)Introduction au droit des societes (formation ecole des mines 2010)
Introduction au droit des societes (formation ecole des mines 2010)
 
Programador Jr. para Python Primera Parte
Programador Jr. para Python Primera ParteProgramador Jr. para Python Primera Parte
Programador Jr. para Python Primera Parte
 
Python para principiantes
Python para principiantesPython para principiantes
Python para principiantes
 
Ciclo de vida del producto
Ciclo de vida del productoCiclo de vida del producto
Ciclo de vida del producto
 
Controle biológico
Controle biológicoControle biológico
Controle biológico
 
Django y Python para todos
Django y Python para todosDjango y Python para todos
Django y Python para todos
 
Production Documentaire Interactif en France
Production Documentaire Interactif en FranceProduction Documentaire Interactif en France
Production Documentaire Interactif en France
 
Synodiance > Outils SEO - Table Ronde EBG 11/06/2013
Synodiance > Outils SEO - Table Ronde EBG 11/06/2013Synodiance > Outils SEO - Table Ronde EBG 11/06/2013
Synodiance > Outils SEO - Table Ronde EBG 11/06/2013
 
Diagnostic maturité (11 septembre 2013)
Diagnostic maturité (11 septembre 2013)Diagnostic maturité (11 septembre 2013)
Diagnostic maturité (11 septembre 2013)
 
L’Esprit du Japon - La capacité du peuple japonais à surmonter l’adversité
L’Esprit du Japon - La capacité du peuple japonais à surmonter l’adversitéL’Esprit du Japon - La capacité du peuple japonais à surmonter l’adversité
L’Esprit du Japon - La capacité du peuple japonais à surmonter l’adversité
 
Atelier veille et prospection en btob nouvelles techniques - 14112013 - dif...
Atelier   veille et prospection en btob nouvelles techniques - 14112013 - dif...Atelier   veille et prospection en btob nouvelles techniques - 14112013 - dif...
Atelier veille et prospection en btob nouvelles techniques - 14112013 - dif...
 
Taller I Coreis Python 10112009
Taller I Coreis Python 10112009Taller I Coreis Python 10112009
Taller I Coreis Python 10112009
 
Du travail virtuel (teletravail) au BYOD
Du travail virtuel (teletravail) au BYODDu travail virtuel (teletravail) au BYOD
Du travail virtuel (teletravail) au BYOD
 
Propriété intellectuelle nov 2012
Propriété intellectuelle nov 2012Propriété intellectuelle nov 2012
Propriété intellectuelle nov 2012
 
Venecia Inolvidable
Venecia InolvidableVenecia Inolvidable
Venecia Inolvidable
 
mission, vision, valeurs et stratégie
mission, vision, valeurs et stratégie mission, vision, valeurs et stratégie
mission, vision, valeurs et stratégie
 

Ähnlich wie ¿Porqué Python? ...y Django

Parallel python sistemas operativos avanzados
Parallel python sistemas operativos avanzadosParallel python sistemas operativos avanzados
Parallel python sistemas operativos avanzadosDaniel Muccela
 
python-para-todos.pdf
python-para-todos.pdfpython-para-todos.pdf
python-para-todos.pdfJaviMartin21
 
Python para todos
Python para todosPython para todos
Python para todosErik Gur
 
python-para-todos.pdf
python-para-todos.pdfpython-para-todos.pdf
python-para-todos.pdfRafalJMalave
 
Python para todos
Python para todosPython para todos
Python para todossebas145713
 
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdfssuser626fe4
 
Integrando mis librerías C++ con Python
Integrando mis librerías C++ con PythonIntegrando mis librerías C++ con Python
Integrando mis librerías C++ con PythonCarlos Gustavo Ruiz
 
Jupyter e IPython para manipulación de datos
Jupyter e IPython para manipulación de datosJupyter e IPython para manipulación de datos
Jupyter e IPython para manipulación de datosSoftware Guru
 
Python y la POO, en una clase, UNNe-Corrientes
Python y la POO, en una clase, UNNe-CorrientesPython y la POO, en una clase, UNNe-Corrientes
Python y la POO, en una clase, UNNe-Corrientesalexis ibarra
 
Python basic slides for beginners to learn python
Python basic slides for beginners to learn pythonPython basic slides for beginners to learn python
Python basic slides for beginners to learn pythonnotelodigo5
 
Acceder a C desde Python (O viceversa)
Acceder a C desde Python (O viceversa)Acceder a C desde Python (O viceversa)
Acceder a C desde Python (O viceversa)Juan Rodríguez
 
Python_Module_01_Courtesy.pdf
Python_Module_01_Courtesy.pdfPython_Module_01_Courtesy.pdf
Python_Module_01_Courtesy.pdfCeth1
 
Transparencias taller Python
Transparencias taller PythonTransparencias taller Python
Transparencias taller PythonSergio Soto
 
Manual de python
Manual de pythonManual de python
Manual de pythonULEAM
 

Ähnlich wie ¿Porqué Python? ...y Django (20)

Python power 1
Python power 1Python power 1
Python power 1
 
Parallel python sistemas operativos avanzados
Parallel python sistemas operativos avanzadosParallel python sistemas operativos avanzados
Parallel python sistemas operativos avanzados
 
python-para-todos.pdf
python-para-todos.pdfpython-para-todos.pdf
python-para-todos.pdf
 
Python para todos
Python para todosPython para todos
Python para todos
 
Python para Todos
Python para TodosPython para Todos
Python para Todos
 
python-para-todos.pdf
python-para-todos.pdfpython-para-todos.pdf
python-para-todos.pdf
 
Python para todos
Python para todosPython para todos
Python para todos
 
Libro python para todos
Libro   python para todosLibro   python para todos
Libro python para todos
 
Python para todos
Python para todosPython para todos
Python para todos
 
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdf
 
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdf
 
Integrando mis librerías C++ con Python
Integrando mis librerías C++ con PythonIntegrando mis librerías C++ con Python
Integrando mis librerías C++ con Python
 
Jupyter e IPython para manipulación de datos
Jupyter e IPython para manipulación de datosJupyter e IPython para manipulación de datos
Jupyter e IPython para manipulación de datos
 
Python y la POO, en una clase, UNNe-Corrientes
Python y la POO, en una clase, UNNe-CorrientesPython y la POO, en una clase, UNNe-Corrientes
Python y la POO, en una clase, UNNe-Corrientes
 
Clase1_Python-CTIC
Clase1_Python-CTICClase1_Python-CTIC
Clase1_Python-CTIC
 
Python basic slides for beginners to learn python
Python basic slides for beginners to learn pythonPython basic slides for beginners to learn python
Python basic slides for beginners to learn python
 
Acceder a C desde Python (O viceversa)
Acceder a C desde Python (O viceversa)Acceder a C desde Python (O viceversa)
Acceder a C desde Python (O viceversa)
 
Python_Module_01_Courtesy.pdf
Python_Module_01_Courtesy.pdfPython_Module_01_Courtesy.pdf
Python_Module_01_Courtesy.pdf
 
Transparencias taller Python
Transparencias taller PythonTransparencias taller Python
Transparencias taller Python
 
Manual de python
Manual de pythonManual de python
Manual de python
 

Mehr von Antonio Ognio

Desarrollo ágil de sistemas distribuidos con Python empleando la arquitectura...
Desarrollo ágil de sistemas distribuidos con Python empleando la arquitectura...Desarrollo ágil de sistemas distribuidos con Python empleando la arquitectura...
Desarrollo ágil de sistemas distribuidos con Python empleando la arquitectura...Antonio Ognio
 
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?Antonio Ognio
 
Organizando una Hackparty
Organizando una HackpartyOrganizando una Hackparty
Organizando una HackpartyAntonio Ognio
 
Redis: servidor de estructuras de datos
Redis: servidor de estructuras de datosRedis: servidor de estructuras de datos
Redis: servidor de estructuras de datosAntonio Ognio
 
Lenguajes y frameworks para desarrollo web
Lenguajes y frameworks para desarrollo webLenguajes y frameworks para desarrollo web
Lenguajes y frameworks para desarrollo webAntonio Ognio
 
Bases de datos NoSQL - Huancayo - 2010
Bases de datos NoSQL - Huancayo - 2010Bases de datos NoSQL - Huancayo - 2010
Bases de datos NoSQL - Huancayo - 2010Antonio Ognio
 
Desarrollando con PHP en Windows
Desarrollando con PHP en WindowsDesarrollando con PHP en Windows
Desarrollando con PHP en WindowsAntonio Ognio
 
Gestor de paquetes YUM
Gestor de paquetes YUMGestor de paquetes YUM
Gestor de paquetes YUMAntonio Ognio
 
Mejorando la seguridad del servicio SSH - Hardening
Mejorando la seguridad del servicio SSH - HardeningMejorando la seguridad del servicio SSH - Hardening
Mejorando la seguridad del servicio SSH - HardeningAntonio Ognio
 
Mini-tutorial de git
Mini-tutorial de gitMini-tutorial de git
Mini-tutorial de gitAntonio Ognio
 
Ubuntu Server Edition 9.04 Jaunty Jackalope
Ubuntu Server Edition 9.04 Jaunty JackalopeUbuntu Server Edition 9.04 Jaunty Jackalope
Ubuntu Server Edition 9.04 Jaunty JackalopeAntonio Ognio
 
Consejos y trucos de supervivencia para nuevos usuarios de GNU/Linux
Consejos y trucos de supervivencia para nuevos usuarios de GNU/LinuxConsejos y trucos de supervivencia para nuevos usuarios de GNU/Linux
Consejos y trucos de supervivencia para nuevos usuarios de GNU/LinuxAntonio Ognio
 

Mehr von Antonio Ognio (16)

Desarrollo ágil de sistemas distribuidos con Python empleando la arquitectura...
Desarrollo ágil de sistemas distribuidos con Python empleando la arquitectura...Desarrollo ágil de sistemas distribuidos con Python empleando la arquitectura...
Desarrollo ágil de sistemas distribuidos con Python empleando la arquitectura...
 
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
¿Cómo elegir el languaje y el framework de tu próxima aplicación web?
 
Organizando una Hackparty
Organizando una HackpartyOrganizando una Hackparty
Organizando una Hackparty
 
Lean Startups
Lean StartupsLean Startups
Lean Startups
 
Redis: servidor de estructuras de datos
Redis: servidor de estructuras de datosRedis: servidor de estructuras de datos
Redis: servidor de estructuras de datos
 
Lenguajes y frameworks para desarrollo web
Lenguajes y frameworks para desarrollo webLenguajes y frameworks para desarrollo web
Lenguajes y frameworks para desarrollo web
 
Bases de datos NoSQL - Huancayo - 2010
Bases de datos NoSQL - Huancayo - 2010Bases de datos NoSQL - Huancayo - 2010
Bases de datos NoSQL - Huancayo - 2010
 
Desarrollando con PHP en Windows
Desarrollando con PHP en WindowsDesarrollando con PHP en Windows
Desarrollando con PHP en Windows
 
Gestor de paquetes YUM
Gestor de paquetes YUMGestor de paquetes YUM
Gestor de paquetes YUM
 
Twixer (english)
Twixer (english)Twixer (english)
Twixer (english)
 
Twixer
TwixerTwixer
Twixer
 
Mejorando la seguridad del servicio SSH - Hardening
Mejorando la seguridad del servicio SSH - HardeningMejorando la seguridad del servicio SSH - Hardening
Mejorando la seguridad del servicio SSH - Hardening
 
Mini-tutorial de git
Mini-tutorial de gitMini-tutorial de git
Mini-tutorial de git
 
Ubuntu Server Edition 9.04 Jaunty Jackalope
Ubuntu Server Edition 9.04 Jaunty JackalopeUbuntu Server Edition 9.04 Jaunty Jackalope
Ubuntu Server Edition 9.04 Jaunty Jackalope
 
Consejos y trucos de supervivencia para nuevos usuarios de GNU/Linux
Consejos y trucos de supervivencia para nuevos usuarios de GNU/LinuxConsejos y trucos de supervivencia para nuevos usuarios de GNU/Linux
Consejos y trucos de supervivencia para nuevos usuarios de GNU/Linux
 
REPLs
REPLsREPLs
REPLs
 

Kürzlich hochgeladen

Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel tallerValentinaTabares11
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramDIDIERFERNANDOGUERRE
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 

Kürzlich hochgeladen (20)

Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel taller
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Explorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ramExplorando la historia y funcionamiento de la memoria ram
Explorando la historia y funcionamiento de la memoria ram
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 

¿Porqué Python? ...y Django

  • 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)  
  • 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