Alfonso de la Guarda Reyes avatar Alfonso de la Guarda Reyes committed 7ded680

Correcciones en el formato del rst

Comments (0)

Files changed (4)

 Consideraciones
 ~~~~~~~~~~~~~~~
 
-Como comentábamos en el capítulo anterior existen dos formas de ejecutar código Python, bien en una sesión interactiva (línea a línea) con el intérprete, o bien de la forma habitual, escribiendo el código en un archivo de código fuente y ejecutándolo.
+Como comentábamos en el capítulo anterior existen dos formas de 
+ejecutar código Python, bien en una sesión interactiva (línea a 
+línea) con el intérprete, o bien de la forma habitual, escribiendo 
+el código en un archivo de código fuente y ejecutándolo.
 
-Para comenzar a *codear* con Python debemos considerar que haremos uso de *funciones* del lenguaje (más adelante sabremos más sobre este concepto), concretamente dos:
+Para comenzar a *codear* con Python debemos considerar que haremos 
+uso de *funciones* del lenguaje (más adelante sabremos más sobre 
+este concepto), concretamente dos:
 
     **print**
-        Que permite la *impresión* de un contenido, es la *salida* que nos ofrece el lenguaje para mostrar / visualizar algo, específicamente en la pantalla.  Su sintáxis es simple: **print(CONTENIDO)**, donde *CONTENIDO* se reemplaza por lo que quieres *mostrar*.
+        Que permite la *impresión* de un contenido, es la *salida* 
+        que nos ofrece el lenguaje para mostrar / visualizar algo, 
+        específicamente en la pantalla.  Su sintáxis es simple: 
+        **print(CONTENIDO)**, donde *CONTENIDO* se reemplaza por lo 
+        que quieres *mostrar*.
     **raw_input**
-        Que permite el *ingreso* de un contenido, es la *entrada* que nos ofrece el lenguaje para adquirir información del usuario / operador.  Su sintáxis es simple **raw_input(MENSAJE)**, donde MENSAJE es una cadena de texto opcional.
+        Que permite el *ingreso* de un contenido, es la *entrada* 
+        que nos ofrece el lenguaje para adquirir información del 
+        usuario / operador.  Su sintáxis es simple 
+        **raw_input(MENSAJE)**, donde MENSAJE es una cadena de texto 
+        opcional.
 
-Entonces con estas funciones ya sabemos como hacer que la computadora nos *diga* algo y además que nosotros le *digamos* algo a ella.  Seguimos?
+Entonces con estas funciones ya sabemos como hacer que la 
+computadora nos *diga* algo y además que nosotros le *digamos* algo 
+a ella.  Seguimos?
 
 
 Operación: **Hola Mundo**
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-El primer programa que vamos a escribir en Python es el clásico *Hola Mundo* y en este lenguaje es tan simple como::
+El primer programa que vamos a escribir en Python es el clásico 
+*Hola Mundo* y en este lenguaje es tan simple como::
 
     print("Hola Mundo")
 
-Vamos a probarlo primero en el intérprete. Ejecuta python o ipython, según tus preferencias, escribe la línea anterior y pulsa *Enter*. El intérprete responderá mostrando en la consola el texto *Hola Mundo*.
+Vamos a probarlo primero en el intérprete. Ejecuta python o ipython, 
+según tus preferencias, escribe la línea anterior y pulsa *Enter*. 
+El intérprete responderá mostrando en la consola el texto *Hola 
+Mundo*.
 
-Ahora crearemos un archivo de texto con el código anterior, de tal forma que podamos distribuir nuestra pequeña obra de arte entre quienes queramos.  Abre el editor de texto o el IDE seleccionado previamente, crea un nuevo archivo y copia la línea anterior. Guárdalo, por ejemplo, con el nombre *hola.py*.
+Ahora crearemos un archivo de texto con el código anterior, de tal 
+forma que podamos distribuir nuestra pequeña obra de arte entre 
+quienes queramos.  Abre el editor de texto o el IDE seleccionado 
+previamente, crea un nuevo archivo y copia la línea anterior. 
+Guárdalo, por ejemplo, con el nombre *hola.py*.
 
-**Aclaración**: la extensión no es obligatoria ni determinante, es decir el *.py*, sin embargo nos ayuda a identificar con facilidad cuales son los archivos que contienen código python dentro de nuestra computadora.
+**Aclaración**: la extensión no es obligatoria ni determinante, es 
+decir el *.py*, sin embargo nos ayuda a identificar con facilidad 
+cuales son los archivos que contienen código python dentro de 
+nuestra computadora.
 
-Ejecutar este programa es tan sencillo como indicarle el nombre del archivo a ejecutar al intérprete de Python, es así que desde la línea de comandos (shell), escribe::
+Ejecutar este programa es tan sencillo como indicarle el nombre del 
+archivo a ejecutar al intérprete de Python, es así que desde la 
+línea de comandos (shell), escribe::
 
    python hola.py
 
-También es posible que lo puedas hacer desde el editor/ide seleccionado, éstos usualmente proveen una herramienta *ejecutar* / *correr* / *run* o lo que fuere, que te permite ejecutar el código haciendo aparecer una ventana (usualmente) con el resultado del mismo (sin embargo, esto puede requerir alguna configuración adicional).
+También es posible que lo puedas hacer desde el editor/ide 
+seleccionado, éstos usualmente proveen una herramienta *ejecutar* / 
+*correr* / *run* o lo que fuere, que te permite ejecutar el código 
+haciendo aparecer una ventana (usualmente) con el resultado del 
+mismo (sin embargo, esto puede requerir alguna configuración 
+adicional).
 
-Vamos a simplificarlo aún más.  Si empleas Windows los archivos .py ya estarán asociados al intérpretede Python, por lo que basta hacer *doble clic* sobre el archivo para ejecutar el programa. Sin embargo, como este programa no hace más que imprimir un texto en la consola, la ejecución es demasiado rápida para poder verlo si quiera. Para remediarlo, vamos a añadir una nueva línea que espere la entrada de datos por parte del usuario::
+Vamos a simplificarlo aún más.  Si empleas Windows los archivos .py 
+ya estarán asociados al intérpretede Python, por lo que basta hacer 
+*doble clic* sobre el archivo para ejecutar el programa. Sin 
+embargo, como este programa no hace más que imprimir un texto en la 
+consola, la ejecución es demasiado rápida para poder verlo si 
+quiera. Para remediarlo, vamos a añadir una nueva línea que espere 
+la entrada de datos por parte del usuario::
 
    print("Hola Mundo")
    raw_input()
 
-De esta forma se mostrará una consola con el texto *Hola Mundo* hasta que pulsemos *Enter*.
+De esta forma se mostrará una consola con el texto *Hola Mundo* 
+hasta que pulsemos *Enter*.
 
 
 Consideraciones con Unix / Linux
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Si utilizas Linux (u otro Unix) para conseguir que el sistema operativo abra el archivo .py con el intérprete adecuado, es necesario añadir una nueva línea al principio del archivo::
+Si utilizas Linux (u otro Unix) para conseguir que el sistema 
+operativo abra el archivo .py con el intérprete adecuado, es 
+necesario añadir una nueva línea al principio del archivo::
 
    #!/usr/bin/python
    print("Hola Mundo")
    raw_input()
 
-A esta línea se le conoce en el mundo Unix como *shebang*, *hashbang* o *sharpbang*.  El par de caracteres #! indica al sistema operativo que dicho script se debe ejecutar utilizando el intérprete especificado a continuación. De esto se desprende, evidentemente, que si esta no es la ruta en la que está instalado nuestro intérprete de Python, es necesario cambiarla.
+A esta línea se le conoce en el mundo Unix como *shebang*, 
+*hashbang* o *sharpbang*.  El par de caracteres #! indica al sistema 
+operativo que dicho script se debe ejecutar utilizando el intérprete 
+especificado a continuación. De esto se desprende, evidentemente, 
+que si esta no es la ruta en la que está instalado nuestro 
+intérprete de Python, es necesario cambiarla.
 
-Otra opción es utilizar el programa *env* (de **environment**, entorno) para preguntar al sistema por la ruta al intérprete de Python, de forma que nuestros usuarios no tengan ningún problema si se diera el caso de que el programa no estuviera instalado en dicha ruta::
+Otra opción es utilizar el programa *env* (de **environment**, 
+entorno) para preguntar al sistema por la ruta al intérprete de 
+Python, de forma que nuestros usuarios no tengan ningún problema si 
+se diera el caso de que el programa no estuviera instalado en dicha 
+ruta::
 
    #!/usr/bin/env python
    print("Hola Mundo")
    raw_input()
 
-Por supuesto además de añadir el *shebang*, tendremos que dar permisos de ejecución al programa::
+Por supuesto además de añadir el *shebang*, tendremos que dar 
+permisos de ejecución al programa::
 
    chmod +x hola.py
 
