miércoles, 4 de junio de 2014

Sexto programa de Python Conexiones a Base de Datos

Una parte importante y lo mas real en casi todo entorno de trabajo automatizado, es la interacción con base de datos. Para este fin Python nos ofrece una manera
sencilla de trabajar con bases de datos.
Debemos tomar en cuenta la versión de Python que estemos usando para instalar la libreria específica para la base de datos que estemos usando.
Vamos a ver un programa que realiza una tarea muy comun:
1. Conectarse a una base de datos
2. Consultar una tabla
3. Exportar los resultados a un archivo de texto

Increíble que esto lo podamos hacer con tan pocas líneas, en este ejemplo usé Oracle. Y en esta ocasión colocaré imágenes en vez de texto (adiós copy/paste) hahaha,
veamos que tal.
Vemos que en las primeras líneas estamos haciendo un import de componentes externos, en este caso tenemos que instalas el modulo cx_Oracle que nos permite trabajar con bases de datos Oracle, para casos en que uses PostgreSQL, MySQL, SQLite deberás buscar el módulo adecuado y seguir los pasos de su instalación, tomar en cuenta que los módulos de base de datos van de acuerdo a la version de Python que estés usando.
Otro punto importante es notar que podemos especificar un name a nuestro gusto (cx_Oracle as ora) eso ayuda cuando el nombre del módulo que importamos tiene un nombre muy largo.
Con makedsn construimos una cadena de conexión para el metodo connect, vemos que el primer parámetro es el IP del servidor de la BDD, segundo el puerto, y tercero el nombre de la base de datos (SID por ejemplo).
Una vez teniendo el dsn nos conectamos con el user/password de la base de datos.
Estando conectados podemos ejecutar DML y extraer datos, en este caso volcamos los resultados a un archivo de texto llamado "tablares.txt"

Al ejecutar el programa deberas ver lo siguiente:

En donde 11.2.0.1.0 es la version de mi base de datos y seguido el tiempo que tomo el proceso en crear el archivo de texto con todos los registros.

Luego podremos ver que se ha creado el archivo de texto "tableres.txt"


Espero que les ayude, ya saben que bienvenidas son las preguntas!
Un saludo!

Quinto programa con Python (Clases)

Para este programa vamos a ver que tal se maneja el concepto de Clase con Python, revisemos línea a línea el siguiente programa para ver a que corresponde cada una.
Como siempre te invito a copiar (a mano) las lineas que no tienen # por delante, ya que como sabemos son comentarios que el compilador ignora.
Este programa escribirá todo lo que el usario le envie por consola en un archivo de texto, terminará cuando el usuario escriba Adios.

#Una clase se define mediante la palabra clase class
class Archivo:
#Viniendo de Java lo primero que intente ubicar fue un constructor, en el caso de python, este se define como __init__, y algo muy importante es nunca olvidar
#el parametro self, de olvidarlo veras algo como "TypeError: function() takes 0 positional arguments but 1 was given".
#self viene a ser algo asi como el this de java, es decir los atributos de instancia que persisten a traves de la vida del objeto.
    def __init__(self, name, content):
        self.name = name
        self.content = content
        print("Archivo llamado ", name)

#En java tenemos la palabra private para indicar que un atributo o metodo es privado, en python esto lo podemos hacer para los metodos con un doble subrayado, 
#veremos que la forma de utilizar (llamar) estas funciones es un tanto diferente, no olvidar el parametro self
    def __escribir(self):
        t = input("Escriba > ")
        self.content += "\n" + t

#Este metodo es normal, tal como lo habiamos visto en el programa 4
    def leer(self):
#Validamos el contenido del archivo antes de leerlo
        if len(self.content) == 0:
            print("Archivo no tiene contenido, escriba algo")
        else:
            print("cat " + self.name + "\n",self.content)


#Uso de la clase
#Vamos a instanciar un objeto de nuestra clase
#Recordar que arriba colocamos el metodo de inicializacion con los parametros de nombre del archivo y algo de contenido, notar que el self no debe ser cargado por 
#nosotros
a = Archivo("CV.doc", "")

#Ofrecemos las instrucciones, notar que con triple doble comilla podemos imprimir lineas tal cual como las escribimos en el fichero de fuente.
print("""Escriba:
    e para escribir
    l para leer
    bye para salir""")
    
#Entramos a un blucle infinito, que se encargara de interactual con el usuario
while True:
    r = input("> ")
    if r == "bye":
        print("Adios")#Si el usuario escribe Adios salimos del programa
        break
    elif r == "e":
#Observar el llamado a la funcion que definimos privada, a es el identificador de la instancia, seguido de un underline y el nombre de nuestra clase (Archivo) doble 
#subrayado y el nombre de nuestra funcion.
        a._Archivo__escribir()#Llamado a una funcion privada
    elif r == "l":
        a.leer()
    else:
        print("Opcion no valida")
             
         
