Aprender a programar con Python: una experiencia docente

Andr´s Marzal, David Llorens e Isabel Gracia e Universitat Jaume I
amarzal@lsi.uji.es, dllorens@lsi.uji.es, gracia@lsi.uji.es

Resumen La elecci´n del primer lenguaje de programaci´n es un debate recuo o rrente entre los docentes universitarios de ingenier´ inform´ticas. La ıas a Universitat Jaume I ha optado por una soluci´n poco convencional: en o el primer curso de dos titulaciones de ingenier´ inform´tica se aprende ıa a a programar con Python y C. Python es un lenguaje que est´ en auge a en el mundo del software libre y que presenta una serie de caracter´ ısticas que lo hacen muy atractivo para ense˜ar a programar. Como material de n apoyo hemos escrito un libro de texto (accesible gratuitamente) y desarrollado un sencillo entorno de programaci´n multiplataforma para Python o que se distribuye con licencia GPL: el entorno PythonG, formado por un int´rprete interactivo, un editor, un depurador sencillo y una ventana con e salida gr´fica. Con el material docente elaborado se facilita la formaci´n a o autodidacta para cualquiera que quiera aprender a programar desde cero. En este art´ ıculo reflexionamos sobre la idoneidad de Python como primer lenguaje de programaci´n, describimos la experiencia docente de o ense˜ar Python y C en primer curso y presentamos el entorno de progran maci´n PythonG. o

1.

Introducci´n o

Hace a˜os hab´ un claro consenso en el mundo acad´mico acerca del lenn ıa e guaje de programaci´n con el que ense˜ar a programar: Pascal. Era considerado o n elegante y sencillo, a la vez que ofrec´ soporte para el paradigma de programaıa ci´n imperante: la programaci´n estructurada. Son pocos los que a´n consideran o o u seriamente que Pascal sea adecuado y no faltan razones: las deficiencias del Pascal est´ndar, que obligan a usar variantes dialectales incompatibles entre s´ la a ı; ausencia de modularidad para ayudarse en el desarrollo de software de medio y gran tama˜o; la falta de apoyo a paradigmas de programaci´n como la pron o gramaci´n orientada a objetos; su escas´ o ısima presencia en el mundo empresarial (exceptuando la de alg´n derivado de Pascal, como Delphi) o en el desarrollo u de software libre. . . En el entorno acad´mico se opta hoy por diferentes lenguajes para introducir e a los estudiantes en la programaci´n. Es corriente optar por C, C++ o Java, y o m´s raramente por otros como Modula-2, Ada o Scheme. Quienes optan por a lenguajes como Modula-2 o Ada lo hacen principalmente por su elegancia y por el soporte que dan a ciertos aspectos de la programaci´n: modularidad, chequeo o

1

Figura 1: El entorno de programaci´n PythonG. o

est´tico de tipos, etc. Scheme, un derivado de Lisp, forma parte del curr´ a ıculum de algunas universidades estadounidenses (en buena medida gracias al libro de Abelson et al. [1]) y permite una aproximaci´n funcional a la programaci´n, o o aunque los paradigmas imperativo y orientado a objetos sean hoy dominantes. Mucho se puede criticar de C (y cualquiera que haya programado en C puede escribir un tratado sobre ello), pero frente a una visi´n puramente acad´mica de o e la programaci´n, C contrapone su fuerte presencia en ((el mundo real)). Quienes o consideran que C no resulta un buen primer lenguaje de programaci´n pero o siguen con la mirada puesta en ((el mundo real)), se decantan generalmente por C++ o Java, atractivos por su orientaci´n a objetos y fuerte implantaci´n en la o o industria. Dos titulaciones de inform´tica de la Universidad Jaume I hacen una apuesa ta diferente: en primer curso no se ense˜a un lenguaje de programaci´n, sino n o dos, Python y C.1 Python no s´lo es un lenguaje acad´micamente interesante, o e muy expresivo y con una sintaxis limpia y sencilla: es, adem´s, un lenguaje ya a presente y con mucho futuro en ((el mundo real)). Los lenguajes de script (lenguajes interpretados de muy alto nivel, como Perl y Python) gozan de creciente importancia e implantaci´n en el mundo del software libre. Pero Python no es o suficiente para abordar el contenido de muchas asignaturas que requieren un lenguaje de programaci´n de sistemas, ni para colmar los conocimientos pr´ctio a cos de programaci´n en el curr´ o ıculum de un inform´tico. Una vez han aprendido a a programar con Python, los alumnos pasan a estudiar el lenguaje C. La gran ventaja de esta aproximaci´n es que, al haber aprendido ya a programar, las o peculiaridades de C pueden estudiarse como lo que son: peculiaridades (por emplear una expresi´n amable). o Para impartir las pr´cticas de la asignatura se ha desarrollado un sencillo a entorno de programaci´n, llamado PythonG (ver figura 1), con un editor de o textos orientado a Python, int´rprete interactivo de ´rdenes Python, terminal e o gr´fico y depurador. El software desarrollado se distribuye con licencia GPL. a
1 Dedicamos

a cada 45 horas de teor´ ıa/problemas y 30 horas de pr´cticas a cada lenguaje. a

