Introducción a Python

9:28 0 Comments A+ a-



Hola Gente! Cómo les va? En esta ocasión traigo algo de material que tenía guardado. No es más que una pequeña introducción a Python pero prefiero compartirlo antes de que se pierda. Al final del post pueden encontrar un link con el material en pdf.

Comencemos!



Introducción


Voy a comenzar de una forma que no se acostumbra mucho hoy en día: definiendo.

Probablemente, muchos sepan que estamos a punto de adentrarnos en uno de los más maravillosos lenguajes de programación que existen actualmente. La pregunta es: ¿qué hace a este lenguaje tan especial? La respuesta es muy sencilla. Aún más de lo que podría parecer en un principio. Sin embargo, muchas de sus características y ventajas recién llegan a ser comprendidas luego de un tiempo. Es decir, nos veremos involucrados en un proceso de pythonización que código tras código nos irá respondiendo aquella pregunta tan importante que todos nos formulamos alguna vez al escuchar acerca de este misterioso ofidio de la programación.

Muy bien. Basta de vueltas y vayamos al grano. Entonces, ¿Qué es Python? Es un lenguaje de programación interpretado de alto nivel creado por Guido Van Rossum a fines de los años ochenta (dicen las malas lenguas que todo comenzó como un hobbie al buscar algo que lo mantenga ocupado durante las semanas de navidad). Entre sus características, podemos nombrar las siguientes:

    - Simple: Es la primera característica que debemos nombrar al hablar de este lenguaje. Python fue diseñado con esta filosofía: legibilidad y transparencia. A eso nos referimos cuando hablamos de “pythónico”. Ya veremos más adelante qué es y  cómo acceder al “Zen de Python”.

    - Interpretado: Todo lo que nosotros escribamos será ejecutado por medio de un intérprete, en contraste con los lenguajes compilados (C, C++, C#, Visual Basic, Delphi, etcétera) que son ejecutados por medio de un compilador (a leer!).

    - Multiparadigma: No tenemos que programar así o asá, sino que tenemos varios estilos para elegir (programación orientada a objetos, programación imperativa y, en menor medida, programación funcional).

    - Multiplataforma: Podemos ejecutar nuestros scripts en cualquier plataforma (GNU/Linux, Microsoft Windows, Mac OSX, etcétera) siempre y cuando tengamos nuestro intérprete instalado y configurado.

    - Interactivo: Podemos ejecutar sentencias desde la línea de comandos y ver qué nos responde el intérprete (nos ayuda mucho para comprender mejor el lenguaje y, principalmente, al momento de programar, permitiéndonos probar segmentos específicos de nuestro código, en busca de errores).

Existen muchas otras características como tipado dinámico, resolución dinámica de nombres, conteo de referencias, facilidad de extensión y demás. No es necesario que las veamos ahora, razón por la cual las dejo para que investiguen por su propia cuenta.



Instalando Python


Lo primero que debemos mencionar es la versión de python que vamos a utilizar a lo largo del taller. Actualmente existen 2 versiones principales: 2.7.8 y 3.4.1. Nosotros vamos a utilizar la primera (Python 2.7).

1). GNU/Linux. Generalmente ya viene instalado por defecto. En caso contrario, su instalación se puede realizar simplemente desde la consola. Para ello, escribimos:

Código: Bash
  1. wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz -O - | tar -x

O si tenemos curl:

Código: Bash
  1. curl https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz | tar -x

Con esto conseguimos descargar y descomprimir el código fuente. A continuación, procedemos a configurar e instalar python:

Código: Bash
  1. cd Python-2.7.8
  2. ./configure
  3. make
  4. sudo make install

En el caso anterior, debemos ejecutar los comandos de manera secuencial y resolver los errores que eventualmente nos puedan surgir. Una vez finalizado, podremos comprobar que la instalación ha sido exitosa simplemente escribiendo lo siguiente:

Código: Bash
  1. python

Lo cual nos abrirá la consola interactiva de python de la cual estuvimos hablando al principio del taller:



2). Windows. Aquí el asunto es un poco más simple. Descargamos el archivo de instalación desde alguno de los siguientes enlaces, según corresponda: 32 bits / 64 bits y con un doble click sobre el mismo comenzamos la instalación. Como siempre, aceptar, aceptar y aceptar hasta finalizar el proceso. Pero cuidado! Para simplificar aún más las cosas deberemos prestar atención. En la pantalla titulada “Customize Python 2.7.8” deberemos marcar la opción “Add python.exe to Path”. Con ello añadimos el archivo python.exe al path de Windows y nos ahorramos unos pequeños problemitas:



(La imagen muestra la instalación de la versión 3.3.2 pero nos sirve igual)

Para finalizar, abrimos el Procesador de comandos de Windows (cmd.exe) y, al igual que en Linux, escribimos:

Código: DOS
  1. python

Nuevamente, si todo anduvo bien, estaremos iniciando una charla con nuestro querido amigo, el intérprete.



Listo! Ya tenemos preparado nuestro entorno de desarrollo en ambos sistemas operativos. Sólo nos queda hacer un programa y ver qué sucede con todo esto.
A descansar 5 minutos que una vez que arranquen a programar no van a poder detenerse


Mi primer programa en Python

Si esta no es tu primera experiencia con un lenguaje de programación, seguro ya te irás imaginando qué tipo de aplicación estamos a punto de “desarrollar”. Exacto, qué otra cosa podía ser más que el clásico de los clásicos: el tan famoso “Hola mundo”.

Para aquellos que no entienden nada de lo que estoy hablando, les explico de forma muy concisa en que consiste este loco rito que acabamos de mencionar. Simplemente, lo que hacemos es crear una sencillísima aplicación que no hace más que imprimir en pantalla el mensaje “Hola mundo!”.

Pero… si es tan simple y, por lo visto, tan poco útil, ¿por qué tanta importancia? Simple. Lo que realmente nos importa de todo esto es realmente el código. En él vamos a poder ver muchas características del lenguaje que estemos utilizando. En nuestro caso, por ejemplo, ya veremos que el código se puede escribir de varias formas, lo cual nos permite constatar la capacidad multiparadigmática de python que mencionamos al principio.

Por otro lado, un “Hola mundo” nos permite rápidamente comprobar que tenemos todo nuestro entorno de desarrollo perfectamente configurado y funcionando.

Finalmente este programa es considerado fundamental desde el punto de vista didáctico, ya que ilustra rápidamente al principiante la sintaxis más básica del lenguaje de programación que está a punto de aprender.

Como dije anteriormente, existen varias formas de hacer nuestro “Hola Mundo” en python. Sin embargo, por ahora haremos lo más simple. A medida que vayamos conociendo más el lenguaje, veremos cuáles son esas otras alternativas que dejamos escapar en este momento.

Lo primero que vamos a hacer es abrir nuestro editor de texto plano favorito (en mi caso, sublime text). Una vez allí, escribimos el siguiente código:


Muy bien. Ahora sólo queda guardar nuestro archivo con el nombre “holaMundo.py” y listo.


Por último, probaremos ejecutarlo para ver si funciona. Para ello, abrimos una consola de comandos, nos dirigimos al directorio donde se encuentre nuestro script y escribimos lo siguiente: “python holaMundo.py”. Si el resultado fue un “Hola Mundo!” en la siguiente línea de la terminal, entonces, felicitaciones!! Acabas de crear tu primer programa 100% funcional en python!!



Vayamos ahora a las entrañas de este misterioso código y veamos qué significan esas palabritas, hasta ahora, sin sentido.

Lo primero que vemos es la palabra clave “print”. Si traducimos esta palabra inglesa al español, entonces vemos que su significado no es más ni menos que “imprimir”.


Código: Text
  1. print = imprimir

Con esta declaración lo que logramos es imprimir en pantalla la expresión que sigue a continuación.