Bueno, eso ha sido todo por hoy. Ya podemos definir clases, sabemos como instanciarlas y construir inicializadores segun las necesidades de nuestro objeto.
Podemos acceder a funciones privadas y publicas de una clase.
Un saludo, bienvenidas son las preguntas!

martes, 13 de mayo de 2014

Cuarto programa de Python (Funciones)

Para el cuarto programa vamos a ponernos interactivos, vamos a crear un programa que nos diga nuestra edad, muy sencillo, pero nos servirá para entender mejor la captura de datos por teclado y lo más importante, definir y utilizar funciones (métodos)
Voy a #comentar todo entre líneas para que se entienda mejor.
Como de costumbre puedes escribir (sí escribir, no copy/paste) este código en tu IDLE de Python y ejecutarlo con F5

#Mi cuarto programa Python
#Si se abre con IDLE, ejecutar con la tecla F5

#Funciones

#Vamos a definir una fincion, su nombre es calcularEdad (a python no le gustan las mayusculas, pero es que vengo de Java entiéndanme)
#Esta función o metodo va a recibir un argumento, fijense que no estamos especificando el tipo del argumento, simplemente va porque vá, queda de nosotros
#manipular este dato en nuestro código, en este ejemplo; como lo vamos a recibir de input() por seguridad lo pasamos a string con str()
#la función no retorna cosa alguna, solo nos imprime nuestra edad
def calcularEdad (anio_nacimiento):
    print("Tu edad es " + str(2014 - anio_nacimiento) + " años")
    
#la variable entrada tendra valor capturado por teclado, esto se logra con la función input()
entrada = input("Ingrese su año de nacimiento ")

#Vamos a llamar a nuestra función creada anteriormente con el valor que tomamos de entrada
calcularEdad(int(entrada))

#Bien, ahora que vimos funciones sin retorno (tipo void) vamos a ver funciones que retornen algo
#nuevamente fue muy extraño para mi no tener la necesidad de definir qué es lo que debo retornar en mi función, simplemente con colocar la palabra return 
#estamos indicando que la función retorna algo, en nuestro ejemplo retorna un entero (nuestra edad)
def calcularEdad2 (anio):
    return 2014 - anio

#Nuevamente vamos a tomar entrada desde el teclado para ejecutar nuestra función
entrada2 = input("Ingrese su año de nacimiento ")

#Vemos que para este caso, como la funcion retorna, podemos almacenar su valor retornado en una variable (answer)
answer = calcularEdad2(int(entrada2))
#Imprimimos la variable answer que  es la que posee el valor que retorno la funcion
print("Tu edad es " + str(answer) + " años")

#Numero variable de parametros en una funcion
#Tal como lo indica la documentacion https://docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions
#una funcion puede definirse para que tome una cantidad de argumentos variable, si bien es cierto en este ejemplo obligatoriamente estamos definiendo que 
#se le deben enviar 2 argumentos (por arg1 y arg2), el tercer parametro puede ser una tupla o un diccionario, esto lo sabemos por el argumento *arg3.
#Si la tupla no contiene valor alguno no se imprimirá nada que inicie con Item: o en el print de abajo, prueba colocarle algo a ver que pasa :)

def variable(arg1, arg2, *arg3):
    for s in arg3:
        print("Item: " + str(s))
        
    print(arg1, arg2, arg3)


a = input("Ingrese un numero ")
b = input("otro ...")

#array = [23,22,21,20] #lista extra #descomenta esta linea para enviarle una lista a la funcion
#variable(int(a), int(b), array) # esta tambien si le pasas la lista
variable(int(a), int(b))

En resumen

  1. Muy importante y si eres observador, habrás notado que las funciones se definen con la palabra def
  2. Lo demás está explicado no?, las preguntas son bienvenidas!
Recuerden ir a descubrir mucho mas en la Documentación


Tercer programa de Python (Sentencias de flujo)

Para el tercer programa, decidí fijarme en las sentencias de flujos (las más comunes), recomiendo revisar la Documentación ya que hay muchas cosas interesantes

Una de las cosas que puede llegar a romperte la cabeza son las identaciones del código que pertenece por ejemplo a un if, while, for, etc. ya que al no requerir llaves para
definir los bloques de código, debemos tener sumo cuidado con las tabulaciones.
No es lo mismo
 for i in range(5):
print(i)
print("boo")

que

for i in range(5):
print(i)
print("boo")
pueden ejecutarlo si gustan, en fin; otra cosa importante es recordar que los dos puntos (:) denotan el inicio de la sentencia de flujo, poner atención a ello en el
siguiente código.

#****************************************************************
#Mi tercer programa Python
#Si se abre con IDLE, ejecutar con la tecla F5

#Sentencias de flujo

