Python – Post 00
02/05/2011
Este post, debió ser el primero de la serie de post sobre programación en Python. Voy a dar una breve introducción y a explicar algunas cosas básicas del lenguaje.
Python es un lenguaje de programación que está pensado para ser un lenguaje limpio y fácil de leer. Creado por Guido van Rossum, Python es un lenguaje interpretado, orientado a objetos, con tipado dinámico, fuertemente tipado y, cómo ventaja principal, es multiplataforma.
Según sus mantenedores:
Python es un lenguaje de programación que te permita trabajar más rápidamente e integrar tus sistemas más efectivamente. Puedes aprender Python e inmediatamente ver la ganancia en productividad y costos de mantenimiento más bajos.
Igual que lo hice algún tiempo, les voy a recomendar el libro “Python Para Todos” el cual está publicado por los amigos del blog mundogeek. Es un excelente libro para comenzar a aprender Python.
También les voy a recomendar el libro “Aprenda a pensar como un programador con Python”.
Por último les dejo el enlace de las “Clases de Python de Google”, están en inglés, pero son de lo mejor.
Ahora sí, entremos un poco en el tema de Python.
Obtener Python
Pues cómo sabrán (y para los que no lo saben) soy usuario de Ubuntu, por lo que obtener python se reduce a un simpe
sudo aptitude install python-all
Lo cual instalará todo lo necesario para trabajar en Python 2.6. Si quieren Python 2.7, pues
sudo aptitude install python2.7
Y pueden experimentar Python 3:
sudo aptitude install python3-all
¿Las diferencias? Pues entre Python 2.6 y 2.7 no hay muchas diferencias para el código, la diferencia real es con Python 3. Acá trabajaremos con Python 2.7 ¿por qué? Pues cómo dice en su web:
Hay mucho más software de terceros hecho para Python 2.7 que para Python 3, todavía.
IMHO Python 3, aunque ya está bien preparado y listo, sigue siendo aún muy nuevo, además que su adopción no ha sido tan masiva debido al cambio de paradigmas tan brusco que trajo consigo.
Para descargas de versiones para otras plataformas hay que dirigerse a la “Página de descargas de Python”.
Programando Python
Lo primero a saber, es que es un lenguaje interpretado, como lo comenté al principio, por lo cual no hay que compilar el código para generar un ejecutable ni nada por el estilo. Simplemente escribes el código, le das permiso de ejecución al archivo y lo ejecutas.
Bien hasta ahora, pero viene una pregunta fundamental: ¿Con qué (IDE) programo en Python? Pues esa no es una pregunta simple, ya que va a depender de los gustos de cada quien. Mis pruebas y recomendaciones son (en orden de prioridad):
- vim: Sí, vim. Vi iMproved es un clon mejorado del vi de Unix. Es un editor de texto para consola, aunque cuenta con una versión para GTK. Es personalizable, y existen ya muchas personalizaciones especializadas para Python. Para mí es la mejor elección a la hora de programar, sobretodo porque puedo portar mi configuración. Un par de referencias:
- Scribes: es un editor minimalista para Gnome. Es muy flexible, se puede manejar todo con el teclado. Resaltado de sintaxis, auto-indentado, autocomletado, personalizable a través de themes (los puedes hacer tu mismo, pero realmente son complejos). La desventaja y que no va a desarrollarse, o por lo menos no por el creador de este excelente editor es que no soporta múltiples archivos en una sola instancia, es decir, siempre se abren los archivos en una ventana nueva, nada de pestañas, ni de segundo plano.
- gedit: es el editor de texto por defecto para gnome. Tiene gran variedad de plugins y themes. No tengo casi nada que decir de este editor más que, si tienes gnome y quieres programar, no tienes excusa, gedit está allí.
- kate: aunque no debo compararlos, kate es el homólogo de gedit en KDE. Poderoso, con gran variedad de características, muy personalizable.
- Geany: es un gran editor basado en GTK, que va un poco más allá de la edición de texto, pero no llega a ser un IDE. Está en algún punto en el medio, pero es una excelente opción. Resaltado de código, opción de compilación y ejecución, configuración de terminales y compiladores a utilizar, autocompletado, soporta gran variedad de archivos.
- eclipse: para muchos el mejor IDE, no estoy de acuerdo, pero bueno, no puedo negar que es un gran IDE, con una comunidad grande que lo soporta. En su forma normal viene preparado para programar en Java, pero con PyDev se puede preparar para programar en Python. Hay una forma un poco más simple, y es utilizando EasyEclipse, en su distribución para Python. EasyEclipse son una especie de instaladores con paquetes, parches y plugins de fácil instalación.
- netbeans: también un muy buen IDE para Java, que se puede extender con plugins. Hay varias formas para trabajar Python con él, como lo explican en la Wiki de Netbeans para Python, específicamente en la hoja PyhtonInstall.
Voy a dejar la lista hasta aquí, porque sino requeriría de un post sólo para hablar de IDE’s y editores de texto.
Básicas de Python
Los primeros pasos van a ser hablar de las variables, tipos de variables, y de algunas otras cosas.
Primero, Python es fuertemente tipado, lo que significa que una variable sólo puede ser tratada cómo del tipo que tiene, es decir que para utilizar las variables como de otro tipo, se tiene que hacer una conversión explícita (veremos cómo más adelante).
Segundo, Python es de tipado dinámico, lo que significa que no se requiere declarar el tipo de la variable, sino que el tipo automáticamente se asigna en tiempo de ejecución según el valor que se asigne a ella.
Ahora, de aquí en adelante me pongo linuxero. Para comenzar, python al ser un lenguaje interpretado, no genera archivos ejecutables, son los mismos archivos con el código fuente los que se necesitan para que el programa corra. En linux para que esto suceda requiere que el archivo tenga permisos de ejecución:
chmod +x codigoFuente.py
Un extra, los archivos de código python tiene extensión “.py”.
También es muy bueno comenzar tus archivos de código fuente con un “hashbang“ indicándole a la línea de comandos que debe utilizar el interprete de Python. Así la primera línea de todos nuestros archivos de código fuente tienen cómo primera línea lo siguiente:
#!/usr/bin/env python
Con esto se logra que el interprete de comandos donde se ejecuta el programa sepa que debe utilizar el programa python y pasarle el script como parámetro. Suena complicado, pero en realidad no lo es, es así de simple: El interprete de comandos, bash es por defecto el de ubuntu y casi todas las distribuciones de GNU/Linux, no sabe que un archivo de extensión .py es un programa en Python, por lo tanto para ejecutar un programa con python hay que decirle a bash que programa utilizar para ejecutar el script. Hay varias formas de hacerlo, la primera es cómo mencione, colocando el “hashbang” y dándole permisos de ejecución y así bastaría con escribir:
./codigoFuente.py
Y así tendrías el script ejecutándose. La otra forma, que no requiere que el archivo tenga permisos de ejecución, ni el “hashbang” en la primera línea es invocando al programa python y dándole el archivo como parámetro:
python codigoFuente.py
Variables
En Python tenemos 3 tipos.
- numericos,
- cadena de caracteres o string,
- booleanos.
Lo numericos se dividen en 4 tipos: enteros int, enteros long, flotantes y complejos.
- Los número complejos son, como lo dice su nombre, algo difíciles de entender y tratar, a menos que estes en el área de las matemáticas o un área aplicada, yo no los voy a tratar aquí, sólo les menciono que existen.
- Los enteros int en Python tienen un rango bastante amplio, yendo desde -2³¹ hasta de 2³¹, pudiendo así almacenar hasta 4 millardos de números; esto en plataformas de 32 bits.
- Los enteros long sólo están limitados por la memoria de la máquina, por lo que se recomienda no utilizarlos a menos que sea estrictamente necesario. Como en Python no declaramos las variables como en C/C++ o Java, para decirle a un entero que es de tipo long, se coloca una L mayúscula luego del valor de que se está asignando a la variable:
entrero = 25L
- Los tipos flotante son los números reales, es decir, los números que tienen parte decimal. A diferencia de C/C++ o Java, todos los flotantes en Python son double (doble), es decir, tienen doble precisión, por lo que la cantidad de números que se pueden expresar utilizando este tipo de datos es mas grande.
Los booleanos sólo toman 2 valores True o False, sirven para estructuras de control, para evaluar expresiones.
Por último tenemos las cadenas de caracteres, pues son cadenas, que quieren que les diga.
Actualización
Me faltaron un par de cosas. La primera, la tabla de los operadores aritméticos:
| Operador | Descripción |
| + | Suma |
| - | Resta o negación |
| - | Negación |
| * | Multiplicación |
| ** | Exponente |
| / | División |
| // | División entera |
| % | Módulo |
Y lo segundo que me falto es la asignación de las variables. En Python las variables no tienen que declararse, se crean en tiempo de ejecución (recuerdan arriba: “Tipado dinámico”), por lo que para crear una variable basta con darle un valor y automágicamente está creada con el tipo que se le asigno. Eso sí, luego que crean una variable con un tipo, no pueden cambiarla por otro, por lo menos no directamente, hay que hacer la conversión explícita. Aquí unos ejemlos rápidos:
entero = 35
cadena = "Hola Mundo"
CadenaEntero = "35"
enteroConvertidoDesdeCadena = (int)CadenaEntero
flotante = 30.5
booleano = True
Fin Actualización
Esto es lo más básico que tengo hasta ahora.
Luego seguimos, en el segundo post.
Saludos,
Be Free, Be Linux…
Python – Post 01
20/04/2011
Programar con python es algo satisfactorio. Un lenguaje simple, poderoso, y muy ordenado. Veamos algunas cosas:
Indentación:
Indentar el código es la práctica de “acomodar” el texto de manera que se entienda que código pertenece a cada bloque. Es decir agregar las tabulaciones necesarias al inicio de cada línea para que el texto quede más “adentro” del bloque. En Python indentar el código es estrictamente necesario, pues es la única forma que tiene el interprete de saber que instrucciones pertenecen a cada bloque; esto es porque en Python no hay delimitadores de bloque. Los delimitadores de bloques, son esos símbolos que nos permiten “encerrar” el código por bloques. En C++ y Java los delimitadores de bloque son las llaves. Así un condicional en C++ y en Java tiene la siguiente forma:
if (condicion){sentenciasDentroCondicional;}
SentenciasFueraCondicional;
Actualización: En el comentario de Javier Albornoz tenemos varios puntos que deben tomarse en cuenta:
- C/C++ y Java obligan a utilizar “paréntesis” en el predicado de la estructura condicional.
- C/C++ y Java obligan a utilizar “corchetes” para marcar el inicio y el fin del bloque.
- C/C++ y Java obligan a utilizar “punto y coma” para indicar el final de la instrucción.
- En Python se utilizan los “dos puntos” sólo para marcar el inicio del bloque, ya que el bloque _debe_ estar indentado.
Mientras que en Python tiene la siguiente forma:
if condicion:
sentenciasDentroCondicional
sentenciasFueraCondicional
Cómo pueden ver, lo que diferencia un código de otro es el indentación, el margen o la sangría. Ahora ¿por qué es tan importante saber esto? Pues simple, porque por costumbre los desarrolladores utilizamos la tabulación para indentar el código y los editores de texto avanzado, que están preparados para codificar, e incluso los que no tan avanzados, tienen distintas formas de hacer esa tabulación en el texto (por ejemplo, gedit por defecto coloca lo que en una cadena de texto es un “\t” o una tabulación ASCII, algunos coloca 3 ó 4 espacios en blanco), y esto suele traer problemas a la hora de codificar en distintas computadores, distintos editores y/o en la edición colaborativa de código. Así que asegurate de establecer bien claro en las opciones de tu IDE, o editor de textos la forma en la que se deben comportar las tabulaciones; yo recomiendo utilizar 4 espacios en blanco, pero es decisión de cada quién.
Una última cosa antes de empezar con las estructuras condicionales y bucles: el separador de sentencias es la nueva línea, es decir que una sentencia se separa de otra sólo si está en otra línea. Por ejemplo:
sentencia1 sentencia2 sentencia3
En Java y C/C++ el delimitador es el punto y coma (“;”), pudiendo tener (aunque no sea lo que se estila normalmente):
sentencia1;sentencia2;sentencia3;
Las Estructuras condicionales
Ya les dí un abreboca de lo que son los condicionales en Python. La estructura es la siguiente:
if condicion:
En esta estructura condición es cualquier expresión booleana, es decir, una expresión que devuelva verdadero o falso, o incluso una variable de tipo booleana. En Python la tabla de comparadores es muy similar a la de otros lenguajes e incluso los operadores booleanos:
| Operador | Significado |
| == | Igual |
| != | Distinto |
| < | Menor |
| > | Mayor |
| <= | Menor o Igual |
| >= | Mayor o Igual |
| AND | “Y” lógico |
| OR | “O” lógico |
| NOT | “No” lógico |
Después de la condición se colocan dos puntos (“:”), para dar comienzo en la siguiente línea a las sentencias que se ejecutaran si la condición es verdadera (“True“) Luego del “if” tenemos el “else“, para lo cual se le coloca la palabra reservada “else” seguida de los “dos puntos” y las sentencias que se ejecutarán en caso de que la condición no se cumpla deben ir indentadas. La estructura queda así:
if condicion:
sentenciasQueSeEjecutanSiCondicionEsVerdadera
else:
sentenciasQueSeEjecutanSiCondicionEsFalsa
Y para terminar con las estructuras condicionales, en python contamos con el “elif” para hacer estructuras condicionales anidadas, es decir, cuando necesitamos condiciones dentro de condiciones.
if condicion1:
sentenciasQueSeEjecutanSiCondicion1EsVerdadera
elif condicion2:
sentenciasQueSeEjecutanSiCondicion2EsVerdadera
elif condicion3:
sentenciasQueSeEjecutanSiCondicion3EsVerdadera
else:
sentenciasQueSeEjecutanSiNingunaCondicionEsVerdadera
En C/C++ y en Java esas estructuras no existen, sino que para hacer estructuras condicionales con varias condiciones se anidan las instrucciones “if” unas dentro de otras:
if (condicion1){
sentenciasQueSeEjecutanSiCondicion1EsVerdadera;
}else{
if (condicion2){
sentenciasQueSeEjecutanSiCondicion2EsVerdadera;
}else{
if (condicion3){
sentenciasQueSeEjecutanSiCondicion3EsVerdadera;
}else{
sentenciasQueSeEjecutanSiNingunaCondicionEsVerdadera;
}
}
}
Recordando siempre que en estos lenguajes el indentado no es obligatorio, ni el cambiar de línea; y que las llaves no tienen que estar alineadas, siempre que estén completas. Pudiendo quedar el código de la siguiente manera:
if (condicion1){sentenciasQueSeEjecutanSiCondicion1EsVerdadera;}
else{if (condicion2){sentenciasQueSeEjecutanSiCondicion2EsVerdadera;}
else{if (condicion3){sentenciasQueSeEjecutanSiCondicion3EsVerdadera;}
else{sentenciasQueSeEjecutanSiNingunaCondicionEsVerdadera;}}}
Así el código es menos legible.
Los Bucles ó Ciclos
Los ciclos son el último tópico que tocaré en este post. Dividimos esta sección en dos partes: “while” y “for”. El “repeat” no existe en python, por eso no lo trataremos. Realmente un ciclo “repeat” se puede escribir como un ciclo “while”, asegurando que la condición se cumpla por lo menos la primera vez.
Ciclo “while”
El ciclo “while” tiene una construcción muy sencilla, consta de la palabra reservada while seguida de la condición y luego dos puntos (“:”). El código queda así:
while condicion: sentenciasQueSeEjecutanMientrasLaCondicionEsVerdadera sentenciasQueSeEjecutanCuandoLaCondicionDejeDeCumplirse
Cabe destacar que siempre es necesario que la condición cambie en algún punto del programa porque sino no dejará de ejecutarse la parte interna de un ciclo.
También hay que tomar en cuenta los mismos tópicos de comparación que con el “if” cuando comparas el “while” de python con el “while” de C/C++ o Java, es decir, en Python no se requiere que la condición esté entre paréntesis, es necesario que los dos puntos (“:”)sigan a la condición y que las sentencias que se ejecuten dentro del ciclo estén indentadas.
Ciclo “for”
El ciclo “for” es algo un poco más difícil de entender al principio para los que venimos de lenguajes “estilo-C” como C++, Java o PHP. En Python el ciclo “for” es un iterador sobre listas (las listas las veremos en otro post), pero para hacer la comparación contra C/C++ y Java, haremos uso de la función “range()” para recorrer una secuencia de números (sólo mostraré un uso simple, la función tiene más usos que los que veremos acá).
Un ciclo “for” en Python se hace así:
for variable in range(10): sentenciasQueSeEjecutaranDuranteLasVueltasDelCiclo
Cómo podemos ver el ciclo es algo más natural. Podríamos leer el ciclo de la siguiente forma: “Para el valor de la variable dentro del rango”. La función range() genera una secuencia de números desde 0 (cero) hasta el valor que se coloca como parámetro.
En C/C++ y Java, el “for” tiene una construcción un poco diferente:
for (variable=valorInicial; condicionDeVariable; cambioDeVariable)
{sentenciasDentroDelCiclo;}
En esta construcción se debe recordar que condicionDeVariable es una condición donde normalmente se indica que la variable es menor o mayor a algo, y cambioDeVariable es una cambio que se ejecuta en la variable del ciclo, puede ser un incremento o un decremento, depende de lo que se quiere hacer. Esa diferencia es importante, en Python nos movemos en un rango incremental, para ir en una secuencia decremental hay que proporcionarle más parámetros a la función range(), pero eso lo veremos en otro post.
En conclusión Python es un lenguaje bastante simple, y con una forma de codificar muy limpia y ordenada que es obligada por el lenguaje. Espero que puedan engancharse al igual que me he enganchado yo.
Saludos,
Be Free, Be Linux…
Programando con Python
11/11/2009
Estoy comenzando a programar con Python. Realmente una experiencia muy satisfactoria luego que piensas que mi principal karma con la programación es que para leer ejemplos y “código amigo”, es un problema. Python no es así, ya que sus sintaxis te obliga a identar el código.
Ahora estoy en las bases, y estoy utilizando un manual: Python Para Todos, el cual fué publicado en uno de mis blogs favoritos Mundo Geek.
Pienso luego incursionar en la programación web. Espero ir colocando algunos tutos y trucos.
Saludos,
Be free, Be Linux…
Retomando X3M Spot
04/08/2009
Bueno, este blog lo cree hace dos años y nunca escribí nada en él. Ahora quiero retomarlo y utilizarlo como medio de dar a conocer las noticias que leo y consigo por ahí.
Lo escribo en colaboración con el staff de Superubuntu.com, del cual formo parte.
Espero les sea útil lo que aquí escribo.
Saludos,
Be free, Be Linux…
Filosofía de un mundo libre
03/12/2007
La libertad es un concepto que acompaña al mismo concepto de la vida. Un ser libre es un ser perfecto, es un ser que tendrá lo que es el objetivo de la via. Imaginar un mundo perfecto es, es imaginar un mundo donde la vida sea tan libre que la libertad de un solo sea la libertad de todos, y la libertad de todos sea la de cada uno. Un ideal que acompaña a la libertad es el compartir, el egoísmo no tiene espacio en un mundo libre y es el compartir la única manera de llegar a esa añorada libertad que nos haga perfectos.
Saludos,
Be free, Be Linux…