En nuestro caso, la expresión que le continúa es “Hola Mundo!” con las comillas incluidas (ya veremos más adelante que significan esas comillas; por ahora quedémonos con la idea de que las comillas le dicen a print cuál es el mensaje que queremos mostrar al usuario).

Entonces, lo que nuestro pequeño código significa es simplemente: imprimir en pantalla el mensaje “Hola Mundo!”.

No era tan difícil, ¿no? A continuación, profundizaremos un poquito más para ver cómo hacemos de éste un programa algo más flexible e interactivo.


Variables

Vamos a comenzar ahora con un tema que nos abrirá muchas posibilidades a la hora de programar. Es que no hay mucho que podamos hacer sin ellas, las variables. Para los que no saben a qué me refiero, voy a tratar de explicarlo sencillamente.

Aclaración: Lo que estamos por ver no es más que una aproximación o introducción a este extenso tema. Existen muchos puntos que dejaremos fuera por el momento. Más adelante, una vez que nos adentremos en el mundo de la programación orientada a objetos (POO), estudiaremos a fondo cada uno de los tópicos que hoy trataremos.

1). Qué es una variable. Las variables son como cajas que nos permiten almacenar información en su interior. En ellas podemos guardar lo que sea: números, textos, listas, diccionarios, objetos, etcétera (ya veremos qué son concretamente estos elementos).

Pero, obviamente, necesitamos rotular estas cajas para poder identificarlas fácilmente y no confundirlas. Es decir, las variables tienen un nombre que las distinguen entre sí.

Conclusión: una variable...
    - es un espacio de memoria (la caja)
    - nos sirve para almacenar un valor (un tipo de dato)
    - tiene un nombre o etiqueta (identificador)

2.) Cómo crear una variable. En ciertos lenguajes primero debemos indicar el nombre de la caja y el tipo de información que va a almacenar (lo cual se denomina declaración) y, a continuación, indicamos cuál va a ser el contenido de la misma (esto es la definición). Esto no es tan así, ya que podemos declarar y definirlas al mismo tiempo, pero no viene al caso.

En python las cosas son un poquito más automáticas. No hace falta declarar las variables antes de definirlas. Simplemente les asignamos un valor y listo. El intérprete se encarga de identificar el tipo de dato almacenado. Esta es una de las características de python nombradas al principio del taller y se denomina tipado dinámico.

Para crear una variable debemos escribir lo siguiente:


Código: Python
  1. miVariable = valor

Como ven, es muy similar a matemáticas. A la izquierda el nombre de la variable y a la derecha el valor (tipo de dato) a asignar. El signo igual que estamos utilizando se denomina operador de asignación (ya veremos más adelante que existen unos cuantos operadores más).

Existe otra forma de asignación, un poco más compleja, denominada asignación múltiple. No la vamos a explicar todavía pero te invito a investigar por tu cuenta y experimentar un poco.

3). Tipos de datos. Si bien no es necesario indicárselo al intérprete, debemos conocer los tipos de datos soportados por python, de lo contrario, no llegaremos muy lejos.

Si bien existen varios tipos de datos, no hace falta nombrarlos a todos en este momento.

A continuación, nombraremos los más importantes para, luego, profundizar en cada uno de ellos:



Existen otros tipos de datos que iremos viendo en los próximos talleres. Por ahora, con esto será más que suficiente.

Muy bien, comencemos:

    A. Datos tipo str. Estos son valores de tipo alfanuméricos, es decir, son cadenas de números, letras y muchos otros símbolos  (str es una abreviatura de string que, traducido al español, significa cadena) delimitadas por comillas dobles (“”) o simples (‘’).

Si hacemos memoria, veremos que este es el tipo de dato utilizado en nuestro primer programa (“Hola Mundo!”, se acuerdan?).

Los datos tipo alfanuméricos pueden ocupar una o más líneas pero deberemos conocer algunos detalles para evitar cometer errores: si la información se encuentra delimitada sólo por una comilla entonces deberemos ocupar sólo una línea.