2

El mercado editorial ofrece infinidad de t´ ıtulos para aprender programar en C, C++ y Java. No ocurre lo mismo con Python, al menos no en Espa˜a. Este n problema se ha superado escribiendo un curso completo que cubre el temario de la asignatura. Se trata de un libro de apuntes que supone en el alumno unos conocimientos previos pr´cticamente nulos y que ha sido escrito con un a estilo expositivo muy pr´ximo al de una clase presencial [6]. El libro puede o utilizarse para el aprendizaje autodidacta de la programaci´n y que se distribuye o gratuitamente en la red. Este art´ ıculo est´ estructurado como sigue. En la secci´n 2 se presentan las a o caracter´ ısticas que, a nuestro juicio, debe reunir un lenguaje de programaci´n o utilizado para aprender a programar. En la secci´n 2.1 se examina Python bajo o esta luz y se justifica su idoneidad como primer lenguaje de programaci´n. El o apartado 2.2 resume las ventajas de aprender C una vez se sabe programar con Python. Los apartados 3 y 4 presentan el entorno de programaci´n PythonG o y el libro de texto de la asignatura. Finalmente, en el apartado 5 se apuntan algunas conclusiones.

2.

La cuesti´n del primer lenguaje o

La primera pregunta que hemos de hacernos es ¿qu´ requisitos debe reunir e un lenguaje de programaci´n para que pueda considerarse un buen lenguaje de o iniciaci´n? Debe tenerse en cuenta que el objetivo de un curso introductorio a o la programaci´n no es la ense˜anza en profundidad de un lenguaje de prograo n maci´n concreto, sino la asimilaci´n de una serie de estrategias para el dise˜o o o n y desarrollo de soluciones a problemas que usan, como veh´ ıculo de expresi´n, o un lenguaje de programaci´n. El lenguaje de programaci´n es instrumental y lo o o ideal es que interfiera lo menos posible en la implementaci´n de los algoritmos. o El primer aspecto a tener en cuenta es la sintaxis. El lenguaje debe tener cierto sentido de la econom´ en el uso de s´ ıa ımbolos auxiliares y sus estructuras deben seguir unos principios sencillos que permitan generalizaciones efectivas. Muchos errores de programaci´n de los aprendices se deben a la omisi´n o uso o o incorrecto de terminadores y delimitadores de bloque (que frecuentemente pasan inadvertidos al compilador por no provocar errores sint´cticos o sem´nticos). a a Estos errores no siempre se deben a un mal dise˜o del algoritmo por parte del n estudiante, sino al pobre soporte que ofrece el lenguaje de programaci´n para o una expresi´n concisa y clara del algoritmo. Esto nos lleva a una segunda caraco ter´ ıstica deseable: el lenguaje debe ser expresivo, es decir, debe poder ((decir mucho con poco)). Para ello, el lenguaje debe ofrecer estructuras de control flexibles y presentar una colecci´n de tipos y estructuras de datos que permita expresar o relaciones complejas entre datos con una notaci´n sencilla (por ejemplo, dando o soporte sint´ctico a estructuras secuenciales como las listas). La sem´ntica del a a lenguaje tambi´n debe ser sencilla. Contribuye a ello que el lenguaje sea muy e ortogonal, es decir, si una construcci´n o m´todo funciona con una estructura o e de datos, debe funcionar de modo similar con aquellas otras que guardan alguna semejanza (si cierta funci´n o m´todo calcula la longitud de una cadena, o e por ejemplo, deber´ calcular tambi´n la longitud de una lista, pues ambas son ıa e secuencias). Programar es una actividad que, especialmente en fases tempranas del aprendizaje, se basa en el m´todo de prueba y error. Es deseable que el lenguaje vaya e

3

acompa˜ado de un entorno de programaci´n que facilite un ciclo de edici´nn o o ejecuci´n r´pido. Resulta cr´ o a ıtico, adem´s, que se detecten y se˜alen correctaa n mente los errores de todo tipo (l´xicos, sint´cticos, sem´nticos est´ticos y de e a a a ejecuci´n): nada hay m´s frustrante para un estudiante que un programa dado o a por bueno por un compilador y que, ((inexplicablemente)), falla en la ejecuci´n o con un mensaje tan parco como ((violaci´n de segmento)), sin indicar siquiera en o qu´ l´ e ınea se produjo el error. Las caracter´ ısticas citadas son, a nuestro entender, fundamentales. Un lenguaje que las presente menguadas o que no las presente en absoluto no es un buen candidato. Hay otras caracter´ ısticas que, aunque deseables, son secundarias. Entre ellas tenemos, por ejemplo, su presencia en el ((mundo real)), aunque teniendo en cuenta que est´ fuertemente sometido al dominio de las modas y a la mercadotecnia. Hace a˜os, C reinaba absolutamente; al poco, irrumpi´ con n o fuerza C++; hoy parece que Java domina buena parte del mercado; y Microsoft se ha empe˜ado en que C# sea lo m´s. Pero, si examinamos el mundo de n a la peque˜a y mediana empresa, Visual Basic es el amo. Sin comentarios. En n cualquier caso, no perdamos de vista la creciente presencia de Perl y Python en el mundo de la programaci´n. El entorno LAMP (Linux-Apache-MySQLo Perl/PHP/Python) [4] ha introducido estos lenguajes en el curr´ ıculum de muchos programadores profesionales. Otra caracter´ ıstica deseable es la existencia de un rico conjunto de m´dulos o librer´ que facilite la programaci´n de ciertas o ıas o tareas: entrada/salida, funciones y constantes matem´ticas, expresiones regulaa res. . . y, por qu´ no, aplicaciones web, serializaci´n de objetos, comunicaci´n e o o entre ordenadores, interfaces gr´ficas, . . . Tambi´n resulta deseable que el entora e no de programaci´n est´ disponible en el mayor n´mero posible de plataformas o e u (incluso en las que no son libres, ya que un efecto secundario de este aspecto es que facilita la migraci´n de los estudiantes a la plataforma GNU/Linux; pero o eso es otra historia).

