Sesión 0: Preámbulo y reglas de juego

Esta sección presenta un contexto muy resumido de Python, algunas de sus ventajas y desventajas, y la configuración usada para producir el material del curso. Además indica cómo interactuarán los programas con la entrada y la salida estándar, y cómo se ejecutarán los programas desde la terminal del sistema. Finalmente, identifica la metodología adoptada durante el curso.

Contexto

Python fue creado a principios de los años 90 por Guido van Rossum (Stichting Mathematisch Centrum -CWI-, Paises Bajos) como sucesor de un lenguaje llamado ABC. De acuerdo con la página oficial del lenguaje

Python is a programming language that lets you work quickly and integrate systems more effectively.

Técnica y principalmente, Python es:
  • un lenguaje de programación de fuente abierta con licencia de distribución Python Software Foundation (PSF), compatible con la licencia GNU General Public License (GPL)
  • imperativo (existe la noción de estado que se modifica por medio de asignaciones)
  • orientado a objetos (las estructuras de datos se pueden abstraer como clases y sus instancias como objetos)
  • interpretado (el código se interpreta a medida que se va haciendo parsing)
  • interactivo
  • extensible usando C o Java

Ventajas y desventajas

Python es un lenguaje de programación muy versátil. Sin embargo, como todo lenguaje de programación, Python tiene ventajas y desventajas, las cuales lo hacen un excelente candidato para algunos usos y no tan conveniente para algunos otros usos.

Algunas ventajas de Python son:
  • básicamente "toda expresión es un programa"; por ejemplo, 3+4 es un programa en Python
  • es un lenguaje de programación altamente portable (salvo con algunas librerías específicas); por ejemplo, un programa se puede escribir en una plataforma Linux y ser ejecutado en cualquier otra plataforma como Mac, Windows, RasperryPi, etc.
  • la documentación oficial es muy completa y la "otra" se encuentra a lo largo y ancho en internet
  • su sintaxis es sencilla y fácil de recordar
  • cuenta con tipos aritméticos de precisión arbitraria, es decir, al hacer operaciones aritméticas no nos debemos preocupar de desborde de tipos
  • también cuenta con un sinnúmero de librerías estándar (que vienen con cualquier distribución) y otras más desarrolladas por la comunidad
  • cuenta con un manejador de módulos (librerías) fácil de usar
  • pueden existir varias instancias de Python (incluso de la misma versión), cada una con configuraciones de módulos distintos
Algunas desventajas de Python son:
  • a pesar de ser relativamente rápido, difícilmente compite en este departamento con lenguajes de programación como C o Java; esto se debe, principalmente, al hecho de ser interpretado (no hay un proceso de compilación y por ende no existen optimizaciones a este nivel)
  • actualmente hay dos versiones, la versión 2 y la versión 3; en principio, la versión 2 deberá desaparecer en un par de años y la versión 3 se convertirá en la versión de facto de Python
  • algunas librerías no son compatibles entre versiones y algunas de ellas no han sido portadas a la versión 3 del lenguaje

Configuración

La dinámica para la práctica con el material de curso usa los siguientes mecanismos:
  • editar código fuente
  • ejecutar Python en la consola del sistema operativo
  • interactuar con Python
Los programas usados para desarrollar el material del curso son los siguientes:
Cada quien podría usar su editor preferido, aunque sugiero fuertemente usar Emacs o Vim. De manera similar, cualquier sistema operativo con un interprete de Python3 debería servir, pero sugiero fuertemente usar alguna versión de Linux.

Las versiones de los programas usados se listan a continuación desde la línea de comandos.

Python:
$ python3 --version
Python 3.3.2

Emacs:
$ emacs --version
GNU Emacs 24.3.1

Copyright (C) 2013 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

Linux:
$ uname -r
3.15.4-200.fc20.x86_64

Ejecución de Programas

Un programa que contenga código fuente de Python tendrá la extensión .py. Por ejemplo, fibonacci.py, estesies999.py o tesis.py.

La ejecución de un programa se puede hacer al menos de dos maneras: invocando directamente al intérprete de Python o delegando esta invocación al sistema operativo. En este curso usaremos la primera opción.