-Y listo! si hacemos doble clic, el programa se ejecutará mostrando una consola con el texto *Hola Mundo*, como en el caso de Windows.
+Y listo! si hacemos doble clic, el programa se ejecutará mostrando 
+una consola con el texto *Hola Mundo*, como en el caso de Windows.
 
-También podríamos correr el programa desde la consola como si tratara de un ejecutable cualquiera::
+También podríamos correr el programa desde la consola como si 
+tratara de un ejecutable cualquiera::
 
    ./hola.py
 
 Errores
 ~~~~~~~
 
-Resulta que Python nos ayuda desde el inicio cuando algo hacemos mal, a través de mensajes de error perfectamente claros nos dice donde estamos haciendo mal las cosas.  Antes de preguntar por ayuda para un error, considera entender el mensaje de error que te pudiera salir, así por ejemplo::
+Resulta que Python nos ayuda desde el inicio cuando algo hacemos 
+mal, a través de mensajes de error perfectamente claros nos informa 
+que es lo que estamos haciendo mal.  Antes de preguntar por ayuda 
+para un error, considera entender el mensaje de error que te pudiera 
+salir, así por ejemplo::
 
     >>> print("Hola Mundo)
       File "<stdin>", line 1
                          ^
     SyntaxError: EOL while scanning string literal
 
-Supongamos que no sabes inglés (aun que emplear google translate te podía ayudar), fijate en el símbolo **^** indica que en dicho lugar hay un error, algo falta, de hecho lo que falta es agregar una comilla **"** más para cerrar el mensaje *Hola Mundo*.  Ahora, presta atención -también- que te indica la línea y hasta el tipo de error (todo esto en inglés), o sea tienes todas las herramientas para corregir un problema.
+Supongamos que no sabes inglés (aun que emplear google translate te 
+podía ayudar), fijate en el símbolo **^** indica que en dicho lugar 
+hay un error, algo falta, de hecho lo que falta es agregar una 
+comilla **"** más para cerrar el mensaje *Hola Mundo*.  Ahora, 
+presta atención -también- que te indica la línea y hasta el tipo de 
+error (todo esto en inglés), o sea tienes todas las herramientas 
+para corregir un problema.
 
-Con todo esto: **por favor!** no pidas ayuda si antes no intentaste corregir el problema (pero hazlo con cuidado, detenidamente.... **usa el cerebro!**), esto te ayudará a aprender más de programación y no estoy hablando de Python.
+Con todo esto: **por favor!** no pidas ayuda si antes no intentaste 
+corregir el problema (pero hazlo con cuidado, detenidamente.... 
+**usa el cerebro!**), esto te ayudará a aprender más de programación 
+y no estoy hablando de Python.
 
 
 Ejercicios
 
     # Haz un programa que muestre un número 8 gigante.
     
-    # Escribe un programa que muestre como vas disparando un rayo *láser* con cada *Enter*.
+    # Escribe un programa que muestre como vas disparando un rayo 
+    *láser* con cada *Enter*.
     
-    # Agrega un error intencional a uno de tus programas, en las líneas intermedias y estudia el resultado.
+    # Agrega un error intencional a uno de tus programas, en las 
+    líneas intermedias y estudia el resultado.
 Consideraciones
 ~~~~~~~~~~~~~~~
 
-Las **variables** constituyen espacios de memoria que permiten almacenar información (valores) dentro de un programa computacional, lo interesante radica en que estos valores pueden sufrir cambios a lo largo de la ejecución del mismo (programa) y nos ayudan a *manipular* los datos que deseamos procesar.  Las variables están compuestas por:
+Las **variables** constituyen espacios de memoria que permiten 
+almacenar información (valores) dentro de un programa computacional, 
+lo interesante radica en que estos valores pueden sufrir cambios a 
+lo largo de la ejecución del mismo (programa) y nos ayudan a 
+*manipular* los datos que deseamos procesar.  Las variables están 
+compuestas por:
 
-    * **Identificadores** o *nombres*, que constituyen palabras o conjuntos de caracteres que permiten identificar fácilmente dichos espacios de memoria.
+    * **Identificadores** o *nombres*, que constituyen palabras o 
+    conjuntos de caracteres que permiten identificar fácilmente 
+    dichos espacios de memoria.
     
-    * **Valores**, que es lo que contienen los espacios de memoria asignados, éstos *valores* pueden ser de diversos *tipos* y precisamente sobre esto tenemos algo que decir.
+    * **Valores**, que es lo que contienen los espacios de memoria 
+    asignados, éstos *valores* pueden ser de diversos *tipos* y 
+    precisamente sobre esto tenemos algo que decir.
 
-Listo! Ya que tenemos en claro esto podemos pasar a los *tipos* de valores que pueden guardar una *variable*.
+Listo! Ya que tenemos en claro esto podemos pasar a los *tipos* de 
+valores que pueden guardar una *variable*.
 
 
 Introducción
 
 En Python los tipos básicos se dividen en:
 
-    * Números, como pueden ser 3 (enteros), 15.57 (coma flotante) o 7 + 5j (complejos).
+    * Números, como pueden ser 3 (enteros), 15.57 (coma flotante) o 
+    7 + 5j (complejos).
     
     * Cadenas de texto, como "Hola Mundo".
     
     * Valores booleanos: True (cierto) y False (falso).
 
-Vamos a crear un par de variables a modo de ejemplo. Una de tipo cadena y una de tipo entero::
+Vamos a crear un par de variables a modo de ejemplo. Una de tipo 
+cadena y una de tipo entero::
 
      # esto es una cadena
      >>> c = "Hola Mundo"
      >>> print(c)
      >>> print(e)
 
-Como ven en Python, a diferencia de muchos otros lenguajes, no se declara el tipo de la variable al crearla. En Java, por ejemplo, escribiríamos::
+Como ven en Python, a diferencia de muchos otros lenguajes, no se 
+declara el tipo de la variable al crearla. En Java, por ejemplo, 
+escribiríamos::
 
      String c = “Hola Mundo”;
      int e = 23;
 
 Este pequeño ejemplo nos ha servido para entender lo siguiente:
 
-    * Como se hace uso de las *variables* en Python, de esta manera: se escoge un identificador, se coloca un símbolo **=** que quiere decir *es igual* o *contiene* y luego el *valor* en sí.
+    * Como se hace uso de las *variables* en Python, de esta manera: 
+    se escoge un identificador, se coloca un símbolo **=** que 
+    quiere decir *es igual* o *contiene* y luego el *valor* en sí.
 
-    * Los comentarios *inline* en Python: cadenas de texto que comienzan con el carácter **#** y que Python ignora totalmente, son simplemente para ayudarnos a comentar algo sin que afecte el desarrollo del programa, para anotar algo que nos puede resultar importante. Hay más tipos de comentarios, de los que hablaremos más adelante.
+    * Los comentarios *inline* en Python: cadenas de texto que 
+    comienzan con el carácter **#** y que Python ignora totalmente, 
+    son simplemente para ayudarnos a comentar algo sin que afecte el 
+    desarrollo del programa, para anotar algo que nos puede resultar 
+    importante. Hay más tipos de comentarios, de los que hablaremos 
+    más adelante.
     
-    * Que tenemos una función *type* que nos permite conocer el tipo de dato de nuestra variable y cuya sintáxis es: **type(VARIABLE)**, donde *VARIABLE* se reemplaza con el identificador deseado.
+    * Que tenemos una función *type* que nos permite conocer el tipo 
+    de dato de nuestra variable y cuya sintáxis es: 
+    **type(VARIABLE)**, donde *VARIABLE* se reemplaza con el 
+    identificador deseado.
     
-    * Combinando las funciones del capítulo 1, como *print* y *raw_input* podemos comenzar a *construir* programas más complejos y útiles.  En este caso: podemos *guardar* datos en variables y *visualizarlas* posteriormente
+    * Combinando las funciones del capítulo 1, como *print* y 
+    *raw_input* podemos comenzar a *construir* programas más 
+    complejos y útiles.  En este caso: podemos *guardar* datos en 
+    variables y *visualizarlas* posteriormente
 
 
 Números
 ~~~~~~~
 
-Como decíamos, en Python se pueden representar números enteros, reales y complejos.
+Como decíamos, en Python se pueden representar números enteros, 
+reales y complejos.
 
 
 Enteros
 *******
 
-Los números enteros son aquellos números positivos o negativos que no tienen decimales (además del cero). En Python se pueden representar mediante el tipo *int* (de integer, entero) o el tipo *long* (largo).  La única diferencia es que el tipo *long* permite almacenar números más grandes. Es aconsejable no utilizar el tipo *long* a menos que sea necesario, para no malgastar memoria.
+Los números enteros son aquellos números positivos o negativos que 
+no tienen decimales (además del cero). En Python se pueden 
+representar mediante el tipo *int* (de integer, entero) o el tipo 
+*long* (largo).  La única diferencia es que el tipo *long* permite 
+almacenar números más grandes. Es aconsejable no utilizar el tipo 
+*long* a menos que sea necesario, para no malgastar memoria.
 
-El tipo *int* de Python se implementa a bajo nivel mediante un tipo *long* de C. Y dado que Python utiliza C por debajo, como C, y a diferencia de Java, el rango de los valores que puede representar depende de la plataforma.
+El tipo *int* de Python se implementa a bajo nivel mediante un tipo 
+*long* de C. Y dado que Python utiliza C por debajo, como C, y a 
+diferencia de Java, el rango de los valores que puede representar 
+depende de la plataforma.
 
-En la mayor parte de las máquinas el *long* de C se almacena utilizando 32 bits, es decir, mediante el uso de una variable de tipo *int* de Python podemos almacenar números de -231 a 231 - 1, o lo que es lo mismo, de -2.147.483.648 a 2.147.483.647. En plataformas de 64 bits, el rango es de -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807.  El tipo *long* de Python permite almacenar números de cualquier precisión, estando limitados solo por la memoria disponible en la máquina.
+En la mayor parte de las máquinas el *long* de C se almacena 
+utilizando 32 bits, es decir, mediante el uso de una variable de 
+tipo *int* de Python podemos almacenar números de -231 a 231 - 1, o 
+lo que es lo mismo, de -2.147.483.648 a 2.147.483.647. En 
+plataformas de 64 bits, el rango es de -9.223.372.036.854.775.808 
+hasta 9.223.372.036.854.775.807.  El tipo *long* de Python permite 
+almacenar números de cualquier precisión, estando limitados solo por 
+la memoria disponible en la máquina.
 
-Al asignar un número a una variable esta pasará a tener tipo *int*, a menos que el número sea tan grande como para requerir el uso del tipo *long*::
+Al asignar un número a una variable esta pasará a tener tipo *int*, 
+a menos que el número sea tan grande como para requerir el uso del 
+tipo *long*::
 
     entero = 23
     # type(entero) devolvería int
 
-También podemos indicar a Python que un número se almacene usando *long* añadiendo una L al final::
+También podemos indicar a Python que un número se almacene usando 
+*long* añadiendo una L al final::
 
     entero = 23L
     # type(entero) devolvería long
 
-El literal que se asigna a la variable también se puede expresar como un *octal*, anteponiendo un cero::
+El literal que se asigna a la variable también se puede expresar 
+como un *octal*, anteponiendo un cero::
 
    # 027 octal = 23 en base 10
    entero = 027
 Reales
 ******
 
-Los números reales son los que tienen decimales. En Python se expresan mediante el tipo *float*. En otros lenguajes de programación, como C, tenemos también el tipo *double*, similar a *float* pero de mayor precisión (double = doble precisión). Python, sin embargo, implementa su tipo *float* a bajo nivel mediante una variable de tipo *double* de C, es decir, utilizando 64 bits, luego en Python siempre se utiliza doble precisión, y en concreto se sigue el estándar IEEE 754: 1 bit para el signo, 11 para el exponente, y 52 para la mantisa. Esto significa que los valores que podemos representar van desde ±2,2250738585072020 x 10-308 hasta ±1,7976931348623157×10308.
+Los números reales son los que tienen decimales. En Python se 
+expresan mediante el tipo *float*. En otros lenguajes de 
+programación, como C, tenemos también el tipo *double*, similar a 
+*float* pero de mayor precisión (double = doble precisión). Python, 
+sin embargo, implementa su tipo *float* a bajo nivel mediante una 
+variable de tipo *double* de C, es decir, utilizando 64 bits, luego 
+en Python siempre se utiliza doble precisión, y en concreto se sigue 
+el estándar IEEE 754: 1 bit para el signo, 11 para el exponente, y 
+52 para la mantisa. Esto significa que los valores que podemos 
+representar van desde ±2,2250738585072020 x 10-308 hasta 
+±1,7976931348623157×10308.
 
-La mayor parte de los lenguajes de programación siguen el mismo esquema para la representación interna. Pero como muchos saben esta tiene sus limitaciones, impuestas por el hardware. Por eso desde Python 2.4 contamos también con un nuevo tipo *decimal*, para el caso de que se necesite representar fracciones de forma más precisa.  Sin embargo este tipo está fuera del alcance de este tutorial, y sólo es necesario para el ámbito de la programación científica y otros relacionados.
+La mayor parte de los lenguajes de programación siguen el mismo 
+esquema para la representación interna. Pero como muchos saben esta 
+tiene sus limitaciones, impuestas por el hardware. Por eso desde 
+Python 2.4 contamos también con un nuevo tipo *decimal*, para el 
+caso de que se necesite representar fracciones de forma más 
+precisa.  Sin embargo este tipo está fuera del alcance de este 
+tutorial, y sólo es necesario para el ámbito de la programación 
+científica y otros relacionados.
 
-Para aplicaciones normales pueden utilizar el tipo *float* sin miedo, como ha venido haciéndose desde hace años, aunque teniendo en cuenta que los números en coma flotante no son precisos (ni en este, ni en otros lenguajes de programación).
+Para aplicaciones normales pueden utilizar el tipo *float* sin 
+miedo, como ha venido haciéndose desde hace años, aunque teniendo en 
+cuenta que los números en coma flotante no son precisos (ni en este, 
+ni en otros lenguajes de programación).
 
-Para representar un número *real* en Python se escribe primero la parte entera, seguido de un punto y por último la parte decimal::
+Para representar un número *real* en Python se escribe primero la 
+parte entera, seguido de un punto y por último la parte decimal::
 
    real = 0.2703
 
-También se puede utilizar notación científica, y añadir una e (de exponente) para indicar un exponente en base 10. Por ejemplo::
+También se puede utilizar notación científica, y añadir una e (de 
+exponente) para indicar un exponente en base 10. Por ejemplo::
 
    real = 0.1e-3
 
 Complejos
 *********
 
-Los números complejos son aquellos que tienen parte imaginaria. Si no conocías de su existencia, es más que probable que nunca lo vayas a necesitar, por lo que puedes saltarte este apartado tranquilamente. De hecho la mayor parte de lenguajes de programación carecen de este tipo, aunque sea muy utilizado por ingenieros y científicos en general.
+Los números complejos son aquellos que tienen parte imaginaria. Si 
+no conocías de su existencia, es más que probable que nunca lo vayas 
+a necesitar, por lo que puedes saltarte este apartado 
+tranquilamente. De hecho la mayor parte de lenguajes de programación 
+carecen de este tipo, aunque sea muy utilizado por ingenieros y 
+científicos en general.
 
-En el caso de que necesiten utilizar números complejos, o simplemente tengan curiosidad, les diré que este tipo, llamado *complex* en Python, también se almacena usando coma flotante, debido a que estos números son una extensión de los números reales. En concreto se almacena en una estructura de C, compuesta por dos variables de tipo *double*, sirviendo una de ellas para almacenar la parte real y la otra para la parte imaginaria.
+En el caso de que necesiten utilizar números complejos, o 
+simplemente tengan curiosidad, les diré que este tipo, llamado 
+*complex* en Python, también se almacena usando coma flotante, 
+debido a que estos números son una extensión de los números reales. 
+En concreto se almacena en una estructura de C, compuesta por dos 
+variables de tipo *double*, sirviendo una de ellas para almacenar la 
+parte real y la otra para la parte imaginaria.
 
 Los números complejos en Python se representan de la siguiente forma::
 
 Operadores
 **********
 
-Veamos ahora qué podemos hacer con nuestros números usando los operadores por defecto. Para operaciones más complejas podemos recurrir al módulo *math*.
+Veamos ahora qué podemos hacer con nuestros números usando los 
+operadores por defecto. Para operaciones más complejas podemos 
+recurrir al módulo *math*.
 
 **Operadores aritméticos**
 
 |    %   | Módulo             | r = 7 % 2            # r es 1        |
 +--------+--------------------+--------------------------------------+
 
+Puede que tengan dudas sobre cómo funciona el operador de módulo y 
+cuál es la diferencia entre división y división entera.  El operador 
+de módulo no hace otra cosa que devolvernos el resto de la división 
+entre los dos operandos.  En el ejemplo: **7 / 2** sería 3, con 1 de 
+resto, entonces el módulo es 1.
 
-Puede que tengan dudas sobre cómo funciona el operador de módulo y cuál es la diferencia entre división y división entera.  El operador de módulo no hace otra cosa que devolvernos el resto de la división entre los dos operandos.  En el ejemplo: **7 / 2** sería 3, con 1 de resto, entonces el módulo es 1.
+La diferencia entre división y división entera no es otra que la que 
+indica su nombre. En la división el resultado que se devuelve es un 
+número real, mientras que en la división entera el resultado que se 
+devuelve es solo la parte entera.  No obstante hay que tener en 
+cuenta que si utilizamos dos operandos enteros, Python determinará 
+que queremos que la variable resultado también sea un entero, por lo 
+que el resultado de, por ejemplo: **3 / 2** y **3 // 2** sería el 
+mismo *1*.
 
-La diferencia entre división y división entera no es otra que la que indica su nombre. En la división el resultado que se devuelve es un número real, mientras que en la división entera el resultado que se devuelve es solo la parte entera.  No obstante hay que tener en cuenta que si utilizamos dos operandos enteros, Python determinará que queremos que la variable resultado también sea un entero, por lo que el resultado de, por ejemplo: **3 / 2** y **3 // 2** sería el mismo *1*.
-
-
-Si quisiéramos obtener los decimales necesitaríamos que al menos uno de los operandos fuera un número real, bien indicando los decimales::
+Si quisiéramos obtener los decimales necesitaríamos que al menos uno 
+de los operandos fuera un número real, bien indicando los 
+decimales::
 
    r = 3.0 / 2
 
-O bien utilizando la función float (explicaremos el uso de esta función más adelante)::
+O bien utilizando la función float (explicaremos el uso de esta 
+función más adelante)::
 
    r = float(3) / 2
 
-Esto es así porque cuando se mezclan tipos de números, Python convierte todos los operandos al tipo más complejo de entre los tipos de los operandos.
+Esto es así porque cuando se mezclan tipos de números, Python 
+convierte todos los operandos al tipo más complejo de entre los 
+tipos de los operandos.
 
 
 Cadenas
 ~~~~~~~
 
-Las cadenas no son más que texto encerrado entre comillas simples ('cadena') o dobles ("cadena"). Dentro de las comillas se pueden añadir caracteres especiales escapándolos con **\\**, como: **\\n** (el carácter de nueva línea) o **\\t** (el de tabulación).
+Las cadenas no son más que texto encerrado entre comillas simples 
+('cadena') o dobles ("cadena"). Dentro de las comillas se pueden 
+añadir caracteres especiales escapándolos con **\\**, como: **\\n** 
+(el carácter de nueva línea) o **\\t** (el de tabulación).
 
-Una cadena puede estar precedida por el carácter **u** o el carácter **r**, los cuales indican, respectivamente, que se trata de una cadena que utiliza codificación **Unicode** y una cadena raw (del inglés, cruda). Las cadenas raw se distinguen de las normales en que los caracteres escapados mediante la barra invertida **\\** no se sustituyen por sus contrapartidas.  Esto es especialmente útil, por ejemplo, para las expresiones regulares, como veremos en el capítulo correspondiente::
+Una cadena puede estar precedida por el carácter **u** o el carácter 
+**r**, los cuales indican, respectivamente, que se trata de una 
+cadena que utiliza codificación **Unicode** y una cadena raw (del 
+inglés, cruda). Las cadenas raw se distinguen de las normales en que 
+los caracteres escapados mediante la barra invertida **\\** no se 
+sustituyen por sus contrapartidas.  Esto es especialmente útil, por 
+ejemplo, para las expresiones regulares, como veremos en el capítulo 
+correspondiente::
 
     unicode = u"äóè"
     raw = r"\n"
 
-También es posible encerrar una cadena entre triples comillas (simples o dobles). De esta forma podremos escribir el texto en varias líneas, y al imprimir la cadena, se respetarán los saltos de línea que introdujimos sin tener que recurrir al carácter **\\n**, así como las comillas sin tener que escaparlas::
+También es posible encerrar una cadena entre triples comillas 
+(simples o dobles). De esta forma podremos escribir el texto en 
+varias líneas, y al imprimir la cadena, se respetarán los saltos de 
+línea que introdujimos sin tener que recurrir al carácter **\\n**, 
+así como las comillas sin tener que escaparlas::
 
     triple = """primera linea
                 esto se vera en otra linea"""
 
-Las cadenas también admiten operadores como **+**, que funciona realizando una concatenación de las cadenas utilizadas como operandos y *****, en la que se repite la cadena tantas veces como lo indique el número utilizado como segundo operando::
+Las cadenas también admiten operadores como **+**, que funciona 
+realizando una concatenación de las cadenas utilizadas como 
+operandos y *****, en la que se repite la cadena tantas veces como 
+lo indique el número utilizado como segundo operando::
 
     a = "uno"
     b = 'dos'
 Booleanos
 ~~~~~~~~~
 
-Como decíamos al comienzo del capítulo una variable de tipo booleano sólo puede tener dos valores: **True** (cierto) y **False** (falso). Estos valores son especialmente importantes para las expresiones condicionales y los bucles, como veremos más adelante.
+Como decíamos al comienzo del capítulo una variable de tipo booleano 
+sólo puede tener dos valores: **True** (cierto) y **False** (falso). 
+Estos valores son especialmente importantes para las expresiones 
+condicionales y los bucles, como veremos más adelante.
 
-En realidad el tipo *bool* (el tipo de los booleanos) es una subclase del tipo *int*. Puede que esto no tenga mucho sentido para tí si no conoces los términos de la orientación a objetos, que veremos más adelante, aunque tampoco es muy importante.
+En realidad el tipo *bool* (el tipo de los booleanos) es una 
+subclase del tipo *int*. Puede que esto no tenga mucho sentido para 
+tí si no conoces los términos de la orientación a objetos, que 
+veremos más adelante, aunque tampoco es muy importante.
 
-A continuación mostramos los distintos tipos de operadores con los que podemos trabajar empleando valores booleanos, los llamados operadores lógicos o condicionales:
+A continuación mostramos los distintos tipos de operadores con los 
+que podemos trabajar empleando valores booleanos, los llamados 
+operadores lógicos o condicionales:
 
 +--------+--------------------+--------------------------------------+
 |Operador|     Descripción    |        Ejemplo                       |
 |  not   | No a               | r = not True        # r es False     |
 +--------+--------------------+--------------------------------------+
 
-Los valores booleanos son además el resultado de expresiones que utilizan operadores relacionales (comparaciones entre valores):
+Los valores booleanos son además el resultado de expresiones que 
+utilizan operadores relacionales (comparaciones entre valores):
 
 +--------+----------------------+--------------------------------------+
 |Operador|     Descripción      |        Ejemplo                       |
 |        |  que b?              |                                      |
 +--------+----------------------+--------------------------------------+
 
-Conforme avancemos en el libro es importante que consideres la importancia de los valores lógicos en Python ya que dentro del lenguaje se considera una buena práctica hacer uso de éstos.
+Conforme avancemos en el libro es importante que consideres la 
+importancia de los valores lógicos en Python ya que dentro del 
+lenguaje se considera una buena práctica hacer uso de éstos.
 
 
 Tipado (Casting)
 ~~~~~~~~~~~~~~~~
 
-En el desarrollo del capítulo hemos establecido los diversos tipos (básicos) de Python, pero: *qué pasa cuándo necesito que un tipo de dato se convierta en otro?*.  Uno podría decir que esto no es habitual, pero en realidad lo es, intentemos en el intérprete::
+En el desarrollo del capítulo hemos establecido los diversos tipos 
+(básicos) de Python, pero: *qué pasa cuándo necesito que un tipo de 
+dato se convierta en otro?*.  Uno podría decir que esto no es 
+habitual, pero en realidad lo es, intentemos en el intérprete::
 
     >>> a = "uno se representa con el número"
     >>> b = 1
       File "<stdin>", line 1, in <module>
     TypeError: cannot concatenate 'str' and 'int' objects
 
-Bueno, lo que sucede es que Python no puede juntar dos datos de diferente *tipo* y entonces, el maravilloso intérprete, nos muestra un error para así corregir el problema.  Para solucionar esto hacemos uso de las funciones de tipado o *casting*:
+Bueno, lo que sucede es que Python no puede juntar dos datos de 
+diferente *tipo* y entonces, el maravilloso intérprete, nos muestra 
+un error para así corregir el problema.  Para solucionar esto 
+hacemos uso de las funciones de tipado o *casting*:
 
     **int()**
         Convierte un valor a entero.
 
     >>> print a + str(b)
 
-Nos permite ahora convertir el número *1* en una cadena y el resultado será otra nueva cadena **"uno se representa con el número 1"**.  Obviamente los valores que deseamos convertir deben ser *compatibles* con el nuevo *tipo*, es obvio que saldrá un error si hacen esto::
+Nos permite ahora convertir el número *1* en una cadena y el 
+resultado será otra nueva cadena **"uno se representa con el número 
+1"**.  Obviamente los valores que deseamos convertir deben ser 
+*compatibles* con el nuevo *tipo*, es obvio que saldrá un error si 
+hacen esto::
 
     >>> int(a)
 
-Cómo diablos el intérprete puede convertir toda esa frase en un número? Ni que fuera inteligente!
+Cómo diablos el intérprete puede convertir toda esa frase en un 
+número? Ni que fuera inteligente!
 
 
 Uniendo las piezas
 ~~~~~~~~~~~~~~~~~~
 
-Muy bien, llegamos a un punto en donde ya podemos hacer un programa mínimamente interactivo, digo esto, porque ya sabemos como visualizar e ingresar valores y además guardarlos en memoria a través de las *variables* y sus diversos *tipos*.  Es decir: podemos unir las piezas (que es lo interesante de la programación), pero nuestro valor añadido es la "lógica", el algoritmo dentro de nuestro programa, lo que lo convierte en algo útil, interesante, importante, rentable, etc.
+Muy bien, llegamos a un punto en donde ya podemos hacer un programa 
+mínimamente interactivo, digo esto, porque ya sabemos como 
+visualizar e ingresar valores y además guardarlos en memoria a 
+través de las *variables* y sus diversos *tipos*.  Es decir: podemos 
+unir las piezas (que es lo interesante de la programación), pero 
+nuestro valor añadido es la "lógica", el algoritmo dentro de nuestro 
+programa, lo que lo convierte en algo útil, interesante, importante, 
+rentable, etc.
 
 Con el intérprete hagamos un experimento::
 
     >>> n = raw_input("Ingresa tu edad: ")
 
-Ya conocíamos **raw_input** pero no lo habíamos usado para guardar nada, así que lo único que hemos hecho es almacenar el resultado de lo que ingrese el usuario a la variable *n*.
-Ingresa, entonces, el número que gustes, digamos *23* y luego:
+Ya conocíamos **raw_input** pero no lo habíamos usado para guardar 
+nada, así que lo único que hemos hecho es almacenar el resultado de 
+lo que ingrese el usuario a la variable *n*. Ingresa, entonces, el 
+número que gustes, digamos *23* y luego:
 
     >>> print 2011 - int(n)
 
-El resultado que nos aparecerá es *1988*, pero para llegar a esto tuvimos que "tipar" la variable *n* puesto que la función **raw_input** nos permite ingresar *cadenas* y para efectuar la resta necesitamos que el valor ingresado sea un *entero* (**int**).
+El resultado que nos aparecerá es *1988*, pero para llegar a esto 
+tuvimos que "tipar" la variable *n* puesto que la función 
+**raw_input** nos permite ingresar *cadenas* y para efectuar la 
+resta necesitamos que el valor ingresado sea un *entero* (**int**).
 
-A esto me refiero con unir las piezas! Podemos ir integrando cada concepto que aprendamos en nuestros programas y hacerlos más ambiciosos y complejos.
+A esto me refiero con unir las piezas! Podemos ir integrando cada 
+concepto que aprendamos en nuestros programas y hacerlos más 
+ambiciosos y complejos.
 
 
 Ejercicios
 
     # Desarrolla un programa que *salude* según el nombre del usuario.
     
-    # Ahora haz un programa que calcule el área de un triángulo dado por el usuario.
+    # Ahora haz un programa que calcule el área de un triángulo dado 
+    por el usuario.
     
-    # Prueba haciendo fallar tus programas, obviando el *tipado* o escribiendo alguna función mal.  De los errores se aprende. 
+    # Prueba haciendo fallar tus programas, obviando el *tipado* o 
+    escribiendo alguna función mal.  De los errores se aprende. 
 ¿Qué es Python?
 ~~~~~~~~~~~~~~~
 
-Python es un lenguaje de programación creado por Guido van Rossum a principios de los años 90 cuyo nombre está inspirado en el grupo de cómicos ingleses “Monty Python”. En su momento surge como una alternativa sólida y viable al lenguaje Perl, con quien mantuvo -al principio- una sana rivalidad (pero para el año 2010 no aplica, puesto que se ha superado ampliamente a Perl).
+Python es un lenguaje de programación creado por Guido van Rossum a 
+principios de los años 90 cuyo nombre está inspirado en el grupo de 
+cómicos ingleses “Monty Python”. En su momento surge como una 
+alternativa sólida y viable al lenguaje Perl, con quien mantuvo -al 
+principio- una sana rivalidad (pero para el año 2010 no aplica, 
+puesto que se ha superado ampliamente a Perl).
 
-Es un lenguaje de propósito general, interpretado (o de script) que ofrece tipado fuerte y dinámico, multiplataforma, interactivo, orientado a objetos, sintáxis clara, ampliable, incrustable y con una gran cantidad de módulos (librerías) que lo hacen ideal para casi cualquier área.
+Es un lenguaje de propósito general, interpretado (o de script) que 
+ofrece tipado fuerte y dinámico, multiplataforma, interactivo, 
+orientado a objetos, sintáxis clara, ampliable, incrustable y con 
+una gran cantidad de módulos (librerías) que lo hacen ideal para 
+casi cualquier área.
 
 **Propósito general**
 
-  Quiere decir que puedes crear cualquier tipo de programas dentro de el.  No está orientado específicamente a una área del desarrollo, como -por ejemplo- web o ventanas, sino cualquiera de ellas (y lo que se te ocurra).
-  Si tienen dudas pregúntenle a *San Google* sobre el uso que le da NASA, Mineras, Industrial Light and Magic, Dreamworks, Pixar, MIT, Google, sigo?
-
+  Quiere decir que puedes crear cualquier tipo de programas dentro 
+  de el.  No está orientado específicamente a una área del 
+  desarrollo, como -por ejemplo- web o ventanas, sino cualquiera de 
+  ellas (y lo que se te ocurra). Si tienen dudas pregúntenle a *San 
+  Google* sobre el uso que le da NASA, Mineras, Industrial Light and 
+  Magic, Dreamworks, Pixar, MIT, Google, sigo?
 
 **Lenguaje interpretado o de script**
 
-  Un lenguaje interpretado o de script es aquel que se ejecuta utilizando un programa intermedio denominado intérprete, que en lugar de compilar el código a lenguaje máquina, lo comprende y ejecuta dinámicamente.  La ventaja de los lenguajes compilados es que su ejecución es -ciertamente- más rápida, pero en contraste, los lenguajes interpretados ofrecen más flexibilidad, portabilidad y simplicidad para programar.
+  Un lenguaje interpretado o de script es aquel que se ejecuta 
+  utilizando un programa intermedio denominado intérprete, que en 
+  lugar de compilar el código a lenguaje máquina, lo comprende y 
+  ejecuta dinámicamente.  La ventaja de los lenguajes compilados es 
+  que su ejecución es -ciertamente- más rápida, pero en contraste, 
+  los lenguajes interpretados ofrecen más flexibilidad, portabilidad 
+  y simplicidad para programar.
 
-  Python tiene, no obstante, muchas de las características de los lenguajes compilados, por lo que se podría decir que es semi interpretado.  En Python, como en Java y muchos otros lenguajes, el código fuente se traduce a un pseudo código máquina intermedio llamado bytecode la primera vez que se ejecuta, generando archivos .pyc o .pyo (bytecode optimizado), que son los que se ejecutarán en sucesivas ocasiones.
-
+  Python tiene, no obstante, muchas de las características de los 
+  lenguajes compilados, por lo que se podría decir que es semi 
+  interpretado.  En Python, como en Java y muchos otros lenguajes, 
+  el código fuente se traduce a un pseudo código máquina intermedio 
+  llamado bytecode la primera vez que se ejecuta, generando archivos 
+  .pyc o .pyo (bytecode optimizado), que son los que se ejecutarán 
+  en sucesivas ocasiones.
 
 **Tipado dinámico**
 
-  Se refiere a que no es necesario declarar el tipo de dato que va a contener una determinada variable, sino que su tipo se determinará en tiempo de ejecución según el tipo del valor que se asigne y el tipo de esta variable puede cambiar si se le asigna un valor de otro tipo.
-
+  Se refiere a que no es necesario declarar el tipo de dato que va a 
+  contener una determinada variable, sino que su tipo se determinará 
+  en tiempo de ejecución según el tipo del valor que se asigne y el 
+  tipo de esta variable puede cambiar si se le asigna un valor de 
+  otro tipo.
 
 **Fuertemente tipado**
 
-  No se permite tratar a una variable como si fuera de un tipo distinto al que tiene, es necesario convertir de forma explícita dicha variable al nuevo tipo previamente.
-  Por ejemplo, si tenemos una variable que contiene un texto (variable de tipo cadena o string) no podremos tratarla como un número (sumar la cadena “9” y el número 8).  En otros lenguajes el tipo de la variable cambiaría para adaptarse al comportamiento esperado, aunque esto es más propenso a errores.
-
+  No se permite tratar a una variable como si fuera de un tipo 
+  distinto al que tiene, es necesario convertir de forma explícita 
+  dicha variable al nuevo tipo previamente. Por ejemplo, si tenemos 
+  una variable que contiene un texto (variable de tipo cadena o 
+  string) no podremos tratarla como un número (sumar la cadena “9” y 
+  el número 8).  En otros lenguajes el tipo de la variable cambiaría 
+  para adaptarse al comportamiento esperado, aunque esto es más 
+  propenso a errores.
 
 **Multiplataforma**
 
-  El intérprete de Python está disponible en multitud de plataformas (UNIX, Solaris, Linux, DOS, Windows, OS/2, Mac OS, Symbian, Android, Haiku, etc.) por lo que si no utilizamos librerías específicas de una plataforma nuestro programa podrá correr en todos estos sistemas sin grandes cambios.
-
+  El intérprete de Python está disponible en multitud de plataformas 
+  (UNIX, Solaris, Linux, DOS, Windows, OS/2, Mac OS, Symbian, 
+  Android, Haiku, etc.) por lo que si no utilizamos librerías 
+  específicas de una plataforma nuestro programa podrá correr en 
+  todos estos sistemas sin grandes cambios.
 
 **Interactivo**
 
-  Dispone de un intérprete por línea de comandos que permite la manipulación rápida y simple de objetos o módulos haciendo que la programación sea mucho más simple, de esta manera podemos probar algunas funcionalidades sin haberlas introducido dentro un programa.
+  Dispone de un intérprete por línea de comandos que permite la 
+  manipulación rápida y simple de objetos o módulos haciendo que la 
+  programación sea mucho más simple, de esta manera podemos probar 
+  algunas funcionalidades sin haberlas introducido dentro un 
+  programa.
 
 
 **Orientado a objetos**
 
-  La orientación a objetos es un paradigma de programación en el que los conceptos del mundo real relevantes para nuestro problema se trasladan a clases y objetos en nuestro programa.
-  La ejecución del programa consiste en una serie de interacciones entre los objetos.
-
+  La orientación a objetos es un paradigma de programación en el que 
+  los conceptos del mundo real relevantes para nuestro problema se 
+  trasladan a clases y objetos en nuestro programa. La ejecución del 
+  programa consiste en una serie de interacciones entre los objetos.
 
 **Sintáxis clara**
 
-  Esto para algunos podría ser relativo, pero en realidad se refiere a que Python ofrece una sintáxis indentada que visualmente permite claridad en el código, esto no es opcional en el lenguaje sino obligatorio, moviendo a los más desordenados programadores a hacer las cosas bien (y atractivas).
-
+  Esto para algunos podría ser relativo, pero en realidad se refiere 
+  a que Python ofrece una sintáxis indentada que visualmente permite 
+  claridad en el código, esto no es opcional en el lenguaje sino 
+  obligatorio, moviendo a los más desordenados programadores a hacer 
+  las cosas bien (y atractivas).
 
 **Ampliable**
 
-  Puedes expandir el lenguaje escribiendo tus propios módulos en C, permitiendo elevar el rendimiento en determinadas tareas.
-
+  Puedes expandir el lenguaje escribiendo tus propios módulos en C, 
+  permitiendo elevar el rendimiento en determinadas tareas.
 
 **Inscrustable**
 
-  Puedes programar en Python dentro de un programa en C/C++, facilitando el scripting dentro de un lenguaje de bajo nivel.
-
+  Puedes programar en Python dentro de un programa en C/C++, 
+  facilitando el scripting dentro de un lenguaje de bajo nivel.
 
 **Módulos y librerías**
 
-  El verdadero poder de Python está en sus módulos y con la librería estándar podrás lograr hacer casi cualquier cosa, aunque no siempre de la manera más sencilla, sin embargo, existe una gran cantidad de módulos externos que te permiten hacer lo que quieras con el menor esfuerzo, desde traducir tu código Python en Assembly hasta implementar SOAP/REST o controlar puertos USB.
+  El verdadero poder de Python está en sus módulos y con la librería 
+  estándar podrás lograr hacer casi cualquier cosa, aunque no 
+  siempre de la manera más sencilla, sin embargo, existe una gran 
+  cantidad de módulos externos que te permiten hacer lo que quieras 
+  con el menor esfuerzo, desde traducir tu código Python en Assembly 
+  hasta implementar SOAP/REST o controlar puertos USB.
 
-
-Hay una característica del lenguaje que me parece muy valiosa y poderosa (aunque algunos pueden tomarlo con pinzas): es multiparadigma, esto quiere decir que puedes programar con Python de manera imperativa, funcional, orientada a objetos u orientada a aspectos,  esto lo convierte en lenguaje muy valioso para introducir a las personas en la programación (aún cuando la implementación de cada paradigma no sea completa y estricta).  Imagínense aprender bien un lenguaje (Python) y luego poder trasladarse -sin mucho esfuerzo- a C, Java, Erlang, Haskell, etc., suena bien, verdad?
-
+Hay una característica del lenguaje que me parece muy valiosa y 
+poderosa (aunque algunos pueden tomarlo con pinzas): es 
+multiparadigma, esto quiere decir que puedes programar con Python de 
+manera imperativa, funcional, orientada a objetos u orientada a 
+aspectos,  esto lo convierte en lenguaje muy valioso para introducir 
+a las personas en la programación (aún cuando la implementación de 
+cada paradigma no sea completa y estricta).  Imagínense aprender 
+bien un lenguaje (Python) y luego poder trasladarse -sin mucho 
+esfuerzo- a C, Java, Erlang, Haskell, etc., suena bien, verdad?
 
 
 ¿Por qué Python?
 ~~~~~~~~~~~~~~~~
 
-Hay tanto sobre este punto que no puedo evitar detenerme para hablar sobre ¿por qué usar Python?. Vamos primero con el lado emotivo e histórico: en los 28 años que llevo en la informática y la programación puedo decir que mi relación con Python fue amor a primera vista, luego de haber trabajado con Assembly, C, Cobol, Fortran o LISP, ningún lenguaje me ha resultado tan simple, potente y divertido; cuando lo ví por primera vez, no pude evitar hacer un flash-back hacia 1982 y pensar en BASIC, pero sin números de líneas y RELOADED (recargado).  Puede haber algo mejor que esto? LO DUDO.
+Hay tanto sobre este punto que no puedo evitar detenerme para hablar 
+sobre ¿por qué usar Python?. Vamos primero con el lado emotivo e 
+histórico: en los 28 años que llevo en la informática y la 
+programación puedo decir que mi relación con Python fue amor a 
+primera vista, luego de haber trabajado con Assembly, C, Cobol, 
+Fortran o LISP, ningún lenguaje me ha resultado tan simple, potente 
+y divertido; cuando lo ví por primera vez, no pude evitar hacer un 
+flash-back hacia 1982 y pensar en BASIC, pero sin números de líneas 
+y RELOADED (recargado).  Puede haber algo mejor que esto? LO DUDO.
 
-El éxito de Python, para mí, se debe a su enfoque: centrarse en la solución del problema (relacionado a la algoritmia en sí) y no en la sintáxis; el programador de Python, adopta esta manera particular de ver las cosas y trata de optimizar todo lo que hace (pues tiene tiempo para hacerlo) para finalmente construir productos de primera calidad en tiempos muy rápidos (más que hacerlos en cualquier otro lenguaje).
+El éxito de Python, para mí, se debe a su enfoque: centrarse en la 
+solución del problema (relacionado a la algoritmia en sí) y no en la 
+sintáxis; el programador de Python, adopta esta manera particular de 
+ver las cosas y trata de optimizar todo lo que hace (pues tiene 
+tiempo para hacerlo) para finalmente construir productos de primera 
+calidad en tiempos muy rápidos (más que hacerlos en cualquier otro 
+lenguaje).
 
-Python al ser interpretado es *lento*, pero su lentitud puede ser compensada con la velocidad de procesamiento existente (que para los tiempos actuales es bastante elevada), por lo que los CPUs (o GPUs, según tu enfoque) ayudan a cubrir muchos de los problemas en aplicaciones de alto rendimiento.  Aquí quiero ser muy claro, la lentitud a la que me refiero es bastante imperceptible en casi cualquier área del desarrollo informático, es relevante -más bien- en la computación de rendimiento crítico o de bajo nivel, cosa que muy, muy pocos llegan a necesitar.
+Python al ser interpretado es *lento*, pero su lentitud puede ser 
+compensada con la velocidad de procesamiento existente (que para los 
+tiempos actuales es bastante elevada), por lo que los CPUs (o GPUs, 
+según tu enfoque) ayudan a cubrir muchos de los problemas en 
+aplicaciones de alto rendimiento.  Aquí quiero ser muy claro, la 
+lentitud a la que me refiero es bastante imperceptible en casi 
+cualquier área del desarrollo informático, es relevante -más bien- 
+en la computación de rendimiento crítico o de bajo nivel, cosa que 
+muy, muy pocos llegan a necesitar.
 
-Es muy probable que requieras emplear un lenguaje compilado como C si lo que buscas es manejar 2 millones de procesos en menos de un segundo sobre un cluster de 14 máquinas con mpich2 o quizás trabajar con 250 señales de diversos dispositivos electrónicos en menos de 50ms para una simulación, *¿es ese tu caso?*.
+Es muy probable que requieras emplear un lenguaje compilado como C 
+si lo que buscas es manejar 2 millones de procesos en menos de un 
+segundo sobre un cluster de 14 máquinas con mpich2 o quizás trabajar 
+con 250 señales de diversos dispositivos electrónicos en menos de 
+50ms para una simulación, *¿es ese tu caso?*.
 
-Así que no te vengan con el cuento de que es "lento", puedes tomar como referencia a quienes lo emplean en el mundo académico, científico o empresarial y verás que seguramente sus aplicaciones son más ambiciosas de las que piensas desarrollar.
+Así que no te vengan con el cuento de que es "lento", puedes tomar 
+como referencia a quienes lo emplean en el mundo académico, 
+científico o empresarial y verás que seguramente sus aplicaciones 
+son más ambiciosas de las que piensas desarrollar.
 
 Revisemos varios casos (documentados) de éxito de Python en el mundo:
 
-     - El 99% del código de **Youtube** (que maneja el 20% del tráfico de internet) está escrito en Python.
-     - **ILM** (Industrial Light & Magic), la productora de George Lucas y creadora de Star Wars y muchísimas películas emplea Python para casi cualquier actividad en sus procesos, desde la generación de escenas o la composición hasta la automatización de render farms.
-     - **Google**, ese buscador que lidera nuestras búsquedas, emplea intensamente Python en sus procesos, de hecho es uno de los lenguajes más usados en la empresa y esto supone que debe lidiar con ofrecer resultados de búsquedas en menos de un segundo para millones de usuarios por minuto.
-     - La **NASA** emplea Python para diversos proyectos, desde la estadística hasta la simulación, sin olvidarnos que está atrás de Nebula, su plataforma de Cloud Computing.
-     - La minería es una de las industrias que mayores capitales mueve en el mundo, en este caso las principales empresas de software para análisis y exploración escriben y comercializan sus aplicaciones empleando Python, sino veamos a Minesight de **Mintec**, uno de los productos más empleados por este rubro.
+     - El 99% del código de **Youtube** (que maneja el 20% del 
+     tráfico de internet) está escrito en Python.
+     - **ILM** (Industrial Light & Magic), la productora de George 
+     Lucas y creadora de Star Wars y muchísimas películas emplea 
+     Python para casi cualquier actividad en sus procesos, desde la 
+     generación de escenas o la composición hasta la automatización 
+     de render farms.
+     - **Google**, ese buscador que lidera nuestras búsquedas, 
+     emplea intensamente Python en sus procesos, de hecho es uno de 
+     los lenguajes más usados en la empresa y esto supone que debe 
+     lidiar con ofrecer resultados de búsquedas en menos de un 
+     segundo para millones de usuarios por minuto.
+     - La **NASA** emplea Python para diversos proyectos, desde la 
+     estadística hasta la simulación, sin olvidarnos que está atrás 
+     de Nebula, su plataforma de Cloud Computing.
+     - La minería es una de las industrias que mayores capitales 
+     mueve en el mundo, en este caso las principales empresas de 
+     software para análisis y exploración escriben y comercializan 
+     sus aplicaciones empleando Python, sino veamos a Minesight de 
+     **Mintec**, uno de los productos más empleados por este rubro.
 
-Finalmente, cuando uno revisa código en Python puede verlo casi como pseudocódigo, algo completamente natural, sencillo de entender, eso le da un valor muy particular al lenguaje.
+Finalmente, cuando uno revisa código en Python puede verlo casi como 
+pseudocódigo, algo completamente natural, sencillo de entender, eso 
+le da un valor muy particular al lenguaje.
 
 
 Instalación de Python
 ~~~~~~~~~~~~~~~~~~~~~
 
-Existen varias implementaciones distintas de Python: CPython, Jython, IronPython, PyPy, etc.  CPython es la más extendida y la más madura y cuando la gente habla de "Python" normalmente se refiere a esta implementación.  En este caso tanto el intérprete como los módulos están escritos en C.  Jython es la implementación en Java de Python, mientras que IronPython es su contrapartida en C# (.NET). Su interés estriba en que utilizando estas implementaciones se pueden utilizar todas las librerías disponibles para los programadores de Java y .NET. PyPy, como pueden suponer por el nombre, se trata de una implementación de Python sobre Python.
+Existen varias implementaciones distintas de Python: CPython, 
+Jython, IronPython, PyPy, etc.  CPython es la más extendida y la más 
+madura y cuando la gente habla de "Python" normalmente se refiere a 
+esta implementación.  En este caso tanto el intérprete como los 
+módulos están escritos en C.  Jython es la implementación en Java de 
+Python, mientras que IronPython es su contrapartida en C# (.NET). Su 
+interés estriba en que utilizando estas implementaciones se pueden 
+utilizar todas las librerías disponibles para los programadores de 
+Java y .NET. PyPy, como pueden suponer por el nombre, se trata de 
+una implementación de Python sobre Python.
 
-CPython está instalado por defecto en la mayor parte de las distribuciones Linux y en las últimas versiones de Mac OSX.
-Para comprobar si está efectivamente está instalado abre una terminal (shell) y escribe *python*.  Si está instalado se iniciará la consola interactiva de Python y obtendremos algo similar a esto::
+CPython está instalado por defecto en la mayor parte de las 
+distribuciones Linux y en las últimas versiones de Mac OSX. Para 
+comprobar si está efectivamente está instalado abre una terminal 
+(shell) y escribe *python*.  Si está instalado se iniciará la 
+consola interactiva de Python y obtendremos algo similar a esto::
 
 
     Python 2.7.2 (default, Nov 21 2011, 17:25:27)
     >>>
 
 
-La primera línea nos indica la versión de Python que tenemos instalada.
-Al final podemos ver el prompt (>>>) que nos indica que el intérprete está esperando código del usuario, para salir de esto podemos escribir exit() o pulsar Control+D.
+La primera línea nos indica la versión de Python que tenemos 
+instalada. Al final podemos ver el prompt (>>>) que nos indica que 
+el intérprete está esperando código del usuario, para salir de esto 
+podemos escribir exit() o pulsar Control+D.
 
-Si no te muestra algo parecido no te preocupes, instalar Python es muy sencillo.  Puedes descargar la versión correspondiente a tu sistema operativo desde la web de Python_.  Existen instaladores para los principales sistemas operativos, incluyendo Windows y MacOSX.  Si utilizas Linux es muy probable que puedas instalarlo usando la herramienta de gestión de paquetes de tu distribución, aunque también podemos descargar la aplicación compilada.
+Si no te muestra algo parecido no te preocupes, instalar Python es 
+muy sencillo.  Puedes descargar la versión correspondiente a tu 
+sistema operativo desde la web de Python_.  Existen instaladores 
+para los principales sistemas operativos, incluyendo Windows y 
+MacOSX.  Si utilizas Linux es muy probable que puedas instalarlo 
+usando la herramienta de gestión de paquetes de tu distribución, 
+aunque también podemos descargar la aplicación compilada.
 
 .. _Python: http://www.python.org/
 
 
 Existen dos formas de ejecutar código Python:
 
-    * Podemos escribir líneas de código en el intérprete y obtener una respuesta de este para cada línea (sesión interactiva).
-    * Podemos escribir el código de un programa en un archivo de texto y ejecutarlo.
+    * Podemos escribir líneas de código en el intérprete y obtener 
+    una respuesta de este para cada línea (sesión interactiva).
+    * Podemos escribir el código de un programa en un archivo de 
+    texto y ejecutarlo.
 
-A la hora de realizar una sesión interactiva les aconsejo instalar y utilizar iPython, en lugar de la consola interactiva de Python.  Se puede encontrar en http://ipython.scipy.org/. iPython cuenta con características añadidas muy interesantes, como el autocompletado o el operador ?.
+A la hora de realizar una sesión interactiva les aconsejo instalar y 
+utilizar iPython, en lugar de la consola interactiva de Python.  Se 
+puede encontrar en http://ipython.scipy.org/. iPython cuenta con 
+características añadidas muy interesantes, como el autocompletado o 
+el operador ?.
 
-(para activar la característica de autocompletado en Windows es necesario instalar PyReadline, que puede descargarse desde http://ipython.scipy.org/moin/PyReadline/Intro)
+Para activar la característica de autocompletado en Windows es 
+necesario instalar PyReadline, que puede descargarse desde 
+http://ipython.scipy.org/moin/PyReadline/Intro.
 
-La función de autocompletado se lanza pulsando el tabulador. Si escribimos fi y pulsamos Tab nos mostrará una lista de los objetos que comienzan con fi (file, filter y finally). Si escribimos file y pulsamos Tab nos mostrará una lista de los métodos y propiedades del objeto file.
+La función de autocompletado se lanza pulsando el tabulador. Si 
+escribimos fi y pulsamos Tab nos mostrará una lista de los objetos 
+que comienzan con fi (file, filter y finally). Si escribimos file y 
+pulsamos Tab nos mostrará una lista de los métodos y propiedades del 
+objeto file.
 
-El operador ? nos muestra información sobre los objetos. Se utiliza añadiendo el símbolo de interrogación al final del nombre del objeto del cual queremos más información. Por ejemplo, escriban *str?* y recibirán el resultado mostrado::
+El operador **?** nos muestra información sobre los objetos. Se utiliza 
+añadiendo el símbolo de interrogación al final del nombre del objeto 
+del cual queremos más información. Por ejemplo, escriban *str?* y 
+recibirán el resultado mostrado::
 
     In [3]: str?
     Type:       type
     errors can be 'strict', 'replace' or 'ignore' and defaults to 'strict'.
 
 
-Para el caso de los editores de código e IDEs hay varios que destacan, pero lo -para mí- lo más importante es que cuenten con resaltado de código y auto-completado.  Las siguientes soluciones ofrecen una serie de características bastante amplias, más allá de las que he indicado e incluso opciones avanzadas para grupos de trabajo:
+Para el caso de los editores de código e IDEs hay varios que 
+destacan, pero lo -para mí- lo más importante es que cuenten con 
+resaltado de código y auto-completado.  Las siguientes soluciones 
+ofrecen una serie de características bastante amplias, más allá de 
+las que he indicado e incluso opciones avanzadas para grupos de 
+trabajo:
 
-    * **Geany**, simple pero potente, cuenta con versión para diversas plataformas.
-    * **Vim**, el clásico editor de los hackers, con algunos plug-ins resulta adictivo y la herramienta ideal.
-    * **PyDEV**, un plug-in para Eclipse, que ha crecido muchísimo los últimos años con características enormes.
+    * **Geany**, simple pero potente, cuenta con versión para 
+    diversas plataformas.
+    * **Vim**, el clásico editor de los hackers, con algunos 
+    plug-ins resulta adictivo y la herramienta ideal.
+    * **PyDEV**, un plug-in para Eclipse, que ha crecido muchísimo 
+    los últimos años con características enormes.
     * **Editra**, ambicioso pero simple editor de Python.
     * **DrPython**, editor de Python para principiantes.
 
-Es obvio que existe una lista mucho más amplia de editores y de hecho pueden encontrarla en el Wiki_ de Python, la idea es que escojan uno con el que se sientan cómodos y que tenga los dos principales atributos que mencioné líneas arriba.
+Es obvio que existe una lista mucho más amplia de editores y de 
+hecho pueden encontrarla en el Wiki_ de Python, la idea es que 
+escojan uno con el que se sientan cómodos y que tenga los dos 
+principales atributos que mencioné líneas arriba.
 
-Ahora, en editores propietarios tenemos otros tantos, pero el que está demostrando un avance sin precedentes es PyCharm_ , tiene tantas características que programar con esta herramienta es un placer, de hecho JetBrains me cedió una licencia hace poco que la estoy aprovechando al máximo.
+Ahora, en editores propietarios tenemos otros tantos, pero el que 
+está demostrando un avance sin precedentes es PyCharm_ , tiene 
+tantas características que programar con esta herramienta es un 
+placer, de hecho JetBrains me cedió una licencia hace poco que la 
+estoy aprovechando al máximo.
 
 .. _Wiki: http://wiki.python.org/moin/PythonEditors
 .. _PyCharm: http://www.jetbrains.com/pycharm
 -------------
 
 
-Hace años debía haber hecho esto: un libro, la verdad es que aún es una deuda pendiente conmigo mismo hacer uno completamente propio, pero bueno, escogí hacerlo de esta manera, es decir, tomando el trabajo de un pythonero como Raúl Gonzáles Duque para modificarlo, potenciarlo, mejorarlo, actualizarlo y -lo más importante- prepararlo para que cualquier persona que desee aprender programación.
+Hace años debía haber hecho esto: un libro, la verdad es que aún es 
+una deuda pendiente conmigo mismo hacer uno completamente propio, 
+pero bueno, escogí hacerlo de esta manera, es decir, tomando el 
+trabajo de un pythonero como Raúl Gonzáles Duque para modificarlo, 
+potenciarlo, mejorarlo, actualizarlo y -lo más importante- 
+prepararlo para que cualquier persona que desee aprender 
+programación.
 
-Aprovechando de la maravillosa licencia Creative Commons, he tomado la obra "Python para Todos" de Raúl Gonzáles Duque como referencia para este *nuevo libro* que he denominado: "Python para Todos Reloaded", bueno -obviamente- el último término lo cojo de "Matrix", pero esta vez la obra debe ser mejor que la versión previa.
+Aprovechando de la maravillosa licencia Creative Commons, he tomado 
+la obra "Python para Todos" de Raúl Gonzáles Duque como referencia 
+para este *nuevo libro* que he denominado: "Python para Todos 
+Reloaded", bueno -obviamente- el último término lo cojo de "Matrix", 
+pero esta vez la obra debe ser mejor que la versión previa.
 
-Creo que tengo mucho que contar de mi experiencia en la informática y -de hecho- me encanta cuando me invitan a conferencias para contar lo que hago... y mucho de lo hago, hoy en día, es en Python.
+Creo que tengo mucho que contar de mi experiencia en la informática 
+y -de hecho- me encanta cuando me invitan a conferencias para contar 
+lo que hago... y mucho de lo hago, hoy en día, es en Python.
 
-Tomé el trabajo de Raúl Gonzáles como referencia temática y he mantenido varios contenidos, aunque corrigiendo aspectos no sólo gramaticales sino computacionales, además -obviamente- de agregar material nuevo, incluyendo capítulos enteros.  De hecho, la obra original de Raúl es buena, pero ya lleva años sin actualizaciones y no abarca una serie de temas importantes para el mundo Python en la actualidad, adicionalmente, en algunos puntos pierde su alcance pedagógico, así que había que trabajar en corregir todo esto.
+Tomé el trabajo de Raúl Gonzáles como referencia temática y he 
+mantenido varios contenidos, aunque corrigiendo aspectos no sólo 
+gramaticales sino computacionales, además -obviamente- de agregar 
+material nuevo, incluyendo capítulos enteros.  De hecho, la obra 
+original de Raúl es buena, pero ya lleva años sin actualizaciones y 
+no abarca una serie de temas importantes para el mundo Python en la 
+actualidad, adicionalmente, en algunos puntos pierde su alcance 
+pedagógico, así que había que trabajar en corregir todo esto.
 
-Para editar el libro tomé la decisión de hacerlo con texto re-estructurado (al cual le estoy tomando un especial cariño hace un tiempo) y no pude encontrar una mejor manera de organizarlo/desplegarlo que tomando el trabajo que hizo Roberto Alsina para su libro "Python No Muerde", es así que hice un *clon* de su repositorio y lo adapté a mis necesidades estéticas y literarias.  Por cierto, luego de terminar con este libro, les recomiendo dar una revisada al trabajo de Roberto con el suyo, es simplemente genial, uno de los mejores contenidos que he leído sobre Python.
+Para editar el libro tomé la decisión de hacerlo con texto 
+re-estructurado (al cual le estoy tomando un especial cariño hace un 
+tiempo) y no pude encontrar una mejor manera de 
+organizarlo/desplegarlo que tomando el trabajo que hizo Roberto 
+Alsina para su libro "Python No Muerde", es así que hice un *clon* 
+de su repositorio y lo adapté a mis necesidades estéticas y 
+literarias.  Por cierto, luego de terminar con este libro, les 
+recomiendo dar una revisada al trabajo de Roberto con el suyo, es 
+simplemente genial, uno de los mejores contenidos que he leído sobre 
+Python.
 
-Este libro es para quienes quieren aprender a programar, quienes quieren programar con Python o quienes quieren conocer de qué trata Python y qué ofrece.  Mi objetivo es simple: que se pueda enseñar Python desde el principio y que el lector/alumno pueda tener una visión del campo de acción del lenguaje.
+Este libro es para quienes quieren aprender a programar, quienes 
+quieren programar con Python o quienes quieren conocer de qué trata 
+Python y qué ofrece.  Mi objetivo es simple: que se pueda enseñar 
+Python desde el principio y que el lector/alumno pueda tener una 
+visión del campo de acción del lenguaje.
 
 Como ya es casi natural para mí escribir reStructured text (hasta los mails me
 suelen salir como reSt válido), busqué algo por ese lado.
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.