Para poder ocupar varias líneas debemos hacerlo con 3 comillas, dobles o simples:


Más adelante veremos que no es necesario utilizar tres comillas para ocupar varias líneas. Como adelanto, les digo que vayan investigando acerca de los códigos de escape (el código de escape “\n” nos permite ocupar varias líneas, a pesar de utilizar sólo una comilla).

Muy bien, antes de terminar con los datos tipo str, me gustaría hacer una pequeña pero importante aclaración: ¡Cuidado con los números!

Un número delimitado por comillas será considerado un valor de tipo str. Para que nuestro número sea considerado como tal deberemos escribirlo sin comillas.



    B. Datos tipo int. A este grupo pertenecen aquellos datos numéricos de tipo entero, incluyendo al cero y a los números negativos (int es la abreviatura de integer que, traducido al español, significa entero).

El espectro de números no es infinito. Ya veremos más adelante cómo determinar ese límite y a quién pertenece el espectro de números que sigue.

Un ejemplo de este tipo de dato es el que vimos en la última imagen (el uno que almacenamos en la variable llamada “intVar”).

    C. Datos tipo float. La palabra float hace referencia a los floating point numbers, es decir, a los números de punto o coma flotante (¿¡los qué!?). Wikipedia les puede dar una buena explicación pero si no quieren complicarse, entonces quédense con esto: si uno agarra una calculadora y escribe cinco dividido dos el resultado tiene dos representaciones: como número racional (es decir, dos quintos: 2/5) o como número de coma flotante (es decir, dos coma cinco: 2,5).

Conclusión, el número de coma flotante es, ni más ni menos, que una representación de un número racional.



Es importante aclarar que python interpretará al número con coma como un dato de tipo float, incluso a pesar de que sea un número entero (1.0 no es lo mismo que 1, ¿se entiende?).



    D. Datos tipo tuple. Se denomina tupla (traducción al español de tuple) a una secuencia ordenada y limitada de objetos. ¿Qué significa esto? Para entenderlo, veamos un poco los orígenes de este término.

Todo comienza cuando unos matemáticos que no tenían otra cosa que hacer aplicaron el método inductivo sobre cierto conjunto de palabras. Dichas palabras eran: dupla, tripla, cuádrupla, quíntupla, etcétera.

Los tipos se preguntaban qué nombre genérico podían darle a este conjunto. Pensaron, aportaron ideas, las desecharon y volvieron a pensar. Así, hasta que uno de ellos dijo: Si hablamos de 5 objetos, se llama quíntupla; si son 6, séxtupla; 7, séptupla. Si generalizamos, podemos llamarlos 5-tupla, 6-tupla y 7-tupla, respectivamente. Si generalizamos más, podemos decir n-tupla, donde n es el número de objetos que contiene la tupla. Y así es como surgió esta interesante denominación.

Bueno, sí. Era innecesaria la historia jeje. Pero al menos sacamos 2 cosas de ella (o 3, qué se yo). Primero, las tuplas contienen una cantidad limitada de objetos (n nos dice que la tupla es finita). Segundo,  los objetos están ordenados de una forma determinada (eso no lo dice la historia pero no importa!). Tercero, los matemáticos se la pasan estudiando cosas sin sentido que, de una forma u otra (ni sé cómo), llegan a tener mucha importancia en nuestras vidas (¿?).

Muy bien. Por último vamos a decir algo muy importante. Las tuplas son inmutables. Esto significa que una vez creada la tupla, es imposible modificarla. ¿Clarito?

Para crear una tupla no hace falta mucho: sólo dos paréntesis (uno de apertura y otro de cierre) y comas (,) para separar los objetos entre sí.

En cuanto al contenido, puede ser cualquier cosa (menos plata! eso no lo pueden hacer, no se dejen engañar). Pero, ¿entonces puedo guardar una tupla dentro de otra tupla? Exactamente! Dentro de ellas puedes guardar cualquiera de los tipos de datos que estamos viendo y mucho más. Es hora de hacer volar tu imaginación y diseñar posibles programas para codear más adelante, a la par del próximo taller.