El intérprete de Python se puede usar con o sin interacción. Supongamos que tenemos un programa en el archivo fibonacci.py y que este se encuentra en el directorio actual. Para ejecutar el programa sin interacción usamos el siguiente comando:

$ python3 fibonacci.py
...

Para ejecutar el programa con interacción usamos el siguiente comando:
$ python3 -i fibonacci.py
...
>>>

La diferencia neta es que con en el modo interactivo, el intérprete ejecuta el programa en el archivo y, una vez termina su ejecución, el usuario puede interactuar con el sistema (por ejemplo, invocando funciones definidas en el programa, etc.).

Entrada y Salida

Los programas usarán la entrada estándar y la salida estándar. Esto quiere decir que el curso NO cubrirá material (por lo menos en esta versión) sobre archivos.

Para interactuar con la entrada estándar usaremos el objeto stdin del módulo sys. Entonces, en el encabezado de todo archivo que requiera leer datos de la entrada estándar deberá tener la línea:

from sys import stdin

Suponiendo que la información a ser procesada siempre será suministrada en forma de texto y no como información en formato binario, el objeto stdin permite leer la entrada estándar caracter por caracter (stdin.read(1)), línea por línea (stdin.readline()) o iterando sobre cada una de las líneas de la entrada (stdin.readlines()).

Así parezca una contradicción, en su mayoría usaremos archivos de texto para probar el código desarrollado. La forma de hacer esto es redireccionando la entrada estándar desde un archivo. Por ejemplo, si nuestro programa en fibonacci.py requiere información del usuario como un número n para calcular fib(n), entonces podemos guardar todos los números n que nos interesan en un archivo de texto, digamos fibonacci.in. Entonces podemos invocar fibonacci.py con datos en fibonacci.in de la siguiente manera:

$ python3 fibonacci.py < fibonacci.in
...

El ejecutar un programa, se usará la salida estándar para imprimir los resultados que nos interesen. En particular, dentro del programa se usará el comando print(). La salida de un programa puede ser muy larga y extensa, y entonces comparar los resultados obtenidos con los esperados puede ser difícil. De forma similar, podemos redireccionar la salida estándar a un archivo. En el ejemplo anterior, podemos guardar los resultados en un archivo, digamos fibonacci.out:

$ python3 fibonacci.py < fibonacci.in > fibonacci.out

Una vez los resultados de una ejecución estén en un archivo, estos se puede comparar automáticamente con los resultados esperados, suponiendo que estos están guardados en un archivo de texto (y con el formato esperado), usando el programa diff desde la línea de comandos. Por ejemplo, podemos comparar el archivo fibonacci.out con un hipotético archivo correct.out que guarda las respuestas correctas para los datos en fibonacci.in:

$ diff fibonacci.out correct.out


Metodología

Este curso está diseñado para "aprender haciendo" y no pretende reinvetar la rueda.

Para aprender haciendo, abordaremos problemas pequeños del estilo de programación competitiva en los cuales se presenta una situación problemática que se puede resolver usando un algoritmo, se describe el formato de los datos de entrada y el formato de los datos de salida. Para cada problema abordado o asignado habrán casos de prueba disponibles en el format test.in y test.out, con los cuales quien siga el curso puede validar sus programas. La intención es que los programas implementados sean correctos: un programa correcto si al ser probado con entradas en test.in genera una salida idéntica a test.out. Cuando sea necesario para resolver un problema, se sugerirá material complementario.

Este curso no pretende reinventar la rueda en el sentido en que habrán numerosas referencias a documentación, tutoriales y ejemplos en línea cuando sea necesario. Por ejemplo, para aprender los constructos básicos del lenguaje, el curso directamente usa material de terceros. En particular, gran parte del material usado a modo de referencia hace parte del tutorial del lenguaje, que a su vez hace parte de la documentación oficial del lenguaje.

Los problemas algorítmicos abordados en el curso son parte de un banco de problemas de programación competitiva. Usaremos problemas cuyos enunciados se encuentran en UVa Online Judge, pero las implementaciones en Python no serán validadas contra el robot de juzgamiento allí disponible dado que Python no ha sido aún adoptado por este sitio como lenguaje de programación de competencia. En internet pueden encontrar muchos sitios que aceptan Python como lenguaje de programación (TopCoder, CodeForces, SphereOnlineJudge, por mencionar algunos).