2.1.

Python como primer lenguaje

Aunque Python no goce a´n de amplia reconocimiento en el mundo acad´miu e co nacional, pretendemos demostrar en esta secci´n que puede compararse muy o favorablemente con los lenguajes adoptados en la mayor´ de universidades y ıa que, en consecuencia, este reconocimiento puede ser cuesti´n de tiempo. De heo cho, son varias las universidades extranjeras que ya han adoptado Python como parte de sus curr´ ıcula en inform´tica o como herramienta para la introducci´n a o a la programaci´n de no inform´ticos2 . o a La sintaxis de Python es extremadamente sencilla. Ilustremos esa sencillez con un ejemplo: el tradicional ((Hola, mundo.)) con el que se presentan muchos lenguajes de programaci´n. Un lenguaje como C obliga a incorporar la o cabecera de una biblioteca est´ndar, a definir una funci´n principal que devuela o ve un valor nulo (obligatorio en C99) y a codificar el salto de l´ ınea de una forma cr´ ıptica (al menos para una persona que no ha visto un programa en su vida):
#include <stdio.h>
2 Universidad de Irvine, California (EEUU); Wartburg College, Iowa (EEUU); Centre College, Kentucky (EEUU); Universidad de San Diego (EEUU); Universidad de Helsinki (Finlandia); Trinity College, Melbourne (Australia). . .

4

int main(void) { printf("Hola, mundo.\n"); return 0; }

¡Quince componentes l´xicos (sin contar la directiva del preprocesador)! La cosa e no mejora mucho en C++ (¡y eso sin entrar en la pol´mica de que cada a˜o, o e n casi, hay que escribir este programa ((can´nico)) de una forma diferente!): o
#include <iostream> int main(void) { std::cout << "Hola, mundo." << std::endl; }

Y en Java, resulta complicado hasta lo inveros´ ımil:
public class HolaMundo { public static void main(String [] args) { System.out.println("Hola, mundo."); } }

¿C´mo explicar a un estudiante que no ha visto un programa en su vida el o significado de cada uno de los t´rminos sin solicitar un acto de fe tras otro? e Python va directo al grano:
print ’Hola, mundo.’

Naturalmente, el programa ((Hola, mundo.)) no es determinante a la hora de escoger un lenguaje de programaci´n, pero s´ deber´ suscitar una seria refleo ı ıa xi´n acera de la excesiva e innecesaria complejidad a la que se somete a los o principiantes a la programaci´n. o No podemos desgranar todos los elementos que, a nuestro juicio, hacen de Python un lenguaje de sintaxis sencilla, pero s´ queremos destacar uno de ellos: ı los bloques se marcan con la indentaci´n del c´digo. He aqu´ un ejemplo o o ı de programa Python con bloques:
def f(x): return x**2 - 2*x - 2 def biseccion(a, b, epsilon): c = (a + b) / 2.0 while f(c) != 0 and b - a > epsilon: if f(a)*f(c) > 0: a = c elif f(b)*f(c) > 0: b = c c = (a + b) / 2.0 return c print ’x =’, biseccion(0.5, 3.5, 1e-10)

Como se puede comprobar, no hay terminadores de sentencia (como el punto y coma de C/C++/Java) ni marcas de inicio/fin de bloque (como las llaves de esos mismos lenguajes). La indentaci´n como forma de marcar bloques o 5

