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.