Academia.eduAcademia.edu

Python a través de Ejemplos

2010, Python elemental

RESUMEN La complejidad de los problemas actuales no tie-ne por qué incrementar la complejidad de las herra-mientas utilizadas para resolverlos. Esta es la filo-sofía fundamental de un novedoso lenguaje de pro-gramación llamado Python. En este artículo veremos muchos ejemplos de sesiones y programas escritos en Python, que ilustrarán las más relevantes carac-terísticas de este lenguaje de programación. Cono-ceremos también, simultáneamente, algunas de sus más importantes aplicaciones. Palabras clave: Python, Pygame, pyOpenGL, programación.

Python a través de Ejemplos Manuel Hernández Gutiérrez* RESUMEN La complejidad de los problemas actuales no tiene por qué incrementar la complejidad de las herramientas utilizadas para resolverlos. Esta es la filosofı́a fundamental de un novedoso lenguaje de programación llamado Python. En este artı́culo veremos muchos ejemplos de sesiones y programas escritos en Python, que ilustrarán las más relevantes caracterı́sticas de este lenguaje de programación. Conoceremos también, simultáneamente, algunas de sus más importantes aplicaciones. Palabras clave: Python, Pygame, pyOpenGL, programación. 1. INTRODUCCIÓN Python (pronunciado, aproximadamente, como ”paidon”) es un lenguaje de programación diseñado con la idea de que sea fácil de programarlo. Actualmente, Python es un lenguaje ya presente de fábrica en muchas computadoras, con facilidades interactivas y gráficas, y con abundantes bibliotecas. Enseñar Python en lo básico y algunas de sus más relevantes aplicaciones es el objetivo de este escrito. Este lenguaje de programación de no es de juguete ni experimental: su uso está actualmente extendido ya que viene como parte de las herramientas estándar de Linux, y es utilizado por empresas tales como Google y Facebook, e instituciones tales como la NASA. Al aprenderlo, tenemos la oportunidad de conocer un lenguaje de programación realista, interactivo, fácil de aprender y, sobre todo, divertido. La implementación oficial del lenguaje puede ser adquirida libremente en www.python.org. El procedimiento de instalación varı́a para cada sistema operativo, pero normalmente vienen las explicaciones de instalación junto con el paquete descargado. En Windows basta ejecutar el archivo obtenido o bien dar doble click sobre este archivo. Algunas empresas * Profesor-Investigador, Universidad Tecnológica de la Mixteca. como ActiveState tienen implementaciones de Python con ambientes de desarrollo integrado (IDEs, por las siglas en inglés de Integrated Development Environments) y que facilitan enormemente el manejo de grandes proyectos. 2. SESIONES Y PROGRAMAS Python es ejecutado con el icono respectivo en Windows o bien escribiendo python en una consola de Linux. (De no activarse el intérprete es necesario revisar la instalación o hallar dónde está ubicado el archivo ejecutable de Python.) En los ejemplos que siguen utilizaremos la versión 2.6 de Python, aunque lo mejor es practicar con las versiones 3.x, más actuales y no necesariamente compatibles con las versiones previas. (Esta falta de compatibilidad es a propósito, para permitir que el lenguaje evolucione.) Una vez activado, Python está listo para trabajar en modo interactivo: el intérprete ejecuta los programas o evalúa las expresiones que el usuario provea. Esto origina una sesión, que es un diálogo que se mantiene entre el intérprete y el usuario. Por ejemplo, tenemos la siguiente sesión: Material de Python 2.1 1 2 >>> 2*3+5 11 Ahora veamos más detalles de Python, tales como variables, asignamiento destructivo, listas y construcciones estándar del lenguaje. Una variable en Python es un identificador, y un identificador es una palabra usual del alfabeto inglés, sin sı́mbolos raros (aunque debemos vigilar que no utilicemos identificadores predefinidos). Para escribir expresiones aritméticas, por ejemplo, tendremos a nuestro disposición operadores aritméticos escritos en notación infija usual. Python tiene asignamiento destructivo: Material de Python 2.2 1 2 3 4 5 6 >>> >>> 2 >>> >>> 6 a=2 print a a=3*2 print a Python tiene muchas caracterı́sticas de manejo automático de memoria, lo que facilita enormemente la escritura de programas; por ejemplo, consideremos el caso de las listas. Las listas son estructuras dinámicas que liberan al programador de la tarea de realizar explı́citamente la asignación y la liberación de memoria, pues ambas actividades son causa frecuente de errores de programación. Las siguientes son listas de 4 elementos, la primera con números del 1 al 4, consecutivamente, y la segunda lista con los caracteres ’a’, ’b’, ’c’ y ’d’: Material de Python 2.3 Las listas ls y ms son ejemplos de datos compuestos. Con cada dato podemos tener asociado un conjunto de operaciones o métodos para manipular o procesar este dato. En ocasiones existe una sobrecarga de operadores: operadores comunes, como el + que es utilizado para la suma, también pueden servirnos para realizar operaciones sobre otros tipos de operandos. También es posible acceder a algunos elementos de una lista por un procedimiento más genérico que al de los arreglos convencionales. Por ejemplo, al manipular cadenas podemos utilizar algunos operadores con sobrecarga y con el acceso extendido: Material de Python 2.6 1 2 3 4 5 6 7 8 9 1 2 >>> ls=[1,2,3,4] >>> ms=[’a’,’b’,’c’,’d’] Sin asignamiento destructivo explı́cito, y por medio de métodos (concepto que retomaremos más adelante), podemos agregar un elemento al final de la lista: Material de Python 2.4 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6 >>> ls.append(5) >>> ls [1, 2, 3, 4, 5] >>> ms.append(’e’) >>> ms [’a’,’b’,’c’,’d’,’e’] o podemos invertir el orden de los elementos: 19 20 Como vemos, los comentarios en Python pueden escribirse con el sı́mbolo # antepuesto a cada comentario en una lı́nea. La sobrecarga es también válida sobre listas: Material de Python 2.7 Material de Python 2.5 1 1 2 3 4 >>> ls.reverse() [5, 4, 3, 2, 1] >>> ms.reverse() [’e’,’d’,’c’,’b’,’a’] >>> s="Hola" #Comentario en Python >>> s+s ’HolaHola’ >>> 3*s ’HolaHolaHola’ >>> (3*s)[2:6] #s[0] es el primer elemento #de la cadena s. ’laHo’ >>> s[2:] ’la’ >>> s[:2] ’Ho’ >>> s[1:2] ’o’ >>> list(s) #Una cadena puede transformarse #en una lista. [’H’, ’o’, ’l’, ’a’] 2 3 4 5 6 >>> ms,ns=[1,2,3],[3,2] #Asignamiento simultáneo o múltiple. >>> ms+ns [1,2,3,3,2] >>> 2*ms [1,2,3,1,2,3] 7 8 9 10 11 12 13 14 15 16 17 18 19 >>> >>> [1, >>> [1, >>> [1, >>> [2, >>> 2 >>> 3 ns=2*ms ns 2, 3, 1, 2, 3] ns[3:5] 2] ns[0:3] 2, 3] ns[4:] 3] ns[-2] ms[-1] Aquı́, hemos ilustrado también el asignamiento múltiple: a,b=n1,n2 asigna el valor n1 a a y el valor n2 a b simultáneamente. El ciclo for es ilustrado junto con una lista como sigue: Material de Python 2.8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 >>> for i in ms: ... print i*i ... 1 4 9 >>> for i in range(4): #range es una función #interconstruida. ... print(i,i*i) ... (0, 0) (1, 1) (2, 4) (3, 9) >>> ls=[] >>> ls=[[1,2],[1,3]] >>> ls [[1, 2], [1, 3]] >>> ls[1][1]=0 #Asignación mediante dobles ı́ndices >>> ls [[1, 2], [1, 0]] >>> for i in range(2): #O bien, sistemático. ... for j in range(2): ... ls[i][j]=0 28 29 30 ... >>> ls [[0, 0], [0, 0]] Los puntos ... en la lı́nea 2 de esta sesión aparecen después de teclear un tabulador (la tecla Tab). La utilización de espacios y tabuladores es necesario, pues Python, en aras de minimizar la utilización de identificadores y, en general, de escritura de caracteres, basa el inicio y fin de bloques vı́a sangrado, en donde un bloque es una construcción de Python completa. A mayor profundidad de indentación, mayor anidamiento de las expresiones dentro de un bloque. Los segundos puntos en la lı́nea 3 ocurren después de presionar la tecla de retorno de carro (la tecla Return). Con esto el usuario señala que Python deberı́a ejecutar los comandos introducidos hasta ese momento. El resultado aparece en las lı́neas 4, 5 y 6, que son los cuadrados de los números de la lista. Notemos que no tenemos que definir previamente a los identificadores i o j en el código anterior. También es posible utilizar otras estructuras de control, tales como el while: Material de Python 2.9 1 2 3 4 5 6 7 8 >>> i=0 >>> while (i<3): ... print i ... i=i+1 ... 0 1 2 Para construir una lista de los cuadrados de los números de otra lista podrı́amos hacer lo siguiente: Material de Python 2.10 1 2 3 4 5 6 7 >>> ts=[] >>> ms=[1,2,3,4] >>> for i in ms: ... ts.append(i*i) ... >>> ts [1,4,9,16] Otra forma para construir tal lista serı́a como sigue: Material de Python 2.11 1 2 >>> [i*i for i in ms] [1,4,9,16] Esta es una utilización de una construcción de Python llamada listas compactas (comprehension lists, en inglés). Veremos más detalles de esto un poco más adelante. 3. PROGRAMAS Y MÓDULOS ser de dos tipos: declaraciones de clases y declaraciones de funciones. Ambos tipos de declaraciones pueden escribirse en un mismo archivo. Concentrémonos en declaraciones de funciones, ya que explicaremos posteriormente las declaraciones de clases. En el archivo fbasicas.py vamos a declarar tres funciones básicas que permiten calcular en forma recursiva la función de Fibonacci, la función factorial , y la suma de una lista de enteros. Ahora ejemplificamos cinco aspectos fundamentales de Python: 1. Cómo definir funciones mediante la palabra reservada def; Un programa de Python es un texto que puede utilizarse para ejecución independiente o como parte de un módulo. Cuando es utilizado para ejecución independiente en un ambiente Linux, su primer renglón debe constar de la lı́nea #!/usr/bin/python y tener los modos y permisos apropiados para ejecución. Por ejemplo, el siguiente programa (archivo de texto) cuadrados.py. 2. la utilización de las construcciones condicionales if, y sus subpartes elif y else; 3. la forma en que Python devuelve valores mediante la palabra reservada return; 4. el concepto de sangrado (o indentado) para estructurar el código sin una profusión de caracteres; y, Material de Python 3.1 1 2 3 #! /usr/bin/python for i in range(1,11): print(i*i) puede ejecutarse en Linux ası́: my@machine:oso$ python cuadrados.py o bien como ./cuadrados.py si estamos en el mismo directorio que el archivo cuadrados.py o bien simplemente como cuadrados.py si este archivo está ubicado dentro de una las trayectorias de ejecución de programas (ver manual del sistema operativo en uso). En la lı́nea de comandos python cuadrados.py también ejecutará el programa cuadrados.py. Cuando el programa es utilizado como un módulo es posible integrarlo a nuestras sesiones con la directiva import: Material de Python 3.2 5. la recursión (cuando una función se llama a sı́ misma). Material de Python 3.3 1 2 3 4 5 6 7 9 10 11 12 13 1 2 3 4 5 >>> import cuadrados 1 4 ... 100 def fact(n): if n==0: return 1 else: return n*fact(n-1) La siguiente es una sesión donde se utiliza este programa: Material de Python 3.4 1 En este caso, es deseable que archivo a ser importado consista de declaraciones. Las declaraciones pueden def fib(n): if n==0: return 1 elif n==1: return 1 elif (n>1): return fib(n-1)+fib(n-2) 2 3 >>> import fbasicas >>> fbasicas.fib(3) #Es necesario para este caso 4 5 6 7 8 9 10 11 12 13 14 #prefijar las llamadas de las #funciones con el nombre del archivo. 3 >>> fbasicas.fib(5) 8 >>> [fbasicas.fib(i) ... for i in range(1,10)] [1, 2, 3, 5, 8, 13, 21, 34, 55] >>> [fbasicas.fact(i) ... for i in range(1,6)] [1, 2, 6, 24, 120] Notemos que para ejecutar las funciones de fbasicas.py es necesario poner como prefijo el nombre del archivo a cada función, y enseguida un punto y el nombre de la función. Esta es una técnica que nos permite definir con un mismo nombre diversas funciones en distintos módulos y resolver qué función utilizar anteponiendo el nombre del archivo en donde están definidas tales funciones. En un mismo archivo, sin embargo, está prohibido definir diversas funciones con un mismo nombre. En caso de tener seguridad de que no existen más nombres de funciones que aquellos definidos en un archivo especı́fico, podemos omitir el prefijo del nombre del archivo como indica la siguiente sesión: Material de Python 3.5 1 2 3 4 5 6 7 8 9 >>> from fbasicas import * >>> fact(3) 6 >>> fact(7) 5040 >>> fib(6) 13 >>> fib(5) 8 Los módulos son muy importantes en Python debido a que permiten reutilizar el código escrito por otras personas y, en su caso, compartir código con otras personas. Python anima a los programadores a que escriban un código que sea legible y autoexplicativo y, en consecuencia, es posible aprender mucho al leer programas en Python. Una manera de realizar limpiamente la reutilización y la distribución de código es por medio de la programación orientada a objetos. De momento, en la próxima Sección veremos otra herramienta adaptada a Python que permite escribir programas con claridad y concisión. 4. PROGRAMACIÓN FUNCIONAL EN PYTHON La programación funcional es un estilo de programación basado en el concepto matemático de función: Una función f relaciona un elemento a de un conjunto llamado dominio A con un único elemento, digamos b, de otro conjunto B, llamado codominio: f :A→B a 7→ f (a) o bien a 7→ b Esta asociación se lleva a cabo por medio de una regla de correspondencia. Además, para el caso de la programación funcional, la obtención del elemento b es factible computacionalmente. Como parte de las técnicas de la programación funcional, las funciones pueden tomar como argumentos a otras funciones, y esta técnica de programación funcional se llama programación funcional de alto orden. Como ejemplo e introducción de este tipo de programación, tenemos la utilización de filter . En este ejemplo, todos los enteros que van del 1 al 24 y que son múltiplos de 2 y de 3 son eliminados: Material de Python 4.1 1 2 3 4 5 >>> def f(x): return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23] En el siguiente ejemplo, definimos una función dentro de una sesión, e inmediatamente la utilizamos junto con la función de alto orden map, una función que aplica a su vez otra función a cada uno de los elementos de una lista, y que nos devuelve la lista con los elementos transformados: Material de Python 4.2 1 2 3 >>> def cube(x): return x*x*x ... >>> map(cube, range(1, 7)) 4 [1, 8, 27, 64, 125, 216] El siguiente ejemplo ilustra la utilización de otra función de alto orden llamada reduce, la cual toma como primer argumento una función f (que debe a su vez tener dos argumentos) y como segundo argumento una lista ls, y devuelve la aplicación sistemática de la definición de f sobre los elementos de la lista ls. Por ejemplo, consideremos la sesión siguiente: Material de Python 4.3 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 >>> def add(x,y):return x+y ... >>> reduce(add,[1,2,3]) #suma los elementos de una lista 6 >>> reduce(add,[1,2,3,4]) 10 >>> reduce(add,[2,3,6,7]) 18 Para un desglose (o desdoblado) de reduce tendrı́amos que reduce(add,[1,2,3,4]) tiene el mismo valor que add(add(add(1,2),3),4) Ambas expresiones producen el valor 10. En la sesión al escribir el comando help(reduce) recibiremos una ayuda básica de reduce. Los casos anómalos serı́an si la lista tiene sólo un elemento o es vacı́a. Cuando sólo existe un elemento en la lista reduce(add,[x]) se reduce a x mismo y si la lista es vacı́a obtenemos un error. En la siguiente sesión, observamos nuevamente la utilización de filter y map, además de ilustrar la idea de funciones anónimas o que carecen de nombre mediante la palabra reservada lambda: 21 22 23 24 25 26 27 28 29 Finalmente, replanteamos el concepto de lista compacta con diversos ejemplos: Material de Python 4.5 1 2 3 4 5 6 7 8 9 10 Material de Python 4.4 11 12 1 2 3 4 5 6 7 8 >>> def mul(x,y): return x*y ... >>> reduce(mul,range(1,5)) #¡El factorial de 4! 24 >>> reduce(mul,range(1,6)) #¡El factorial de 5! 120 >>> map(lambda x:x*x,[1,2,3,4]) [1, 4, 9, 16] >>> map(lambda x,y:(x*x,y),\ [1,2,3,4],[1,2,3,4]) [(1, 1), (4, 2), \ (9, 3), (16, 4)] >>> def sum(x,y): return x+y ... >>> def sq(x): return x*x ... >>> def sum_sq(ls): return\ reduce(sum,map(sq,ls)) #Composición de funciones: #Esta función calcula la suma #de los cuadrados #de los elementos de #una lista de números. ... >>> sum_sq([1,2,3,4]) 30 13 14 15 16 17 18 >>> vec=range(1,5) >>> [[x,x**2] for x in vec] [[1, 1], [2, 4], [3, 9], [4, 16]] >>> ms=range(1,10) >>> ms range(1, 10) >>> list(ms) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> [(x,x*x) for x in range(1,10)] [(1, 1), (2, 4), (3, 9),\ (4, 16), (5, 25),\ (6, 36), (7, 49), (8, 64), (9, 81)] >>> [(x,x*x) for x in range(1,10)\ if x<5] [(1, 1), (2, 4), (3, 9), (4, 16)] >>> [(x,x*x) for x in range(1,10)\ if x %2==0] [(2, 4), (4, 16), (6, 36), (8, 64)] 5. PROGRAMACIÓN ORIENTADA A OBJETOS La programación orientada a objetos es un método de programación basado en la noción de clases que, esencialmente, constan de datos y operaciones realizadas con estos datos por medio de métodos. Debido a sus cualidades de reutilización y programación colaborativa, la programación orientada a objetos es altamente exitosa en la actualidad, siendo su representante práctico más conocido el lenguaje de programación Java. Pero Python no se quedá atrás en este aspecto, y para muestra un pequeño botón. El siguiente segmento de código incorpora la ideas de clases, datos y métodos. Material de Python 5.1 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #archivo complex.py from math import * class Com: """Numeros complejos""" """inicializados""" """y metodos asociados.""" def __init__(self,u,v): self.re=u self.im=v def norm(self): return\ sqrt(self.im**2+self.re**2) def real(self): return self.re def imag(self): return self.im A continuación ejemplificamos la utilización de esta clase: Material de Python 5.2 1 2 3 4 5 6 7 8 9 >>> import complex >>> c1=complex.Com(1,2) #Llamada cualificada: >>> c2=complex.Com(0,4) #tiene como prefijo el #módulo donde #fue definida la clase >>> c1.real() #Parte real de c1 10 11 12 13 14 15 16 17 18 19 20 21 1 >>> c1.imag() #Parte imaginaria de c2 2 >>> c2.real() 0 >>> c2.imag() 4 >>> c1.norm() #Norma de c1 2.2360679774997898 >>> c2.norm() #Norma de c2 4.0 En Python, algunos datos que son altamente útiles ya de por sı́ tienen asociados métodos especı́ficos. Por ejemplo, considere el caso de las listas. Algunos métodos asociados al tipo de datos listas son pop, append y reverse. En este segmento de sesión vemos cómo una lista es manipulada en varias formas por sus métodos: Material de Python 5.3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 >>> >>> [0, >>> >>> [4, >>> 0 >>> [4, >>> >>> [4, >>> >>> [3, ls=range(0,5) ls 1, 2, 3, 4] ls.reverse() ls 3, 2, 1, 0] ls.pop() ls 3, 2, 1] ls.append(3) ls 3, 2, 1, 3] ls.reverse() ls 1, 2, 3, 4] En ls.reverse() la cadena (string) ha cambiado: ahora ls es la inversa de la lista original. Tales datos son mutables. Es posible tener métodos sobre datos inmutables. Por ejemplo: Material de Python 5.4 1 2 3 >>> ls="abc" >>> ls.upper() ’ABC’ 4 5 6 7 8 9 10 11 12 13 14 15 16 >>> ls.lower() ’abc’ >>> ls #l no cambió ’abc’ >>> ls=ls.upper() #si queremos conservar la cadena #transformada, debemos asignarla #explı́citamente >>> ls #Ahora l ha cambiado ’ABC’ >>> ls.reverse() #originará un error: l como cadena #no es mutable 15 16 17 18 19 20 21 22 23 24 25 26 27 28 6. GRÁFICOS CON TORTUGA El aspecto de las facilidades de graficación que un lenguaje nos provee jamás debe minimizarse, pues nuestro sentido de la vista es un gran medio para obtener información del mundo. En Python es posible realizar gráficos con tortuga (los detalles para utilizar la tortuga varı́an de instalación a instalación de Python y, en todo caso, nos aseguramos del funcionamiento de este ejemplo obteniendo la biblioteca python-tk): una pequeña tortuga idealizada que al moverse de forma animada deja un rastro con su cuerpo (como si se moviera sobre un suelo de arena) y que, junto con otros comandos, nos permite dibujar de forma sencilla y amena utilizando toda la potencia de programación de Python. En el siguiente programa mostramos algunas órdenes asociadas con la tortuga. Material de Python 6.1 1 2 3 4 #!/usr/bin/python # Probado con Python 2.6, 3.0 y 3.1 from turtle import * import time 29 30 31 32 34 35 36 37 38 39 40 7 8 9 10 11 12 13 14 # la tortuga está en (x=0,y=0) color("green") # levantamos el lápiz de la tortuga... up() # y nos movemos hacia cierta posición goto(0,-50) # bajamos el lápiz... down() # y dibujamos un cı́rculo de radio=50 up() goto(-150,-120) color("red") write("Done!") # esperamos 15 segundos... # para admirar nuestra obra de arte. time.sleep(15) El dibujo resultante es mostrado en la parte izquierda de la Fig. 1. Es posible dibujar otras figuras con cambios mı́nimos sobre el código propuesto. Por ejemplo, ya sin tanto comentario, tendrı́amos que al cambiar las lı́neas 24 a la 32 del Material de Python [6.1] por: Material de Python 6.2 1 2 3 6 circle(50) up() # centramos la tortuga otra vez: goto(0,0) # bajamos el lápiz otra vez: down() # utilizamos el lápiz azul, y # ponemos algunos cuadros: color("blue") for deg in range(0, 61, 6): right(90 + deg) forward(100) right(90) forward(100) right(90) forward(100) right(90) forward(100) 4 5 6 7 8 9 for deg in range(0,61,6): right(90 + deg) forward(100-deg) right(90) forward(5) right(90) forward(100-deg) right(90) forward(5) obtenemos el dibujo presentado en la parte derecha de la Fig. 1. Figura 1: Una tortuga dibujante (izquierda) y una variante (derecha). 7. BIBLIOTECA DE EXPRESIONES REGULARES El poder computacional de Python se debe, en gran medida, al gran número de bibliotecas que posee. Como ejemplo, apreciemos la idea de expresiones regulares (un concepto que conocerás a fondo en un curso avanzado de Computación), trabajando con el paquete especializado de Python llamado re: Material de Python 7.1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 >>> import re >>> pattern1=’[a-z][a-z][a-z]’ >>> pattern2=’[a-z]*[a-z]’ >>> text=’hola a todo mundo’ >>> l1=re.findall(pattern1,text) >>> l2=re.findall(pattern2,text) >>> for i in l1: ... print i ... hol tod mun >>> for i in l2: ... print i ... hola a todo mundo Esta biblioteca junto con la biblioteca os te permitirán manejar sin problemas archivos de texto para extraer información útil. Ambas bibliotecas, re y os, también son muy útiles para manejar sistemas de archivos, para identificar tipos de archivo, cambiar permisos, borrar (¡gulp!) archivos, y demás. (Se tiene que ser muy cuidadoso al utilizar estas bibliotecas en un ambiente realista, pues por su mismo capacidad se podrı́an borrar todos nuestros archivos. Intentemos trabajar en directorios de prueba con archivos sin importancia.) Por ejemplo, el siguiente código nos permitirá conocer todos los archivos que tenemos en nuestra cuenta de Linux (y algo similar sucederı́a si se trabaja en Windows): Material de Python 7.2 1 2 3 4 5 6 7 8 9 10 >>> import os >>> for s in os.walk(’.’): #utiliza dir(os) para ver #qué otros comandos #hay en el módulo os. ... for t in s[2]: ... print(t) #Imprime el nombre del archivo #o podrı́a ser alguna otra #operación sobre el archivo O la pregunta ¿qué archivos tenemos que contengan en su nombre al menos un carácter numérico? se puede responder con: Material de Python 7.3 1 2 3 >>> import os, re >>> for s in os.walk(’.’): ... for t in s[2]: 4 5 ... ... if re.findall(’[0-9]’,t): print(t) Otras bibliotecas (tales como urllib, que nos permite trabajar con Internet desde Python) estarán disponibles desde la instalación misma. Algunas otras más, especializadas a tareas especı́ficas, tales como Pygame (cuyos detalles de uso están presentados, por ejemplo, en el libro [4]) o numpy (para realizar tareas intensivas en cálculo numérico o en estadı́stica) tienen que instalarse independientemente. 8. OpenGL en Python El siguiente ejemplo ilustra las bondades de los paradigmas declarativos de programación sin tener que involucrarse en los detalles de bajo nivel (pero ver el artı́culo de Luis A. Zarza López en este mismo cuaderno para comprender mejor este ejemplo). Ya vimos que para realizar algunas actividades especializadas es necesario cargar bibliotecas especı́ficas. Tal es el caso también de los gráficos en 3 dimensiones, que se llevan a cabo mediante la utilización de la biblioteca pyOpenGL, y que utiliza en lo fundamental toda la potencia de los gráficos de OpenGL (ver Fig. 2). En la primera parte de este ejemplo tenemos la inicialización del uso de la biblioteca OpenGL, con un posible mensaje de error en caso de no estar instalada en el sistema: Material de Python 8.4 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 1 2 3 4 5 6 7 8 #!/usr/bin/python import sys try: from OpenGL.GLUT import * from OpenGL.GL import * except: print ’’’PyOpenGL no instalado.’’’ sys.exit() En la segunda parte de este ejemplo está puesto el material de OpenGL como tal: 36 37 38 39 40 41 42 43 44 45 46 Material de Python 8.5 1 2 3 def init(): light_ambient=[0.7,0.3,0.4,1.0] light_diffuse=[1.0,1.0,1.0,1.0] 47 49 50 light_specular=[1.0,1.0,0.4,1.0] light_position=[1.0,1.0,1.0,0.0] glLightfv(GL_LIGHT0,GL_AMBIENT, light_ambient) glLightfv(GL_LIGHT0,GL_DIFFUSE, light_diffuse) glLightfv(GL_LIGHT0,GL_SPECULAR, light_specular) glLightfv(GL_LIGHT0,GL_POSITION, light_position) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glEnable(GL_DEPTH_TEST) def display(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glPushMatrix() glRotatef(20.0, 1.0, 0.0, 0.0) glPushMatrix() glTranslatef(-0.75, 0.5, 0.0) glRotatef(90.0, 2.0, 3.0, 15.0) glColor3f(0.2,0.0,0.1) glRectf(-25.0,25.0,25.0,-25.0) glutSolidTorus(0.5, 0.85, 15, 15) glVertex3f(0.3,0.3,0.3) glPopMatrix() glPopMatrix() glFlush() def reshape(w, h): glViewport(0, 0, w, h) glMatrixMode (GL_PROJECTION) glLoadIdentity() if w <= h: glOrtho(-2.5, 2.5, -2.5*h/w, 2.5*h/w, -10.0, 10.0) else: glOrtho(-2.5*w/h, 2.5*w/h, -2.5, 2.5, -10.0, 10.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() def keyboard(key, x, y): if key == chr(27): Figura 2: Vista de un toro. 51 53 54 55 56 57 58 59 60 61 62 63 sys.exit(0) glutInit(sys.argv) glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH) glutInitWindowSize (500, 500) glutCreateWindow(’scene’) init() glutReshapeFunc(reshape) glutKeyboardFunc(keyboard) glutDisplayFunc(display) glutMainLoop() También en esta biblioteca existen herramientas para manejo de eventos, animación, y en general, la creación de mundos virtuales tridimensionales. 9. PYGAME y se podrá, quizás a partir de ahı́, crear nuestros propios juegos. Para muestra, presento uno de los programas que está en [4] que hace del cursor algo divertido. No serı́a difı́cil que modificar este cursor, poniendo una mosca zumbona con capacidades de evasión o de persecución, por ejemplo. Otros ejemplos de juegos sencillos pero altamente ilustrativos están en www.inventwithpython.com, de donde se puede descargar un tutorial gratuito y el código fuente de muchos programas de juegos. En el siguiente programa está el código para programar un mouse-pelota. El programa presentará una pantalla como la de la Fig. 3. Material de Python 9.1 1 2 3 Pygame es una de las bibliotecas disponibles bajo petición en Python (“bajo petición” quiere decir que deben conseguirse aparte, que no son directamente distribuidas con las implementaciones del lenguaje de programación). Pygame es una biblioteca especı́ficamente diseñada para programar juegos en dos dimensiones (y opcionalmente, en tres dimensiones), con sonido, video, técnicas de paralaje (como cuando vemos que una montaña se mueve más rápido que una montaña más lejana cuando paseas en coche), con dibujos animados (sprites) y otras técnicas de sincronización y multitarea. Se puede hallar más información en www.pygame.org, donde también hay programas tales como Invasores del espacio, Pacman, o de simulación de guerras con tanques. Pero lo mejor: se tendrá el código en Python 4 5 6 7 9 10 11 13 14 15 16 17 18 #!/usr/bin/python background_img_name = ’back.jpg’ mouse_img_name = ’ball.png’ #Los archivos de gráficos #deberı́an existir... #Puedes crearlos #utilizando gimp (www.gimp.org) import pygame from pygame.locals import * from sys import exit pygame.init() screen = pygame.display.set_mode(\ (640, 400), 0, 32) pygame.display.set_caption\ ("Hello, World!") Figura 3: Un mouse-pelota. 20 21 22 23 24 25 26 27 background = pygame.image.\ load(background_img_name).\ convert() mouse_cursor = pygame.image.\ load(mouse_img_name).\ convert_alpha() Esta es la parte que controla y despliega el mouse con forma de pelota: ca de alta calidad, el artı́culo de Francisco Espinosa Maceda, de este cuaderno, que trata sobre Mathematica c será de mucha utilidad. SAGE fue construido con Python; además, se puede programar a SAGE con Python (en sı́ mismo) como lenguaje subyacente de programación. Veamos el siguiente ejemplo con abundantes comentarios para ubicar la utilización de cada posible comando: Material de Python 10.1 1 Material de Python 9.2 2 3 1 2 3 4 5 6 7 8 9 10 while True: for event in pygame.event.get(): if event.type == QUIT: exit() screen.blit(background, (0,0)) x, y = pygame.mouse.get_pos() x-= mouse_cursor.get_width() / 2 y-= mouse_cursor.get_height() / 2 screen.blit(mouse_cursor, (x, y)) pygame.display.update() 4 6 7 8 9 10 11 12 13 14 10. SAGE ¿Y para nuestras actividades matemáticas? Buena pregunta. La comunidad de cientı́ficos y programadores de Python ha tomado nota al respecto y nos ofrece un programa de excelente calidad llamado SAGE, el cual se puede obtener libremente (y en lo práctico, sin costo) para diversos sistemas operativos en la siguiente dirección: www.sagemath.org. Si se opta por una herramienta comercial cientı́fi- 15 16 17 18 19 20 sage: xy=var(’x,y’) #Declaramos las variables x y y. sage: expand((x+y)**2) #Expandemos este binomio #al cuadrado y ... x^2 + 2*x*y + y^2 sage: expand((x+3*y)**3) #ahora este al cubo... x^3 + 9*x^2*y + 27*x*y^2 + 27*y^3 sage: solve(x+3==5,x) #Resolvemos la ecuación x+3=5. [x == 2] sage: solve(x**2+3*x==5,x) #Y ahora esta ecuación #cuadrática [x == -1/2*sqrt(29) - 3/2, x == 1/2*sqrt(29) - 3/2] sage: plot(sin(x),(x,-3,3)) #Graficamos la función seno. Las figuras que se obtendrán serán como la gráfica de la función matemática seno, mostrada en la parte izquierda de la Fig. 4. Figura 4: Función seno (izquierda), y funciones seno y coseno (derecha). Podemos graficar 2 curvas simultáneamente. Por ejemplo, dos gráficas de curvas pueden colocarse en una misma figura, como es mostrado en la parte derecha de la Fig. 4. El código para graficar tales curvas se muestra a continuación: Material de Python 10.2 1 2 3 4 5 6 7 1 2 3 sage: s=plot(sin(x),(x,-3,3)); c=plot(cos(x),(x,-3,3)) sage: s+c 8 9 10 11 Otras opciones más avanzadas permitirán construir gráficas en 3 dimensiones, como la de la parte izquierda de la Fig. 5, o gráficas descritas en forma de ecuaciones paramétricas, con sorprendentes imágenes como resultado, como en la parte derecha de la Fig. 5. Material de Python 10.3 12 13 14 15 16 17 18 19 1 2 3 sage: plot3d(cos(x)*y,(x,-3,3),(y,-3,3)) #También es posible #graficar en 3 dimensiones. 20 21 22 23 5 6 7 8 9 10 sage: parametric_plot3d([cos(x)*y,\ sin(y)*x,\ cos(x)*sin(y)],\ (x,-3,3),(y,-3,3)) #Y utilizando gráficas paramétricas #a veces resultan cosas muy raras. Algunas operaciones matemáticas que involucran operaciones algebraicas son realizadas como se indica a continuación: Material de Python 10.4 24 26 27 28 sage: diff(x*sin(x),x) #Podemos también derivar e integrar #funciones. x*cos(x) + sin(x) sage: integrate(x*cos(2*x),x) 1/2*x*sin(2*x) + 1/4*cos(2*x) sage: A=Matrix([[1,2,3],\ [2,2,1],\ [0,1,3]]) #Definimos una matriz, #para tus cursos más avanzados... sage: A*A #la multiplicamos por sı́ misma... [ 5 9 14] [ 6 9 11] [ 2 5 10] sage: A.trace() #obtenemos su traza... 6 sage: A.transpose() #la transponemos.... [1 2 0] [2 2 1] [3 1 3] sage: w=vector([3,2,2]) #e inclusive podemos aplicarla #a un vector... sage: A*w #para obtener otro vector. (13, 12, 8) Aplicaciones más avanzadas podrı́an incluir también animaciones y controles de usuario. Para mayor versatilidad en la presentación de resultados, es posible utilizar algún navegador de Internet. Figura 5: Graficación en 3 dimensiones y graficación paramétrica en 3 dimensiones. CONCLUSIONES Existe una tendencia creciente para utilizar Python como un lenguaje base para muchos programas importantes (por ejemplo, el programa de modelado y animación tridimensional llamado Blender —ver www.blender.org— utiliza Python de esta manera), de modo que el aprendizaje de este lenguaje se aplica en varios ámbitos. Por ahora, hemos aprendido los conceptos esenciales de Python, y aún ası́ de básico este conocimiento, hemos visto que los resultados logrados son prácticos, útiles y divertidos. Python es ası́: práctico, útil y divertido. Es posible aprender más de Python, en diversos niveles de profundidad, con la biblio- grafı́a citada en la sección de referencias [1, 2, 3, 4], con la que el lector interesado complementará lo aquı́ presentado. Referencias [1] Tim Hall and J-P Stacey. Python 3 for absolute beginners. Apress, 2009. [2] Magnus Lie Hetland. Beginning Python: From novice to professional. Apress, 2005. [3] Mark Lutz. Learning Python. O’Reilly, tercera edition, 2007. [4] Will McGugan. Beginning Python Programming with Python and Pygame. Apress, 2007.