#IF
a = 10
b = 70

#Importante: las sentencias a ejecutar segun se cumpla la condicion o no; debe
#identarse con un Tab
if (b/a) > 5 :
    print("Alcanza para todos")
    print("tenemos", 70/10)
else:
    print("No alcanza para todos")

#WHILE
#Se pueden omitir los parentesis de la condicion
count = 0

print("Uso del while")
while ( count <= 5 ):
    count += 1
    print("Imprimo " + str(count) + " veces")

#Entrada por teclado con input(""),
#en Python 3 se elimino el raw_input()
    
print ("While infinito, escribe adios para salir")

while True:
    entrada = input("> ")
    if entrada == "adios":
        break
    else:
        print (entrada)

#FOR
#Similar a Java se puede iterar sobre objetos sin necesidad de un contador
        
secuencia = ["uno","dos","tres","cuatro","cinco"]

for e in secuencia:
    print("Salgo en " + e)
#****************************************************************

En resumen:

  1. Muy importante tener en cuenta los dos puntos (:) y las tabulaciones para los bloques de código, es vital esto, porque los métodos o funciones funcionan de igual forma
  2. Los que estamos acostumbrados a C o Java vamos; por inercia a utilizar parentesis en las condiciones if (1 == i), pero acá los puedes omitir if 1 == i
  3. Vimos el uso de la función str (print("Imprimo " + str(count) + " veces")) sin esto no podríamos concatenar el entero al resto de la cadena
  4. Otra cosa importante y que me tomó algo darme cuenta, era que en Python 3 se eliminó la función raw_input() para procesar la entrada del teclado, de Python 3.x en adelante debemos usar input()
  5. Descubrí que los for son bastante resumidos en comparacion con otros lenguajes
Recuerden revisar la ¡¡¡¡Documentación!!!! de paso les dejo el Cuarto programa
Saludos!

Segundo programa Python (Listas, Tuplas y Diccionarios)

Para el segundo programa vamos a ver las listas, tuplas y diccionarios.
En este punto existen varias cosas interesantes, como la busqueda por rangos, la búsqueda de atras hacia adelante en una lista, y la búsqueda con saltos (no sé como decirle exactamente). Vamos a verlo en el siguiente código.
Copialo y pégalo en el IDLE de Python y pinchale a F5.

#****************************************************************
#Mi segundo programa Python
#Si se abre con IDLE, ejecutar con la tecla F5

#Listas (arrays o vectores)
lista1 = [1, 2, "tres", 4, "cinco", [2,3], 7, "ocho", "nueve", 10]

print("Accediendo a la lista:", lista1[2])
#La sublista esta en el index 5 de la lista principal, accedemos al primer valor
#de ella (sublista)
print("Accediendo a la sublista:", lista1[5][0])

print("Lista original:", lista1)
lista1[0] = 100
print("Modifico 1er elemento (1 por 100):", lista1)

#Uso de numero negativo (busqueda inversa)
#Buscará la 3 posicion de atras hacia adelante de la lista
print(lista1[-3])

#Uso de Slicing (particionado) o busqueda por rango
print(lista1[0:4])

#Uso de saltos (cada n cantidad)
#Buscara solo en la posicion 0 a la 8, saltando 3 elementos en cada item encontrado
print(lista1[0:8:3])

#Tuplas
#Se pueden manejar a las listas
#La gran diferencia es que las tuplas son inmutables
#tupla1[1] = 100 (TypeError: 'tuple' object does not support item assignment) #este es el error que dá si intentas cambir algo, lo puedes descomentar para que lo vivas :)
tupla1 = (1,2,3,4,5)
print("Tupla:", tupla1[:3])

#Diccionarios, la misma vaina que los HashMaps de JAVA :)
diccionario = {"uno":1, "dos":2, "tres":3}
print("Diccionario:", diccionario["uno"])

#****************************************************************

En resumen:

  1. Crear una lista es bastante sencillo, de igual forma acceder a sus elementos
  2. Si bien las tuplas pueden ser manipuladas como una lista para su consulta, la gran diferencia es que las tuplas son inmutables, es decir que son como una especie de constante, no podemos cambiar los valores que les asignemos al crearlas.
  3. Listas se crean con [], las tuplas se crean con ()
  4. Y pues los diccionarios son una estructura de clave = valor en la que los valores se acceden por el nombre de la clave, similar a los HashMaps de Java
  5. De igual manera, aunque no lo puse aqui (y obviamente) podemos hacer pruebas de recorridos con un for, que por cierto lleva abreviadas muchas cosas para los que estamos acostumbrados a los for de C o los antiguos de Java.
Aqui esta el Tercer programa

lunes, 12 de mayo de 2014