elimina errores propios de los lenguajes citados y que son frecuentes en los estudiantes (¡y tambi´n en programadores profesionales!): sentencias condicionales e sin acci´n por a˜adir un punto y coma incorrecto, bucles con una sola sentencia o n cuando el alumno cree que hay dos o m´s (por omisi´n de llaves con un sangraa o do inadecuado del programa), sentencias con sem´ntica ((alterada)) por usar una a coma cuando corresponde un punto y coma o por omitir un punto y coma al declarar un registro antes de una funci´n, etc. La indentaci´n s´lo resulta molesta o o o cuando el tama˜o de un bloque de cierta profundidad excede del tama˜o de la n n ventana del editor, pero ese caso no es frecuente en los programas de un curso introductorio. El entorno PythonG es un editor adaptado a la programaci´n o que elimina las incomodidades de iniciar manualmente cada l´ ınea con blancos o tabuladores3 . Un aspecto interesante de la indentaci´n forzosa es que disciplina o a los estudiantes en el sangrado correcto del c´digo en otros lenguajes de proo gramaci´n: hemos percibido que el c´digo C de nuestros estudiantes est´ mejor o o a indentado si empiezan aprendiendo Python. Python es un lenguaje interpretado. Los lenguajes interpretados permiten ciclos de desarrollo breves (edici´n y ejecuci´n) que animan a los estudiantes o o a experimentar. Python dispone de un entorno de ejecuci´n que ayuda a detectar o los errores (incluyendo aquellos que s´lo se manifiestan en ejecuci´n) se˜al´ndoo o n a los con mensajes muy informativos. Python ofrece, adem´s, un entorno interaca tivo con el que es posible efectuar peque˜as pruebas o dise˜ar incrementalmente n n las soluciones a los problemas. Nuestro curso sugiere empezar a programar usando el entorno interactivo de Python como una calculadora avanzada. He aqu´ un ı ejemplo de una breve sesi´n interactiva de trabajo: o
>>> 2 + 2 4 >>> from math import sin, pi >>> pi 3.1415926535897931 >>> for i in range(4): ... print i, sin(i*pi/4) ... 0 0.0 1 0.707106781187 2 1.0 3 0.707106781187

La contrapartida de que se trate de un lenguaje interpretado es, obviamente, la menor velocidad de ejecuci´n. No obstante, esta menor velocidad no resulo ta en absoluto importante para los programas propios de un primer curso de programaci´n. o Python puede considerarse pseudoc´digo ejecutable. Muchos cursos o de iniciaci´n a la programaci´n empiezan por presentar nociones b´sicas con o o a pseudoc´digo, es decir, con un lenguaje de programaci´n inexistente que aporta, o o eso s´ la flexibilidad suficiente para expresar c´modamente algoritmos. De este ı, o
es el unico editor adaptado a la sintaxis de Python. Editores como vim o Emacs/Xemacs ´ tambi´n est´n preparados para la edici´n de programas Python. El entorno IDLE, que se e a o distribuye con el int´rprete, tambi´n facilita el desarrollo de programas. e e
3 No

6