Como ven en la imagen, primero creamos tres variables que contienen los primeros tres tipos de datos que vimos. Luego, creamos 3 variables más: las primeras dos (miTupla y otraTupla) son tuplas que contienen a las primeras variables. La última (tuplaDeTuplas) es una tupla que contiene a las otras dos tuplas.

Si prestan atención, verán que miTupla y otraTupla presentan el mismo contenido. Sin embargo, no hay que caer en el error de afirmar que son iguales. Como dijimos al principio, el orden de los objetos es importante. Tanto que estas dos tuplas serían iguales de no ser por esta característica.

    E. Datos tipo list. Las listas (no voy a aclarar que lista es la traducción al español de list :P) son muy parecidas a nuestras queridas tuplas. Difieren de ellas en los siguientes aspectos:

        a.   No surgen del ocio de los matemáticos.

        b.   Son mutables (sí, podemos modificar su contenido una vez creada la lista).

        c.   El contenido es delimitado por corchetes (y no por paréntesis).

        d.   Muchas otras cosas que dejaremos para más adelante (las veremos cuando comencemos con la POO).

De lo antedicho, y si aplicamos el famoso método hipotético-deductivo, podemos obtener más información de las listas:

        a.   Son una secuencia ordenada y limitada de datos.

        b.   Pueden contener cualquier tipo de dato.

        c.   Los objetos se separan unos de otros por comas.

Bueno, basta de cháchara y a la acción:




    F. Datos tipo dict. Los diccionarios son, al igual que las tuplas y las listas, un conjunto limitado de datos. Pero hay 2 términos que no estamos incluyendo en esta definición: ordenado y secuencial. Es que, de hecho, si hay algo que no le interesa al diccionario de python es preocuparse por un orden y una secuencia. Pero, ¿por qué? Es que los diccionarios no son más que un conjunto no ordenado de pares clave: valor.

Para entenderlo, hagamos una analogía con un diccionario de idiomas. Si quisiéramos saber qué significa una palabra determinada (por ejemplo, python), debemos buscar dicha palabra (clave) para luego ver su significado (valor).

Así es cómo hacen los diccionarios de python para organizar los datos que almacenamos en ellos.

Al igual que con las tuplas y las listas, los valores pueden ser cualquier tipo de dato. Las claves, en cambio, sólo pueden ser objetos inmutables (incluyendo a las tuplas, siempre y cuando no contengan objetos mutables).

Por último, vamos a ver cómo hacer un diccionario (al igual que con los anteriores, dejamos afuera mucha información; ya veremos todo con POO):

    - Los objetos deben estar delimitados por corchetes ({}) y separados por comas (,).

    - Las claves y los valores se asocian por medio de dos puntos ( : ); el objeto de la izquierda es la clave y el de la derecha, el valor.



En la imagen anterior podemos ver que miDic y otroDic presentan el mismo contenido pero en diferente orden. A diferencia de lo que sucedió en el caso de las listas y las tuplas, estos dos diccionarios sí son iguales. Recuerden: como hemos dicho al principio, al diccionario no le interesa el orden de los objetos.

    G. Datos tipo bool. Los datos booleanos son aquellos que pueden representar valores de lógica binaria, es decir, 2 valores (verdadero o uno y falso o cero).

En python, estos datos están representados de muchas formas pero principalmente con 2 palabras clave: true y false (en sí, ambas son simples variables que almacenan los valores booleanos 1 y 0, respectivamente).

En términos generales, podemos decir que todos los datos son verdaderos, a excepción del cero (0 y 0.0), los datos vacíos (“”, (), [] y {}) y el NoneType.

Los datos booleanos son importantísimos en informática y, por ende, para nosotros: los programadores. Ya veremos más adelante cómo utilizarlos.

    H. Datos tipo NoneType. Este tipo de dato denota la falta de valor (none significa, traducido al español, ninguno) pero, en realidad, esto no es así. De hecho, los datos NoneType presentan y sólo pueden presentar un único valor: None.