Este fué mi primer programa con Python, muy simple realmente. Comento entre líneas lo que estaba haciendo (recordar que los comentarios inician con #)
Copia el contenido a continuación (te sería más instructivo escribirlo pero bueno ...) y pégalo en el IDLE, ejecútalo con F5

#*****************************************************************************
#Mi primer programa Python
#El print recibe cualquier cantidad de parametros separados por coma (,)
#incluyendo expresiones aritmeticas como se muestra a continuacion.
#Si se abre con IDLE, ejecutar con la tecla F5

print ("Si sumas 2 + 3 el resultdo es ",
       2 + 3,
       "\nPero si los restas el resultado es ",
       2 - 3,
       "\nQue cosa no?")

#Variables
#No necesitas declarar de qué tipo son, sólo se declaran (tipo dinamico)
a = "Soy una cadena de texto"
b = 50
c = 25

print(a, "\nOperacion:", b + c)

c = "Como los tipo son dinamicos, puedes cambiar el tipo de dato de tu variable en tiempo de ejecución"
print(c) #Notar que c era un entero (25)

multilinea = """ Esto es cool
                 puedo escribir lineas sin usar carracteres de escape
                 solamente usando las comillas triples :)"""

print(multilinea)

#Las cadenas tambien aceptan operaciones aritmeticas
#Es decir que puedes multiplicar o sumar cadenas de texto
d = "eco"
e = d * 3
f = "sistema"
print("Multiplicacion de cadenas:", e)

e = d + f
print("Suma de cadenas:", e)
#*****************************************************************************

En resumen:

  1. Es bastante agradable el metodo print, ya que acepta lo que le pongas y como lo pongas (salvo el caso de los enteros y lo que no sea string. Pero tranquilo! tenemos el método str() que transforma a string lo que le pongas :) Ej.: print(str(25))
  2. Vimos que los tipos de datos son dinámicos (c era un entero y luego era un string)
  3. Vimos los textos multilinea con """ """", util si no se quiere usar el clásico \n (que puede ser usado)
  4. Vimos la multiplicación de cadenas
Un saludo! Cualquier duda, pues a la orden!

Aprendiendo Python

Bueno, hace algunos días decidí hacer cosas con Python para ver que tal, ya que quería aprender un nuevo lenguaje y me decidí por él.
En mi caso venía de trabajar puramente con Java y para mi sorpresa las diferencias son muchas (jejeje lógico no?), pero hay unas que me agradaron muchas.
Visto desde el punto de vista de la línea de aprendizaje pues hacer un programa algo complejo (Conexión a base de datos con Oracle usando ORM SQLAlchemy) no me tardó mucho.
Aunque atribuyo eso a que ya conocía un lenguaje orientado a objetos y que algunas cosas pues son muy similares funcionalmente.

Si me percaté de ciertas diferencias muy notables que dejo a continuación:

  1. No tienes que tipar tus variables, el tipo de datos de las mismas es dinámico, es decir que según como la uses el tipo de dato de tu variable cambiará.
  2. Los bloques de código no se cierran con llaves, en el caso del for y demás cosas por el estilo, se debe tabular el código (perfecto para mí porque tengo la tecla de la llave cerrando dañada :D)
  3. Las funciones se declaran con la palabra def y aunque la función o método retorne datos no necesitas especificarlo en la definición de la función.
  4. Debido a lo anterior y a lo del tipo dinámico de datos, la característica de POO sobre polimorfismo pierde un poco su lugar jejejjeeje.
  5. Hablando de métodos y constructores todos (nunca se te olvide) llevan el parametro self, que es una forma como de this (de Java)
  6. Para imprimir solo usa print!!! (no como ese largo System.out.println balalalalala .... )
  7. Existe el try/except en vez de try/catch
  8. Leer y escribir archivos ... qué les puedo decir ... es muy fácil!
  9. Conectarte a una base de datos tambien es muy fácil, solo debes buscar los módulos indicados :)
  10. La herencia es multiple!!! 
  11. No! Los comentarios no inician con // inician con #

Bueno y sobre eso un montón de cosas más que aún voy descubriendo, pero por lo general han sido cosas muy buenas e interesantes y se puede decir que ya le tengo cariño.

Antes de iniciar, pues lógicamente debemos instalar Python en muestra máquina para poder usar la consola interactiva (!Si, consola interactiva!)

Partí con Python 3.3, entiendo que va por la 3.4 pero bueno habrá que revisar, ya que mi primer tropiezo fué leer la documentación de Python 2.x y darme cuenta que el print se convirtió en un metodo, por ende se debía llamar con parentesis ()

Para Windows es fácil, solo descargate el instalador (Aquí) y lo instalas (valga la redundancia) y en tu menú de programas aparecerá Python 3.3, para mi fué mas bonito usar la opción IDLE (Python GUI) que está dentro del menú Python 3.3, con este puedes ejecutar tu código presionando la tecla F5

¡Aqui está el primer programa!