modo se evita tener que lidiar con la infinitud de detalles propios de lenguajes de programaci´n tradicionales. Pero Python es muy expresivo y su sintaxis sencilla o interfiere poco en la implementaci´n de algoritmos, as´ que resulta un buen o ı sustituto del pseudoc´digo, con la ventaja de que los algoritmos codificados en o Python s´ son ejecutables. ı Python es un lenguaje tipado din´micamente. Cada dato es de un tipo a determinado (a diferencia de otros lenguajes de script, como Tcl, en los que muchos tipos son, en el fondo, cadenas) y s´lo se puede operar con ´l de formas o e bien definidas. La ventaja es que no hay que declarar variables antes de su uso. Esto, que en ciertos ambientes se considera sacr´ ılego, resulta de gran ayuda para el que empieza a programar: las sutiles diferencias entre declaraci´n y definici´n, o o por ejemplo, se obvian en Python. Cuando el estudiante se ha acostumbrado a usar variables y ha comprendido el concepto de tipo de datos, puede transitar f´cilmente a C y entender con mayor facilidad las ventajas de la declaraci´n a o de variables en un lenguaje compilado. Curiosamente, quienes critican opciones como Python por no ser un lenguaje est´ticamente tipado aceptan de buen grado a opciones como C o C++, lenguajes en los que ((todo vale)) cuando se apunta a memoria. Esta caracter´ ıstica, que resulta util en la programaci´n de sistemas, se ´ o presta a enorme confusi´n en el principiante. No es que Python evite el trabajo o con punteros, al contrario, en Python toda la informaci´n se maneja v´ punteros o ıa (referencias a memoria), sino que la memoria apuntada mantiene informaci´n o de tipo sobre los datos almacenados, evitando problemas de acceso a ellos con tipos err´neos. o Hay una vertiente negativa en la no necesidad de declarar variables: los errores derivados de teclear incorrectamente identificadores de variables o de atributos de objetos. Si se comete un error al teclear el nombre de una variable o atributo en la parte izquierda de una asignaci´n, se crea una nueva variable. El o mismo problema, cuando ocurre en la parte derecha, es detectado por el entorno de ejecuci´n, as´ que no resulta tan grave. o ı Python facilita la detecci´n y gesti´n de errores mediante excepcioo o nes. Las excepciones forman parte ya de los lenguajes de programaci´n modero nos (Java las incorpor´ desde el principio y C++ lo ha hecho m´s recientemente) o a y eliminan la excesiva complejidad de la detecci´n y tratamiento de errores con o lenguajes de programaci´n que, como C, fuerzan a detectarlos con valores espeo ciales de retorno y que no ofrecen un modelo claro de interrupci´n de rutinas o para localizar su tratamiento en un solo punto. Python ofrece un rico conjunto de estructuras de datos flexibles. El tipo lista de Python (un vector din´mico heterog´neo) permite introducir con a e naturalidad el concepto de secuencia y presentar los algoritmos b´sicos de maa nejo de secuencias. Que la indexaci´n empiece siempre en 0 ayuda a dar el salto o a C, C++ o Java. El entorno de ejecuci´n proporciona comprobaci´n de validez o o de los ´ ındices, eliminando as´ una de las principales fuentes de problemas de C ı y C++. El hecho de que las listas sean redimensionables elimina al estudiante la necesidad de tomar decisiones acerca de la longitud m´xima de los vectoa res demasiado pronto. Es el camino que ha adoptado ultimamente C++ con la ´ STL (aunque, ¿alguien se atreve a presentar la STL en las primeras semanas de

7

formaci´n de un programador, con todas sus sutilezas y esa sintaxis endemoo niada?). Por otra parte, Python es un lenguaje muy ortogonal : una vez se ha aprendido a manejar listas, por ejemplo, se sabe manejar cadenas, ya que ambos tipos son secuenciales y presentan conjuntos de operadores con igual nombre y sem´ntica. Adem´s de listas y cadenas, Python ofrece tuplas (listas inmutables) a a y diccionarios (vectores asociativos). Python simplifica la gesti´n de memoria. El modelo de memoria de Pyto hon es sencillo: todo valor reside en el ((heap)) y toda variable contiene una referencia a su valor. A ello se suma un sistema de recogida autom´tica de a basura (garbage collection) que evita los punteros colgantes (dangling pointers), las fugas de memoria, las violaciones de segmento, etc. Estos errores de ejecuci´n, habituales en lenguajes como C o C++, son dif´ o ıciles de detectar y convierten el desarrollo de programas en una actividad m´s frustrante de lo que a es razonable, especialmente para el principiante. Python ofrece una ampl´ ısima colecci´n de m´dulos (bibliotecas). Hay o o m´dulos para cualquier actividad imaginable: escritura de CGI, gesti´n de correo o o electr´nico, desarrollo de interfaces gr´ficas de usuario, an´lisis de documentos o a a HTML o XML, acceso a bases de datos, trabajo con expresiones regulares, etc. No es que haya que presentar al estudiante todos estos m´dulos (no hay tiempo); o pero s´ es posible organizar actividades alrededor de la asignatura de programaı ci´n (seminarios, talleres,. . . ) que introduzcan diferentes campos de aplicaci´n. o o Acostumbrar al estudiante a consultar la documentaci´n de las bibliotecas diso ponibles desde bien temprano ayuda a hacer de ellos programadores eficientes. Una ventaja adicional de Python es, pues, que hace posible organizar seminarios sobre temas ((modernos)) y que alumnos de primer curso los sigan con aprovechamiento: CGI, an´lisis de texto con expresiones regulares, interfaces a gr´ficos de usuario, etc. a El mecanismo de paso de par´metros es unico. Los par´metros se pasan a ´ a a funciones y m´todos por referencia a objeto. En la pr´ctica, se comporta de e a forma similar al paso de par´metros de Java: el paso de objetos b´sicos (de tipo a a escalar) se realiza con efectos similares al paso por valor y el de objetos m´s a elaborados (vectores, diccionarios, instancias de clase, etc.) por referencia.
def parametros(a, lista): a += 1 lista.append(10) x = 1 l = [1,2,3] parametros(x, l) print ’x no se ha modificado:’, x print ’pero a l se le ha a~adido el elemento de valor 10:’, l n

Si bien el paso de par´metros de C es m´s flexible (incluye una forma de paso a a de par´metros por referencia basada en el paso por valor de un puntero), el a comportamiento por defecto con respecto al paso de variables de tipo b´sico y a vectorial es an´logo al de Python, haciendo sencilla la migraci´n. a o

8

Python es orientado a objetos. A diferencia de Java, Python permite una programaci´n puramente procedimental. La orientaci´n a objetos, aunque pero o fectamente soportada, es opcional (a menos, naturalmente, que se recurra a ciertos m´dulos en los que se definen clases). El soporte a la programaci´n orieno o tada a objetos es similar al de lenguajes como Smalltalk: la resoluci´n de los o nombres de m´todo y atributos es din´mica. Ello elimina la necesidad de come a plicadas jerarqu´ de herencia (aunque Python soporta la herencia m´ltiple), ıas u clases virtuales e interfaces. Cuestiones como el dise˜o de contenedores gen´ricos n e est´ tambi´n resuelta, pues el sistema de tipos din´mico ofrece la flexibilidad a e a suficiente.
class Pila: def __init__(self, n): # M´todo constructor. e self.index = -1 self.buffer = [None] * n def push(self, value): # Apila un elemento. if self.index >= len(self.buffer): raise "Error: Pila llena." self.index += 1 self.buffer[self.index] = value def top(self): # Consulta la cima de la pila. if self.index < 0: raise "Error: Pila vac´a." ı return self.buffer[self.index] def pop(self): # Extrae la cima de la pila. if self.index < 0: raise "Error: Pila vac´a." ı self.index -= 1 return self.buffer[self.index+1] p = Pila(5) p.push(3) p.push(2) print p.top() print p.pop() print p.pop()