Es elemental que comprendan esta diferencia: los datos NoneType no carecen de valor, sino que sí lo tienen, y sólo puede ser uno.

A partir de esto, uno se preguntará, ¿qué utilidad podemos darle a un dato que no se puede modificar y que no nos aporta ningún tipo de información? Fácil. En python, no podemos iniciar una variable sin asignarle un valor. Tampoco podemos, en las listas, asignar un valor a un offset que no ha sido creado aún. Por último, lo mejor: ninguno de estos ejemplos es cierto debido a que None nos permite hacerlo.

Veamos cómo:



Como podemos ver, la variable varVacia será de tipo NoneType. Gracias a None podemos iniciar la variable “sin tener que definir su tipo” (lo pongo entre comillas porque, a pesar de su nombre, None es algo: no es realmente nada, sino que es un objeto).

En cuanto a la variable miLista, el resultado será una lista con cuatro offsets ocupados por objetos None. Esto es casi lo mismo que decir que son 4 lugares vacíos, listos y a la espera de ser ocupados.


Mejorando nuestro “Hola Mundo!”

Cada vez que nos encontramos frente a una computadora, cualquiera que sea, podemos ver que cuenta una característica o cualidad fundamental: la capacidad de interactuar. Es que, de hecho, serían muy poco útiles si no contaran con dicho atributo. Si queremos que nuestros programas sean útiles y flexibles, debemos darles la capacidad de interactuar con el usuario.

Llamamos input a la información que el usuario suministra a la máquina y output a la información que la computadora transmite al usuario.

Ya vimos un ejemplo de output: la declaración print. Es decir, ya sabemos cómo hacer que la computadora muestre información por medio del monitor. Ahora sólo nos resta ver cómo podemos hacer para pasarle información a nuestros programas.

En python 2.7 existen 2 declaraciones para introducir información por medio del teclado: input y raw_input, para introducir números (int) y texto (str), respectivamente.

Veamos un ejemplo para entenderlo rápidamente.



Como vemos en la imagen, input nos sirve para ingresar datos de tipo int, mientras que raw_input, para ingresar datos de tipo str. De aquí surgen 2 cuestiones. Primero, si quisiéramos utiliza input para ingresar letras, se generaría un error. Por el contrario, el hecho de ingresar números al utilizar raw_input no genera ningún tipo de error pero debemos tener en cuenta que el dato ingresado no será de tipo int sino str (será el número con comillas).

Muy bien, ahora que ya sabemos cómo pasarle datos a nuestro programa y hacer que éste nos imprima texto en pantalla, es tu turno de mejorar nuestro primer programa, de forma tal que nos permita interactuar con el usuario e imprimir la información suministrada por el mismo.

La tarea es hacer un programa que pida el nombre y la edad al usuario para luego imprimir el siguiente texto:


“Hola (nombre)!! Tienes (edad) años”

Hay algunas cositas que van a andar mal pero es, simplemente, porque no lo hemos visto aún. No se preocupen. Tranquilos que ya vamos a llegar.

Por último, si les funciona el programa anterior, les dejo un último desafío: creen una variable con la edad del programa y e impriman la diferencia de edad (del programa y del usuario) en pantalla. Complicadito jeje.

Ahora sí me despido. La solución en el próximo número, con muchísimo más python y ejercitación.

Saludos!





P.D.: El tutorial que acabo de presentar iba a formar parte de los talleres oficiales de python pero, por error, escribí acerca de temas que ya habían sido tratados en las primeras dos entregas. Con esto quiero decir 2 cosas: primero, esta guía no pertenece a los talleres de underc0de y, segundo, todavía tengo pendiente la creación de una entrega oficial que se hará pública en los próximos días. En ella trataremos nuevos temas que nos permitirán comenzar con lo mejor del taller: la creación de herramientas orientadas al hacking.

Autor: WhiZ