26 de junio de 2012

Python primera prensada


En cualquier orden, esta es una primera impresión

Voy a tomar como referencia el lenguaje C por conocerlo, pero no es una comparativa. Dejando de lado que usualmente Python se ejecuta bajo un intérprete, lo primero que me llamó la atención es que las funciones en lugar de definirse entre llaves {}, requieren indentación, (sí, requieren ), supongo esto es para que la legibilidad del código no quede del todo librada al programador y sea parte de la sintaxis, otro detalle inmediato es que no se usa punto y coma al final de las líneas, y que los comentarios de código se escriben anteponiendo #. Aunque incompatibles con C, son lindas cosas, hasta ahí particularidades que no aportan mayor ventaja, veamos algo más, un hola mundo.

Hello World
  • En C
    // Comentario
     int main(void)  
     {  
         printf("hola mundo" );  
         return 0;  
     }   
    
  • En Python
    # Comentario  
    print ("hola mundo") 
    
En ese ejemplo Python luce más simple, pero para ser justos debería compararse con un hola mundo definido en una función main, que esto revelar más detalles del lenguaje, y hecho así ya no parece simple.

Python main
  • #Definiendo main como función
    def main():
        print ('hola mundo')      #1
    if __name__ == '__main__':    #2
        main() 
    
    #1: Notar la indentación (viene a ser equivalente a las llaves de C)
    #2: Aquí el hecho de no tener indentación da por terminada la def anterior
Repetir Strings
  • #Aprovecho a mencionar una singular forma de repetir strings
    print("hola mundo " * 5)
    
    hola mundo hola mundo hola mundo hola mundo hola mundo
Dicho sea de paso, estos ejemplos son para Python 3.x, aclaro esto porque a partir de la versión 3.x print usa paréntesis, es una función, por lo tanto el "hola mundo" de la versión 2.x (sin paréntesis) tan simple que parece, es incompatible.

Python 2.x
  • print "hola mundo"
Python 3.x
  • print ("hola mundo")

Esto evidentemente puede ocacionar problemas con código 'viejo', pero como salvedad digamos que "no es tan importante de donde viene, sino adonde va", y creo que es una mejora uniformizar el llamado a funciones.
Otra cosa, para poder usar ciertos caracteres (por ejemplo tildes) en los comentarios se debe aclarar primero la codificación que se va a usar en el archivo, por ejemplo:
  • #coding: latin-1

Entorno de Desarrollo Integrado (IDE)

Por suerte conseguir una IDE funcional fue relativamente rápido: pyDev.org  (basada en eclipse  que además tiene una versión stand-alone Aptana  y por lo visto funcionan ok).
Hay también un plugin para Netbeans para los que nos gusta esa IDE.

List Comprehension

Esto me gusta, al menos es algo útil, varios lenguajes traen esta característica o alguna similar, las "listas por comprensión" son una forma de procesar y generar listas. A la lista se ingresan, filtran y extraen datos de una forma directa, especificando el qué y sin los detalles de cómo.
Esto podría pensarse en términos más generales como el avance de la abstracción en los lenguajes, (pensemos que hay microcontroladores que ni siquiera tienen una instrucción de multiplicar, y las multiplicaciones se hacen mediante desplazamientos de bits y/o sumas sucesivas), pero todo eso es invisible para el lenguaje, y es solucionado por el compilador, por lo tanto en ese caso básico ya se puede ver cómo un "algoritmo oculto" (lenguaje abstracto) resuelve el cómo especificando sólamente el qué.
Como siempre toda abstracción exige que se pierdan ciertos detalles, y el control sobre esos detalles, y aunque esto aparentemente limita ciertas posibilidades a bajo nivel permitite facilitar otras de mayor nivel que en definitiva son más complejas y tienen un mayor alcance.
Aquí algunos ejemplos que se explican a sí mismos con los resultados
  • #Imprime el elemento 3 
    #Va a imprimir la D (ya que empieza en indice=0 tal como los array de C)
    
    lista = ['A', 'B', 'C', 'D', 'E']
    print( lista[3] )
    
    D
  • #coding: latin-1
    #Ahora vamos a usar 'comprehension' para extraer datos
    #Se obtienen, modifican e imprimen todos los elementos de la lista
    #multiplicando cada valor por 2
    #Observar que la palabra elemento sólo se usa para referenciar el item
    #puede usarse cualquier nombre de variable
    #(abajo está la misma operación mediante for (sin comprehension) )
    listaNumeros = [100, 200, 300, 400, 500] 
    listaCompre= [2*elemento for elemento in listaNumeros]
    print(listaCompre)
    
    listaClasic = []
    for valor in listaNumeros:
        listaClasic.append(2*valor)
        
    print(listaClasic)
    
    [200, 400, 600, 800, 1000]
  • #coding: latin-1
    #Hacemos un poco más complejo el comprehension agregando unos if's
    #Para modificar y seleccionar algunos items de la lista
    #(Notar que la condición la chequea antes de hacer la operación)
    listaNumeros = [1, 2, 3, 4, 5] 
    listaSelecta =[10*valor for valor in listaNumeros if valor>=3]
    print(listaSelecta)
    
    listaDos=['hola', 'cómo', 'va']
    listaFiltrada = [valor for valor in listaDos if valor!='hola']
    print(listaFiltrada)
    
    [30, 40, 50]
    ['cómo', 'va']
Suficiente para una primera impresión