(Hemos de decir que el primer a˜o que impartimos el curso incluimos un n tema de orientaci´n a objetos. Los resultados no fueron satisfactorios, quiz´ en o a buena medida porque la celeridad con que impartimos el temario de Python (un cuatrimestre) no permite alcanzar la madurez necesaria para asimilar los conceptos propios de esta metodolog´ En la actualidad explicamos los tipos de ıa. datos compuestos mediante registros.)

2.2.

C como segundo lenguaje

Aprender C una vez se sabe programar con otro lenguaje resulta m´s sencillo. a El estudiante ya conoce los conceptos fundamentales (tipo de dato, variable, bucle, selecci´n condicional, etc.) y tiene cierta soltura en el dise˜o de algoritmos. o n La introducci´n al nuevo lenguaje puede plantearse inicialmente en t´rminos de o e traducci´n de programas Python cuyo comportamiento es bien conocido por los o 9

estudiantes. El discurso sobre los abundantes detalles de C se puede plantear pues, en el marco de las abstracciones que ya conocen. Python permite introducir todos los conceptos con una sintaxis minimalista y preservando suficiente abstracci´n como para que los conceptos se aprendan en su esencia. El estudio o de C obliga a repasar todos estos conceptos y a examinarlos desde una ´ptica o ligeramente (a veces radicalmente) diferente. El resultado es una visi´n doble de o los conceptos y, por tanto, m´s s´lida. Una lista, por ejemplo, es una secuencia a o de elementos sobre la que es posible implementar ciertas operaciones. Esa es la esencia. C´mo se implementa en C (bien con punteros a bloques contiguos o de memoria din´mica, bien con registros enlazados) es una cuesti´n relacionada a o con las caracter´ ısticas propias del lenguaje.4 Haber aprendido Python ofrece la ventaja a˜adida de haber disciplinado al n estudiante en cuestiones elementales de legibilidad del c´digo, como ya hemos o apuntado antes. La indentaci´n, por ejemplo, es un concepto ya interiorizado. o Los tipos y estructuras de datos se presentan en C como versiones m´s pobres a de aquellas que ya conocen por Python: los vectores, por ejemplo, no presentan operaciones ((nativas)) como la concatenaci´n o el c´lculo de su longitud. Un ejero a cicio interesante es explotar estas limitaciones para proponer al estudiante que implemente operaciones y m´todos cuyo comportamiento conoce bien gracias a e Python (inversi´n, b´squeda, ordenaci´n, extracci´n de cortes, etc.). o u o o Habr´ quien piense que impartir dos lenguajes de programaci´n en primer a o curso ha de hacerse, necesariamente, en detrimento de la cantidad de conceptos aprendidos. No es as´ El temario propuesto considera todos los aspectos releı. vantes de un primer curso de programaci´n: tipos de datos, estructuras secueno ciales, estructuras de control, funciones, ficheros y una introducci´n al an´lisis o a de algoritmos. Ense˜ar dos lenguajes de programaci´n tiene una ventaja a˜adida: acostumn o n bra al estudiante a una realidad con la que se ha de enfrentar: la diversidad de herramientas que deben formar parte de su ((banco de trabajo)). ¿Se concibe un programador eficaz que use un s´lo lenguaje de programaci´n? ¿Se es produco o tivo desarrollando software s´lo en C? Cada problema demanda una forma de o trabajo y cada herramienta se adapta a un tipo de problema.

3.

El entorno PythonG

Como material de apoyo al curso hemos desarrollado un entorno de programaci´n para Python: PythonG. El objetivo fundamental es ofrecer un entorno o sencillo y c´modo de usar. PythonG [5] (ver figura 1) incluye un editor de texto o dirigido por la sintaxis (coloreado autom´tico, sugerencia autom´tica de indena a taci´n), una consola de entrada salida, un int´rprete interactivo, un terminal de o e salida gr´fica (con rutinas de acceso a teclado y rat´n) y un depurador muy sena o cillo. El entorno de distribuye con licencia GPL y est´ accesible en la direcci´n a o http://marmota.act.uji.es/MTP. El editor de texto tom´ como punto de partida el que ofrec´ el entorno IDLE. o ıa Se ha procurado emular el comportamiento de Emacs/XEmacs: las combinaciones de teclado para las acciones b´sicas de edici´n son las mismas (aunque se a o han a˜adido algunas que los estudiantes echaban en falta, como las comunes n
4 No decimos que d´ igual hacerlo de un modo u otro. En el mismo curso, m´s adelante, se e a ense˜ a al estudiante a escoger en funci´n del coste computacional de cada opci´n. n o o

10

en operaciones de cortar/copiar/pegar). De este modo facilitamos al estudiante la transici´n, durante el segundo semestre, al editor que usamos en las sesiones o pr´cticas: XEmacs. a PythonG es multiplataforma, al igual que el entorno est´ndar de Python, a pues utiliza la biblioteca est´ndar para dise˜o de interfaces, Tkinter (un rea n cubrimiento de la biblioteca Tk). El estudiante puede descargar el software e instalarlo f´cilmente en cualquier distribuci´n de Linux o cualquier otro sistemas a o operativo en el que corra el int´rprete de Python. e Una caracter´ ıstica rese˜able y que hace atractivas las pr´cticas es el acceso n a que facilita a funciones gr´ficas b´sicas y de interacci´n con teclado y rat´n. a a o o De este modo los estudiantes pueden empezar, desde bien temprano, a dise˜ar n programas con salida gr´fica y cierto nivel de interacci´n sin la necesidad de a o aprender antes Programaci´n Orientada a Objetos y alg´n marco conceptual o u excesivamente sofisticado. Creemos que estas posibilidades son muy motivadoras para los estudiantes: el profesorado est´ acostumbrado a interactuar con a su software a trav´s de la consola o la l´ e ınea de comandos, pero la imagen que tienen los estudiantes del ordenador es fundamentalmente gr´fica, as´ que suea ı len mostrar aversi´n por los programas de consola y una cierta inclinaci´n por o o los programas gr´ficos. Orientar un curso entero a programas de consola es, en a opini´n de muchos estudiantes, frustrante. En los dos ultimos cursos, los estuo ´ diantes han podido mejorar su calificaci´n final realizando trabajos voluntarios o atractivos: un juego interactivo donde unos robots dan caza a un personaje (una versi´n de Daleks), un m´dulo para trazar gr´ficos de tortuga (similar a la funo o a cionalidad del lenguaje Logo), una versi´n completa de Tetris (ver figura 2) y o un rompecabezas con Pentominos. (Los enunciados est´n accesibles en la p´gina a a web rese˜ada m´s arriba). n a
Siguiente:

Puntos: Velocidad:
Records: pepe juan pepe 51 58 58

5 9

Figura 2: Pantalla del juego de Tetris que implementan los estudiantes en el entorno PythonG.

Las funciones gr´ficas y de acceso a teclado y rat´n est´n disponibles en un a o a m´dulo independiente, de modo que los programas desarrollados no necesitan o ejecutarse desde el entorno de programaci´n. Es posible, pues, implementar o programas portables con salida gr´fica sencilla. a El entorno ofrece un modo de depuraci´n simplificado (figura 4). Cuando se o activa, se muestra la l´ ınea actual destacada con fondo azul. Una botonera da acceso a las acciones b´sicas de control de flujo: ejecuci´n paso a paso, ejecuci´n a o o

11

(a)

(b)

(c)

(d)

(e)

(f)

(g)

(h)

Figura 3: Salida de los programas de demostraci´n que acompa˜an al entoro n no PythonG. (a) Ilustraci´n de las posibilidades gr´ficas. (b) Una simulaci´n o a o gravitacional con tres cuerpos. (c) Un programa de visualizaci´n en 3D con o ocultaci´n de caras. (d) Una demostraci´n de la capacidad para mover (gruo o pos de) objetos. (e) Una animaci´n. (f) Un programa para dibujar figuras con o engranajes. (g) y (h) Demostraciones de interacci´n con entrada de rat´n. o o

Figura 4: Modo de depuraci´n del entorno PythonG. o

12

continua hasta la l´ ınea del cursor (que act´a como ((breakpoint))), ejecuci´n u o hasta fin de funci´n, reinicio de la ejecuci´n, etc. Bajo la ventana de edici´n se o o o muestran las variables locales y globales en un instante dado y bajo la consola se muestra el estado de la pila de llamadas a funci´n. o

4.

Un libro de texto

Uno de los problemas con que se enfrenta el profesorado que opta por usar Python como primer lenguaje de programaci´n es la relativa ausencia de libros o de texto adecuados. La bibliograf´ sobre Python no cesa de crecer y se cuenıa ta ya con algunos libros de introducci´n a la programaci´n. Podemos destacar o o tres: ((Python Programming: An Introduction to Computer Science)) [6] (borrador disponible en web y pendiente de publicaci´n como libro); ((How to Think o Like a Computer Scientist: Learning with Python)) [2]; y ((Learn to Program Using Python)) [3]. Otros libros sobre Python suelen incluir una introducci´n o r´pida al lenguaje, pero asumen conocimientos de programaci´n y/o resultan a o excesivamente breves para un curso como el propuesto. A estas monograf´ se suma la que hemos escrito como material para claıas ses de teor´ y problemas. Se trata de un libro de texto en castellano con una ıa aproximaci´n ligeramente diferente de las seguidas en estos tres libros. El libro, o titulado ((Introducci´n a la programaci´n. Volumen I: Python)) [6], disponible o o gratuitamente en la web (para autodidactas e instituciones p´blicas de ense˜anu n za), no tiene por objeto presentar la totalidad del lenguaje de programaci´n o Python, sino ense˜ar al estudiante los conceptos b´sicos de la programaci´n y n a o las estrategias seguidas al desarrollar los programas propios de un primer curso. Se asume que el lector no tiene conocimiento alguno de programaci´n y el nivel o de matem´ticas necesario para seguir el discurso es el propio de la educaci´n a o secundaria. Tras una breve introducci´n a los computadores y la programaci´n o o en general, se presenta a los estudiantes el entorno interactivo de Python. Con la excusa de su utilizaci´n como calculadora avanzada, se introducen las expreo siones y los tipos de datos b´sicos (entero, flotante y cadena), as´ como algunas a ı funciones de la biblioteca matem´tica. El siguiente cap´ a ıtulo presenta el concepto de programa y las funciones de entrada salida, a la vez que incluye un breve tutorial del entorno PythonG. El siguiente cap´ ıtulo se dedica a presentar las estructuras de control (selecci´n condicional y bucle). El estudiante pasa entonces o a estudiar listas (en realidad, vectores din´micos) y a dise˜ar algoritmos que a n manejan secuencias de datos. El dise˜o de funciones se aprende a continuaci´n. n o El siguiente cap´ ıtulo presenta registros5 . El ultimo cap´ ´ ıtulo se dedica al manejo de ficheros. La pr´xima edici´n incorporar´ cap´ o o a ıtulos dedicados al manejo de diccionarios, la programaci´n orientada a objetos y un ap´ndice dedicado al o e dise˜o de interfaces gr´ficas. Aunque no hay tiempo material para impartir el n a material adicional en el curso actual, estos nuevos cap´ ıtulos dotar´n de cierta a completitud al libro como material de aprendizaje de Python. El libro est´ plagado de ejemplos completamente desarrollados y que, en a ocasiones, se presentan siguiendo los caminos equivocados que suelen tomar los estudiantes y que conocemos gracias a la experiencia docente de varios a˜os. n El objetivo es, precisamente, reflexionar sobre la naturaleza de los errores que
5 Python no proporciona soporte nativo para registros, sino para clases e instancias, as´ que ı los registros se implementan con un m´dulo extra. o

13

suelen cometer. Se han incluido numerosos cuadros flotantes con informaci´n o adicional que profundizan en determinados aspectos o que pueden despertar la curiosidad del estudiante por materias que guardan cierta relaci´n con los o asuntos tratados en el cuerpo del texto. En la ultima edici´n, los programas ´ o est´n apuntados por enlaces desde el documento PDF para facilitar las pruebas a y evitar, en la medida de lo posible, erratas en el c´digo presentado. o A lo largo del texto, e intercalados con las explicaciones, se proponen cerca de 480 ejercicios que van desde preguntas simples para constatar que se ha asimilado lo expuesto, a peque˜as aplicaciones o sencillos videojuegos que hacen n necesario combinar lo aprendido en diferentes cap´ ıtulos. Con el fin de hacer m´s amena su lectura y estimular la curiosidad de algunos estudiantes, el libro a se acompa˜a de numerosas digresiones que abordan cuestiones muy dispares n relacionadas con el mundo de la programaci´n. o En 2002 se liber´ en la red una primera versi´n del libro que tuvo muy o o buena acogida, tanto por estudiantes universitarios y autodidactas espa˜oles n como latinoamericanos.

5.

Conclusiones

Algunas universidades norteamericanas han empezado a adoptar Python como lenguaje de programaci´n b´sico. En Espa˜a, de momento, ya hay una o a n experiencia piloto: la Universidad Jaume I. Durante los cursos 2001/2002 y 2002/2003 se ha puesto en pr´ctica la ense˜anza de la programaci´n con Pyta n o hon y C. Creemos que Python es un lenguaje particularmente adecuado como primer lenguaje de programaci´n. Uno de los resultados de la experiencia es el o material docente confeccionado: un sencillo entorno de programaci´n, una bio blioteca simplificada para la implementaci´n de programas gr´ficos y un libro o a de texto. El material se encuentra disponible en Internet y puede utilizarse para el aprendizaje autodidacta de la programaci´n. o La experiencia docente ha sido muy satisfactoria. En un breve plazo de tiempo (un cuatrimestre), los estudiantes aprenden todos lo aspectos b´sicos de la a programaci´n. Completamos su formaci´n b´sica en la materia con la ense˜anza o o a n del lenguaje C en el segundo semestre. La formaci´n previa con Python es de o gran ayuda para asimilar el nuevo lenguaje y entender las cuestiones t´cnicas e que determinan ciertas cuestiones de dise˜o de C. n

Referencias
[1] Abelson, H., Sussman, G. J. and Sussman, J.: Structure and Interpretation of Computer Programs, Segunda edici´n, 1996, MIT Press/McGraw-Hill. o [2] Allen Downey, Jeff Elkner and Chris Meyers: How to Think Like a Computer Scientist: Learning with Python. Green Tea Press. ISBN: 0971677506. http://www.ibiblio.org/obp/thinkCSpy/dist/thinkCSpy.pdf. [3] Alan Gauld: Learn to Program Using Python: A Tutorial for Hobbyists, Self-Starters, and All Who Want to Learn the Art of Computer Programming. Addison-Wesley. ISBN: 0201709384.

14

[4] LAMP: The Open Source Web Platform. http://www.onlamp.com. O’Reilly & Associates. [5] David Llorens, http://www3.uji.es/~dllorens/PythonG/. [6] Andr´s Marzal e Isabel Gracia: Introducci´n a la programaci´n. Volumen I: e o o Python. Colecci´n ((Materials)), 147, Servei de Publicacions de la Universitat o Jaume I. Disponible en http://marmota.act.uji.es/MTP. [6] John Zelle: Python Programming: An Introduction to Computer Science. Pendiente de publicaci´n. Borrador del libro disponible en o http://mcsp.wartburg.edu/zelle/python.

15

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.