...

Doma de Serpientes para Niños

by user

on
Category: Documents
0

views

Report

Comments

Transcript

Doma de Serpientes para Niños
Tı́tulo original Snake Wrangling for Kids, Learning to Program with Python
por Jason R. Briggs
Versión 0.7.7
c
Copyright 2007.
Traducción al español: José Miguel González Aguilera
Versión 0.0.4
c
Copyright de la traducción 2009.
Website de la traducción: http://code.google.com/p/swfk-es
Publicado por... ah, en realidad... por nadie.
Diseño de portada e ilustraciones realizado por Nuthapitol C.
Website:
http://www.briggs.net.nz/log/writing/snake-wrangling-for-kids
Agradecimientos del Autor:
Guido van Rossum (por su benevolente dictadura del lenguaje Python), a los miembros de la lista de correo Edu-Sig (por sus útiles comentarios y consejos), al autor
David Brin (el instigador inicial de este libro), Michel Weinachter (por proporcionar
unas versiones de mejor calidad de las ilustraciones), y a aquellas personas que aportaron información y erratas, incluidas: Paulo J. S. Silva, Tom Pohl, Janet Lathan,
Martin Schimmels, and Mike Cariaso (entre otros). Cualquiera que haya quedado
fuera y no tuviera que quedar ası́, es debido a la prematura senilidad del autor.
Agradecimientos del Traductor:
A Jason R. Briggs. A Nieves, Alba y especialmente a Miguel, mi hijo, por sus
aportaciones a la traducción.
Licencia:
Este trabajo está licenciado bajo la licencia de Reconocimiento-No comercial-Compartir
bajo la misma licencia Creative Commons 3.0 España. Para ver una copia de esta
licencia, visita http://creativecommons.org/licenses/by-nc-sa/3.0/es/ o envı́a una
carta a Creative Commons, 171 Second Street, Suite 300, San Francisco, California,
94105, USA.
A continuación se muestra un resumen de la licencia.
Usted es libre de:
Compartir — copiar, distribuir y comunicar públicamente la obra
Rehacer — hacer obras derivadas
Bajo las condiciones siguientes:
Reconocimiento. Debe reconocer los créditos de la obra de la manera especificada
por el autor o el licenciador (pero no de una manera que sugiera que tiene su
apoyo o apoyan el uso que hacer de su obra).
No comercial. No puede utilizar esta obra para fines comerciales.
Compartir bajo la misma licencia. Si altera o transforma esta obra, o genera
una obra derivada, sólo puede distribuir la obra generada bajo una licencia
idéntica a ésta.
Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia
de esta obra.
Alguna de las condiciones puede no aplicarse si se obtiene el permiso del titular de
los derechos de esta obra.
Nada en esta licencia menoscaba o restringe los derechos morales del autor.
Índice general
Introducción
V
1. No todas las serpientes muerden
1
1.1. Unas pocas palabras sobre el lenguaje . . . . . . . . . . . . . . . . . .
2
1.2. La Orden de las Serpientes Constrictoras No Venenosas. . . . . . . . .
3
1.3. Tu primer programa en Python . . . . . . . . . . . . . . . . . . . . .
5
1.4. Tu segundo programa en Python. . .¿Otra vez lo mismo?
6
2. 8 multiplicado por 3.57 igual a. . .
. . . . . . .
9
2.1. El uso de los paréntesis y el “Orden de las Operaciones” . . . . . . . 12
2.2. No hay nada tan voluble como una variable . . . . . . . . . . . . . . 13
2.3. Utilizando variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4. ¿Un trozo de texto? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5. Trucos para las cadenas . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6. No es la lista de la compra . . . . . . . . . . . . . . . . . . . . . . . . 19
2.7. Tuplas y Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.8. Cosas que puedes probar . . . . . . . . . . . . . . . . . . . . . . . . . 24
3. Tortugas, y otras criaturas lentas
25
3.1. Cosas que puedes probar . . . . . . . . . . . . . . . . . . . . . . . . . 32
4. Cómo preguntar
33
4.1. Haz esto. . . o ¡¡¡SI NO!!! . . . . . . . . . . . . . . . . . . . . . . . . . 38
i
4.2. Haz esto. . . o haz esto. . . o haz esto. . . o ¡¡¡SI NO!!! . . . . . . . . . . 38
4.3. Combinando condiciones . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.4. Vacı́o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.5. ¿Cuál es la diferencia. . .? . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.6. Cosas que puedes probar . . . . . . . . . . . . . . . . . . . . . . . . . 49
5. Una y otra vez
51
5.1. ¿Cuándo un bloque no es cuadrado? . . . . . . . . . . . . . . . . . . . 54
5.2. Saliendo de un bucle antes de tiempo . . . . . . . . . . . . . . . . . . 62
5.3. Mientras hablamos sobre bucles. . . . . . . . . . . . . . . . . . . . . . . 63
5.4. Cosas que puedes probar . . . . . . . . . . . . . . . . . . . . . . . . . 66
6. Una forma de reciclar. . .
67
6.1. Trocitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6.2. Módulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.3. Cosas para probar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7. Un corto capı́tulo sobre ficheros
79
8. Tortugas en abundancia
81
8.1. Coloreando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.2. Oscuridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3. Rellenando las cosas . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.4. Cosas para probar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
9. Algo sobre gráficos
97
9.1. Dibujo rápido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
9.2. Dibujos simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
9.3. Dibujando cajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
9.4. Dibujando arcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
9.5. Dibujando óvalos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
9.6. Dibujando polı́gonos . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
ii
9.7. Mostrando imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
9.8. Animación básica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
9.9. Reaccionando a los eventos. . . . . . . . . . . . . . . . . . . . . . . . . 117
10.Cómo seguir desde aquı́
121
A. Palabras clave de Python
123
B. Funciones internas de Python
137
C. Unos cuantos módulos de Python
147
D. Respuestas a “Cosas que puedes probar”
157
iii
iv
Introducción
Una Nota para los Padres...
Querida ‘Unidad Paternal’ u otro Tutor,
Para que tu hijo pueda iniciarse a la programación, es necesario que instales
Python en tu ordenador. Este libro se ha actualizado para utilizar Python 3.0–esta
última versión de Python no es compatible con versiones anteriores, por lo que si
tienes instalada una versión anterior de Python, necesitarás descargar una versión
más antigua de este libro.
La instalación de Python es una tarea simple, pero hay algunas cosas a tener en
cuenta dependiendo del Sistema Operativo en el que se instale. Si acabas de comprar
un ordenador nuevo, no tienes ni idea de qué hacer con él, y mi afirmación anterior
te ha dado escalofrı́os, probablemente querrás buscar a alguien que haga esta tarea
por ti. Dependiendo del estado de tu ordenador, y la velocidad de tu conexión a
Internet, te puede llevar de 15 minutos a varias horas.
En primer lugar, ve a www.python.org y descarga el último instalador de Windows
para Python 3. En el momento de escribir este libro era:
http://www.python.org/ftp/python/3.0.1/python-3.0.1.msi
Haz doble click en el icono del instalador de Windows (¿Recuerdas dónde lo has
descargado?), y sigue las instrucciones para instalarlo en la ubicación por defecto
(posiblemente será c:\Python30 o algo parecido).
Después de la instalación. . .
. . .Puede que te tengas que sentar junto a tu hijo durante los primeros capı́tulos,
pero después de unos pocos ejemplo, deberı́an estar apartando tus manos del teclado
porque querrán hacerlo ellos. Tus hijos deberı́an conocer como utilizar un editor de
texto antes de comenzar (no, no un Procesador de Textos, como Microsoft Word—
un editor de texto plano de la vieja guardia)—deberı́an saber como abrir y cerrar
ficheros, crear nuevos ficheros de texto y grabar lo que están haciendo. Este libro
v
intentará enseñarles lo básico, a partir de aquı́.
Gracias por tu tiempo, y un cordial saludo,
EL LIBRO
vi
Capı́tulo 1
No todas las serpientes muerden
Existe la posibilidad de que te regalasen este libro en tu cumpleaños. O posiblemente en navidades. La tı́a Pili iba a regalarte unos calcetines que eran dos tallas
más grandes que la tuya (que no querrı́as llevar ni cuando crecieras). En vez de eso,
oyó a alguien hablar de este libro imprimible desde Internet, recordó que tenı́as uno
de esos aparatos que se llaman ordenadores o algo ası́ y que intentaste enseñarle a
usarlo las últimas navidades (cosa que dejaste de hacer cuando viste que ella intentaba hablarle al ratón), y te imprimió una copia. Agradécele que no te regalase los
viejos calcetines.
En vez de eso, espero que no te haya defraudado cuando salı́ del papel de envolver reciclado. Yo, un libro que no habla tanto como tu tı́a (de acuerdo, no hablo
nada de nada), con un tı́tulo que no augura nada bueno sobre “Aprender. . .”. Sin
embargo, entretente un rato pensando como me siento yo. Si fueras el personaje de
esta novela sobre magos que está en la estanterı́a de tu dormitorio, posiblemente
yo tendrı́a dientes... o incluso ojos. Dentro de mı́ tendrı́a fotos con imágenes que se
moverı́an, o serı́a capaz de hacer sonidos y quejidos fantasmales cuando abrieras mis
páginas. En luga de eso, estoy impreso en páginas de tamaño folio, grapadas o tal
vez aprisionadas en una carpeta. Como podrı́a saberlo—Si no tengo ojos.
Darı́a cualquier cosa por una hermosa y afilada dentadura. . .
Si embargo no es tan malo como suena. Incluso aunque no pueda hablar... o morderte
los dedos cuando no estás mirando... Puedo enseñarte un poquito sobre lo que hace
que los ordenadores funcionen. No hablo de las piezas, con cables, conexiones, chips
de ordenador y dispositivos que podrı́an, más que probablemente, electrocutarte en
cuanto los tocaras (por eso ¡¡no los toques!!)—sino de todo aquello que por va dentro
de esos cables, circuitos y chips, que es lo que hace que los ordenadores sean útiles.
1
2
CAPÍTULO 1. NO TODAS LAS SERPIENTES MUERDEN
Es como esos pequeños pensamientos que andan dentro de tu cabeza. Si no tuvieras pensamientos estarı́as sentado en el suelo de tu dormitorio, con la mirada perdida hacia la puerta de tu habitación y babeando en la camiseta. Sin los programas, los ordenadores solamente serı́an
útiles para sujetar las puertas—e incluso para eso no serı́an muy útiles, porque tropezarı́as constantemente con ellos por la noche. Y no
hay nada peor que darse un golpe en un dedo del pie en la oscuridad.
Solamente soy un libro, incluso yo sé eso
Tu familia puede que tenga una Playstation, Xbox o Wii en la sala de estar—
No son muy útiles sin programas (Juegos) para hacerlas funcionar. Tu reproductor
de DVD, posiblemente tu frigorı́fico e incluso tu coche, todos contienen programas
de ordenador para hacerlos más útiles de lo que serı́an sin ellos. Tu reproductor de
DVD tiene programas que sirven para que pueda reproducir lo que hay en un DVD;
tu frigorı́fico podrı́a tener un programa simple que le asegura que no usa demasiada
electricidad, pero sı́ la suficiente para mantener la comida frı́a; tu coche podrı́a tener
un ordenador con un programa para avisar al conductor que van a chocar contra
algo.
Si supieras escribir programas de ordenador, podrı́as hacer toda clase de cosas útiles,
Tal vez escribir tus propios juegos. Crear páginas web que hagan cosas, en lugar de
estar ahı́ delante paradas con sus colorida apariencia. Ser capaz de programar te
podrı́a ayudar incluso con tus deberes.
Dicho esto, vamos a hacer algo un poco más interesante.
1.1.
Unas pocas palabras sobre el lenguaje
Como pasa con los humanos, con las ballenas, posiblemente con los delfines,
y puede que incluso con los padres (aunque esto último se puede debatir), los ordenadores tienen su propio idioma o lenguaje. En realidad, también como con los
humanos, tienen más de un idioma. Hay tantos lenguajes que casi se acaban las
1.2. LA ORDEN DE LAS SERPIENTES CONSTRICTORAS NO VENENOSAS. . .3
letras del alfabeto. A, B, C, D y E no son únicamente letras, también son nombres
de lenguajes de programación (lo que prueba que los adultos no tienen imaginación,
y que deberı́an leer un diccionario antes de darle nombre a nada).
Hay lenguajes de programación cuyo nombre viene de nombres de personas,
otros cuyo nombre viene de acrónimos (las letras mayúsculas de una serie de palabras), y algunos pocos cuyo nombre proviene de algún espectáculo de televisión.
Ah, y si le añades algunos simbolos más y hash (+, #) después de un par de las
letras que comenté antes—también hay un par de lenguajes de programación que se
llamen ası́. Para complicar más las cosas, algunos de esos lenguajes son casi iguales,
y sólo varı́an ligeramente.
¿Qué te dije? ¡Sin imaginación!
Por fortuna, muchos de estos lenguajes ya no se usan mucho, o han desaparecido completamente; pero la lista de las diferentes formas de las que le puedes ‘hablar’
al ordenador sigue siendo preocupantemente larga. Yo únicamente voy a comentar
una de ellas—de otra manera posiblemente ni siquiera podrı́amos empezar.
Serı́a mas productivo permanecer sentado en tu dormitorio babeando la camiseta. . .
1.2.
La Orden de las Serpientes Constrictoras No
Venenosas. . .
. . .o Pitones, para abreviar.
Aparte de ser una serpiente, Python es también un lenguaje de programación.
Sin embargo, el nombre no procede este reptil sin patas; en vez de eso es uno de los
pocos lenguajes de programación cuyo nombre viene de un programa de televisión.
Monty Python era un espectáculo de comedia Británica que fue popular en la década
de los 70 (1970-1979), y que aún es popular hoy dı́a, en realidad, para la que tienes
que ser de una cierta edad para encontrarla entretenida. Cualquiera bajo una edad
de unos . . . digamos 12. . . se sorprenderá de las pasiones que levanta esta comedia1 .
Hay algunas cosas sobre Python (el lenguaje de programación, no la serpiente, ni el espectáculo de televisión) que lo hacen extremadamente útil cuando estás
aprendiendo a programar. Para nosotros, por el momento, la razón más importante
es que puedes comenzar a hacer cosas realmente rápido.
Esta es la parte en la que espero que Mamá, Papá (o cualquiera que sea que
1
Salvo por la danza de los golpes de pescado. Eso es divertido independientemente de la edad
que tengas.
4
CAPÍTULO 1. NO TODAS LAS SERPIENTES MUERDEN
Figura 1.1: Python en el menú de opciones de Windows.
esté a cargo del ordenador), hayan leı́do el comienzo de este libro que está etiquetado
como “Una Nota para los Padres:”
Hay una buena manera de descubrir si realmente se la han leı́do:
Haz click en el botón de Inicio en la parte izquierda de la pantalla, pulsa en
la opción ‘Todos los Programas’ (que tiene un triángulo verde junto a ella), y, si
todo va bien, en la lista de programas deberı́as ver ‘Python 2.5’ o ‘Python 3.0’ (o
algo parecido). La Figura 1.1 te muestra lo que estás buscando. Pulsa en la opción
‘Python (lı́nea de comando)’ y deberı́as ver algo parecido a la Figura 1.2.
Si descubrieras que no se han leido la sección del comienzo
del libro. . .
. . .porque falta algo cuando intentas seguir las instrucciones—entonces ve al
comienzo del libro, y se lo pasas por delante de sus narices mientras estén intentando
leer el periódico, y pon cara esperanzada. Diciendo, “por favor por favor por favor
por favor” y ası́ una y otra vez, hasta que resulte molesto, podrı́a funcionar bastante
bien, si tuvieras problemas en convencerles para que se levanten del sillón, puede
probar otra cosa, ir al comienzo del libro y seguir las instrucciones en la Introducción
para instalar Python tú mismo.
1.3. TU PRIMER PROGRAMA EN PYTHON
5
Figura 1.2: La consola de Python en Windows.
1.3.
Tu primer programa en Python
Con algo de suerte, si has alcanzado este punto, has conseguido iniciar la
consola de Python, que es una de las formas de ejecutar sentencias y programas.
Al iniciar la consola (o después de ejecutar una sentencia), verás lo que se llama
un ‘prompt’. En la consola de Python, el prompt está formado por tres sı́mbolos de
‘mayor que’ (>) que forman una flecha apuntando a la derecha:
>>>
Si juntas suficientes sentencias de Python, tendrás un programa que podrás
ejecutar más allá de la consola. . . pero por el momento vamos a hacer lo más simple, y
teclear nuestras sentencias directamente en la consola, en el prompt (>>>). Ası́ que,
por qué no comenzar tecleando lo siguiente:
print("Hola mundo")
Asegúrate que incluyes las comillas (eso es, estas comillas: ” ”), y pulsa la tecla
Intro al finalizar la lı́nea. Si todo va bien verás en la pantalla algo como lo siguiente:
>>> print("Hola mundo")
Hola mundo
El prompt reaparece, con el fin de hacerte saber que la consola de Python
está lista para aceptar más sentencias.
6
CAPÍTULO 1. NO TODAS LAS SERPIENTES MUERDEN
¡Enhorabuena! Acabas de crear tu primer programa Python. print es una función
que se encarga de escribir en la consola todo lo que se encuentre dentro de los
paréntesis–la utilizaremos repetidamente más adelante.
1.4.
Tu segundo programa en Python. . .¿Otra vez
lo mismo?
Los programas en Python no serı́an nada útiles si tuvieras que teclear las
sentencias cada vez que quisieras hacer algo—o si escribieras programas para alguien,
y tuvieran que teclearlo cada vez antes de que pudieran usarlo. El Procesador de
Textos que uses para escribir las tareas del cole, tiene probablemente entre 10 y 100
millones de lı́neas de código (sentencias). Dependiendo de cuantas lı́neas imprimieras
en una página (y si las imprimes o no por ambas caras del papel), esto supondrı́a
alrededor de 400.000 páginas en papel. . . o una pila de papel de unos 40 metros de
alto. Imagı́nate cuando tuvieras que traer esta aplicación a casa desde la tienda,
habrı́a que hacer unos cuantos viajes con el coche, para llevar tantos papeles. . .
. . .y mejor que no sople el viento mientras transportas esas pilas de papel. Por
fortuna, existe una alternativa a tener que teclearlo todo cada vez—o nadie podrı́a
hacer nada.
1.4. TU SEGUNDO PROGRAMA EN PYTHON. . .¿OTRA VEZ LO MISMO? 7
Abre el Block de Notas (Notepad) (Pulsa en el menú de Inicio, Todos los
Programas: deberı́a estar en el submenú de Accesorios), y teclea la sentencia print
exactamente igual que lo hiciste antes en la consola:
print("Hola mundo")
Pulsa en el menú Archivo (en el Block de Notas), luego Guardar, y cuando te
pregunte por qué nombre darle al fichero, llámalo hola.py y grábalo en tu Escritorio.
Haz doble click en el icono que aparece en el Escritorio con el nombre hola.py (ver
Figura 1.3) y durante un breve momento se mostrará una ventana con la consola.
Desaparecerá demasiado rápido como para ver lo que pone, pero lo que se mostrará en pantalla en esas décimas de segundo será Hola mundo—volveremos a esto
más tarde para comprobar que es verdad lo que digo.
Como ves la gente que creó Python era gente decente, te ha librado de tener
que teclear lo mismo una y otra vez y otra vez y otra vez y otra vez. Como pasó en
los años ochenta. No, lo digo en serio—lo hicieron. Ve y pregunta a tu Padre si
alguna vez tuvo un ZX81 cuando era más joven
8
CAPÍTULO 1. NO TODAS LAS SERPIENTES MUERDEN
Figura 1.3: El icono hola.py en el Escritorio de Windows.
Si lo tuvo puedes señalarle con el dedo y reirte.
Créeme. No lo entenderás. Pero él sı́.2
De todos modos, prepárate para salir corriendo.
El Final del Comienzo
Bienvenido al maravilloso mundo de la Programación. Hemos empezado con
una aplicación sencillita ‘Hola mundo’—todo el mundo comienza con eso, cuando
empiezan a programar. En el siguiente capı́tulo comenzaremos a hacer cosas más
útiles con la consola de Python y empezaremos a ver lo que hace falta para hacer
un programa.
2
El Sinclair ZX81, vendido en la década de 1980 fue uno de los primeros ordenadores para
el hogar que se vendı́a a un precio asequible. Un gran número de jóvenes se volvieron ‘locos’
tecleando el código de juegos que venı́an impresos en revistas sobre el ZX81—únicamente para
descubrir, después de horas de teclear, que esos malditos juegos nunca funcionaban bien.
Capı́tulo 2
8 multiplicado por 3.57 igual a. . .
¿Cuánto es 8 multiplicado por 3.57? Tendrı́as que utilizar una calculadora, ¿a
que sı́? Bueno, tal vez eres superlisto y puedes calcular con decimales mentalmente—
bueno, no es importante. Tambien puedes hacer el cálculo con la consola de Python.
Inicia la consola de nuevo (mira el Capı́tulo 1 para más información, si te lo hubieras
saltado por alguna extraña razón), y cuando veas el prompt en pantalla, teclea 8∗3.57
y pulsa la tecla Intro:
Python 3.0 (r30:67503, Dec 6 2008, 23:22:48)
Type "help", "copyright", "credits" or "license" for more information.
>>> 8 * 3.57
28.559999999999999
La estrella (*), o tecla de asterico, se utiliza como sı́mbolo de multiplicación, en
lugar del simbolo de multiplicar tradicional (X) que utilizas en el cole (es necesario
que utilices la tecla de estrella porque el ordenador no tendrı́a forma de distinguir si
lo querı́as era teclear la letra x o el sı́mbolo de la multiplicación X). ¿Qué te parece
si probamos un cálculo que sea un poco más útil?
Supón que haces tus obligaciones de la casa una vez a la semana, y por ello
te dan 5 euros, y que haces de chico repartidor de periódicos 5 veces por semana
cobrando 30 euros—¿Cuánto dinero podrı́as ganar en un año?
Si lo escribieramos en un papel, lo calcuları́amos como sigue:
(5 + 30) x 52
9
10
CAPÍTULO 2. 8 MULTIPLICADO POR 3.57 IGUAL A. . .
¿!¿!Python está roto!?!?
Si has probado a calcular 8 x 3.57 con una calculadora el
resultado que se muestra será el siguiente:
28.56
¿Porqué el resultado de Python es diferente? ¿Está roto?
En realidad no. La razón de esta diferencia está en la forma en
que se hacen los cálculos en el ordenador con los números de
coma flotante (Los números que tienen una coma y decimales).
Es algo complejo y que confunde a los principiantes, por lo que
es mejor que recuerdes únicamente que cuando estás trabajando con decimales, a veces el resultado no será exactamente el
experado. Esto puede pasar con las multiplicaciones, divisiones,
sumas y restas.
Es decir, 5 + 30 euros a la semana multiplicado por las 52 semanas del año.
Desde luego, somos chicos listos por lo que sabemos que 5 + 30 es 35, por lo que la
fórmula en realidad es:
35 x 52
Que es suficientemente sencilla como para hacerla con una calculadora o a
mano, con lápiz y papel. Pero también podemos hacer todos los cálculos con la
consola:
>>> (5 + 30) * 52
1820
>>> 35 * 52
1820
Veamos, ¿Qué pasarı́a si te gastases 10 euros cada semana? ¿Cuánto te quedarı́a a final de año? En papel podemos escribir este cálculo de varias formas, pero
vamos a teclearlo en la consola de Python:
11
>>> (5 + 30 - 10) * 52
1300
Son 5 más 30 euros menos 10 euros multiplicado por las 52 semanas que tiene
el año. Te quedarán 1300 euros a final de año. Estupendo, pero aún no es que sea
muy útil lo que hemos visto. Todo se podrı́a haber hecho con una calculadora. Pero
volveremos con este asunto más tarde para mostrarte como hacer que sea mucho
más útil.
En la consola de Python puedes multiplicar y sumar (obvio), y restar y dividir, además de un gran puñado de otras operaciones matemáticas que no vamos
a comentar ahora. Por el momento nos quedamos con los sı́mbolos básicos de matemáticas que se pueden usar en Python (en realidad, en este lenguaje, se les llama
operadores):
+
Suma
Resta
* Multiplicación
/
División
La razón por la que se usa la barra inclinada hacia adelante (/) para la división,
es que serı́a muy difı́cil dibujar la lı́nea de la división como se supone que lo haces en
las fórmulas escritas (además de que ni se molestan en poner un sı́mbolo de división
÷ en el teclado del ordenador). Por ejemplo, si tuvieras 100 huevos y 20 cajas,
querrı́as conocer cuantos huevos deberı́as meter en cada caja, por lo que tendrı́as
que dividir 100 entre 20, para lo que escribirı́as la siguiente fórmula:
100
20
O si supieras como se escribe la división larga, lo harı́as ası́:
100
100
0
20
5
O incluso lo podrı́as escribir de esta otra forma:
100 ÷ 20
Sin embargo, en Python tienes que escribirlo ası́ “100 / 20”.
Lo que es mucho más sencillo, o eso me parece a mi. Pero bueno, yo soy un
libro—¿Qué voy a saber yo?
12
2.1.
CAPÍTULO 2. 8 MULTIPLICADO POR 3.57 IGUAL A. . .
El uso de los paréntesis y el “Orden de las
Operaciones”
En los lenguajes de programación se utilizan los paréntesis para controlar lo
que se conoce como el “Orden de las Operaciones”. Una operación es cuando se usa
un operador (uno de los sı́mbolos de la tabla anterior). Hay más operadores que
esos sı́mbolos básicos, pero para esa lista (suma, resta, multiplicación y división),
es suficiente con saber que la multiplicación y la división tiene mayor orden de
prioridad que la suma y la resta. Esto significa que en una fórmula, la parte de la
multiplicación o la división se calcula antes que la parte de la suma y resta. En la
siguiente fórmula, todos los operadores son sumas (+), en este caso los números se
suman en el orden que aparecen de izquierda a derecha:
>>> print(5 + 30 + 20)
55
De igual manera, en esta otra fórmula, hay únicamente operadores de sumas y restas,
por lo que de nuevo Python considera cada número en el orden en que aparece:
>>> print(5 + 30 - 20)
15
Pero en la siguiente fórmula, hay un operador de multiplicación, por lo que los
números 30 y 20 se toman en primer lugar. Esta fórmula lo que está diciendo es
“multiplica 30 por 20, y luego suma 5 al resultado” (se multiplica primero porque
tiene mayor orden que la suma):
>>> print(5 + 30 * 20)
605
¿Pero qué es lo que sucede cuando añadimos paréntesis? La siguiente fórmula muestra el resultado:
>>> print((5 + 30) * 20)
700
¿Por qué el número es diferente? Porque los paréntesis controlan el orden de las
operaciones. Con los paréntesis, Python sabe que tiene que calcular primero todos
los operadores que están dentro de los paréntesis, y luego los de fuera. Por eso lo
que significa esta fórmula es “suma 5 y 30 y luego multiplica el resultado por 20”. El
uso de los paréntesis puede volverse más complejo. Pueden existir paréntesis dentro
de paréntesis:
2.2. NO HAY NADA TAN VOLUBLE COMO UNA VARIABLE
13
>>> print(((5 + 30) * 20) / 10)
70
En este caso, Python calcula los paréntesis más internos primero, luego los exteriores, y al final el otro operador. Por eso esta fórmula significa “suma 5 y 30,
luego multiplica el resultado por 20, y finalmente divide el resultado entre 10”. El
resultado sin los paréntesis serı́a ligeramente diferente:
>>> 5 + 30 * 20 / 10
65
En este caso se multiplica primero 30 por 20, luego el resultado se divide entre
10, finalmente se suma 5 para obtener el resultado final.
Recuerda que la multiplicación y la división siempre van antes que la suma y la
resta, a menos que se utilicen paréntesis para controlar el orden de las operaciones.
2.2.
No hay nada tan voluble como una variable
Una ‘variable’ es un término de programación que se utiliza para describir un
sitio en el que almacenar cosas. Las ‘cosas’ pueden ser números, o textos, o listas
de números y textos—y toda clase de otros elementos demasiado numerosos para
profundizar aquı́. Por el momento, vamos a decir que una variable algo ası́ como un
buzón o caja.
14
CAPÍTULO 2. 8 MULTIPLICADO POR 3.57 IGUAL A. . .
De la misma forma en que puedes meter cosas (como una carta o un paquete)
en un un buzón, puedes hacerlo con una variable, puedes meter cosas (números,
textos, listas de números y textos, etc, etc, etc) en ella. Con esta idea de buzón es
con la que funcionan muchos lenguajes de programación. Pero no todos.
En Python, las variables son ligeramente diferentes. En lugar de ser un buzón
con cosas dentro, una variable es más parecida a una etiqueta que pegas por fuera
de la caja o carta. Podemos despegar la etiqueta y pegarla en otra cosa, o incluso
atar la etiqueta (con un trozo de cuerda, tal vez) a más de una cosa. En Python
las variables se crean al darles un nombre, utilizando después un sı́mbolo de igual
(=), y luego diciéndole a Python a qué cosa queremos que apunte este nombre. Por
ejemplo:
>>> fred = 100
Acabamos de crear una variable llamada ‘fred’ y le dijimos que apuntase al
número 100. Lo que estamos haciendo es decirle a Python que recuerde ese número
porque queremos usarlo más tarde. Para descubrir a qué está apuntando una variable, lo único que tenemos que hacer es teclear ‘print’ en la consola, seguido del
nombre de la variable, y pulsar la tecla Intro. Por ejemplo:
>>> fred = 100
>>> print(fred)
100
También le podemos decir a Python que queremos que la variable fred apunte
a otra cosa diferente:
>>> fred = 200
>>> print(fred)
200
En la primera lı́nea decimos que ahora queremos que fred apunte al número 200.
Luego, en la segunda lı́nea, le pedimos a Python que nos diga a qué está apuntando
fred para comprobar que lo hemos cambiado (ya no apunta a 100). También podemos
hacer que más de un nombre apunte a la misma cosa:
>>> fred = 200
>>> john = fred
>>> print(john)
200
En el código anterior estamos diciendo que queremos que el nombre (o etiqueta)
john apunte a la misma cosa a la que apunta fred. Desde luego, ‘fred’ no es un nombre
2.3. UTILIZANDO VARIABLES
15
muy útil para una variable. No nos dice nada sobre para qué se usa. Un buzón se
sabe para lo que se usa—para el correo. Pero una variable puede tener diferentes
usos, y puede apuntar a muchas cosas diferentes entre sı́, por lo que normalmente
queremos que su nombre sea más informativo.
Supón que iniciaste la consola de Python, tecleaste ‘fred = 200’, y después te
fuiste—pasaste 10 años escalando el Monte Everest, cruzando el desierto del Sahara,
haciendo puenting desde un puente en Nueva Zelanda, y finalmente, navegando por
el rio Amazonas—cuando vuelves a tu ordenador, ¿podrı́as acordarte de lo que el
número 200 significaba (y para qué servı́a)?
Yo no creo que pudiera.
En realidad, acabo de usarlo y no tengo ni idea qué significa ‘fred=200’ (más allá de
que sea un nombre apuntando a un número 200 ). Por eso después de 10 años, no
tendrás absolutamente ninguna oportunidad de acordarte.
¡Ajá! Pero si llamáramos a nuestra variable: numero de estudiantes.
>>> numero_de_estudiantes = 200
Podemos hacer esto porque los nombres de las variables pueden formarse con
letras, números y guiones bajos ( )—aunque no pueden comenzar por un número.
Si vuelves después de 10 años, ‘numero de estudiantes’ aún tendrá sentido para ti.
Puedes teclear:
>>> print(numero_de_estudiantes)
200
E inmediatamente sabrás que estamos hablando de 200 estudiantes. No siempre es
importante que los nombres de las variables tengan significado. Puedes usar cualquier
cosa desde letras sueltas (como la ‘a’) hasta largas frases; y en ocasiones, si vas a
hacer algo rápido, un nombre simple y rápido para una variable es suficientemente
útil. Depende mucho de si vas a querer usar ese nombre de la variable más tarde y
recordar por el nombre en qué estabas pensando cuando la tecleaste.
este_tambien_es_un_nombre_valido_de_variable_pero_no_muy_util
2.3.
Utilizando variables
Ya conocemos como crear una variable, ahora ¿Cómo la usamos? ¿Recuerdas
la fórmula que preparamos antes? Aquella que nos servı́a para conocer cuánto dinero
16
CAPÍTULO 2. 8 MULTIPLICADO POR 3.57 IGUAL A. . .
tendrı́amos al final de año, si ganabas 5 euros a la semana haciendo tareas, 30 euros
a la semana repartiendo periódicos, y gastabas 10 euros por semana. Por ahora
tenemos:
>>> print((5 + 30 - 10) * 52)
1300
¿Qué pasarı́a si convertimos los tres primeros números en variables? Intenta teclear
lo siguiente:
>>> tareas = 5
>>> repartir_periodicos = 30
>>> gastos = 10
Acabamos de crear unas variables llamadas ‘tareas’, ‘repartir periodicos’ y ‘gastos’.
Ahora podemos volver a teclear la fórmula de la siguiente forma:
>>> print((tareas + repartir_periodicos - gastos) * 52)
1300
Lo que nos da exactamente la misma respuesta. Pero qué sucederı́a si eres capaz
de conseguir 2 euros más por semana, por hacer tareas extra. Solamente tienes que
cambiar la variable ‘tareas’ a 7, luego pulsar la tecla de flecha para arriba (↑) en el
teclado varias veces, hasta que vuelva a aparecer la fórmula en el prompt, y pulsar
la tecla Intro:
>>> tareas = 7
>>> print((tareas + repartir_periodicos - gastos) * 52)
1404
Ası́ hay que teclear mucho menos para descubrir que a final de año vas a tener
1404 euros. Puedes probar a cambiar las otras variables, y luego pulsar la tecla de
flecha hacia arriba para que se vuelva a ejecutar el cálculo y ver qué resultado se
obtiene.
Si gastases el doble por semana:
>>> gastos = 20
>>> print((tareas + repartir_periodicos - gastos) * 52)
884
Solamente te quedarán 884 euros al final de año. Por ahora esto es un poco
más util, pero no mucho. No hemos llegado a nada realmente útil aún. Pero por
el momento es suficiente para comprender que las variables sirven para almacenar
cosas.
¡Piensa en un buzón con una etiqueta en él!
2.4. ¿UN TROZO DE TEXTO?
2.4.
17
¿Un trozo de texto?
Si has estado prestando atención, y no únicamente leyendo por encima el texto, recordarás que he mencionado que las variables se pueden utilizar para varias
cosas—no únicamente para los números. En programación, la mayor parte del tiempo
llamamos a los textos ‘cadenas de caracteres’. Esto puede parecer un poco extraño;
pero si piensas que un texto es como un ‘encadenamiento de letras’ (poner juntas
las letras), entonces quizá tenga un poco más de sentido para ti.
Si bueno, quizás no tenga tanto sentido.
En cualquier caso, lo que tienes que saber es que una cadena es solamente un
puñado de letras y números y otros sı́mbolos que se juntan de forma que signifique
algo. Todas las letras, números y sı́mbolos de este libro podrı́an considerarse que
forman una cadena. Tu nombre podrı́a considerarse una cadena. Como podrı́a serlo
la dirección de tu casa. El primer programa Python que creamos en el Capı́tulo 1,
utilizaba una cadena: ‘Hola mundo’.
En Python, creamos una cadena poniendo comillas alrededor del texto. Ahora
podemos tomar nuestra, hasta ahora inútil, variable fred, y asignarle una cadena de
la siguiente forma:
>>> fred = "esto es una cadena"
Ahora podemos mirar lo que contiene la variable fred, tecleando print(fred):
>>> print(fred)
esto es una cadena
También podemos utilizar comillas simples para crear una cadena:
>>> fred = ’esto es otra cadena’
>>> print(fred)
esto es otra cadena
Sin embargo, si intentas teclear más de una lı́nea de texto en tu cadena utilizando comillas simple (’) o comillas dobles (”), verás un mensaje de error en la
consola. Por ejemplo, teclea la siguiente lı́nea y pulsa Intro, y saldrá en pantalla un
mensaje de error similar a esto:
>>> fred = "esta cadena tiene dos
File "<stdin>", line 1
fred = "esta cadena tiene dos
^
SyntaxError: EOL while scanning string literal
18
CAPÍTULO 2. 8 MULTIPLICADO POR 3.57 IGUAL A. . .
Hablaremos de los errores más tarde, pero por el momento, si quieres escribir
más de una lı́nea de texto, recuerda que tienes que usar 3 comillas simples:
>>> fred = ’’’esta cadena tiene dos
... lı́neas de texto’’’
Imprime el contenido de la variable para ver si ha funcionado:
>>> print(fred)
esta cadena tiene dos
lı́neas de texto
Por cierto, verás que salen 3 puntos (...) siempre que tecleas algo que continua
en otra lı́nea (como sucede en una cadena que ocupa más de una lı́nea). De hecho,
lo verás más veces según avanzemos en el libro.
2.5.
Trucos para las cadenas
He aquı́ una interesante pregunta: ¿Cuánto es 10 * 5 (10 veces 5)? La respuesta
es, por supuesto, 50.
De acuerdo, para nada es una pregunta interesante.
Pero ¿Cuánto es 10 * ’a’ (10 veces la letra a)? Podrı́a parecer una pregunta sin
sentido, pero hay una respuesta para ella en el Mundo de Python:
>>> print(10 * ’a’)
aaaaaaaaaa
También funciona con cadenas de más de un carácter:
>>> print(20 * ’abcd’)
abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd
Otro truco con cadenas consiste en incrustar valores. Para ello puedes usar %s,
que funciona como marcador o espacio reservado para el valor que quieras incluir en
la cadena. Es más fácil de explicar con un ejemplo:
>>> mitexto = ’Tengo %s a~
nos’
>>> print(mitexto % 12)
Tengo 12 a~
nos
En la primera lı́nea, creamos la variable mitexto con una cadena que contiene
algunas palabras y un marcador ( %s). El %s es una especie de señal que le dice
2.6. NO ES LA LISTA DE LA COMPRA
19
“sustitúyeme con algo” a la consola de Python. Ası́ que en la siguiente lı́nea, cuando
ejecutamos print(mitexto), usamos el sı́mbolo %, para decirle a Python que reemplace el marcador con el número 12. Podemos reutilizar esa cadena y pasarle diferentes
valores:
>>> mitexto = ’Hola %s, ¿Cómo estás hoy?’
>>> nombre1 = ’Joe’
>>> nombre2 = ’Jane’
>>> print(mitexto % nombre1)
Hola Joe, ¿Cómo estás hoy?
>>> print(mitexto % nombre2)
Hola Jane, ¿Cómo estás hoy?
En el ejemplo anterior, hemos creado 3 variables (mitexto, nombre1 y nombre2)—
la primera almacena la cadena con el marcador. Por ello, podemos imprimir la variable ‘mitexto’, y utilizando el operador % pasarle el valor almacenado en las variables
‘nombre1’ y ‘nombre2’. Puedes usar más de un marcador:
>>> mitexto = ’Hola %s y %s, ¿Cómo estáis hoy?’
>>> print(mitexto % (nombre1, nombre2))
Hola Joe y Jane, ¿Cómo estáis hoy?
Cuando utilizas más de un marcador, necesitas que los valores que se usan para
reemplazar las marcas se encuentren entre paréntesis—Ası́ que el modo correcto
de pasar 2 variables es (nombre1, nombre2). En Python a un conjunto de valores
rodeados de paréntesis se le llama tupla, y es algo parecido a una lista, de las que
hablaremos a continuación.
2.6.
No es la lista de la compra
Huevos, leche, queso, apio, manteca de cahauetes, y levadura. Esto no es una
lista de la compra completa, pero nos sirve para nuestros propósitos. Si quisieras
almacenar esto en una variable podrı́as pensar en crear una cadena:
>>> lista_de_la_compra = ’huevos, leche, queso, apio, manteca de cacahuetes, levadura’
>>> print(lista_de_la_compra)
huevos, leche, queso, apio, manteca de cacahuetes, levadura
Otro modo de hacerlo serı́a crear una ‘lista’, que es una clase especial de objetos
de Python:
20
CAPÍTULO 2. 8 MULTIPLICADO POR 3.57 IGUAL A. . .
>>> lista_de_la_compra = [ ’huevos’, ’leche’, ’queso’, ’apio’, ’manteca de cacahuetes’,
...’levadura’ ]
>>> print(lista_de_la_compra)
[’huevos’, ’leche’, ’queso’, ’apio’, ’manteca de cacahuetes’, ’levadura’]
Aunque supone teclear más, también es más útil. Podrı́amos imprimir el tercer
elemento en la lista utilizando su posición (al número que refleja la posición de un
elemento se le denomina ı́ndice), dentro de unos corchetes []:
>>> print(lista_de_la_compra[2])
queso
Las listas comienzan a contarse en la posición con número de ı́ndice 0—es
decir, el primer elemento de una lista es el 0, el segundo es el 1, el tercero es el
2. Esto no tiene mucho sentido para la mayorı́a de la gente, pero lo tiene para
los programadores. Muy pronto te acostumbrarás y cuando estés subiendo unas
escaleras, comenzarás a contar los escalones desde cero en lugar que comenzando
desde uno. Lo que despistará a tu hermano o hermana pequeña.
También podemos seleccionar todos los elementos que van desde el tercero al
quinto de la lista, para ello utilizamos el sı́mbolo de los dos puntos dentro de los
corchetes:
>>> print(lista_de_la_compra[2:5])
[’queso’, ’apio’, ’manteca de cacahuetes’]
[2:5] es lo mismo que decir que estamos interesados en los elementos que van
desde la posición de ı́ndice 2 hasta (pero sin incluirla) la posición de ı́ndice 5. Y
desde luego, como comenzamos a contar con el cero, el tercer elemento en la lista es
el número 2, y el quinto es el número 4. Las listas se pueden utilizar para almacenar
toda clase de objetos. Pueden almacenar números:
>>> milista = [ 1, 2, 5, 10, 20 ]
Y cadenas:
>>> milista = [ ’a’, ’bbb’, ’ccccccc’, ’ddddddddd’ ]
Y mezcla de números y cadenas:
2.6. NO ES LA LISTA DE LA COMPRA
21
>>> milista = [1, 2, ’a’, ’bbb’]
>>> print(milista)
[1, 2, ’a’, ’bbb’]
E incluso listas de listas:
>>> lista1 = [ ’a’, ’b’, ’c’ ]
>>> lista2 = [ 1, 2, 3 ]
>>> milista = [ lista1, lista2 ]
>>> print(milista)
[[’a’, ’b’, ’c’], [1, 2, 3]]
En el ejemplo anterior se crea la variable ‘lista1’ para contener 3 letras, la lista
‘lista2’ se crea con 3 números, y ‘milista’ se crea utilizando a las variables lista1 y
lista2. Como ves, las cosas se complican rápidamente cuando empiezas a crear listas
de listas de listas de listas. . . pero afortunadamente normalmente no hay ninguna
necesidad de complicarlo tanto en Python. De todos modos sigue siendo útil conocer
que puedes almacenar toda clase de elementos en una lista de Python.
Y no únicamente para hacer la compra.
Sustituyendo elementos
Podemos reemplazar un elemento en la lista asignándole un valor de la misma
forma en que se hace con una variable corriente. Por ejemplo, podrı́amos cambiar el
apio por lechuga asignando el valor nuevo a la posición de ı́ndice 3:
>>> lista_de_la_compra[3] = ’lechuga’
>>> print(lista_de_la_compra)
[’huevos’, ’leche’, ’queso’, ’lechuga’, ’manteca de cacahuetes’, ’levadura’]
Añadiendo más elementos...
Podemos añadir elementos a una lista utilizando el método denominado ‘append’ (que en inglés significa ‘añadir’). Un método es una acción u orden que le
dice a Python que queremos que haga algo. Más tarde hablaremos más de ellos, por
el momento, recuerda que para añadir un elemento a nuestra lista de la compra,
podemos hacer lo siguiente:
>>> lista_de_la_compra.append(’chocolate’)
>>> print(lista_de_la_compra)
[’huevos’, ’leche’, ’queso’, ’lechuga’, ’manteca de cacahuetes’, ’levadura’, ’chocolate’]
Al menos ahora sı́ que hemos mejorado la lista de la compra.
22
CAPÍTULO 2. 8 MULTIPLICADO POR 3.57 IGUAL A. . .
. . . y suprimiendo elementos
Podemos quitar elementos de una lista mediante el uso de la orden ‘del’ (que
es una forma corta de escribir delete, que en inglés significa ‘borrar’). Por ejemplo,
para eliminar el sexto elemento de la lista (levadura) podemos escribir:
>>> del lista_de_la_compra[5]
>>> print(lista_de_la_compra)
[’huevos’, ’leche’, ’queso’, ’lechuga’, ’manteca de cacahuetes’, ’chocolate’]
Recuerda que las posiciones comienzan a contar desde cero, por lo que lista de la compra[5] se refiere en realidad al sexto elemento.
2 listas mejor que 1
Podemos unir listas mediante el operador de suma, como si estuvieramos sumando dos números:
>>>
>>>
>>>
[1,
lista1 = [ 1, 2, 3 ]
lista2 = [ 4, 5, 6 ]
print(lista1 + lista2)
2, 3, 4, 5, 6]
También podemos juntar las dos listas y asignar la lista resultante a otra variable:
>>>
>>>
>>>
>>>
[1,
lista1 = [ 1, 2, 3 ]
lista2 = [ 4, 5, 6 ]
lista3 = lista1 + lista2
print(lista3)
2, 3, 4, 5, 6]
Y puedes multiplicar una lista de la misma forma que multiplicamos una cadena
(recuerda que la multiplicación de una cadena por un número lo que hace es crear
una cadena que repite tantas veces la original como el número por el que multiplicas):
>>> lista1 = [ 1, 2 ]
>>> print(lista1 * 5)
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
En el ejemplo anterior multiplicar lista1 por cinco lo que significa es “repite la lista1
cinco veces”. Sin embargo, no tiene sentido utilizar la división (/) ni la resta () cuando estamos trabajando con listas, por eso Python mostrará errores cuando
intentas ejecutar los siguientes ejemplos:
2.7. TUPLAS Y LISTAS
23
>>> lista1 / 20
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: ’list’ and ’int’
o:
>>> lista1 - 20
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: ’type’ and ’int’
El resultado será un mensaje de error bastante feo.
2.7.
Tuplas y Listas
Una tupla (mencionada anteriormente) es una cosa parecida a una lista, la
diferencia es que en lugar de utilizar corchetes, utilizas paréntesis—por ejemplo ‘(’
y ‘)’. Las tuplas funcionan de forma similar a las listas:
>>> t = (1, 2, 3)
>>> print(t[1])
2
La diferencia principal es que, a diferencia de las listas, las tuplas no se pueden
modificar después de haberlas creado. Por eso si intentas reemplazar un valor como
hicimos antes en la lista, lo que hace Python es dar un mensaje de error.
>>> t[0] = 4
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: ’tuple’ object does not support item assignment
Eso no significa que no puedas cambiar el contenido de la variable para que
en lugar de contener a la tupla, contenga otra cosa. Este código funcionará sin
problemas:
>>> mivar = (1, 2, 3)
>>> mivar = [ ’una’, ’lista’, ’de’, ’cadenas’ ]
En primer lugar hemos creado la variable mivar que apunta a una tupla compuesta por 3 números. Luego modificamos mivar para que apunte a una lista de
24
CAPÍTULO 2. 8 MULTIPLICADO POR 3.57 IGUAL A. . .
cadenas. Al principio te puede resultar algo confuso. Pero trata de pensar en las
taquillas del gimnasio o del colegio, cada taquilla está etiquetada con un nombre.
Pones cualquier cosa en la taquilla, cierras la puerta con llave y después la tiras.
Entonces le arrancas la etiqueta y te vas a otra taquilla vacı́a, le pones la etiqueta
que te llevaste y metes algo dentro (pero esta vez te quedas con la llave). Una tupla
es como una taquilla cerrada. No puedes modificar lo que hay dentro. Pero puedes
llevarte la etiqueta (la variable) y y pegarla en otra taquilla abierta, y entonces
puedes poner cosas dentro de ella y sacar cosas de ella—ası́ son las listas.
2.8.
Cosas que puedes probar
En este capı́tulo hemos visto cómo hacer cálculos con fórmulas matemáticas
simples utilizando la consola de Python. También hemos visto cómo los paréntesis
pueden modificar el resultado de una fórmula, al controlar el orden en que se calculan
las operaciones. Hemos aprendido cómo decirle a Python que recuerde valores para
usarlos más tarde—utilizando variables—además de aprender a usar las ‘cadenas’
de Python para almacenar textos, y cómo usar las listas y las tuplas para almacenar
más de un elemento.
Ejercicio 1
Crea una lista de tus juguetes favoritos y llámala juguetes. Crea una lista de
tus comidas favoritas y llámala comidas. Une las dos listas y llama al resultado
favoritos. Finalmente imprime la variable favoritos.
Ejercicio 2
Si tienes 3 cajas que contienen 25 chocolates cada una, y 10 bolsas que contienen 32 caramelos cada una, ¿cuántos dulces y chocolates tienes en total? (Nota:
puedes calcularlo con una fórmula en la consola de Python)
Ejercicio 3
Crea variables para almacenar tu nombre y tus apellidos. Después crea una
cadena con un texto que quieras e incluye marcadores para añadir tu nombre y
apellidos. Imprime el resultado para verlo en la consola de Python.
Capı́tulo 3
Tortugas, y otras criaturas lentas
Hay ciertas similitudes entre las tortugas del mundo real y una tortuga Python.
En el mundo real, la tortuga es un reptil verde (a veces) que se mueve muy lentamente
y lleva la casa a su espalda. En el mundo de Python, una tortuga es una flecha negra
y pequeña que se mueve lentamente en la pantalla. Aunque no lleva ninguna casa a
cuestas.
De hecho, al considerar que una tortuga de Python va dejando un rastro según
se mueve por la pantalla, aún es menos parecida a una tortuga de la vida real, por lo
que se parece más a un caracol o a una babosa. Sin embargo, supongo que un módulo
que se denominara ‘babosa’ no hubiera sido especiamente atractivo, por lo que tiene
sentido que sigamos pensando en tortugas. Únicamente tienes que imaginar que la
tortuga lleva consigo un par de rotuladores, y va dibujando por el suelo según se
mueve.
En el oscuro, profundo y distante pasado, existı́a un simple lenguaje de programación llamado Logo. Logo se utilizaba para controlar a una tortuga robot (que
se llamaba Irving, por cierto). Pasado el tiempo, la tortuga evolucionó de ser un
robot que se podı́a mover por el suelo, a una pequeña flecha que se movı́a por la
pantalla.
Lo que demuestra que las cosas no siempre mejoran con el avance de la tecnologı́a—un pequeño robot tortuga serı́a mucho más divertido.
El módulo de Python llamado turtle1 (volveremos a hablar de los módulos más
adelante, pero por ahora imagina que un módulo es algo que podemos usar dentro
de un programa) es parecido al lenguaje de programación Logo, pero mientras Logo
era (y es) un poco limitado, Python sirve para muchas más cosas. El módulo turtle
1
‘turtle’ en inglés significa ‘tortuga’. Los nombres de módulos de Python no se pueden traducir
y deben escribirse en la consola sin equivocar ninguna letra
25
26
CAPÍTULO 3. TORTUGAS, Y OTRAS CRIATURAS LENTAS
nos vale para aprender de forma sencilla cómo los ordenadores hacer dibujos en la
pantalla de tu ordenador.
Comencemos y veamos como funcina. El primer paso es decirle a Python que
queremos usar el módulo ‘turtle’, para ello hay que “importar” el módulo:
>>> import turtle
Lo siguiente que necesitamos hacer es mostrar un lienzo sobre el que dibujar.
Un lienzo es una base de tela que los artistas usan para pintar; en este caso es un
espacio en blanco en la pantalla sobre el que podemos dibujar:
>>> t = turtle.Pen()
En este código, ejecutamos una función especial (Pen) del módulo turtle. Lo
que sirve para crear un lienzo sobre el que dibujar. Una función es un trozo de código
que podemos reutilizar (como con los módulos, volveremos con las funciones más
tarde) para hacer algo útil tantas veces como necesitemos—en este caso, la función
Pen crea el lienzo y devuelve un objeto que representa a una tortuga—asignamos
el objeto a la variable ‘t’ (en efecto, le estamos dando a nuestra tortuga el nombre
‘t’). Cuando teclees el código en la consola de Python, verás que aparece en pantalla
una caja blanca (el lienzo) que se parece a la de la figura 3.1.
Sı́, esa pequeña flecha en medio de la pantalla es la tortuga. Y, no, si lo estás
pensando tienes razón, no se parece mucho a una tortuga.
Puedes darle órdenes a la tortuga utilizando funciones del objeto que acabas de
crear (cuando ejecutaste turtle.Pen())—puesto que asignamos el objeto a la variable
t, utilizaremos t para dar las órdenes. Una orden que podemos dar a la tortua es
forward2 . Decirle forward a la tortuga supone darle la orden para que se mueva hacia
adelante en la dirección en que ella esté mirando (No tengo ni idea si es una tortuga
chico o chica. Vamos a pensar que es una chica). Vamos a decirle a la tortuga que
se mueva hacia adelante 50 pixels (hablaremos sobre lo que son en un minuto):
>>> t.forward(50)
Deberı́as ver en tu pantalla algo parecido a la figura 3.2.
Desde el punto de vista de ella, se ha movido hacia adelante 50 pasos. Desde
nuestro punto de vista, se ha movido 50 pixels.
Pero, ¿Qué es un pixel?
2
‘forward’ significa ‘adelante’ en inglés
27
Figura 3.1: Una flecha que representa a la tortuga.
Figura 3.2: La tortuga dibuja una lı́nea.
28
CAPÍTULO 3. TORTUGAS, Y OTRAS CRIATURAS LENTAS
Figura 3.3: Ampliando la lı́nea y la flecha.
Un pixel es un punto de la pantalla.
En la pantalla del ordenador todo lo que aparece está formado por pequeños
puntos (cuadrados). Los programas que usas y los juegos a los que sueles jugar en el
ordenador, o en una Playstation, o una Xbox, o una Wii; todos se muestran a base
de un gran puñado de puntos de diferentes colores organizados en la pantalla. De
hecho, si la observaras con una lupa, serı́as capaz de verlos. Por eso si mirásemos con
la lupa en el lienzo para ver la lı́nea que acaba de dibujar la tortuga observarı́amos
que está formada por 50 puntos. También podrı́amos ver que la flecha que representa
la tortuga está formada por puntos cuadrados, como se puede ver en la figura 3.3.
Hablaremos más sobre los puntos o pixels, en un capı́tulo posterior.
Lo siguiente que vamos a hacer es decirle a la tortuga que se gire a la izquierda
o derecha:
>>> t.left(90)
Esta orden le dice a la tortuga que se gire a la izquierda 90 grados. Puede que
no hayas estudiado aún los grados en el cole, ası́ que te explico que la forma más
fácil de pensar en ellos, es que son como si dividieramos la circunferencia de un reloj
como vemos en la figura 3.4.
La diferencia con un reloj, es que en lugar de hacer 12 partes (o 60, si cuentas
minutos en lugar de horas), es que se hacen 360 divisiones o partes de la circunferencia. Por eso, si divides la circunferencia de un reloj en 360 divisiones, obtienes
90 divisiones en el trozo en el que normalmente hay 3, 180 en donde normalmente
hay 6 y 270 en donde normalmente hay 9; y el 0 estarı́a en la parte de arriba (en
el comienzo), donde normalmente está el número de las 12 horas. La figura 3.5 te
muestra las divisiones en grados de la circunferencia.
Visto esto, ¿Qué es lo que realmente significa que le des a la tortuga la orden
left(90)?
Si estás de pie mirando en una dirección y extiendes el brazo hacia el lado
directamente desde el hombro, ESO son 90 grados. Si apuntas con el brazo izquierdo,
29
Figura 3.4: Las ‘divisiones’ en un reloj.
Figura 3.5: Grados.
30
CAPÍTULO 3. TORTUGAS, Y OTRAS CRIATURAS LENTAS
Figura 3.6: La tortuga después de girar a la izquierda.
serán 90 grados hacia la izquierda. Si apuntas con con el brazo derecho, serán 90
grados a la derecha. Cuando la tortuga de Python se gira a la izquierda, planta su
nariz en un punto y luego gira todo el cuerpo para volver la cara a hacia la nueva
dirección (lo mismo que si te volvieras tú hacia donde apuntas con el brazo). Por
eso el código t.left(90) da lugar a que la flecha apunte ahora hacia arriba, como se
muestra en la figura 3.6.
Vamos a probar las mismas órdenes de nuevo algunas veces más:
>>>
>>>
>>>
>>>
>>>
>>>
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
Nuestra tortuga ha dibujado un cuadrado y está a la izquierda mirando en la
misma dirección en la que comenzó (ver figura 3.7).
Podemos borrar lo que está dibujado en el lienzo con la orden clear3 :
>>> t.clear()
Existen algunas otras funciones básicas que puedes utilizar con tu tortuga:
3
En inglés ‘clear’ significa ‘limpiar’
31
Figura 3.7: Dibujando un cuadrado.
reset4 , que también sirve para limpiar la pantalla pero que además vuelve a poner a
la tortuga en su posición de comienzo; backward5 , que mueve la tortuga hacia atrás;
right, que hace girar a la tortuga a la derecha; up6 (para de dibujar) que le dice a la
tortuga que pare de dibujar cuando se mueve (en otras palabras, levanta el rotulador
del lienzo); y finalmente down7 (comienza a dibujar) lo que sirve para decirle a la
tortuga que vuelva a dibujar. Puedes utilizar estas funciones de la misma forma que
las otras:
>>>
>>>
>>>
>>>
>>>
t.reset()
t.backward(100)
t.right(90)
t.up()
t.down()
Volveremos al módulo turtle en breve.
4
En
En
6
En
7
En
5
inglés
inglés
inglés
inglés
‘reset’ significa ‘reiniciar’
‘backward’ significa ‘hacia atrás’
‘up’ significa ‘arriba’
‘down’ significa ‘abajo’
32
3.1.
CAPÍTULO 3. TORTUGAS, Y OTRAS CRIATURAS LENTAS
Cosas que puedes probar
En este capı́tulo hemos visto como utilizar el módulo turtle para dibujar lineas
simple utiliando giros a la izquierda y a la derecha. Hemos visto que la tortuga
utilizar grados como unidad de giro, y que son algo similar a las divisiones de los
minutos en un reloj.
Ejercicio 1
Crea un lienzo utilizando la función Pen del módulo turtle, y luego dibuja un
rectángulo.
Ejercicio 2
Crea otro lienzo utilizando la función Pen del módulo turtle, y después dibuja
un triángulo. (Es más complicado de lo que parece)
Capı́tulo 4
Cómo preguntar
En términos de programación, una pregunta normalmente significa que queremos hacer o una cosa u otra, dependiendo de la respuesta a la pregunta. A la
sentencia que permite esto se la denomina sentencia if 1 . Por ejemplo:
¿Qué edad tienes? Si eres mayor de 20 años, ¡eres demasiado viejo!
Esto podrı́a escribirse en Python con la siguiente sentencia if:
if edad > 20:
print(’¡Eres demasiado viejo!’)
Un sentencia if se compone de un ‘if’ seguido una ’condición’ (explicaremos
lo que es una condición en breve), seguido de dos puntos (:). Las lı́neas siguientes
deben formar un bloque—y si la respuesta a la condición es ‘sı́’ (En términos de
programación decimos que si la respuesta a la condición es True2 ) se ejecutarán las
sentencias del bloque.
En la figura 4.1 se muestra el flujo de ejecución del ejemplo anterior. las lı́neas
gruesas contı́nuas muestran lo que se ejecuta, las lı́neas discontı́nuas muestran caminos posibles que en este ejemplo no se ejecutan. En este capı́tulo se mostrarán
más diagramas como el de la figura para tratar de explicarte de forma gráfica, con
caminos que son como calles, cómo se ejecutan los ejemplos. Presta mucha atención
a este primer ejemplo y no avances hasta que lo entiendas bien.
Una condición es un cálculo de programación cuyo resultado es ‘Sı́’ (True) o
‘No’ (False). Hay ciertos sı́mbolos (u operadores) que se utilizan para crear condiciones, como son:
1
2
En inglés ‘if’ significa ‘si’
En inglés ‘True’ significa ‘Verdadero’
33
34
CAPÍTULO 4. CÓMO PREGUNTAR
Si edad > 20
SI
NO
print("¡Eres demasiado viejo!")
Figura 4.1: Diagrama de ejecución de la sentencia if
==
igual
!= no igual o distinto de
>
mayor que
<
menor que
>=
mayor o igual que
<=
menor o igual que
Por ejemplo, si tienes 10 años, entonces la condición tu edad == 10 tendrı́a
como resultado True (Sı́), pero si no tienes 10 años, devolverı́a False (No). Recuerda:
no confundas los dos sı́mbolos de igual (==) utilizados para las condiciones, con el
sı́mbolo de igual utilizado para asignar valores (=)—si utilizas un único sı́mbolo =
en una condición, Python devolverá un mensaje de error.
Si asumimos que asignas tu edad a la variable edad, entonces si tienes 12 años,
la condición. . .
edad > 10
. . . darı́a como resultado el valor True. Si tuvieras 8 años, el resultado serı́a
False. Si tuvieras 10 años, el resultado también seguirı́a siendo False—porque la
condición comprueba que sea mayor que (>) 10, y no mayor o igual (>=) que 10.
35
edad = 10
Si edad > 10
SI
NO
print("llegué aquí")
Figura 4.2: Otro flujo de ejecución de una sentencia if.
Vamos a probar varios ejemplos:
>>> edad = 10
>>> if edad > 10:
...
print(’llegué aquı́’)
Si teclearas el ejemplo anterior en la consola, ¿Qué sucederı́a?
Nada.
El valor de la variable edad no es mayor que 10, por eso el bloque interior a la
sentencia if (la sentencia print) no se ejecutará. Se puede observar lo que sudece en
la figura 4.2
Y qué pasará con el siguiente ejemplo:
36
CAPÍTULO 4. CÓMO PREGUNTAR
edad = 10
Si edad >= 10
SI
NO
print("llegué aquí")
Figura 4.3: Otro flujo de ejecución del ejemplo anterior.
>>> edad = 10
>>> if edad >= 10:
...
print(’llegué aquı́’)
Si pruebas este ejemplo en la consola, entonces deberı́as ver el mensaje ‘llegué aquı́’ impreso en la consola. La figura 4.3 muestra la ejecución.
Lo mismo sucederá con el siguiente ejemplo:
>>> edad = 10
>>> if edad == 10:
...
print(’llegué aquı́’)
llegué aquı́
Que se muestra en la figura 4.4.
37
edad = 10
Si edad == 10
SI
NO
print("llegué aquí")
Figura 4.4: Otro flujo más.
38
4.1.
CAPÍTULO 4. CÓMO PREGUNTAR
Haz esto. . . o ¡¡¡SI NO!!!
Podemos extender una sentencia if, para que haga algo cuando una condición
no sea verdadera. Por ejemplo, imprimir la palabra ‘Hola’ en la consola si tu edad
es de 12 años, pero imprimir ‘Adiós’ si no lo es. Para hacer esto, utilizamos una
sentencia if-then-else (es una forma de decir “si algo es verdad, entonces haz esto,
en caso contrario haz esto otro”):
>>> edad = 12
>>> if edad == 12:
...
print(’Hola’)
... else:
...
print(’Adiós’)
Hola
Teclea el ejemplo anterior y verás la palabra ‘Hola’ en la consola. El diagrama
de ejecución de este ejemplo es como se muestra en la figura 4.5.
Cambia el valor de la variable edad a otro número y verás que se imprime la
palabra ‘Adiós’:
>>> edad = 8
>>> if edad == 12:
...
print(’Hola’)
... else:
...
print(’Adiós’)
Adiós
Ahora la edad no es 12 por lo que la ejecución varı́a. El digrama de la figura 4.6
muestra que la ejecución ahora es diferente al de la figura 4.5.
4.2.
Haz esto. . . o haz esto. . . o haz esto. . . o ¡¡¡SI
NO!!!
Podemos extender aún más la sentencia if utilizando elif (contracción de elseif). Por ejemplo, podemos preguntar si tu edad es 10, o si es 11, o si es 12 y ası́ cuanto
queramos:
4.2. HAZ ESTO. . . O HAZ ESTO. . . O HAZ ESTO. . . O ¡¡¡SI NO!!!
edad = 12
NO (else)
Si edad == 12
print("Adiós")
SI
print("Hola")
Figura 4.5: Flujo de ejecución de una setencia if-else.
39
40
CAPÍTULO 4. CÓMO PREGUNTAR
edad = 8
NO (else)
Si edad == 12
print("Adiós")
SI
print("Hola")
Figura 4.6: Flujo de ejecución que sigue el camino del else.
4.3. COMBINANDO CONDICIONES
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
>>> edad = 12
>>> if edad == 10:
...
print(’tienes
... elif edad == 11:
...
print(’tienes
... elif edad == 12:
...
print(’tienes
... elif edad == 13:
...
print(’tienes
... else:
...
print(’¿Eh?’)
...
tienes 12 a~
nos
41
10 a~
nos’)
11 a~
nos’)
12 a~
nos’)
13 a~
nos’)
En el código anterior, la lı́nea 2 pregunta si el valor de la variable edad es igual
a 10. Si no lo es, entonces salta a la lı́nea 4 sin ejecutar la 3. En la lı́nea 4 valida si el
valor de la variable edad es igual a 11. De nuevo no lo es, por eso salta a la lı́nea 6
sin ejecutar la 5. Este caso, comprueba el valor y sı́ que es igual a 12. Por eso Python
ejecuta el bloque de la lı́nea 7, y ejecuta esa sentencia print. (Espero que te hayas
dado cuenta de que hay 5 grupos en este código—lı́neas 3, 5, 7, 9 y 11). Después,
una vez ejecutado un bloque, no se pregunta por ninguna de las condiciones que
están después y se salta al final de todos los if, después del else en la lı́nea 12.
¿Complicado? Un poco. Observa la figura 4.7 para tratar de entenderlo un
poco mejor.
4.3.
Combinando condiciones
Puedes combinar condiciones utilizando las palabras ‘and’ y ‘or’3 . Ası́ podemos
comprimir el ejemplo anterior un poco, utilizando ‘or’ para unir condiciones:
1.
2.
3.
4.
>>> if edad == 10 or edad == 11 or edad == 12 or edad == 13:
...
print(’tienes %s a~
nos’ % edad)
... else:
...
print(’¿Eh?’)
Si alguna de las condiciones de la lı́nea 1 es verdadera (por ejemplo, si la
variable edad vale 10 o vale 11 o vale 12 o vale 13), entonces se ejecuta el bloque de
código de la lı́nea 2, en otro caso Python continúa en la lı́nea 4.
El diagrama de la figura 4.8 muestra que el or es parecido al elif en la forma
en la que se comprueba cada parte de la condición. Basta con que una de ellas sea
3
En inglés significan ‘Y’ y ‘O’
42
CAPÍTULO 4. CÓMO PREGUNTAR
edad = 12
Si edad == 10
SI
print("tienes 10 años")
NO
Si edad == 11
SI
print("tienes 11 años")
NO
Si edad == 12
SI
print("tienes 12 años")
NO
Si edad == 13
SI
print("tienes 13 años")
NO
print("¿Eh?")
Figura 4.7: Múltiples caminos posibles gracias al uso de elif.
4.4. VACÍO
43
cierta para que se ejecute el bloque que contiene el if. En caso de no ser ninguna
cierta se ejecuta el bloque de sentencias del else.
Aún podemos mejorar un poquito más el ejemplo mediante el uso de la palabra
‘and’ y los sı́mbolos >= y <=.
1.
2.
3.
4.
>>> if edad >= 10 and edad <= 13:
...
print(’tienes %s a~
nos’ % edad)
... else:
...
print(’¿Eh?’)
Seguramente te has figurado ya que si son verdaderas (True) ambas condiciones de la lı́nea 1 entonces se ejecuta el bloque de código de la lı́nea 2 (si la edad es
mayor o igual que 10 y menor o igual que 13). Ası́ que si la variable edad vale 12,
se mostrará en la consola la frase ‘tienes 12 años’: puesto que 12 es mayor o igual
que 10 y menor o igual que 13.
El diagrama de la figura 4.9 muestra que el uso del and hace que sea necesario
cumplir todas las condiciones incluidas para que se pueda ejecutar el bloque de
sentencias del if. En cuanto haya una condición que no se cumpla se ejecuta en su
lugar el bloque de sentencias correspondiente al else.
4.4.
Vacı́o
Hay otra clase de valor que se puede asignar a una variable del que no hablamos
en el capı́tulo anterior: Nada.
De igual forma que podemos asignar a una variable valores que representan
números, cadenas y listas, ’nada’ también es un valor que se puede asignar. En
Python, el valor que representa el vacı́o, la nada, se escribe como None4 (En otros
lenguajes de programación se llama Null) y se puede utilizar del mismo modo que
otros valores:
>>> mivalor = None
>>> print(mivalor)
None
None se suele utilizar para quitarle el valor que tenı́a una variable, de forma
que esté ‘limpia’. También se suele utilizar para crear una variable sin asignarle un
valor antes de que se utilice.
4
En inglés ‘None’ significa ‘Ninguno’
44
CAPÍTULO 4. CÓMO PREGUNTAR
edad = 12
Si edad == 10
SI
NO
O edad == 11
SI
NO
O edad == 12
SI
NO
O edad == 13
SI
print("tienes %s años" % edad)
NO
print("¿Eh?")
Figura 4.8: Condiciones complejas usando or.
45
4.4. VACÍO
edad = 12
Si edad >= 10
NO
SI
Y edad <= 13
NO
print("¿Eh?")
SI
print("tienes %s años" % edad)
Figura 4.9: Condiciones complejas usando and.
46
CAPÍTULO 4. CÓMO PREGUNTAR
Por ejemplo, si todos los miembros de tu equipo de fútbol estuviérais consiguiendo fondos para comprar unos uniformes nuevos, y te tocase contar cuanto
dinero se ha recoletado, Posiblemente quisieras esperar hasta que todo el equipo
hubiera regresado con el dinero que ha conseguido cada uno antes de comenzar a sumarlo todo. En términos de programación, podrı́amos crear una variable para cada
miembro del equipo, asignándole a cada una de ellas el valor None:
>>> jugador1 = None
>>> jugador2 = None
>>> jugador3 = None
Entonces podrı́amos utilizar la sentencia if para validar si todos los miembros
del equipo han vuelto con el dinero:
>>> if jugador1 is None or jugador2 is None or jugador3 is None:
...
print(’Por favor, espera a que vuelvan todos los jugadores’)
... else:
...
print(’Has conseguido %s euros’ % (jugador1 + jugador2 + jugador3))
La sentencia if del ejemplo valida si alguna de las variables tiene el valor None,
e imprime el primer mensaje si es ası́. Si todas las variables tienen un valor real
(algún número) se imprime el segundo mensaje que suma el dinero total antes de
hacerlo. Si pruebas el código anterior con todas las variables valiendo None, verás el
primer mensaje en la consola (no te olvides de crear primero las variables o Python
mostrará un mensaje de error):
>>> if jugador1 is None or jugador2 is None or jugador3 is None:
...
print(’Por favor, espera a que vuelvan todos los jugadores’)
... else:
...
print(’Has conseguido %s euros’ % (jugador1 + jugador2 + jugador3))
Por favor, espera a que vuelvan todos los jugadores
Si asignamos algún valor a una o a dos variables aún se imprime el mismo
mensaje:
>>>
>>>
>>>
...
...
...
Por
jugador1 = 100
jugador3 = 300
if jugador1 is None or jugador2 is None or jugador3 is None:
print(’Por favor, espera a que vuelvan todos los jugadores’)
else:
print(’Has conseguido %s euros’ % (jugador1 + jugador2 + jugador3))
favor, espera a que vuelvan todos los jugadores
Finalmente, cuando asignamos valor a todas las variables el resultado es la suma de
todos los valores y, por lo tanto, el dinero que hemos recolectado:
4.5. ¿CUÁL ES LA DIFERENCIA. . .?
>>>
>>>
>>>
>>>
...
...
...
Has
jugador1 = 100
jugador3 = 300
jugador2 = 500
if jugador1 is
print(’Por
else:
print(’Has
conseguido 900
4.5.
47
None or jugador2 is None or jugador3 is None:
favor, espera a que vuelvan todos los jugadores’)
conseguido %s euros’ % (jugador1 + jugador2 + jugador3))
euros
¿Cuál es la diferencia. . .?
¿Cuál es la diferencia entre 10 y ’10’?
Podrı́as decir que no mucha aparte de las comillas. Bien, de la lectura de los
capı́tulos anteriores, sabes que el primero es un número y que el segundo es una cadena. Esto los hace ser más distintos de lo que podrı́as imaginar. Antes comparamos
el valor de una variable (edad) con un número en una sentencia if:
>>> if edad == 10:
...
print(’tienes 10 a~
nos’)
Si asignas el valor 10 a la variable edad, se imprimirá la cadena en la consola:
>>> edad = 10
>>> if edad == 10:
...
print(’tienes 10 a~
nos’)
...
tienes 10 a~
nos
Si embargo si lo que asignas a la variable edad es el valor ’10’ (observa las
comillas), entonces no se imprimirá la cadena:
>>> edad = ’10’
>>> if edad == 10:
...
print(’tienes 10 a~
nos’)
...
¿Porqué no se ejecuta el código del bloque interior al if? Porque una cadena
siempre es diferente a un número, incluso aunque se parezcan:
48
CAPÍTULO 4. CÓMO PREGUNTAR
>>>
>>>
>>>
10
>>>
10
edad1 = 10
edad2 = ’10’
print(edad1)
print(edad2)
¡Ves! Parecen exactamente lo mismo. Pero, como uno es una cadena y el otro
es un número, son valores diferentes. Por eso edad == 10 (edad igual a 10) nunca
será True (verdadero) cuando la variable edad contiene un valor que es una cadena.
Posiblemente la mejor manera de imaginártelo es considerar 10 libros y 10
ladrillos. El número de elementos puede que sea el mismo, no puedes decir que
10 libros sean igual que 10 ladrillos, ¿o sı́? Afortunadamente en Python existen
funciones mágicas que puede convertir cadenas en números y números en cadenas
(aunque nunca convertirán ladrillos en libros). Por ejemplo, para convertir la cadena
‘10’ en un número puedes utilizar la función int5 :
>>> edad = ’10’
>>> edad_convertida = int(edad)
La variable edad convertida contiene el número 10, y no una cadena. Para convertir
un número en una cadena, podrı́as utilizar la función str6 :
>>> edad = 10
>>> edad_convertida = str(edad)
La variable edad convertida contiene ahora la cadena ‘10’, y no un número. Si
volvemos ahora a la sentencia if que no imprimı́a nada:
>>> edad = ’10’
>>> if edad == 10:
...
print(’tienes 10 a~
nos’)
...
Si convirtiéramos la variable antes de la validación, entonces el resultado serı́a diferente:
>>> edad = ’10’
>>> edad_convertida = int(edad)
>>> if edad_convertida == 10:
...
print(’tienes 10 a~
nos’)
...
tienes 10 a~
nos
5
‘int’ es la contracción de ‘integer’ que significa ‘entero’ en inglés y se refiere a los números
enteros: 0, 1, 2,... y también -1, -2, -3, ...
6
‘str’ es la contracción de ‘string’ que significa ‘cadena’ en inglés
4.6. COSAS QUE PUEDES PROBAR
4.6.
49
Cosas que puedes probar
En este capitulo hemos visto que la sentencia if nos permite preguntar por
valores de una variable y decidir qué código queremos ejecutar según el resultado sea
Verdadero (True) o Falso (False).
Ejercicio 1
¿Qué crees que se imprimirá en pantalla al ejecutar este código?
>>> valor = 1000
>>> if valor > 100:
...
print(’Tengo una moto’)
... else:
...
print(’Tengo un coche’)
¿Y al ejecutar este otro?
>>>
>>>
>>>
...
...
...
valor1 = 30
valor2 = 80
if valor1 + valor2 < 100:
print(’Tengo una moto’)
else:
print(’Tengo un coche’)
Ejercicio 2
Crea una variable con el valor que quieras. Luego utiliza una sentencia if para
que se imprima en consola la palabra ’hola’ si la variable tiene un valor menor que
100, la palabra ’chao’ si la variable vale entre 100 y 200, y la palabra ’adiós’ si el
valor de la variable es cualquier otro (Pista: recuerda que puedes usar la opción else
y la palabra and para poner dos condiciones en un mismo if).
50
CAPÍTULO 4. CÓMO PREGUNTAR
Capı́tulo 5
Una y otra vez
No hay nada peor que tener que hacer lo mismo una y otra vez. Hay una
razón por la que tus padres te dicen que cuentes ovejas para que te duermas, y no
tiene nada que ver con el sorprendente poder para inducir al sueño de los mamı́feros
lanosos. Lo que importa es el hecho de que repetir algo sin parar es aburrido, y
a tu cerebro le deberı́a resultar más fácil dormirse si no está pensando en cosas
interesantes.
Particularmente a los programadores tampoco les gusta repetirse. También les
da el sueño. Esta es una buena razón por la que todos los lenguajes de programación
tienen lo que se llama un for-loop1 . Por ejemplo, para imprimir 5 veces la palabra
hola en Python, podrı́as escribir lo siguiente:
>>> print("hola")
hola
>>> print("hola")
hola
>>> print("hola")
hola
>>> print("hola")
hola
>>> print("hola")
hola
Lo que es. . . bastante aburrido.
O podrı́as utilizar un bucle for-loop (nota: hay 4 espacios en la segunda lı́nea
antes de la sentencia print—Los hemos resaltado utilizando @ para que puedas ver
donde están):
1
En inglés ‘for’ significa ‘para’ y ‘loop’ signica ‘giro’ o ‘bucle’
51
52
CAPÍTULO 5. UNA Y OTRA VEZ
>>> for x in range(0, 5):
... @@@@print(’hola’)
...
hola
hola
hola
hola
hola
La función range2 permite crear de forma rápida y sencilla una lista de números
que comienza en el primero y finaliza antes del último. Por ejemplo:
>>> print(list(range(10, 20)))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Por eso, en el caso del for-loop, lo que el código ‘for x in range(0, 5)’ le está diciendo a Python es que cree una lista de números [0, 1, 2, 3, 4] y que luego, para
cada número—de uno en uno—, lo guarde en la variable x. Por eso podrı́amos usar
la variable x en la sentencia que imprime si ası́ lo quisieramos:
>>> for x in range(0, 5):
...
print(’hola %s’ % x)
hola 0
hola 1
hola 2
hola 3
hola 4
Si no lo hiciéramos con la sentencia for-loop, el código que habrı́a que escribir
serı́a algo ası́:
x = 0
print(’hola
x = 1
print(’hola
x = 2
print(’hola
x = 3
print(’hola
x = 4
print(’hola
%s’ % x)
%s’ % x)
%s’ % x)
%s’ % x)
%s’ % x)
Ası́ que la sentencia for, que nos permite hacer un bucle, nos ha ahorrado tener
que teclear 8 lı́neas extra de código. Esto es muy útil, puesto que un programador
2
En inglés ‘range’ significa ‘rango’
53
normal, cuando tiene que teclear, es más perezoso que un hipopótamo en un dı́a de
calor. Los buenos programadores odian tener que hacer las cosas más de una vez, por
eso la sentencia for es una de las más útiles en cualquier lenguaje de programación.
¡¡¡AVISO!!!
Si has intentado teclear los ejemplos anteriores sobre la marcha,
podrı́a ser que Python te haya mostrado un extraño mensaje
de error cuando introdujiste el código dentro del for-loop. Si
fue ası́ se parecerı́a a esto:
IndentationError: expected an indented block3
Si ves un error como este, significa que te ha faltado teclear los
espacios de la segunda lı́nea. En Python los espacios son muy
importantes (o un espacio normal o un tabulador). Hablaremos
sobre ellos enseguida. . .
En realidad no tenemos que utilizar la función range, podemos utilizar las
listas que hayamos creado. Como por ejemplo, la lista de la compra que creamos en
el último capı́tulo:
>>> lista_de_la_compra = [ ’huevos’, ’leche’, ’queso’, ’apio’,
... ’manteca de cacahuete’, ’levadura’ ]
>>> for i in lista_de_la_compra:
...
print(i)
huevos
leche
queso
apio
manteca de cacahuete
levadura
El código anterior es una forma de decir, “para cada elemento en la lista,
almacena el valor en la variable ‘i’ y luego imprime el contenido de esa variable”. Si,
como antes, no utilizásemos el bucle for-loop, tendrı́amos que haber hecho algo ası́:
54
CAPÍTULO 5. UNA Y OTRA VEZ
>>> lista_de_la_compra = [ ’huevos’, ’leche’, ’queso’, ’apio’,
... ’manteca de cacahuete’, ’levadura’ ]
>>> print(lista_de_la_compra[0])
huevos
>>> print(lista_de_la_compra[1])
leche
>>> print(lista_de_la_compra[2])
queso
>>> print(lista_de_la_compra[3])
apio
>>> print(lista_de_la_compra[4])
manteca de cacahuete
>>> print(lista_de_la_compra[5])
levadura
Gracias al bucle nos hemos ahorrado tener que teclear un montón de código.
La figura 5.1 trata de explicar de forma gráfica el funcionamiento del bucle
for. Python llega al bucle for y observa la lista. Lo primero que hace es iniciar un
contador interno que nosotros no vemos nunca pero que a Python le vale para saber
por dónde va ejecutando el bucle y cuándo tiene que terminar. Luego, antes de
hacer ninguna sentencia del bloque interior lo siguiente que hace es comprobar que
el contador no ha llegado al final de la lista. Esto lo hace incluso la primera vez.
Ten en cuenta que la lista podrı́a no tener ningún elemento (podrı́a estar vacı́a). Si
aún quedan elementos, el contador es menor que el número de elementos de la lista,
entonces asigna a la variable que hemos dicho el elemento correspondiente de lista
y ejecuta el bloque de la setencia for una vez. Finalizada la ejecución del bloque,
incrementa en uno el contador y vuelve al comienzo a preguntar si el contador es
menor que el número de elementos. Ası́ se ejecuta, tantas veces como elementos haya
en la lista. Cuando el contador ya no sea menor que los elementos de la lista el bucle
for termina.
5.1.
¿Cuándo un bloque no es cuadrado?
Cuando es un bloque de código.
¿Y qué es lo que es un ‘bloque de código’ ?
Un bloque de código es un conjunto de sentencias del programa que quieres
que estén agrupadas. Por ejemplo, en el bucle for-loop anterior, podrı́a suceder que
quisieras hacer algo más que imprimir los elementos de la lista. Tal vez quisieras
comprar cada elemento y luego imprimirlo. Suponiendo que tuviéramos una función
llamada ‘comprar’, podrı́amos escribir el siguiente código:
55
5.1. ¿CUÁNDO UN BLOQUE NO ES CUADRADO?
for i in lista_de_la_compra
contador = 0
NO
contador < número elementos de la lista
SI
i = lista_de_la_compra[contador]
(ejecuta las sentencias del bloque)
comprar(i)
print(i)
contador = contador + 1
Figura 5.1: Dando vueltas en un bucle for.
56
CAPÍTULO 5. UNA Y OTRA VEZ
>>> for i in lista_de_la_compra:
...
comprar(i)
...
print(i)
No te molestes en teclear el ejemplo anterior en la consola de Python—porque
no tenemos ninguna función comprar y dará un mensaje de error si intentas ejecutarlo—
únicamente nos sirve para demostrar el uso de un bloque de código de Python compuesto por 2 sentencias:
comprar(i)
print(i)
En Python, los espacios en blanco resultado del tabulador (cuando pulsas la
tecla tab) y del espacio (cuando pulsas la barra espaciadora) son muy importantes.
El código que está en la misma posición queda agrupado para formar bloques.
esto podrı́a ser el bloque 1
esto podrı́a ser el bloque 1
esto podrı́a ser el bloque 1
esto podrı́a ser el bloque 2
esto podrı́a ser el bloque 2
esto podrı́a ser el bloque 2
esto aún serı́a el bloque 1
esto aún serı́a el bloque 1
esto podrı́a ser bloque 3
esto podrı́a ser bloque 3
esto podrı́a ser bloque 4
esto podrı́a ser bloque 4
esto podrı́a ser bloque 4
Pero debes ser consistente con los espacios. Por ejemplo:
>>> for i in lista_de_la_compra:
...
comprar(i)
...
print(i)
La segunda lı́nea (función comprar(i)) comienza con 4 espacios. La tercera
(función print(i)) comienza con 6 espacios. Veamos de nuevo el código haciendo
visibles los espacios (utilizando @ de nuevo):
>>> for i in lista_de_la_compra:
... @@@@comprar(i)
... @@@@@@print(i)
Esto provocarı́a un error. Una vez comienzas a utilizar 4 espacios, debes seguir
usándolos. Y si quieres poner un bloque dentro de otro bloque, necesitarás usar
5.1. ¿CUÁNDO UN BLOQUE NO ES CUADRADO?
57
más de 4 espacios, los que sean, pero los mismos durante todo el bloque. Es buena
práctica de programación utilizar el doble de los espacios del bloque inicial, en este
caso 8 (2 x 4) al comienzo de las lı́neas del bloque interno.
Ası́ que si el primer bloque tiene 4 espacios (Lo volveremos a resaltar para que
puedas verlos):
@@@@Aquı́ está mi primer bloque
@@@@Aquı́ está mi primer bloque
El segundo bloque (que está ‘dentro’ del primero) necesitará más de 4 espacios,
vamos a usar 8:
@@@@Aquı́ está mi primer bloque
@@@@Aquı́ está mi primer bloque
@@@@@@@@Aquı́ está mi segundo bloque
@@@@@@@@Aquı́ está mi segundo bloque
Y si quisiéramos un tercer bloque ‘dentro’ del segundo necesitarı́amos más de
8 espacios. Para mantener nuestro criterio utilizarı́amos 12 (3 x 4):
@@@@Aquı́ está mi primer bloque
@@@@Aquı́ está mi primer bloque
@@@@@@@@Aquı́ está mi segundo bloque
@@@@@@@@Aquı́ está mi segundo bloque
@@@@@@@@@@@@Aquı́ está mi tercer bloque
@@@@@@@@@@@@Aquı́ está mi tercer bloque
@@@@@@@@@@@@Aquı́ está mi tercer bloque
A Python le es indiferente el número de espacios que use cada bloque siempre
que sean los mismos para cada lı́nea de un bloque, y que los bloques internos a otros
(anidados) tengan más espacios que aquél en el que se anidan. No obstante, es buena
práctica utilizar siempre el mismo número de espacios en el código para cada nivel
de bloque con el fin de que quede más claro al leerlo. Norlmamente, como ya hemos
comentado, usaremos múltiplos del primer nivel para los bloques interiores.
¿Por qué queremos poner un bloque ‘dentro’ de otro? Normalmente hacemos
esto cuando el segundo bloque depende de alguna manera del primero. Tal y como
pasa con nuestro bucle for-loop. Si la lı́nea con el código for es el primer bloque,
entonces las sentencias que queremos que se ejecuten una y otra vez están en el
segundo bloque—estas sentencias dependen del primer bloque para funcionar apropiadamente (el valor de la variable del bucle cambia cada vez). Por último, conviene
tener en cuenta que el primer bloque está formado por todo lo que está a su nivel de
58
CAPÍTULO 5. UNA Y OTRA VEZ
espacios o más espaciado dentro de él. Hasta que aparece otra lı́nea al mismo nivel.
Para aclararlo, muestro un par de ejemplos pero esta vez con rayitas destacando los
bloques:
+---esto podrı́a ser el bloque 1
|
esto podrı́a ser el bloque 1
|
esto podrı́a ser el bloque 1
|
+---esto podrı́a ser el bloque 2
|
|
esto podrı́a ser el bloque 2
|
+---esto podrı́a ser el bloque 2
|
esto aún serı́a el bloque 1
|
esto aún serı́a el bloque 1
|
+---esto podrı́a ser bloque 3
|
|
esto podrı́a ser bloque 3
|
+---esto podrı́a ser bloque 3
|
+---esto podrı́a ser bloque 4
|
|
esto podrı́a ser bloque 4
+-------+---esto podrı́a ser bloque 4
+---Aquı́ está mi primer bloque
|
Aquı́ está mi primer bloque
|
+---Aquı́ está mi segundo bloque
|
|
Aquı́ está mi segundo bloque
|
|
+---Aquı́ está mi tercer bloque
|
|
|
Aquı́ está mi tercer bloque
+---+---+---Aquı́ está mi tercer bloque
Cuando inicias un bloque en la consola, Python continúa el bloque hasta que
pulsas la tecla Intro en una lı́nea en blanco (mientras se teclea el bloque la consola
mostrará 3 puntos al comienzo de la lı́nea para mostrar que estás aún en un bloque.
Vamos a intentar algunos ejemplos de verdad. Abre la consola de Python
y teclea lo siguiente (recuerda que debes pulsar la barra espaciadora 4 veces al
comienzo de las lı́neas con las funciones print)
>>> milista = [ ’a’, ’b’, ’c’ ]
>>> for i in milista:
...
print(i)
...
print(i)
...
a
a
b
b
c
c
Después del segundo print, pulsa la tecla Intro en la lı́nea en blanco—esto sirve
5.1. ¿CUÁNDO UN BLOQUE NO ES CUADRADO?
59
para decirle a la consola que quieres finalizar el bloque. Entonces se imprimirá cada
elemento de la lista dos veces.
El siguiente ejemplo provocará que se muestre un mensaje de error:
>>> milista = [ ’a’, ’b’, ’c’ ]
>>> for i in milista:
...
print(i)
...
print(i)
...
File \<stdin>", line 3
print(i)
^
IndentationError: unexpected indent
El segundo print tiene 6 espacios, no 4, lo que no le gusta a Python ya que
espera que los espacios permanezcan iguales dentro del bloque.
RECUERDA
Si inicias los bloques de código con 4 espacios debes continuar
utilizando 4 espacios. Si inicias los bloques con 2 espacios, debes
continuar utilizando 2 espacios. Te recomiendo utilizar 4 espacios porque es lo que suelen utilizar los programadores expertos
en Python.
A continuación muestro un ejemplo más complejo con 2 bloques de código:
>>> milista = [ ’a’, ’b’, ’c’ ]
>>> for i in milista:
...
print(i)
...
for j in milista:
...
print(j)
...
¿Dónde están los bloques en este código? y ¿Qué es lo que hace?
Hay dos bloques—el primero es parte del primer bucle for-loop:
>>> milista = [ ’a’, ’b’, ’c’ ]
>>> for i in milista:
...
print(i)
#
...
for j in milista:
#-- estas lı́neas forman el PRIMER bloque
...
print(j)
#
...
El bloque número dos es la lı́nea print del segundo bucle for-loop:
60
CAPÍTULO 5. UNA Y OTRA VEZ
>>> milista = [ ’a’, ’b’, ’c’ ]
>>> for i in milista:
...
print(i)
...
for j in milista:
...
print(j)
...
# esta lı́nea forma el SEGUNDO bloque
¿Puedes tratar de pensar que es lo que hace este código?
Imprimirá las tres letras de ‘milista’, pero ¿cuántas veces? Si miramos a cada
lı́nea, probablelmente lo descubramos. Sabemos que el primer bucle recorrerá cada
uno de los elementos de la lista, y luego ejecutará las sentencias del bloque número
1. Por lo que imprimirá una letra, luego comenzará el segundo bucle. Este bucle
también recorrerá cada uno de los elementos en la lista y luego ejecutará la sentencia
del bloque 2. Por eso lo que deberı́amos ver al ejecutar el código es ‘a’ seguido de
‘a’, ‘b’, ‘c’, luego ‘b’ seguido de ‘a’, ‘b’, ‘c’, para terminar con ‘c’ y luego seguido de
‘a’, ‘b’ y ‘c’. Introduce el código en la consola de Python para verlo tú mismo:
>>> milista = [ ’a’, ’b’, ’c’ ]
>>> for i in milista:
...
print(i)
...
for j in milista:
...
print(j)
...
a
a
b
c
b
a
b
c
c
a
b
c
¿Qué te parece hacer algo más útil que imprimir letras? ¿Recuerdas el cálculo
que hicimos al comienzo del libro para conocer cuánto podrı́as ahorrar al final del
año si ganases 5 euros haciendo tareas, 30 euros repartiendo periódicos y gastases
10 euros a la semana?
Era ası́:
>>> (5 + 30 - 10) * 52
(Son 5 euros más 30 euros menos 10 euros multiplicados por 52 semanas al año).
5.1. ¿CUÁNDO UN BLOQUE NO ES CUADRADO?
61
Podrı́a ser útil ver cómo se incrementarı́an tus ahorros a lo largo del año según
se van produciendo, en lugar de conocer únicamente lo que tendrás al finalizar.
Podemos hacerlo con un bucle for. Pero primero tenemos que guardar estos números
en variables:
>>> tareas = 5
>>> reparto = 30
>>> gastos = 10
Podemos ejecutar el cálculo original utilizando las variables:
>>> (tareas + reparto - gastos) * 52
1300
O podemos ver los ahorros incrementándose a lo largo del año. Para ello creamos otra variable y usamos un bucle:
1.
2.
3.
4.
5.
>>> ahorros = 0
>>> for semana in range(1, 53):
...
ahorros = ahorros + tareas + reparto - gastos
...
print(’Semana %s = %s’ % (semana, ahorros))
...
En la lı́nea 1 la variable ‘ahorros’ se inicia con el valor 0 (porque no hemos
ahorrado nada aún).
La lı́nea 2 prepara el bucle for que ejecutará todos las sentencias del bloque (el
bloque está compuesto de las lı́neas 3 y 4). Cada vez que se ejecuta el bucle la
variable ‘semana’ contiene el siguiente número en el rango que va de 1 a 52. Lo que
significa que el bucle se ejecuta 52 veces, una por cada semana del año. todo ello
gracias a la función range que genera una lista que contiene los números del 1 al 52.
La lı́nea 3 es un poco más complicada. Lo que queremos es que cada semana se
sume lo que ahorramos con los ahorros que ya tenemos. Piensa que la variable
‘ahorros’ funciona como un banco. Le añadimos el dinero que ganamos en nuestros
trabajos y le quitamos los gastos y luego dejamos lo que queda en el banco. Hablando
en terminologı́a informática, la lı́nea 3 significa, “suma los valores de las variables
ahorros, tareas y reparto, y réstale el valor de la variable gastos. El resultado ası́gnalo
a la variable ahorros—que pierde ası́ su valor original para guardar el nuevo valor”.
En otras palabras, el sı́mbolo igual (=) sirve en Python para decirle que “haga todo
lo que haya que hacer de cálculos a la derecha del igual y luego que lo guarde en la
variable que está en la derecha”.
La lı́nea 4 es una sentencia print un poco más complicada, imprime el número de
semana y la cantidad ahorrada hasta la semana indicada. Consulta la sección Trucos
para las cadenas en la página 18, si esta lı́nea no tiene sentido para ti. Por eso, el
resultado si ejecutas este programa es el siguiente. . .
62
CAPÍTULO 5. UNA Y OTRA VEZ
Semana
Semana
Semana
Semana
Semana
Semana
Semana
Semana
Semana
Semana
Semana
Semana
Semana
Semana
Semana
1 = 25
2 = 50
3 = 75
4 = 100
5 = 125
6 = 150
7 = 175
8 = 200
9 = 225
10 = 250
11 = 275
12 = 300
13 = 325
14 = 350
15 = 375
. . .y ası́ hasta la semana 52.
5.2.
Saliendo de un bucle antes de tiempo
La palabra reservada break se utiliza para parar la ejecución del bucle. Puedes
utilizar la sentencia break dentro de un bucle for o while como en el siguiente ejemplo:
>>> edad = 10
>>> for x in range(1, 100):
...
print(’contando %s’ % x)
...
if x == edad:
...
print(’fin de la cuenta’)
...
break
Si la variable ‘edad’ tuviera el valor 10, este código imprimirı́a:
contando 1
contando 2
contando 3
contando 4
contando 5
contando 6
contando 7
contando 8
contando 9
contando 10
fin de la cuenta
A pesar de que la cuenta del bucle for está prevista para 100 elementos. Existe
una sentencia if que en cada paso del bucle for comprueba si la edad es igual a x. En
5.3. MIENTRAS HABLAMOS SOBRE BUCLES. . .
63
el momento en que x coincide con edad (en este ejemplo es el número 10) se ejecuta
el código de la sentencia if que es un print y un break. La sentencia break hace que
se acabe el bucle for.
5.3.
Mientras hablamos sobre bucles. . .
El bucle for no es la única clase de bucle que puede existir en Python. También
existe el bucle while. Si en el bucle for se sabe exactamente el momento en que se
finaliza, en el bucle while no se conoce necesariamente cuántas veces se ejecutará el
mismo. Imagina una escalera de 20 escalones. Sabes que puedes subirlos fácilmente.
Eso es un bucle for.
>>> for paso in range(0,20):
...
print(paso)
Ahora imagina una escalera que sube a lo largo de una montaña. Te quedarı́as
sin energı́a antes de alcanzar la cima. O el tiempo podrı́a empeorar forzándote a
parar la escalada. Esto es un bucle while4 .
>>> paso = 0
>>> while paso < 10000:
...
print(paso)
...
if cansado:
...
break
...
elif maltiempo:
...
break
...
else:
...
paso = paso + 1
No te molestes en ejecutar el código del ejemplo anterior, porque no nos hemos preocupado de crear las variables cansado y maltiempo. Pero demuestra lo
fundamental de un bucle while. El código del bloque se ejecutará una vez tras otra
mientras el valor de la variable paso sea menor que 10000 (paso < 10000). En el bloque, imprimimos el valor de paso, luego validamos si cansado or maltiempo tienen
el valor verdadero (True). Si cansado es verdadero (tiene el valor True), entonces
la sentencia break finaliza la ejecución del código del bucle (lo que sucede es que
saltamos fuera del bucle a la siguiente lı́nea de código que sigue al bloque inmediatamente después de él). Si maltiempo es verdadero, también salimos del bucle. Si no,
entonces se suma 1 al valor de la variable paso, y se vuelve al comienzo, validándose
de nuevo la condición de salida del bucle while (paso < 10000).
4
En inglés ‘while’ significa ‘mientras’.
64
CAPÍTULO 5. UNA Y OTRA VEZ
Si condición
es verdadera
paso < 10000
NO
SI
(ejecuta las sentencias del bloque)
print(paso)
if cansado:
break
elif maltiempo:
break
else:
paso = paso + 1
Figura 5.2: Dando vueltas en un bucle while.
Ası́ que los pasos de un bucle while son fundamentalmente:
⊲ validar la condición que sigue a la palabra ‘while’,
⊲ ejecutar el bloque,
⊲ volver al comienzo del bucle
Si lo vemos, como en los ejemplos anteriores, con un diagrama, el bucle while
funciona según se observa en la figura 5.2.
Es común que sea necesario crear bucles while que requieran más de una condición, por ejemplo un par de ellas:
5.3. MIENTRAS HABLAMOS SOBRE BUCLES. . .
65
>>> x = 45
>>> y = 80
>>> while x < 50 and y < 100:
...
x = x + 1
...
y = y + 1
...
print(x, y)
En este bucle creamos la variable x con el valor 45, y la variable y con el valor
80. Hay dos condiciones que se chequean en el bucle: si x es menor que 50 y si y es
menor que 100. Mientras ambas condiciones sean verdaderas, se ejecuta el bloque del
código, sumando 1 a ambas variables y luego imprimiéndolas. La salida en pantalla
del código anterior es la siguiente:
46
47
48
49
50
81
82
83
84
85
Posiblemente ya seas capaz de figurarte porqué se imprimen estos números5
Otro uso habitual de un bucle while, es crear bucles casi eternos. O sea, un
bucle que se ejecuta para siempre, o al menos hasta que sucede algo en el bloque de
código interno que lo finaliza. Por ejemplo:
>>> while True:
...
Mucho código aquı́
...
Mucho código aquı́
...
Mucho código aquı́
...
if alguna_condicion es verdadera:
...
break
La condición para el bucle while es ‘True’. Por lo que siempre será verdadera
y ejecutará contı́nuamente el código del bloque (ası́ que el bucle es eterno o infinito). Solamente si la condición ‘alguna condicion’ de la sentencia if es verdadera se
ejecutará la sentencia break y se saldrá del bucle. Puedes ver un ejemplo mejor de
este tipo de bucle en el Apéndice C (en la sección sobre el módulo random), pero
podrı́as querer esperar hasta que hayas leı́do el siguiente capı́tulo antes de echarle
un vistazo.
5
Comenzamos contando en 45 en la variable x y en 80 en la variable y, y luego incrementamos
(añadimos uno) a cada variable cada vez que se ejecuta una vuelta completa del bucle. Las condiciones comprueban que x sea menor que 50 y que y sea menor que 100. Después de cinco pasadas
(sumando 1 a cada variable en cada pasada) el valor de x alcanza el número 50. Ahora la primera
condición (x < 50) ya no es verdadera, por lo que Python finaliza el bucle.
66
CAPÍTULO 5. UNA Y OTRA VEZ
5.4.
Cosas que puedes probar
En este capı́tulo hemos visto como utilizar bucles para ejecutar tareas repetitivas. Y hemos usado bloques de código dentro de los bucles para ejecutar las tareas
que tenı́an que repetirse.
Ejercicio 1
¿Qué piensas que sucederá al ejecutar el siguiente código?
>>> for x in range(0, 20):
...
print(’hola %s’ % x)
...
if x < 9:
...
break
Ejercicio 2
Cuando guardas dinero en un banco, ganas un interés. El ‘interés’ es el dinero
que el banco te paga por dejarle que use tus ahorros—cada año te paga una pequeña
cantidad de dinero dependiendo de cuanto tengas ahorrado. Este pago normalmente
se añade a tus ahorros en la cuenta del banco, con lo que pasa a formar parte de tus
ahorros. . . lo que es un poco confuso, posiblemente deberı́as consultarlo con Mamá o
Papá para que te lo expliquen.
El interés se calcula usando porcentajes. Si no sabes lo que es un porcentaje,
no te preocupes, es suficiente con que sepas que si el banco te está pagando un 1 %
(1 por ciento) de interés, puedes multiplicar tus ahorros por el número 0.01 (si tus
ahorros son $1000, entonces harás: 1000 * 0.01 cuyo resultado es 10). Si te están
pagando un 2 % de interés, puedes utilizar el número 0.02, con lo que el cálculo
será 1000 * 0.02 y te estarán pagando 20, y ası́ sucesivamente.
Si tienes $100 euros ahorrados en una cuenta bancaria, y ellos te pagan un 3 %
de interés cada año, ¿Cuánto dinero crees que tendrás cada año? Calcúlalo durante 10
años. Escribe un programa que utilice un bucle for para calcularlo (Pista: Recuerda
añadir cada año el interés que te pagan al total de tus ahorros).
Capı́tulo 6
Una forma de reciclar. . .
Estoy pensando en la cantidad de basura que generas cada dı́a. Agua embotellada o botellas de refrescos, paquetes de crispies, envoltorios de sandwiches, bolsas
de verduras, bandejas de plástico de la carne, bolsas de plástico de la compra, periódicos, revistas y muchas cosas más. . .
Piensa ahora en lo que pasarı́a si toda esa basura quedase tirada en un montón
al otro lado de tu calle.
67
68
CAPÍTULO 6. UNA FORMA DE RECICLAR. . .
Probablemente reciclas tanto como puedes. Lo cual está muy bien, porque a
nadie le gusta tener que escalar una montaña de basura de camino al colegio. Por
eso, las botellas de cristal van al cubo de reciclar para que las fundan y vuelvan a
hacer nuevas jarras, vasos y botellas con ellas; el papel se vuelve a convertir en papel
reciclado; el plástico sirve para hacer nuevos artı́culos de plástico—de forma que tu
calle no desaparece bajo toneladas de basura. Reutilizamos las cosas que se fabrican
para evitar comernos el mundo a trozos al fabricar continuamente nuevos objetos.
Reciclar o reutilizar también es muy importante en el mundo de la programación. No porque tu programa vaya a desaparecer bajo un montón de basura—sino
porque si no reutilizas algo de lo que haces posiblemente perderı́as los dedos de tanto
teclear.
Hay diversas formas de reutilizar código en Python (en general, en todos los
lenguajes de programación), vimos una de las formas en el Capı́tulo 3, con la función
range. Las funciones son un modo de reutilizar código—de forma que escribes el
código una vez y lo puedes usar en tus programas tantas veces como quieras. Vamos
a comenzar por un ejemplo simple de una función:
>>> def mifuncion(minombre):
...
print(’hola %s’ % minombre)
...
La función anterior se llama ‘mifuncion’ y tiene como parámetro ‘minombre’.
Un parámetro es una variable que solamente está disponible dentro del ‘cuerpo’ de la
función (El cuerpo de la función es el bloque de código que comienza inmediatamente
después de la lı́nea con el def1 ).
Puedes ejecutar la función llamándola por su nombre y utilizando paréntesis
para delimitar el valor que quieras asignar al parámetro:
>>> mifuncion(’Miguel’)
hola Miguel
Podrı́amos modificar la función para que recibiese dos parámetros:
>>> def mifuncion(nombre, apellidos):
...
print(’Hola %s %s’ % (nombre, apellidos))
...
Y podemos ejecutarla de la misma forma que la primera vez:
1
‘def’ es la contracción de ‘define’ que en inglés significa ‘definir’
69
>>> mifuncion(’Miguel’, ’González Pérez’)
Hola Miguel González Pérez
También podrı́amos crear algunas variables y utilizarlas para llamar a la función
(para asignar con ellas los parámetros):
>>> fn = ’Joe’
>>> ln = ’Robertson’
>>> mifuncion(fn, ln)
Hola Joe Robertson
Una función puede devolver valores utilizando la sentencia return2 :
>>> def calcular_ahorros(tareas, reparto, gastos):
...
return tareas + reparto - gastos
...
>>> print(calcular_ahorros(10, 10, 5))
15
Esta función toma 3 parámetros y luego suma los dos primeros, tareas y reparto, antes de restar el último, gastos. El resultado se devuelve con la sentencia
return—este resultado se puede utilizar para asignarlo a una variable (de la misma
forma que lo hemos hecho en otras ocasiones):
>>> mis_ahorros = calcular_ahorros(20, 10, 5)
>>> print(mis_ahorros)
25
Importante, cualquier variable que se use dentro del cuerpo de una función, no
estará accesible (no se podrá usar) a partir de que la función haya finalizado:
>>> def variable_test():
...
a = 10
...
b = 20
...
return a * b
...
>>> print(variable_test())
200
>>> print(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ’a’ is not defined
En el ejemplo anterior creamos la función variable test, que multiplica dos
variables (a y b) y devuelve el resultado. Si llamamos a la función utilizando print3 ,
2
3
En inglés ‘return’ significa ‘retorno’
como ves, ‘print’ es una función que recibe un parámetro en este caso.
70
CAPÍTULO 6. UNA FORMA DE RECICLAR. . .
obtenemos la respuesta: 200. Sin embargo, si intentamos imprimir el contenido de
la variable a (o b), vemos un mensaje de error “‘a’ no está definida”. Esto sucede
por algo que se suele llamar ‘ámbito’ en el mundo de la programación.
Imagina que una función es como una islita en el océano—y que está demasiado
lejos para nadar a ninguna parte desde ella. Ocasionalmente, un avión vuela hasta
ella y deja caer unos trozos de papel en la isla (son los parámetros que llegan a la
función) entonces los habitantes juntan los papeles y crean un mensaje, lo ponen
dentro de una botella y la tiran al mar (la botella es el valor que retorna la función).
A la persona que coge la botella y lee el mensaje no le importa lo que hacen los
isleños, ni cuantos son. Posiblemente esta sea la manera más sencilla de pensar sobre
el concepto de ámbito—únicamente tiene un pequeño problema. Uno de los isleños
tiene unos prismáticos muy potentes y puede ver el continente. Puede ver lo que la
gente está haciendo allı́, y puede afectar al mensaje que están creando:
>>> x = 100
>>> def variable_test2():
...
a = 10
...
b = 20
...
return a * b * x
...
>>> print(variable_test2())
20000
Como se ve, incluso aunque no se pueden utilizar las variables a y b fuera de
la función, la variable x (que se ha creado fuera, y antes, que la función) sı́ se puede
utilizar dentro de ella. Piensa en el isleño con los prismáticos, y tal vez te ayude a
comprender la idea.
En resumen, las variables que están creadas fuera de una función se pueden
utilizar dentro de la función (además de sus parámetros y las que se creen dentro de
la función). Sin embargo, las variables creadas dentro de la función y los parámetros
de la función únicamente están disponibles dentro de la función. En otras palabras,
el ámbito de las variables de dentro de una función está reducido a la propia función,
mientras que el ámbito de las variables exteriores a una función se extiende a las
funciones que se usen después de que la variable se haya creado.
71
El bucle for que creamos en un capı́tulo anterior para mostrar los ahorros de
un año se puede convertir en una función fácilmente:
>>> def obtener_ahorros_anuales(tareas, reparto, gastos):
...
ahorros = 0
...
for semana in range(1, 53):
...
ahorros = ahorros + tareas + reparto - gastos
...
print(’Semana %s = %s’ % (semana, ahorros))
...
Prueba a teclear la función en la consola y luego llámala con diferentes valores
para los parámetros, tareas, reparto y gastos:
>>> obtener_ahorros_anuales(10, 10, 5)
Semana 1 = 15
Semana 2 = 30
Semana 3 = 45
Semana 4 = 60
Semana 5 = 75
Semana 6 = 90
Semana 7 = 105
Semana 8 = 120
Semana 9 = 135
Semana 10 = 150
(continúa...)
72
CAPÍTULO 6. UNA FORMA DE RECICLAR. . .
>>> obtener_ahorros_anuales(25, 15, 10)
Semana 1 = 30
Semana 2 = 60
Semana 3 = 90
Semana 4 = 120
Semana 5 = 150
(continúa...)
Esto es un poco más útil que tener que teclear el bucle for cada vez que quieres
probar con un valor diferente. Las funciones se pueden agrupar en algo llamado
‘módulos’, y con ello Python comienza a convertirse en algo útil de verdad. . .
En breve hablaremos sobre los módulos.
6.1.
Trocitos
Cuando Python se instala en tu ordenador, se instalan con él un montón de
funciones y módulos. Algunas funciones están disponibles por defecto. Por ejemplo,
hemos utilizado sin necesidad de hacer nada más la función range. Otro ejemplo
posible es open4 , que es otra función que aún no hemos usado.
Para poder ver cómo se usa la función open, abre el Block de Notas de Windows
y teclea algunas palabras, luego graba el fichero en el disco C: de la siguiente forma:
1. haz click en el menú Archivo, y pulsa Guardar,
2. haz doble click en ‘Mi PC’ en la ventana de diálogo,
3. haz doble click en ‘Disco Local (C:)’,
4. En la caja de texto de Archivo (abajo) donde dice ‘*.txt’, teclea ‘test.txt’
Abre la consola de Python y prueba lo siguiente:
>>> f = open(’c:\\test.txt’)
>>> print(f.read())
¿Qué es lo que hace este trozo de código? La primera lı́nea llama a la función
open pasándole como parámetro el nombre del fichero que acabas de crear. La función retorna un valor de un tipo especial (denominado ‘objeto’) que representa al
4
En inglés ‘open’ significa ‘abrir’.
6.2. MÓDULOS
73
Figura 6.1: La ventana de diálogo para guardar ficheros del Block de Notas de
Windows.
fichero. No es que sea el propio fichero; es más bien como si la variable fuese como
un dedo que apunta al fichero diciendo “¡¡¡AQUÍ ESTÁ!!!”. Este objeto se guarda
en la variable f.
La siguiente lı́nea llama a la función read5 para leer el contenido del fichero, y el
resultado (el valor que retorna read) se pasa como parámetro a la función print, que
imprime el valor en la consola. Como la variable f contiene un objeto, para ejecutar
la función read es necesario usar el sı́mbolo de punto (.) con la variable objeto y la
función a utilizar. El código f.read() hace que se lea el contenido del fichero f.
El apéndice B (al final del libro) contiene más información sobre
las funciones que vienen ya en Python cuando lo instalas.
6.2.
Módulos
En realidad hemos visto ya un par de formas diferentes de reutilizar código.
Unas son las funciones normales, que podemos crear nosotros mismos o utilizar
las que vienen con Python (como range, open, int y str. Otras son las funciones
especiales que tienen los objetos—que podemos ejecutar utilizando el sı́mbolo punto
(.)—y la siguiente son los módulos; que permiten agrupar muchas funciones y objetos
juntos según sea necesario. Vimos un ejemplo de módulo cuando usamos la tortuga
(el módulo ‘turtle’, que agrupaba un conjunto de funciones sobre la tortuga). Otro
ejemplo de esto es el módulo ‘time’6 :
5
6
En inglés ‘read’ significa ‘leer’
En inglés ‘time’ significa ‘tiempo’
74
CAPÍTULO 6. UNA FORMA DE RECICLAR. . .
>>> import time
La sentencia import se utiliza en Python para decirle que queremos acceder
al módulo cuyo nombre sea el que escribamos después del ‘import’7 . En el ejemplo
anterior estamos diciéndole a Python que queremos usar el módulo ‘time’. De este
modo, después podemos utilizar las funciones y objetos que están disponibles en
este módulo. Para ello tenemos que usar el nombre del módulo seguido del sı́mbolo
punto y de la función a utilizar:
>>> print(time.localtime())
(2006, 11, 10, 23, 49, 1, 4, 314, 1)
localtime es una función que está dentro del módulo time. Retorna la fecha y
la hora actual troceada en una tupla(ver Tuplas y listas en la página 23) en partes
individuales—año, mes, dı́a, hora, minuto, segundo, dı́a de la semana, dı́a del año,
y si hay horario de verano o no (1 si hay, 0 si no hay).
Puedes utilizar otra función (asctime) del módulo time para convertir la fecha
y la hora devuelta por localtime en algo que sea pueda comprender de forma más
sencilla:
>>> t = time.localtime()
>>> print(time.asctime(t))
Sat Nov 18 22:37:15 2006
Podrı́amos escribirlo en una única lı́nea si quisieramos:
>>> print(time.asctime(time.localtime()))
Sat Nov 18 22:37:15 2006
Suponte que quieres pedirle a alguien que teclee algún valor. Se puede hacer
utilizando la sentencia print y el módulo ‘sys’—importándolo del mismo modo que
hiciste con el módulo time:
import sys
Dentro del módulo sys hay un objeto denominado ‘stdin’ (es la contracción de
standard input, que significa ‘entrada estándar’). El objeto stdin posee una función
(a las funciones de los objetos también se las suelen llamar métodos) que se llama
readline—que se usa para leer una lı́nea de texto que alguien introduzca desde el
teclado (Hasta el momento en que se pulse la tecla Intro). Puedes probar la función
readline introduciendo las sentencias siguientes en la consola de Python:
7
En inglés ‘import’ significa ‘importar’
6.2. MÓDULOS
75
>>> print(sys.stdin.readline())
Observarás que el cursor se queda esperando en la pantalla. Ahora puedes
teclear algunas palabras y luego pulsar la tecla Intro. Lo que hayas tecleado se
imprimirá en la consola. Vuelve a pensar por un momento en el código que escribimos
anteriormente con una sentencia if:
if edad >= 10 and edad <= 13:
print(’tienes %s a~
nos’ % edad)
else:
print(’¿Eh?’)
En lugar de crear la variable edad de antemano, podemos pedir que se introduzca el valor desde el teclado. En primer lugar vamos a convertir el código en una
función. . .
>>> def tu_edad(edad):
...
if edad >= 10 and edad <= 13:
...
print(’tienes %s a~
nos’ % edad)
...
else:
...
print(’¿Eh?’)
...
Esta función se puede llamar pasándole un número en el parámetro. Vamos a
probarlo para ver si funciona bien:
>>> tu_edad(9)
¿Eh?
>>> tu_edad(10)
tienes 10 a~
nos
Ahora que sabemos que la función está bien hecha y funciona bien, podemos
modificarla para preguntar por la edad de la persona:
>>> def tu_edad():
...
print(’Por favor, introduce tu edad’)
...
edad = int(sys.stdin.readline())
...
if edad >= 10 and edad <= 13:
...
print(’tienes %s a~
nos’ % edad)
...
else:
...
print(’¿Eh?’)
...
Necesitamos utilizar la función int para convertir en un número el valor que
devuelve readline() puesto que esta última retorna lo que se haya introducido por el
76
CAPÍTULO 6. UNA FORMA DE RECICLAR. . .
teclado en formato cadena. De este modo funcionará correctamente la función if—
vuelve a mirar ¿Cuál es la diferencia? en la página 47 para obtener más información
sobre esto.
Para probarlo tú, ejecuta la función tu edad sin parámetros y luego teclea tu
edad cuando aparezca el texto ‘Por favor, introduce tu edad’:
>>> tu_edad()
Por favor, introduce tu edad
10 # el número es lo que tecleas y finalizas pulsando Intro
tienes 10 a~
nos
>>> tu_edad()
Por favor, introduce tu edad
15
¿Eh?
Lo importante a tener en cuenta es que aunque teclees un número (en los casos
anteriores 10 ó 15), la función readline siempre retorna una cadena.
sys y time son sólo dos de los muchos módulos que están incluidos con Python. Para más información sobre otros módulos de
Python (aunque no todos), mira el Apéndice C.
6.3.
Cosas para probar
En este capı́tulo hemos visto cómo reciclar en Python; mediante el uso de
funciones y módulos. Hemos visto algo de lo que significa el ‘ámbito’ de una variable,
cómo las variables que están fuera de una función ‘se ven’ dentro de ellas mientras
que las que están dentro no se pueden ver fuera, y hemos aprendido cómo crear
nuestras propias funciones utilizando la sentencia def.
Ejercicio 1
En el ejercicio 2 del Capı́tulo 5 creamos un bucle for para calcular el interés
que podrı́amos ganar a partir de 100 euros durante un perı́odo de 10 años. Ese bucle
for podrı́a convertirse fácilmente en una función. Prueba a crear una función que
se llame calcular interes que tome como parámetros la cantidad inicial, y la tasa de
interés. Luego podrás ejecutarla utilizando un código como el que sigue:
calcular_interes(100, 0.03)
6.3. COSAS PARA PROBAR
77
Ejercicio 2
Toma la función que acabas de crear y modifı́cala para que calcule el interés para diferentes perı́odos—por ejemplo, 5 ó 15 años. Será necesario añadir un parámetro
más. Luego podrás ejecutarla de la siguiente forma:
calcular_interes(100, 0.03, 5)
Ejercicio 3
En lugar de una simple función en la que le pasamos los valores como parámetros, podemos hacer un miniprograma que pida por pantalla los valores (utilizando
la función sys.stdin.readline()). La nueva función no tendrá parámetros porque los
datos se introducen con el teclado. De esta forma la llamaremos ası́:
calcular_interes()
Para crear este programa hace falta una función de la que no hemos hablado aún:
float. La función float es muy parecida a la función int. La diferencia es que convierte cadenas en números de coma flotante (con decimales) en lugar de enteros.
Se comentará algo más de estos números en el Capı́tulo 2). Los números de coma
flotante son números con coma decimal (.), como 20.3 o 2541.9338 .
8
En español se usa la coma decimal (,) pero los ingleses utilizan el punto (.) decimal, por eso
para escribir números con coma decimal en Python, y en casi todos los lenguajes de programación,
hay que usar el punto (.)
78
CAPÍTULO 6. UNA FORMA DE RECICLAR. . .
Capı́tulo 7
Un corto capı́tulo sobre ficheros
A estas alturas probablemente ya sepas lo que es un fichero.
Si tus padres tienen una oficina en casa hay posibilidades de que tengan un armario
de archivos de algún tipo. En estos archivos almacenarán diversos papeles importantes (la mayor parte serán cosas aburridas de mayores), normalmente estarán en
carpetas de cartón etiquetadas alfabéticamente o con los meses del año. Los ficheros
de un ordenador son muy similares a esas carpetas de cartón. Tienen etiquetas (el
nombre del fichero), y sirven para almacenar la información importante. Los cajones
de un armario de archivos son como los directorios (o carpetas) de un ordenador y
sirven para organizar los papeles de forma que sea más sencillo de encontrar.
En el capı́tulo anterior creamos un fichero utilizando Python. El ejemplo era
ası́:
>>> f = open(’c:\\test.txt’)
>>> print(f.read())
Un objeto fichero de Python tiene más funciones aparte de read. Después de
todo, los armarios de ficheros no serı́an muy útiles si únicamente pudieras abrir un
cajón y sacar los papeles, pero no pudieras poner nada dentro. Podemos crear un
fichero nuevo vacı́o pasando un parámetro adicional cuando llamamos a la función
open:
>>> f = open(’mifichero.txt’, ’w’)
La ’w’ del segundo parámetro es la forma de decirle a Python que queremos
escribir en el objeto fichero y no leer de él. Ahora podemos añadir información en
el fichero utilizando la función write.
79
80
CAPÍTULO 7. UN CORTO CAPÍTULO SOBRE FICHEROS
>>> f = open(’mifichero.txt’, ’w’)
>>> f.write(’esto es un fichero de prueba’)
Necesitamos decirle a Python cuándo hemos terminado de introducir datos en
el fichero y que no queremos escribir nada más—para ello tenemos que utilizar la
función close.
>>> f = open(’mifichero.txt’, ’w’)
>>> f.write(’esto es un fichero de prueba’)
>>> f.close()
Si abres el fichero utilizando tu editor favorito verás que contiene el texto “esto
es un fichero de prueba”. O mejor aún, podemos usar Python para leerlo de nuevo:
>>> f = open(’mifichero.txt’)
>>> print(f.read())
esto es un fichero de prueba
Capı́tulo 8
Tortugas en abundancia
Volvamos al módulo turtle que comenzamos a usar en el Capı́tulo 3. Recuerda
que para crear el lienzo sobre que el la tortuga dibuja, necesitamos importar el
módulo y crear el objeto ‘Pen’ (el rotulador):
>>> import turtle
>>> t = turtle.Pen()
Ahora podemos usar algunas funciones básicas para mover la tortuga por el
lienzo y dibujar formas simples, pero es más interesante utilizar lo que hemos aprendido en los capı́tulos anteriores. Por ejemplo, el código que utilizamos para crear un
cuadrado era algo ası́:
>>>
>>>
>>>
>>>
>>>
>>>
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
Ahora lo podemos reescribir utilizando un bucle for:
>>> t.reset()
>>> for x in range(1,5):
...
t.forward(50)
...
t.left(90)
...
Ası́ hay que teclear menos, pero aún podemos hacer cosas más interesantes,
intenta lo siguiente:
81
82
CAPÍTULO 8. TORTUGAS EN ABUNDANCIA
Figura 8.1: La tortuga dibujando una estrella de 8 puntas.
>>> t.reset()
>>> for x in range(1,9):
...
t.forward(100)
...
t.left(225)
...
Este código genera una estrella de 8 puntas como la que se muestra en la
figura 8.1 (Cada una de las ocho veces, la tortuga gira 225 grados y se mueve 100
pı́xeles).
Con un ángulo diferente (175 grados), y un bucle mayor (37 veces), podemos dibujar
una estrella con más puntas (se muestra en la figura 8.2):
>>> t.reset()
>>> for x in range(1,38):
...
t.forward(100)
...
t.left(175)
...
O el código siguiente, que genera una estrella en espiral como la de la figura 8.3.
>>> for x in range(1,20):
...
t.forward(100)
...
t.left(95)
...
83
Figura 8.2: Una estrella con más puntas.
Figura 8.3: Una estrella con más puntas.
84
CAPÍTULO 8. TORTUGAS EN ABUNDANCIA
Figura 8.4: Una estrella de nueve puntas.
Esto es algo más complicado:
>>> t.reset()
>>> for x in range(1,19):
...
t.forward(100)
...
if x % 2 == 0:
...
t.left(175)
...
else:
...
t.left(225)
...
En el código anterior, chequeamos la variable x para ver si contiene un número
par. Para hacerlo utilizamos el operador denominado módulo ( %), con la expresión
x % 2 == 0, que pregunta si el resto de la división entre 2 es cero.
x % 2 es cero si el número que contenga la variable x es divisible entre 2, si es
divisible entre dos no queda nada del resto de la división, el resto es cero (que es lo
que hace el operador módulo, retornar el valor del resto de la división)—si no lo ves
muy claro, no te preocupes, simplemente trata de recordar que puedes utilizar ‘x %
2 == 0’ para validar si el valor en una variable es un número par. El resultado de
ejecutar este código es una estrella de nueve puntas como la de la figura 8.4.
No sólo puedes dibujar estrellas y figuras geométricas simples, utilizando una
combinación de llamadas a función, la tortuga puede dibujar muchas cosas diferentes.
Por ejemplo:
8.1. COLOREANDO
85
t.color(1,0,0)
t.begin_fill()
t.forward(100)
t.left(90)
t.forward(20)
t.left(90)
t.forward(20)
t.right(90)
t.forward(20)
t.left(90)
t.forward(60)
t.left(90)
t.forward(20)
t.right(90)
t.forward(20)
t.left(90)
t.forward(20)
t.end_fill()
t.color(0,0,0)
t.up()
t.forward(10)
t.down()
t.begin_fill()
t.circle(10)
t.end_fill()
t.setheading(0)
t.up()
t.forward(90)
t.right(90)
t.forward(10)
t.setheading(0)
t.begin_fill()
t.down()
t.circle(10)
t.end_fill()
Lo que resulta muy largo de dibujar. El resultado es un coche algo feo y primitivo
como el de la figura 8.5. De todos modos nos sirve para demostrar un par de otras
funciones de la tortuga: color, para cambiar el color del rotulador que está utilizando
la tortuga; begin fill y end fill, para rellenar un área del lienzo; and circle, para
dibujar un cı́rculo del tamaño indicado.
8.1.
Coloreando
La función color recibe 3 parámetros. El primero es un valor para el color rojo,
el segundo es para el color verde y el tercero para el azul.
86
CAPÍTULO 8. TORTUGAS EN ABUNDANCIA
Figura 8.5: ¡La tortuga es bastante mala dibujando coches!
¿Por qué rojo, verde y azul?
Si sabes pintar, seguro que conocer parte de la respuesta a esta pregunta.
Cuando mezclas dos pinturas de colores diferentes, el resultado es otro color1 . Cuando mezclas azul y rojo, obtienes el púrpura. . . y cuando mezclas demasiados colores
juntos sueles obtene un marrón sucio. En un ordenador puedes mezclar colores de
la misma manera—junta rojo y verde y tendrás el amarillo—la diferencia es que en
un ordenador estamos mezclando luz de colores, no pintura de colores.
Aunque no estemos utilizando pintura, por un momento piensa en tres grandes
botes de pintura. Rojo, verde y azul. Cada bote está lleno, por lo que diremos que el
bote lleno de pintura vale 1 (o 100 %). En un batidor podemos poner el bote entero
de pintura roja (100 %), y después añadimos el bote completo de pintura verde (de
nuevo el 100 %). Despues de mezclarlos el resultado será el color amarillo. Vamos a
dibujar un cı́rculo amarillo con la tortuga:
>>>
>>>
>>>
>>>
t.color(1,1,0)
t.begin_fill()
t.circle(50)
t.end_fill()
Lo que se hace en el ejemplo anterior es ejecutar la función color con los colores
1
En realidad, los tres colores primarios en pintura son rojo, amarillo y azul, y no rojo/verde/azul (RGB), que lo son en los ordenadores.
8.1. COLOREANDO
87
rojo y verde al 100 % y 0 % para el color azul (en otras palabras, 1, 1, y 0). Para
hacer más sencillo el experimentar con differentes colores, vamos a convertir el código
anterior en una función que dibuje cı́rculos de colores:
>>> def micirculo(rojo, verde, azul):
...
t.color(rojo, verde, azul)
...
t.begin_fill()
...
t.circle(50)
...
t.end_fill()
...
Podemos dibujar un cı́rculo verde brillante utilizando todo el bote de pintura verde
(1 o 100 %):
>>> micirculo(0, 1, 0)
Y podemos dibujar un cı́rculo verde más oscuro utilizando solamente la mitad de la
pintura verde (0.5 o 50 %)
>>> micirculo(0, 0.5, 0)
En este momento ya no tiene mucho sentido seguir pensando en pintura. En el
mundo real, si tienes un bote de pintura verde, no importa cuanto utilices, siempre
será el mismo color. Con los colores en un ordenador lo que estamos haciendo es
jugar con luz, si usamos menos luz de un color lo que sucede es que se ve más oscuro.
Es lo mismo que cuando enciendes una linterna por la noche, la luz es amarillenta—
cuando las pilas se empiezan a gastar cada vez hay menos luz y el color amarillo
se va haciendo cada vez más oscuro, hasta que se apaga del todo y se queda todo
oscuro (o negro). Para que lo veas por tı́ mismo, intenta dibujar cı́rculos con el color
rojo al máximo y con el color rojo a la mitad (1 y 0.5), y luego prueba lo mismo con
el azul.
>>> micirculo(1, 0, 0)
>>> micirculo(0.5, 0, 0)
>>> micirculo(0, 0, 1)
>>> micirculo(0, 0, 0.5)
Utilizando diferentes combinaciones de rojo, verde y azul se puede generar una
amplia variedad de colores. Por ejemplo, puedes conseguir el color dorado utilizando
el 100 % de rojo, 85 % de verde y nada de azul:
88
CAPÍTULO 8. TORTUGAS EN ABUNDANCIA
>>> micirculo(1, 0.85, 0)
El color rosa claro se puede conseguir combinando el 100 % de rojo, 70 % de verde
y 75 % de azul:
>>> micirculo(1, 0.70,0.75)
El naranja se puede conseguir combinando el 100 % de rojo y el 65 % de verde, y el
marrón mezclando 60 % de rojo, 30 % de verde y 15 % de azul:
>>> micirculo(1, 0.65, 0)
>>> micirculo(0.6, 0.3, 0.15)
No olvides que puedes limpiar el lienzo cuando quieras utilizando t.clear(). O reiniciar la todo el lienzo, incluida la posición de la tortuga con la sentencia t.reset().
8.2.
Oscuridad
Tengo una pregunta para ti: ¿Qué sucede por la noche cuando apagas las luces?
Todo se queda negro.
En un ordenador sucede lo mismo con los colores. Si no hay luz no hay colores.
Por eso el valor del negro en un ordenador es 0 para el rojo, 0 para el verde y 0 para
el azul:
>>> micirculo(0, 0, 0)
Genera un circulo negro como el de la figura 8.6.
Lo contrario también es cierto; si utilizas el 100 % en el rojo, verde y azul, el
color que sale es el blanco. Utiliza el código siguiente y desaparecerá el circulo negro:
>>> micirculo(1,1,1)
8.3.
Rellenando las cosas
Probablemente te has dado cuenta ya de que la función begin fill activa el
relleno de figuras y la función end fill finaliza el relleno. Vamos a hacerlo con un
cuadrado a partir del código anterior. En primer lugar lo vamos a convertir en una
función. Para dibujar un cuadrado con la tortuga hacemos lo siguiente:
8.3. RELLENANDO LAS COSAS
89
Figura 8.6: ¡Un agujero negro!
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
Al convertirlo en una función podrı́amos pasarle como parámetro el tamaño
que deseamos para el cuadrado. Ası́, la función será un poco más flexible:
>>> def micuadrado(lado):
...
t.forward(lado)
...
t.left(90)
...
t.forward(lado)
...
t.left(90)
...
t.forward(lado)
...
t.left(90)
...
t.forward(lado)
...
t.left(90)
Para probar nuestra función:
90
CAPÍTULO 8. TORTUGAS EN ABUNDANCIA
>>> micuadrado(50)
Para comenzar está bien, pero no es perfecto. Si observas el código del cuadrado
verás el patrón (la repetición). Estamos repitiendo: forward(lado) y left(90) cuatro
veces. Eso es un desperdicio. Ası́ que podemos utilizar el bucle for para que haga
las repeticiones por nosotros (de igual modo que hicimos antes):
>>> def micuadrado(lado):
...
for x in range(0,4):
...
t.forward(lado)
...
t.left(90)
Es una gran mejora sobre la versión anterior. Ahora vamos a probar la función
usando varios tamaños:
>>>
>>>
>>>
>>>
>>>
>>>
t.reset()
micuadrado(25)
micuadrado(50)
micuadrado(75)
micuadrado(100)
micuadrado(125)
Y la tortuga deberı́a dibujar algo parecido a lo que se ve en la figura 8.7.
Ahora podrı́amos probar un cuadrado relleno. En primer lugar reiniciamos el lienzo
de nuevo (no es exactamente lo mismo que limpiarlo, reiniciar también pone de
nuevo a la tortuga en su lugar de inicio):
>>> t.reset()
Para ello, activamos el relleno y llamamos a la función que crea el cuadrado:
>>> t.begin_fill()
>>> micuadrado(50)
Como verás, el cuadrado no se ve relleno. Para que se rellene es necesario finalizar
con:
>>> t.end_fill()
De este modo se genera un resultado similar al que se ve en la figura 8.8.
¿Qué te parece modificar la función para que pueda dibujar cuadrados rellenos
o sin rellenar según queramos? Para eso necesitamos otro parámetro, y el código
será ligeramente más complejo:
8.3. RELLENANDO LAS COSAS
Figura 8.7: Muchos cuadrados.
Figura 8.8: Un cuadrado negro.
91
92
CAPÍTULO 8. TORTUGAS EN ABUNDANCIA
>>> def micuadrado(lado, relleno):
...
if relleno:
...
t.begin_fill()
...
for x in range(0,4):
...
t.forward(lado)
...
t.left(90)
...
if relleno:
...
t.end_fill()
...
Las primeras dos lı́neas chequean si el valor del parámetro ‘relleno’ es True. Si
lo es, entonces se activa el relleno. Luego se efectúa el bucle cuatro veces para dibujar
los cuatro lados del cuadrado. Por último se vuelve a chequear el valor de la variable
‘relleno’ para desactivarlo en caso de que sea verdadero. Ası́ que ahora es posible
crear un cuadrado relleno simplemente con una llamada a la función micuadrado:
>>> micuadrado(50, True)
Y un cuadrado sin rellenar mediante:
>>> micuadrado(150, False)
Lo que hace que nuestra tortuga dibuje algo como en la figura 8.9. . . . . . Que, ahora
que lo pienso, parece un extraño ojo cuadrado.
Puedes dibujar toda clase de formas y rellenarlas con color. Vamos a convertir
la estrella que dibujamos anteriormente en una función. El código original era:
>>> for x in range(1,19):
...
t.forward(100)
...
if x % 2 == 0:
...
t.left(175)
...
else:
...
t.left(225)
...
Podemos utilizar las mismas sentencias if de la función micuadrado y utilizar
el parámetro lado para que la función sea más flexible:
8.3. RELLENANDO LAS COSAS
93
Figura 8.9: Un ojo cuadrado.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
>>> def miestrella(lado, relleno):
...
if relleno:
...
t.begin_fill()
...
for x in range(1,19):
...
t.forward(lado)
...
if x % 2 == 0:
...
t.left(175)
...
else:
...
t.left(225)
...
if relleno:
...
t.end_fill()
En las lı́neas 2 y 3 activamos el relleno, dependiendo del valor del parámetro
relleno (activa el relleno si el parámetro está activado a True). Las lı́neas 10 y 11
desactivan el relleno en caso de haberse activado. La otra diferencia respecto de esta
función es que pasamos el parámetro lado y lo usamos en la lı́nea 5 para que se
puedan crear estrellas de diferentes tamaños.
Vamos a activar el color dorado (como quizás recuerdes el color dorado se
compone de 100 % de rojo, 85 % de verde y nada de azul), y luego llamamos a la
función que hemos creado:
94
CAPÍTULO 8. TORTUGAS EN ABUNDANCIA
Figura 8.10: Una estrella dorada.
>>> t.color(1, 0.85, 0)
>>> miestrella(120, True)
La tortuga deberı́a dibujar una estrella dorada como la de la figura 8.10. Podemos
añadirle un borde a la estrella, si cambiamos el color de nuevo (esta vez será el
negro) y volviendo a dibujar la estrella con el relleno desactivado:
>>> t.color(0,0,0)
>>> miestrella(120, False)
La estrella ahora se verá como en la figura 8.11.
8.4.
Cosas para probar
En este capı́tulo hemos aprendido algunas cosas más del módulo turtle. Lo
hemos utilizado para dibujar algunas figuras geométricas básicas. Hemos utiliado
funciones paa reutilizar el código y hacer más sencillo dibujar diversas formas de
diferentes tamaños y colores.
8.4. COSAS PARA PROBAR
95
Figura 8.11: Una estrella con borde.
Ejercicio 1
Hemos dibujado estrellas y cuadrados. ¿Qué tal dibujar un octágono? Un
octágono es una forma geométrica que tiene 8 lados. (Pista: prueba a girar 45 grados).
Ejercicio 2
Ahora convierte el código del octágono en una función que sirva para construirlo y permita que se rellene o no según nuestros deseos (y un parámetro que
utilicemos para tal fin).
96
CAPÍTULO 8. TORTUGAS EN ABUNDANCIA
Capı́tulo 9
Algo sobre gráficos
El problema de utilizar una tortuga para dibujar, es. . . que. . .. . . las tortugas. . .. . .. . .
son. . .. . .. . .. . . muy. . .. . .. . .. . .. . . lentas.
Una tortuga, incluso aunque vaya a su máxima velocidad, nunca va rápida.
Para las tortugas, esto no es realmente un problema—tienen todo el tiempo del
mundo—pero cuando estamos hablando de gráficos de ordenador, sı́ que importa.
Si tienes una Nintendo DS, una Gameboy Advance, o juegas en tu ordenado, piensa
por un momento en los gráficos (lo que ves en la pantalla). Hay varias formas en las
que se presentan los gráficos de los juegos: Hay juegos en 2d (en dos dimensiones), en
los que las imágenes son planas y los personajes se mueven únicamente hacia arriba,
abajo, izquierda o derecha—es bastante común en dispositivos portátiles como la
Gameboy, Nintendo DS o teléfonos móviles. Hay también juegos pseudo-3d (casi en
tres dimensiones), en las que las imágenes parecen algo más reales, pero en los que
los personajes aún se mueven únicamente hacia arriba, abajo, izquierda y derecha—
de nuevo son comunes en dispositivos portátiles—y finalmente existen los juegos en
3d, en los que las imágenes de la pantalla intentan imitar la realidad (como en los
simuladores de carreras de coches o de aviones en vuelo).
Todos los tipos de gráficos tienen una cosa en común—se necesita dibujarlos
rápidamente en la pantalla del ordenador. ¿Has probado a hacer tu propia animación? Esa en la que usas un taco de hojas de papel y en la esquina de la primera
página dibuas algo (tal vez un muñequito hecho de rayitas), en la esquina inferior de
la siguiente página dibujas la misma figura en el mismo sitio pero le mueves la pierna
un poco. Luego en la siguiente pagina dibujas la figura de nuevo con la pierna un
poquito más allá. Gradualmente vas página a página dibujando la figura moviéndose
en la esquina inferior del taco de páginas. Cuando has terminado, pasas las páginas
rápidamente con el dedo de forma que parece que el muñequito se está moviendo.
Ası́ son las bases de todas las animaciones que se hacen—ya sean dibujos animados
97
98
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
en la tele o los juegos de ordenador o consola. Dibujas algo en pantalla y luego lo
vuelves a dibujar un poco cambiado de lugar de forma que si se hace rápido parece
que es la misma imagen que se está moviendo. Por es la tortuga no es buena para
hacer gráficos. Par que una imagen parezca que está en movimiento es necesario
dibujar cada ‘frame’ (cuadro) de la animación muy rápido.
Los gráficos en tres dimensiones se hacen de una forma diferente de los de
dos dimensiones, pero la base de la idea es la misma. Para cuando la tortuga ha
terminado de dibujar sólo una pequeña parte de la imagen ya habrı́a que estar
pasando la página e iniciando el dibujo de la siguiente página. . .
9.1. DIBUJO RÁPIDO
9.1.
99
Dibujo rápido
Cada lenguaje de programación tiene una forma (o varias) diferente de dibujar
en la pantalla. Algunos métodos son rápidos y otros son lentos, lo que significa
que los programadores que desarrollan juegos tienen que ser muy cuidadosos con el
lenguaje en el que eligen trabajar.
Python dispone de diferentes formas de dibujar gráficos (incluida la tortuga del
módulo turtle que ya hemos utilizado), pero los mejores métodos (desde el punto de
vista de los gráficos) están en módulos y librerı́as de código que no están incluidas
con el propio lenguaje. Posiblemente tendrás que programar durante varios años
antes de que seas capaz de saber cómo instalar y utilizar una de estas complejas
librerı́as.
Afortunadamente, existe un módulo, que viene con Python, que podemos utilizar para hacer gráficos (a una velocidad ligeramente superior a la tortuga). Tal vez
lo suficientemente rápido como para poderlo llamar la Tortuga de dibujo veloz.
Este módulo se llama tkinter (es un nombre extraño que significa ‘Tk interface’) y que se puede utilizar para crear aplicaciones completas (podrı́as incluso crar
un programa de proceso de textos simple si quisieras—como un Microsoft Word sencillito). Podrı́amos crear una aplicación simple que muestre un botón con el siguiente
código:
100
1.
2.
3.
4.
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
>>>
>>>
>>>
>>>
from tkinter import *
ventana = Tk()
btn = Button(ventana, text="Púlsame")
btn.pack()
En la lı́nea 2 importamos el contenido del módulo Tk para que podamos usarlos . En la segunda lı́nea usamos una de las funciones más útiles del módulo, Tk,
que crea una ventana de las que se dibujan en la pantalla a la que podemos añadir
cosas. Después de teclear la lı́nea 2 verás que la ventana aparece instantáneamente
en la pantalla. En la lı́nea 3 creamos un objeto botón y lo asignamos a la variable
btn. El botón se crea mediante una función a la que se le pasa la ventana (el objeto
creado anteriormente con Tk()) y una cadena que lleva el texto ‘Púlsame’.
1
Parámetros con nombre
Esta es la primera vez que hemos usado ‘parámetros con nombre’. Funcionan como cualquier otro parámetro con la única
diferencia de que pueden aparecer en cualquier orden, es por
eso por lo que hace falta proporcionarles un nombre.
Por ejemplo, supongamos que tenemos una función rectángulo que recibe dos parámetros denominados alto y ancho. Normalmente podrı́amos llamar a la función utilizando algo como
rectangulo(200, 100), que significa que queremos dibujar un
rectángulo de 200 pixels de ancho y 100 pixels de alto.
Si quisieramos que los parámetros pudieran escribirse en
cualquier orden es necesario decir cual es cual, para ello
podrı́amos llamar a la función de la siguiente manera: rectangulo(alto=100, ancho=200).
La idea de los parámetros con nombre es más compleja que lo
que hemos mostrado aquı́, y puede utilizarse de varias formas
para hacer que las funciones se puedan utilizar de formas más
flexibles—pero esta es una materia para un libro más avanzado
que este libro introductorio de programación.
La cuarta lı́nea le indica al botón que se debe dibujar a sı́ mismo. En este
momento, la ventana que creamos en la lı́nea 2 se ajustará al tamaño del botón que
contiene el texto ‘Púlsame’. Verás algo parecido a esto:
1
La diferencia entre ‘import tkinter’ y ‘from Tkinter import *’ es que con la primera sentencia se
importa el módulo pero es necesario utilizar el nombre el módulo para usar las funciones y objetos
que están dentro de él (Tkinter.Tk() o Tkinter.Button(. . .), y con la segunda sentencia se importa
el módulo pero no es necesario usar el nombre del mismo para usarlas (Tk() o Button(. . .)
9.2. DIBUJOS SIMPLES
101
Con lo que llevamos hecho el botón no hace nada especial, pero por lo menos
lo puedes pulsar.
Vamos a hacer que haga algo modificando el ejemplo anterior un poco (asegúrate de que cierras la ventanas que creamos anteriormente). Primero creamos una
función que imprima algún texto:
>>> def saludar():
...
print(’hola’)
Ahora modificamos el ejemplo para que utilice la función que hemos creado:
>>>
>>>
>>>
>>>
from tkinter import *
ventana = Tk()
btn = Button(ventana, text="Púlsame", command=saludar)
btn.pack()
El parámetro con nombre ‘command’ sirve para indicarle al botón que tiene
que ejecutar la función que se le indica cuando se pulse el botón. En nuestro caso,
al pulsar el botón se escribirá el texto ‘hola’ en la consola—cada vez que se pulse el
botón.
9.2.
Dibujos simples
Los botones no son muy útiles cuando lo que quieres es dibujar en la pantalla—
por eso tenemos que crear y añadir un tipo diferente de componente: el objeto Canvas(lienzo). A diferencia de un botón (que toma los parámetros ‘text’ y ‘command’)
cuando creamos un lienzo (canvas), necesitamos pasarle el ancho y la altura (en
pı́xeles) del lienzo. Aparte de esto el resto del código es muy similar al código para
mostrar un botón en pantalla:
>>>
>>>
>>>
>>>
from tkinter import *
ventana = Tk()
lienzo = Canvas(ventana, width=500, height=500)
lienzo.pack()
Como en el caso del botón, al escribir la lı́nea 2 se muestra una ventana en
pantalla. La empaquetar (‘pack’) el lienzo en la lı́nea cuatro se incrementará su
102
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
Figura 9.1: Lienzo y ejes x e y.
tamaño para que quepa el lienzo (de 500x500) en la ventana.
Ahora podemos dibujar una lı́nea en el lienzo utilizando las coordenadas de los
pı́xeles. Las coordenadas indican la posición de los pı́xeles en un lienzo. En un lienzo
del módulo Tk, las coordenadas indican la distancia del los pı́xeles en relación con
la esquina superior izquierda del mismo. En otras palabras, el pixel 0,0 está situado
en la esquina superior izquierda del lienzo.
Del valor que sirve para medir la distancia de izquierda a derecha se dice que
mide la distancia sobre el eje x (izquierda a derecha). Del valor que sirve para medir
la distancia de arriba a abajo se dice que mide la distancia sobre el eje y (arriba a
abajo).
Puesto que el lienzo que hemos creado mide 500 pı́xeles de ancho y 500 pı́xeles
de alto, las coordenadas de la esquina inferior derecha de la pantalla es 500,500.
Por eso, la lı́nea que se muestra en la figura 9.1 hay que dibujarla utilizando las
coordenadas 0,0 como lugar de inicio y las 500,500 como final:
9.3. DIBUJANDO CAJAS
>>>
>>>
>>>
>>>
>>>
103
from tkinter import *
ventana = Tk()
lienzo = Canvas(ventana, width=500, height=500)
lienzo.pack()
lienzo.create_line(0, 0, 500, 500)
Para hacer lo mismo con el módulo turtle hubieramos necesitado el código siguiente:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
import turtle
turtle.setup(width=500, height=500)
t = turtle.Pen()
t.up()
t.goto(-250,250)
t.down()
t.goto(500,-500)
Como se puede ver el código del módulo tkinter es un mejora al ser más corto
y menos complejo. En el objeto canvas (lienzo) existen muchos métodos (funciones)
disponibles, algunos de ellos no nos son muy útiles en este momento, pero vamos a
echar un vistazo a algunos ejemplos con funciones que sı́ que son interesantes.
9.3.
Dibujando cajas
En la tortuga tenı́amos que dibujar una caja avanzando y girando varias veces.
Con tkinter dibujar un cuadrado o rectángulo es bastante más fácil—únicamente
necesitas indicar las coordenadas de las esquinas.
>>>
>>>
>>>
>>>
>>>
1
from tkinter import *
ventana = Tk()
lienzo = Canvas(ventana, width=400,height=400)
lienzo.pack()
lienzo.create_rectangle(10, 10, 50, 50)
En el ejemplo anterior, creamos un lienzo de 400 pı́xeles de ancho y 400 pı́xeles
de alto. Después dibujamos un cuadrado en la esquina superior izquierda (la esquina
superior izquierda del cuadrado esta a 10 pı́xeles de la esquina superior izquierda, y
la esquina inferior derecha está en la posición 50,50). Si te estás preguntando qué es
el número que aparece en la consola después de teclear el código create rectangle y
antes cuando utilizamos create line, te explico que es un número de identificación
para la figura que has dibujado (sea una lı́nea, un cuadrado o un cı́rculo). Volveremos
este número más adelante.
104
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
De acuerdo con lo explicado, los parámetros que se utilizar para create rectangle
son: la esquina superior izquierda (primer y segundo parámetros: posición sobre el
eje X y posición sobre el eje Y) del cuadrado, y la esquina inferior derecha del cuadrado (tercer y cuarto parámetro: posición sobre eje X y posición sobre eje Y). En
adelante, para no tener que explicarlo mucho, nos referiremos a estas coordenadas
como x1, y1 y x2, y2.
Podemos dibujar un rectángulo simplemente haciendo x2 más grande:
>>> lienzo.create_rectangle(100, 100, 300, 50)
O haciendo y2 un poco más grande:
>>> lienzo.create_rectangle(100, 200, 150, 350)
Vamos a explicar este último ejemplo: le decimos al lienzo que cree un rectángulo empezando con la esquina superior izquierda en la posición que comienza en el
pı́xel 100,200 contando desde el borde de la izquierda del lienzo para el primer
número y desde el borde de arriba del lienzo para el segundo número. Y que termine
el rectángulo en el pı́xel 150,350 (también contando desde los bordes izquierdo y
superior). Con ello, deberı́a verse algo como lo que aparece en la figura 9.2.
Vamos a intentar crear rectángulos de diferentes tamaños. Para no tener que
dar los tamaños nosotros mismos, vamos a usar un módulo que se llama random.
Para usarlo, en primer lugar vamos a importar el módulo random 2 :
>>> import random
Ahora podemos crear una función que utilice números aleatorios para identificar las posiciones en las que crear los rectángulos. Para ello tenemos que utilizar la
función randrange:
>>> def rectangulo_aleatorio(lienzo, ancho, alto):
...
x1 = random.randrange(ancho)
...
y1 = random.randrange(alto)
...
x2 = x1 + random.randrange(ancho-x1)
...
y2 = y1 + random.randrange(alto-y1)
...
lienzo.create_rectangle(x1, y1, x2, y2)
La función recibe el alto y el ancho del lienzo para que los rectángulos que
se dibujen en pantalla sean como máximo de ese tamaño. Además recibe el lienzo en el que queremos que se dibuje el rectángulo. La función randrange recibe
2
En inglés ‘random’ significa ‘aleatorio’
9.3. DIBUJANDO CAJAS
105
Figura 9.2: Cajas usando tkinter.
un número como argumento (parámetro) (mira el Apéndice C para ver más usos
de randrange)—ası́ randrange(10) retorna un número entre 0 y 9, randrange(100)
retorna un número entre 0 y 99, y ası́ sucesivamente.
Las lı́neas que asignan las variables x1 e y1 utilizan randrange para establecer
la posición superior izquierda del rectángulo.
Las lı́neas que asignan las variables x2 e y2 también utilizan randrange pero
primero restan los valores calculados como esquina superior izquierda antes de calcular el número aleatorio para que el rectángulo no pueda ser más grande que el ancho
de la pantalla. El número ası́ calculado será el tamaño en pı́xeles del rectángulo, si
le sumamos la posición de inicio tendremos la posición de fin del rectángulo.
Finalmente llamamos a la función create rectangle con las variables creadas.
Puedes probar el código utilizando la función creada pasándole el ancho y alto del
lienzo creado:
>>> rectangulo_aleatorio(400, 400)
Para que aparezcan muchos en pantalla, crearı́amos un bucle:
106
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
Figura 9.3: Un barullo de rectángulos.
>>> for x in range(0, 100):
...
rectangulo_aleatorio(400, 400)
Lo que genera un lienzo un poco embarullado (figura 9.3.
¿Recuerdas cuando en el anterior capı́tulo le decı́amos a la tortuga que dibujase
con diferentes colores utilizando porcentajes de 3 colores: rojo, verde y azul? Con
el módulo tkinter puedes hacer algo similar, pero desafortunadamente, es algo más
complejo que con el módulo turtle. En primer lugar vamos a modificar la función
que genera rectángulos aleatorios para pasarle como parámetro el color con el que
queremos rellenar el rectángulo que se genere:
>>> def rectangulo_aleatorio(lienzo, ancho, alto, color_relleno):
...
x1 = random.randrange(ancho)
...
y1 = random.randrange(alto)
...
x2 = x1 + random.randrange(ancho-x1)
...
y2 = y1 + random.randrange(alto-y1)
...
lienzo.create_rectangle(x1, y1, x2, y2, fill=color_relleno)
La función create rectangle del lienzo puede recibir el parámetro ‘fill’ que sirve
para especificarle el color de relleno. Ahora podemos pasar el color de relleno a la
función de la siguiente forma. Prueba lo siguiente:
107
9.3. DIBUJANDO CAJAS
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
rectangulo_aleatorio(400,
400,
400,
400,
400,
400,
400,
400,
400,
400,
400,
’green’)
’red’)
’blue’)
’orange’)
’yellow’)
’pink’)
’purple’)
’violet’)
’magenta’)
’cyan’)
Algunos, puede que todos, los nombres de colores funcionarán. Pero algunos
de ellos podrı́an dar como resultado un mensaje de error (depende de que estés
utilizando Windows, Mac OS X o Linux). Por ahora es muy sencillo. Pero ¿cómo
hacemos para dibujar con el color dorado? En el módulo de la tortuga utilizamos
las mezclas de luz de colores. En tkinter podemos crear el dorado utilizando:
>>> rectangulo_aleatorio(400, 400, ’#ffd800’)
Lo que es una forma muy extraña de crear un color. ‘ffd800’ es un número
hexadecimal, que sirve para representar números de forma diferente a como solemos
hacerlo. Explicar cómo funcionan los números decimales nos llevarı́a muchas páginas,
ası́ que por el momento, puedes utilizar la siguiente función para crear un color en
hexadecimal:
>>> def hexcolor(rojo, verde, azul):
...
r = 255*(rojo/100.0)
...
g = 255*(verde/100.0)
...
b = 255*(azul/100.0)
...
return ’#%02x%02x%02x’ % (r, g, b)
Si llamamos a la función hexcolor con 100 % para el rojo, 85 % para el verde y
0 % para el azul, el resultado es el número hexadecimal para el color dorado:
>>> print(hexcolor(100, 85, 0))
#ffd800
Puedes crear un color púrpura brillante utilizando 98 % de rojo, 1 % de verde, y 77 %
de azul:
>>> print(hexcolor(98, 1, 77))
#f902c4
Puedes utilizarlo como parámetro de la función rectangulo aleatorio que creamos
anteriormente:
108
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
Figura 9.4: Un rectángulo púrpura.
>>> rectangulo_aleatorio(400, 400, hexcolor(98, 1, 77))
9.4.
Dibujando arcos
Un arco es un trozo de un cı́rculo, pero para dibujarlo con tkinter lo que tienes
que hacer es dibujar un rectángulo. Lo que no parece que tenga mucho sentido. Tal
vez si ves la figura 9.5 te lo aclare un poco. El rectángulo indica a Tkinter el espacio
que tiene para dibujar el arco. El código para dibujar este arco serı́a ası́:
lienzo.create_arc(10, 10, 200, 100, extent=180, style=ARC)
Esta sentencia establece que el espacio rectangular en el que se va a dibujar
el arco tiene la esquina en las coordenadas 10, 10 (10 pı́xeles a la derecha del borde
izquierdo y 10 pı́xeles hacia abajo desde el borde de arriba), y la esquina inferior
derecha del espacio rectangular estará en las coordenadas 200, 100 (200 pı́xeles a
la derecha y 100 pı́xeles hacia abjo de los bordes izquierdo y superior). El siguiente
parámetro (un parámetro con nombre) ‘extent’ se utiliza para especificar los
grados de ángulo del arco. Si no conoces nada sobre grados en un cı́rculo (o arco),
9.5. DIBUJANDO ÓVALOS
109
Figura 9.5: Un arco ajustado dentro de un rectángulo.
recuerda lo que hablamos sobre los cı́rculos, 180 grados serı́a la mitad del cı́rculo.
359 grados serı́a el cı́rculo casi completo, 90 grados un cuarto del cı́rculo y 0 grados
serı́a. . . bueno, nada de nada.
A continuación se muestra código que dibuja un puñado de arcos diferentes para que puedas ver las diferencias básicas existentes al usar diferentes grados (puedes
ver los ejemplos en la figura 9.6):
>>>
>>>
>>>
>>>
>>>
9.5.
lienzo.create_arc(10,
lienzo.create_arc(10,
lienzo.create_arc(10,
lienzo.create_arc(10,
lienzo.create_arc(10,
10, 200, 80, extent=45, style=ARC)
80, 200, 160, extent=90, style=ARC)
160, 200, 240, extent=135, style=ARC)
240, 200, 320, extent=180, style=ARC)
320, 200, 400, extent=359, style=ARC)
Dibujando óvalos
Aunque la última sentencia del ejemplo anterior acaba dibujando un óvalo,
existe una función de tkinter que permite dibujar un óvalo directamente. Se llama
create oval . Del mismo modo que se dibujan los arcos, los óvalos de dibujan dentro
de los lı́mites de un rectángulo. Por ejemplo, el código siguiente:
>>>
>>>
>>>
>>>
ventana = Tk()
lienzo = Canvas(ventana, width=400,height=400)
lienzo.pack()
lienzo.create_oval(1, 1, 300, 200)
Este ejemplo dibuja un óvalo dentro del rectángulo (imaginario) que va desde
las posiciones 1,1 a la 300,200. Si dibujáramos un rectánculo rojo con las mismas
coordenadas lo verı́amos claramente (figura 9.7):
110
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
Figura 9.6: Arcos de diferentes grados.
>>> lienzo.create_rectangle(1, 1, 300, 200, outline="#ff0000")
Para dibujar un cı́rculo, en lugar de un óvalo elı́ptico, el rectángulo ‘imaginario’
deberı́a ser un cuadrado (lo que genera un cı́rculo como el de la figura 9.9):
>>>
>>>
>>>
>>>
9.6.
ventana = Tk()
lienzo = Canvas(ventana, width=400,height=400)
lienzo.pack()
lienzo.create_oval(1, 1, 300, 300)
Dibujando polı́gonos
Un polı́gono es cualquier forma geométrica de 3 o más lados. Los triángulos,
cuadrados, rectángulos, pentágonos y hexágonos son ejemplos de polı́gonos. Además
de estas formas más o menos normales, existen polı́gonos con formas irregulares.
Para dibujarlos con el módulo tkinter se usa la función create polygon. Por
ejemplo, para dibujar un triángulo tienes que proporcionar tres conjuntos de coordenadas (tres posiciones x,y), una para cada esquina del triángulo. El siguiente
código crea el triángulo de la figura 9.10):
9.6. DIBUJANDO POLÍGONOS
Figura 9.7: El dibujo de un óvalo.
Figura 9.8: El dibujo de un óvalo dentro de un rectángulo.
111
112
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
Figura 9.9: Un simple cı́rculo.
>>>
>>>
>>>
>>>
>>>
from tkinter import *
ventana = Tk()
lienzo = Canvas(ventana, width=400,height=400)
lienzo.pack()
lienzo.create_polygon(10, 10, 100, 10, 100, 50, fill="", outline="black")
El siguiente código genera un polı́gono irregular. La figura 9.11 muestra los
dos ejemplos, el triángulo y el polı́gono irregular.
>>> canvas.create_polygon(200, 10, 240, 30, 120, 100, 140, 120, fill="", outline="black")
9.7.
Mostrando imágenes
También puedes mostrar una imagen en un lienzo utilizando tkinter. En primer
lugar tienes que cargar la imagen (normalmente la tendrás que tener ya en un fichero
tu ordenador), luego se utiliza la función create image del objeto lienzo. Para que
lo entiendas mejor el código queda como sigue:
9.7. MOSTRANDO IMÁGENES
Figura 9.10: Un simple triángulo.
Figura 9.11: Un polı́gono irregular junto a un triángulo.
113
114
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
1.
2.
3.
4.
5.
6.
>>>
>>>
>>>
>>>
>>>
>>>
from tkinter import *
ventana = Tk()
lienzo = Canvas(ventana, width=400, height=400)
lienzo.pack()
mi_imagen = PhotoImage(file=’test.gif’)
lienzo.create_image(0, 0, image=mi_imagen, anchor=NW)
Las lı́neas de la 1 a la 4 crean el lienzo tal y como hemos hecho en ejemplos
anteriores. En la lı́nea 5 se carga la imagen en la variable mi imagen. Es muy importante que la imagen que quieres cargar se encuentre un directorio que esté accesible
para Python. Normalmente, esto supone que la imagen tiene que estar en el mismo
directorio en el que arrancaste la consola. También puedes poner el path completo
hasta el fichero, pero esto no lo vamos a explicar aquı́. Para saber el nombre del
directorio en el que puedes poner el fichero con la imagen para que Python la pueda cargar puedes utilizar la función getcwd() del módulo os. Como se trata de un
módulo, tienes que importarlo con ‘import os’:
>>> import os
>>> print(os.getcwd())
Este código imprimirá en la consola algo como ‘c:
Python30’.
Copia tu imagen en el directorio y luego cárgala utilizando la función PhotoImage (como en la lı́nea 5) de tkinter. Después utiliza la función create image para
que se muestre la imagen en el lienzo (lı́nea 6). Si has hecho todo esto correctamente,
verás algo como lo de la figura 9.12.
La función PhotoImage puede cargar imágenes de archivos con las extensiones
.gif, .ppm y pgm. Si quieres cargar otros tipos de imágenes (hay otros muchas formas
de crear ficheros de imágenes—por ejemplo, las cámaras digitales suelen almacenar
las imágenes con extensiones .jpg), necesitarás utilizar una extensión de Python
que añada esta caracterı́stica. La Librerı́a para imágenes de Python (PIL: Python
Imagin Library)3 añade la capacidad de cargar todo tipo de imágenes, ası́ como
hacer cosas como agrandarlas o encogerlas, cambiarle los colores, invertirlas y otras
muchas posibilidades. Sin embargo, instalar esta librerı́a va más allá del ámbito de
este libro.
3
La Python Imagin Library se puede descargar de http://www.pythonware.com/products/pil/index.htm
115
9.8. ANIMACIÓN BÁSICA
Figura 9.12: Una foto.
9.8.
Animación básica
Hasta ahora hemos visto como hacer dibujos estáticos—imágenes que no se
mueven. ¿Qué te parece hacer algo de animación? La animación no es algo en lo que
Tk sea muy potente, pero podemos probar algo básico. Por ejemplo, podemos crear
un triángulo relleno y luego moverlo por la pantalla con el siguiente código:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
>>>
>>>
>>>
>>>
>>>
>>>
1
>>>
...
...
...
import time
from tkinter import *
ventana = Tk()
lienzo = Canvas(ventana, width=400, height=400)
lienzo.pack()
lienzo.create_polygon(10, 10, 10, 60, 50, 35)
for x in range(0, 60):
lienzo.move(1, 5, 0)
ventana.update()
time.sleep(0.05)
Cuando pulses la tecla Intro después de teclear la última lı́nea, el triángulo
comenzará a moverse por la pantalla (puedes verla a mitad de camino en la figura 9.13).
116
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
Figura 9.13: El triángulo moviéndose por la pantalla.
¿Cómo funciona?
Las lı́neas 1 a 4 las hemos visto antes—es la inicialización tı́pica para mostrar
un lienzo—en la lı́nea 6 creamos el triángulo (utilizando la función create polygon).
La lı́nea 7 muestra el identificador (el número 1) que devuelve la función anterior.
En la lı́nea 8 creamos un bucle for que se repite de 0 a 59 (60 veces en total).
El bloque de lı́neas (9 a 11) es el código para mover el triángulo. La función
move del lienzo moverá un objeto sumándole los parámetros a las coordenadas x
e y actuales del objeto. Por ejemplo, en la lı́nea 9 lo que se está diciendo es que
se mueva el objeto con el identificador 1 (el triángulo) 5 pı́xeles en horizontal y 0
pı́xeles en vertical. Si quisiéramos que se volviera a la posición anterior tendrı́amos
que usar números negativos lienzo.move(1, -5, 0).
La función update del objeto ventana obliga a actualizarla (si no usáramos
dicha función, tkinter esperarı́a hasta que el bucle hubiera terminado antes de mover
el triángulo, lo que significarı́a que no lo verı́as moverse). Finalmente la lı́nea 11 le
dice a Python que duerma durante un fracción de segundo (un veinteavo de segundo:
1/20 = 0.05) antes de seguir. Podemos cambiar el tiempo (el parámetro de la función
sleep) para que el triángulo se mueva más rápido o más lento.
También podemos modificar el código para que el triángulo se mueva en diagonal, simplemente modificando la función move: move(1,5,5). Primero, cierra el lienzo
9.9. REACCIONANDO A LOS EVENTOS. . .
117
(pulsando el botón X de la ventana), y luego prueba este código:
>>>
>>>
>>>
>>>
>>>
1
>>>
...
...
...
...
import time
ventana = Tk()
lienzo = Canvas(ventana, width=400, height=400)
lienzo.pack()
lienzo.create_polygon(10, 10, 10, 60, 50, 35)
for x in range(0, 60):
lienzo.move(1, 5, 5)
tk.update()
time.sleep(0.05)
En la figura 9.14 se muestra el triángulo a mitad de camino de la pantalla.
Paa mover el triángulo hacia arriba de la pantlla a su lugar inicial hay que utilizar
el movimiento en negativo, -5, -5:
>>> import time
>>> for x in range(0, 60):
...
lienzo.move(1, -5, -5)
...
tk.update()
...
time.sleep(0.05)
9.9.
Reaccionando a los eventos. . .
Podemos hacer que el triángulo reaccione cuando se pulsa una tecla. Para ello
es necesario utilizar una cosa que se llama enlace a eventos 4 . Los eventos son cosas
que pueden pasar mientras el programa se está ejecutando, por ejemplo: mover el
ratón, pulsar una tecla, o cerrar una ventana. Puedes hacer que el módulo Tk ‘vigile’
estos eventos, y que haga algo como respuesta a ellos. Para comenzar a ‘manejar’
eventos necesitamos empezar creando una función. Imagina que lo que queremos
hacer es mover el triángulo cuando se pulse la tecla Intro. Podemos definir una
función para mover el triángulo:
>>> def mover_triangulo(event):
...
lienzo.move(1, 5, 0)
Es obligatorio que si la función sirve para manejar eventos reciba un único
parámetro (el evento), este parámetro le sirve al módulo Tk para enviar informacion
a la función sobre lo que ha pasado.
4
En inglés lo llaman ‘event bindings’
118
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
Figura 9.14: Triángulo moviéndose en diagonal hacia abajo de la pantalla.
Lo siguiente que hacemos es decirle a Tk que esta función es la que se debe
utilizar para ‘manejar’ un evento concreto. Para ello se utiliza la función del lienzo
bind all. El código completo es como sigue:
>>>
>>>
>>>
>>>
>>>
>>>
...
...
>>>
from tkinter import *
ventana = Tk()
lienzo = Canvas(ventana, width=400, height=400)
lienzo.pack()
lienzo.create_polygon(10, 10, 10, 60, 50, 35)
def mover_triangulo(evento):
lienzo.move(1, 5, 0)
lienzo.bind_all(’<KeyPress-Return>’, mover_triangulo)
El primer parámetro de la función bind all describe el evento que queremos
que Tk atienda. En este caso el evento es <KeyPress−Return> (que es la pulsación
-KeyPress- de la tecla Intro -Return-). Además, el segundo parámetro indica la
función que queremos que se ejecute cada vez que suceda el evento indicado. En este
caso decimos que se llame a la función mover triangulo.
Si ejecutas este código pulsa primero en el lienzo con el ratón para asegurarte
de que está activada esa ventana, luego pulsa la tecla Intro (Return) en el teclado.
9.9. REACCIONANDO A LOS EVENTOS. . .
119
¿Qué te parecerı́a cambiar la dirección del triángulo dependiendo de la tecla
que se pulse, por ejemplo, las teclas de flecha? Primero vamos a modificar la función
move a lo siguiente:
>>> def mover_triangulo(evento):
...
if evento.keysym == ’Up’:
...
lienzo.move(1, 0, -3)
...
elif evento.keysym == ’Down’:
...
lienzo.move(1, 0, 3)
...
elif evento.keysym == ’Left’:
...
lienzo.move(1, -3, 0)
...
elif evento.keysym == ’Right’:
...
lienzo.move(1, 3, 0)
El objeto evento que se pasa como parámetro a la función contiene un conjunto
de propiedades 5 . Una de estas propiedades es keysym que es una cadena con el
nombre de la tecla que se ha pulsado. Si la propiedad contiene la cadena ‘Up’,
ejecutamos la función move con -3 en el eje y, lo que hace que se mueva hacia arriba;
si contiene el texto ‘Down’ sumamos 3 al eje y, lo que hace que se mueva hacia
abajo. Lo mismo se hace para la izquierda y para la derecha. Recuerda que el primer
parámetro es el número que identifica la la figura que se quiere mover en el lienzo, el
segundo valor a sumar al eje x (coordenada horizontal), y el último parámetro es el
valor a sumar al eje y (coordenada vertical). Lo siguiente que hacemos es decirle a
Tk que use la misma función mover triangulo para manejar los eventos de las cuatro
teclas de flecha (Arriba, abajo, izquierda y derecha). El código ahora queda ası́:
5
Las propiedades son valores con nombre que describen algo de un objeto—por ejemplo, una
propiedad del cielo es que es azul (algunas veces), una propiedad de un coche es que tiene ruedas.
En términos de programación, una propiedad tiene un nombre y un valor. Hasta cierto punto son
como variables que pertenecen a un objeto.
120
>>>
>>>
>>>
>>>
>>>
1
>>>
...
...
...
...
...
...
...
...
...
>>>
>>>
>>>
>>>
CAPÍTULO 9. ALGO SOBRE GRÁFICOS
from tkinter import *
ventana = Tk()
lienzo = Canvas(ventana, width=400, height=400)
lienzo.pack()
lienzo.create_polygon(10, 10, 10, 60, 50, 35)
def mover_triangulo(evento):
if evento.keysym == ’Up’:
lienzo.move(1, 0, -3)
elif evento.keysym == ’Down’:
lienzo.move(1, 0, 3)
elif evento.keysym == ’Left’:
lienzo.move(1, -3, 0)
elif evento.keysym == ’Right’:
lienzo.move(1, 3, 0)
lienzo.bind_all(’<KeyPress-Up>’, mover_triangulo)
lienzo.bind_all(’<KeyPress-Down>’, mover_triangulo)
lienzo.bind_all(’<KeyPress-Left>’, mover_triangulo)
lienzo.bind_all(’<KeyPress-Right>’, mover_triangulo)
Su pruebas este ejemplo, observarás que el triángulo se mueve ahora en la dirección
de la tecla de flecha que pulses.
Capı́tulo 10
Cómo seguir desde aquı́
¡Felicidades! Has llegado hasta el final.
Lo que has aprendido con este libro son conceptos básicos que te ayudarán a
aprender otros lenguajes de programación. Aunque Python es un estupendo lenguaje
de programación, un solo lenguaje no es el mejor para todo. Pero no te preocupes si
tienes que mirar otros modos de programar en tu ordenador, si te interesa el tema.
Por ejemplo, si estás interesado en programación de juegos posiblemente te
interese mirar el lenguaje BlitzBasic (www.blitzbasic.com), que utiliza el lenguaje
de programación Basic. O tal vez quieras mirar Flash (que es lo que utilizan muchas páginas web para hacer animaciones y juegos—por ejemplo la página web de
Nickelodeon o la de tamagotchi utilizan mucho código escrito en Flash).
Si estás interesado en programar juegos Flash, un buen lugar para comenzar
podrı́a ser ‘Beginning Flash Games Programming for Dummies’, un libro escrito
por Andy Harris, o una referencia más avanzada como el libro ‘The Flash 8 Game
Developing HandBook’ por Serge Melnikov. Si buscas en la página web de amazon
www.amazon.com por las palabras ‘flash games’ encontrarás un buen número de
libros sobre programación de juegos en Flash.
Algunos otros libros de programación de juegos son: ‘Beginners Guide to DarkBASIC Game Programming’ por Jonathon S Harbour (que también utiliza el lenguaje de programación Basic), y ‘Game Programming for Teens’ por Maneesh Sethi
(que utiliza BlitzBasic). Que sepas que las herramientas de desarrollo de BlitzBasic,
DarkBasic y Flash cuestan dinero (no como Python), ası́ que mamá o papá tendrán
que comprometerse a gastarse dinero antes de que puedas comenzar.
Si quieres seguir con Python para programar juegos, hay un par de sitios en los
que puedes mirar: www.pygame.org, y el libro ‘Game Programming With Python’
por Sean Riley.
121
122
CAPÍTULO 10. CÓMO SEGUIR DESDE AQUÍ
Si no estas interesado especı́ficamente en programar juegos, pero quieres aprender más sobre Python (temas más avanzados), échale un vistazo a ‘Dive into Python’
de Mark Pilgrim (www.diveintopython.org). Existe también un tutorial gratuito para Python que está disponible en: http://docs.python.org/tut/tut.html. Hay muchos
temas que no hemos abordado en esta introducción básica por lo que desde la perspectiva de Python, hay mucho que puedes aprender y practicar aún.
Buena suerte y pásalo bien en tu aprendizaje sobre programación.
Apéndice A
Palabras clave de Python
Las palabras clave (o palabras reservadas) son aquellas palabras importantes
que se utilizan en el propio lenguaje (cada lenguaje de programación tiene sus propias
palabras clave). Si intentases utilizar esas palabras para darle nombre a tus variables
o nombres de función, o las intentases usar de una forma que no esté definida por
el lenguaje, lo que sucederı́a serı́a que Python te mostrarı́a un mensaje de error en
la consola.
En este apéndice se da una breve descripción de cada una de las palabras clave
(o reservadas) del lenguaje de programación Python.
and
La palabra reservada and se utiliza para unir dos expresiones para indicar que
ambas expresiones deben ser True. Por ejemplo:
if edad > 10 and edad < 20
Que significa que la edad debe ser mayor que 10 y menor que 20.
as
La palabra reservada as se utiliza para dar un nombre diferente a un módulo
que acabas de importar. Por ejemplo, si tuvieras un módulo con un nombre como:
soy_un_modulo_de_python_que_no_es_muy_util
Serı́a muy complicado tener que teclear su nombre cada vez que quisieras usar una
función u objeto contenido en él:
123
124
APÉNDICE A. PALABRAS CLAVE DE PYTHON
>>> import soy_un_modulo_de_python_que_no_es_muy_util
>>> soy_un_modulo_de_python_que_no_es_muy_util.llamar_funcion()
He hecho algo
>>> soy_un_modulo_de_python_que_no_es_muy_util.llamar_funcion_haz_otra_cosa()
¡He hecho otra cosa!
En vez de esto, puedes darle otro nombre cuando lo importas, ası́ se puede teclear
el nuevo nombre en lugar del anterior (es como si el nuevo nombre fuera su apodo):
>>> import soy_un_modulo_de_python_que_no_es_muy_util as noutil
>>> noutil.llamar_funcion()
He hecho algo
>>> noutil.llamar_funcion_haz_otra_cosa()
¡He hecho otra cosa!
De todos modos es probable que no uses mucho esta palabra clave.
assert
Assert es una palabra reservada avanzada que utilizan los programadores para indicar que algún código debe ser True. Es una forma de encontrar errores y
problemas en el código—lo normal es que se utilice en programas avanzados y por
programadores expertos.
break
La palabra reservada break se utiliza para parar la ejecución de algún código.
Podrı́as utilizar un break dentro de un bucle for o while como en el siguiente ejemplo:
>>> edad = 10
>>> for x in range(1, 100):
...
print(’contando %s’ % x)
...
if x == edad:
...
print(’fin de la cuenta’)
...
break
Si la variable ‘edad’ tuviera el valor 10, este código imprimirı́a:
125
contando 1
contando 2
contando 3
contando 4
contando 5
contando 6
contando 7
contando 8
contando 9
contando 10
fin de la cuenta
Mira el capı́tulo 5 para obtener más información sobre los bucles for.
class
La palabra reservada class se utiliza para definir un tipo de objeto. Esta
caracterı́stica aparece en muchos lenguajes de programación, es muy útil cuando se
desarrollan programas más complicados, pero es muy avanzada para este libro.
del
Del es una función especial que se utiliza para eliminar algo. Por ejemplo, si
tuvieras una lista de cosas que quisieras para tu cumpleaños anotadas en tu diario,
pero cambiases de opinión sobre una de ellas, podrı́as tacharla de la lista, y añadir
una nueva:
Si tuvieramos una lista en python:
>>> lo_que_quiero = [’coche de control remoto’, ’bicicleta nueva’, ’juego de ordenador’]
Podrı́amos eliminar el juego de ordenador utilizando la función del, y añadir el nuevo
elemento utilizando la función append:
126
APÉNDICE A. PALABRAS CLAVE DE PYTHON
>>> del lo_que_quiero[2]
>>> lo_que_quiero.append(’roboraptor’)
Y luego puedes ver la nueva lista:
>>> print(lo_que_quiero)
[’coche de control remoto’, ’bicicleta nueva’, ’roboraptor’]
Mira el Capı́tulo 2 para más información sobre listas.
elif
La palabra reservada elif se utiliza como parte de la sentencia if. Mira if más
abajo...
else
La palabra reservada else se utiliza también como parte de la sentencia if.
Mira if más abajo...
except
Otra palabra reservada que se utiliza para encontrar problemas en el código.
De nuevo se utiliza en programas más complejos, pero es muy avanzada para este
libro.
exec
exec es una función especial que se utiliza para que Python mire el contenido
de una cadena como si fuese un trozo de código escrito en el propio lenguaje Python.
Por ejemplo, puedes crear una variable y asignarle una cadena como la que sigue en
el ejemplo:
>>> mivariable = ’Hola’
Y luego imprimir el contenido:
127
>>> print(mivariable)
Hola
Pero también podrı́as incluir el código en una cadena:
>>> mivariable = ’print("Hola")’
Y luego utilizar exec para convertir la cadena en un miniprograma Python y ejecutarlo:
>>> exec(mivariable)
Hola
Es una idea algo extraña, y puede parecer que no tiene sentido hasta que lo
necesites. Como en otros casos se trata de una de esas palabras clave que se usa
únicamente en programas más avanzados.
finally
Esta es otra palabra reservada avanzada que se usa para estar seguro de que
cuando sucede un error, se ejecuta siempre el código que se indique (normalmente
para limpiar el ‘desorden’ que haya dejado atrás el código que falló).
for
La palabra reservada for se utiliza para crear bucles. Por ejemplo:
for x in range(0,5):
print(’x vale %s’ % x)
El ejemplo anterior ejecuta el bloque de código (la sentencia print) 5 veces, dando
como resultado la salida:
x
x
x
x
x
vale
vale
vale
vale
vale
0
1
2
3
4
128
APÉNDICE A. PALABRAS CLAVE DE PYTHON
from
Cuando se importa un módulo, puedes importar únicamente la parte que necesites, para ello debes usar la palabra reservada from. Por ejemplo, el módulo turtle
tiene una función denominada Pen(), que se utiliza para crear un objeto Pen (que
es un lienzo sobre el que la tortuga se mueve)—puedes importar el módulo completo
y luego utilizar la función Pen como sigue:
>>> import turtle
>>> t = turtle.Pen()
O puedes importar únicamente la función Pen por sı́ misma, y luego utilizarla
directamente (sin necesidad de referirse al módulo turtle):
>>> from turtle import Pen
>>> t = Pen()
Desde luego, esto significa que no puedes utilizar las partes del módulo que no
hayas importado. Por ejemplo, el módulo time tiene funciones denominadas localtime
y gmtime. Si importamos localtime y luego intentas utilizar gmtime lo que sucede
es que Python devuelve un mensaje de error:
>>> from time import localtime
>>> print(localtime())
(2007, 1, 30, 20, 53, 42, 1, 30, 0)
Funciona bien, pero:
>>> print(gmtime())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ’gmtime’ is not defined
Al decir Python que “‘gmtime’ is not defined” nos está diciendo que no conoce
la función gmtime. . .. Si un módulo tuviera un montón de funciones que quisieras
utilizar pero no quieres tener que usar el nombre del módulo cada vez (que es lo que
sucede cuando importas con ‘import nombre de modulo’) puedes importar todo lo
que contiene el módulo mediante el uso del asterisco (*):
129
>>> from time import *
>>> print(localtime())
(2007, 1, 30, 20, 57, 7, 1, 30, 0)
>>> print(gmtime())
(2007, 1, 30, 13, 57, 9, 1, 30, 0)
En este caso, importamos todo lo que contiene el módulo time, y nos podemos
referir a cada función por su nombre, si tener que poner por delante el nombre del
módulo.
global
En el Capı́tulo 6, hablamos sobre el ámbito. Si recuerdas, el ámbito es la
‘visibilidad’ de una variable. Si una variable está definida fuera de una función,
normalmente se puede ver dentro de la función. Si está definida dentro de una
función, no se puede ver fuera de la función.
La palabra reservada global es una excepción a esta regla. Cuano una variable
se define como global, puede verse en cualquier sitio. Global es algo que es mundial o
universal. Si te imaginas que tu consola de Python es como un minimundo, entonces
global significa que lo ve todo el mundo. Por ejemplo:
>>> def test():
...
global a
...
a = 1
...
b = 2
¿Qué pasarı́a si llamas a print(a), y a print(b), después de ejecutar la función
test? En el primer caso se imprimirá normalmente el valor 1 que fue lo que se asignó a
la variable ‘a’ al ejecutar la función test. El segundo caso generará un mensaje de
error:
>>> test()
>>> print(a)
1
>>> print(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ’b’ is not defined
La variable a es global (visible por todo el ‘mundo’), sin embargo la variable
b únicamente es visible dentro de la función.
Observa que debes llamar a global antes de asignar un valor a la variable.
130
APÉNDICE A. PALABRAS CLAVE DE PYTHON
if
Es una sentencia que sirve para tomar una decisión sobre algo—Muchas veces
se utiliza con las palabras reservadas else y elif (else if). La sentencia if es una forma
de decir, “si algo es verdadero, entonces ejecuta una acción”. Por ejemplo:
if precio_juguete > 1000:
print(’Ese juguete es demasiado caro’)
elif precio_juguete > 100:
print(’Ese juguete es caro’)
else:
print(’Me gustarı́a ese juguete’)
Esta sentencia if significa lo siguiente, si el precio de un juguete es mayor que
1000 euros, es demasiado caro; si el precio del juguete es mayor que 100 euros 1
entonces es caro.... en otro caso se ejecuta la sentencia print y se muestra en consola
“Me gustarı́a ese juguete”. El Capı́tulo 4 tiene más información sobre las sentencias
if.
import
La palabra reservada import es una forma de decirle a Python que cargue el
módulo que se le indica para que se pueda utilizar. Por ejemplo:
>>> import sys
Este código le dice a Python que quieres utilizar el módulo sys.
in
La palabra reservada in se utiliza en las expresiones para descubrir si un elemento está incluido en una colección de elementos (lista, tupla, diccionario). Por
ejemplo, para ver si el número 1 está incluido en una lista podrı́amos hacer:
>>> lista = [1,2,3,4]
>>> if 1 in lista:
...
print(’el número está en la lista’)
el número está en la lista
O si la lechuga está en la lista de la compra:
1
Pero menor o igual a 1000, porque es un elif y ya se ha visto en el if que no es mayor que 1000
euros.
131
>>> lista_de_compra = [ ’huevos’, ’leche’, ’queso’ ]
>>> if ’lechuga’ in lista_de_compra:
...
print(’la lechuga está en la lista de la compra’)
... else:
...
print(’la lechuga no está en la lista de la compra’)
...
la lechuga no está en la lista de la compra
is
La palabra reservada is, es algo ası́ como el operador de igualdad (==) que
sirve para decir si dos cosas son iguales (por ejemplo 10 == 10 es verdadero —
True—, 10 == 11 es falso —False—). Pero hay una diferencia fundamental entre is
y ==. Si estás comparando dos cosas, == puede devolver True, en donde ‘is’ puede
que devuelva False (incluso aunque tú pienses que las cosas son iguales).
Se trata de uno de los conceptos de programación avanzada que tienden a ser
muy confusos, ası́ que por el momento limı́tate a utilizar ==.
lambda
Otra palabra reservada avanzada. De hecho lambda es tan complicada que
escribir una explicación sobre ella podrı́a hacer que este libro ardiera en llamas.
Ası́ que mejor no hablar sobre ella.
not
Si algo es verdadero, la palabra reservada not lo convierte en falso, y lo contrario. Por ejemplo, si creamos una variable x y le asignamos el valor True...
>>> x = True
...y luego imprimimos el valor de x utilizando not, el resultado es:
>>> print(not x)
False
Lo que no parece muy útil, hasta que comienzas a utilizar not en sentencias
if. Por ejemplo, si tienes 12 años y la edad más importante para ti es 12 años, no
querrás tener que referirte al resto de edades diciendo:
132
APÉNDICE A. PALABRAS CLAVE DE PYTHON
“1 no es una edad importante” “2 no es una edad importante” “3 no
es una edad importante” “4 no es una edad importante” ... ... “50 no es
una edad importante”
de uno en uno.
No querrı́as escribirlo ası́:
if edad == 1:
print("1 no
elif edad == 2:
print("2 no
elif edad == 3:
print("3 no
elif edad == 4:
print("4 no
es una edad importante")
es una edad importante")
es una edad importante")
es una edad importante")
. . .y seguir hasta el infinito. Una forma mucho más simple de hacerlo serı́a:
if edad < 10 or edad > 10:
print("%s no es una edad importante" % edad)
Pero aún serı́a más simple utilizando not:
if not edad == 10:
print("%s no es una edad importante" % edad)
Como te habrás dado cuenta, esta sentencia if es una forma de decir “si la edad no
es igual a 10”.
or
La palabra reservada or se utiliza para unir dos expresiones en una sentencia
(como por ejemplo la sentencia if), para decir que al menos una de las expresiones
tiene que ser True. Por ejemplo:
>>> if amigo == ’Rachel’ or amigo == ’Rob’:
...
print(’Los Robinsons’)
... elif amigo == ’Bill’ or amigo == ’Bob’:
...
print(’Los Baxters’)
En este caso, si la variable amigo contiene ‘Raquel’ o ‘Rob’ entnces imprime
‘Los Robinsons’. Si la variable amigo contiene ‘Bill’ o ‘Bob’ entonces imprime ‘Los
Baxters’.
133
pass
Algunas veces, cuando escribes un programa, puede ser que solemente quieras
escribir partes del mismo para probar cosas. El problema es que no puedes construir
algunas sentencias, por ejemplo if o for, sin que tenga un bloque de código incluido.
Por ejemplo:
>>> if edad > 10:
...
print(’mayor de 10 a~
nos’)
El código anterior funcionará, pero si tecleas únicamente:
>>> if edad > 10:
...
Saldrá un mensaje de error en la consola parecido a este:
File "<stdin>", line 2
^
IndentationError: expected an indented block
Cuando tienes una sentencia que espera un bloque de código después de ella y
no aparece, Python muestra el mensaje anterior.
La palabra reservada pass se puede utilizar en estos casos para que puedas
escribir la sentencia sin necesidad de que contenga el bloque de código (es una
sentencia que no hace nada). Por ejemplo, podrı́as querer escribir un bucle for con
una setencia if en él. Tal vez aún no has decidido qué poner dentro de la sentencia
if. Puede que pongas un print, o un break, u otra cosa. En ese caso puedes utilizar
pass y el código funcionará (aunque no haga lo que tu quieres aún porque no lo has
decidido). El código:
>>> for x in range(1,7):
...
print(’x es %s’ % x)
...
if x == 5:
...
pass
Imprimirá lo siguiente:
134
x
x
x
x
x
x
APÉNDICE A. PALABRAS CLAVE DE PYTHON
es
es
es
es
es
es
1
2
3
4
5
6
Más tarde puedes añadir el código del bloque para la sentencia if (sustituyendo la
sentencia pass).
print
La función print escribe algo en la consola de Python; una cadena, un número
o una variable:
print(’Hola mundo’)
print(10)
print(x)
raise
Otra palabra reservada avanzada. En este caso, raise se utiliza para provocar
que se produzca un error—lo que puede parecer algo extraño de hacer, pero en
programas avanzados es realmente bastante útil.
return
La palabra reservada return se utiliza para retornar el valor de una función.
Por ejemplo, podrı́as crear una función para retornar la cantidad de dinero que has
ahorrado:
>>> def midinero():
...
return cantidad
Cuando llamas a esta función, el valor retornado se puede asignar a otra variable:
>>> dinero = midinero()
o se puede imprimir:
>>> print(midinero())
135
try
La palabra reservada try sirve para iniciar un bloque de código que tiene que terminar con las palabras reservadas except y/o finally. Todas juntas
try/except/finally crean bloques de código que sirven para controlar los errores en un programa—por ejemplo, para asegurarse que un programa muestra un
mensaje útil para los usuarios cuando hay un error en lugar de un feo mensaje de
Python.
Se trata de un conjunto de palabras reservadas (try/except/finally) avanzado
que escapa a lo que podemos tratar en este texto introductorio.
while
Es parecido al bucle for, while es otra forma de generar bucles. El bucle for
va contando a lo largo de un rango de valores, mientras que el bucle while se ejecuta
mientras una expresión sea True. Tienes que tener mucho cuidado con los bucles
while, porque si la expresión siempre es True, el bucle continuará para siempre y
nunca finalizará (a lo que se suele llamar ‘bucle infinito’). Por ejemplo:
>>> x = 1
>>> while x == 1:
...
print(’hola’)
Si ejecutas el código anterior el bucle continuará para siempre. Bueno, al menos
hasta que te canses y cierres la consola de Python o pulses las teclas CTRL+C
(La tecla control y la tecla C juntas) para interrumpirlo. Sin embargo el siguiente
código:
>>> x = 1
>>> while x < 10:
...
print(’hola’)
...
x = x + 1
Imprimirá ‘hola’ 9 veces (cada vez que se completa una pasada del bucle se
suma 1 a la variable x, hasta que x sea igual a 10, que ya no es menor que 10). Como
se ve, es parecido al bucle for, pero en ocasiones es necesario utilizar while.
with
With es una palabra reservada muy avanzada.
136
APÉNDICE A. PALABRAS CLAVE DE PYTHON
yield
Yield es otra palabra reservada muy avanzada.
Apéndice B
Funciones internas de Python
Python tiene un conjunto de funciones internas—funciones que se pueden utilizar sin necesidad de importarlas primero. En este apéndice se muestran algunas
de estas funciones.
abs
La función abs retorna el valor absoluto de un número. El valor absoluto de
un número es el número en positivo siempre. Por ejemplo, el valor absoluto de 10
es 10, el valor absoluto de -20 es 20, el valor absoluto de -20.5 es 20.5. Por ejemplo:
>>> print(abs(10))
10
>>> print(abs(-20.5))
20.5
bool
La función bool retorna o True o False basándose en el valor que se le pase
como parámetro. Si se le pasa un número, el 0 retorna False y cualquier otro número
retorna True:
137
138
APÉNDICE B. FUNCIONES INTERNAS DE PYTHON
>>> print(bool(0))
False
>>> print(bool(1))
True
>>> print(bool(1123.23))
True
>>> print(bool(-500))
True
Para otros valores de otros tipos (objetos, cadenas, listas,...) None retorna
False mientras que cualquier otro valor retorna True:
>>> print(bool(None))
False
>>> print(bool(’a’))
True
cmp
La función cmp compara dos valores y retorna un número negativo si el primer
valor es menor que el segundo; retorna 0 si ambos valores son iguales, y retorna un
número positivo si el primer valor es mayor que el segundo. Por ejemplo, 1 es menor
que 2:
>>> print(cmp(1,2))
-1
Y 2 es igual a 2:
>>> print(cmp(2,2))
0
Pero 2 es mayor que 1:
>>> print(cmp(2,1))
1
La comparación no únicamente funciona con números. Puedes utilizar otros valores,
como las cadenas:
139
>>> print(cmp(’a’,’b’))
-1
>>> print(cmp(’a’,’a’))
0
>>> print(cmp(’b’,’a’))
1
Pero ten cuidado con las cadenas; el valor de retorno no tiene por qué ser lo que
tú esperas. . .
>>> print(cmp(’a’,’A’))
1
>>> print(cmp(’A’,’a’))
-1
Una ‘a’ en minúscula es mayor que una en mayúsculas ‘A’. Desde luego. . .
>>> print(cmp(’aaa’,’aaaa’))
-1
>>> print(cmp(’aaaa’,’aaa’))
1
. . .3 letras ‘a’ (aaa) es menor que 4 letras ‘a’ (aaaa).
dir
La función dir retorna una lista con información sobre un valor. Puedes utilizar
dir en cadenas, números, funciones, módulos, objetos, clases—en casi cualquier cosa.
Para algunos valores, la información que devuelve puede que no tenga sentido para
ti. Por ejemplo, si llamamos a la función dir pasándole como parámetro el número
1, el resultado es. . .
>>> dir(1)
[’__abs__’, ’__add__’, ’__and__’, ’__class__’, ’__cmp__’, ’__coerce__’, ’__delattr__’,
’__div__’, ’__divmod__’, ’__doc__’, ’__float__’, ’__floordiv__’, ’__getattribute__’,
’__getnewargs__’, ’__hash__’, ’__hex__’, ’__index__’, ’__init__’, ’__int__’, ’__invert__’,
’__long__’, ’__lshift__’, ’__mod__’, ’__mul__’, ’__neg__’, ’__new__’, ’__nonzero__’,
’__oct__’, ’__or__’, ’__pos__’, ’__pow__’, ’__radd__’, ’__rand__’, ’__rdiv__’,
’__rdivmod__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__rfloordiv__’,
’__rlshift__’, ’__rmod__’, ’__rmul__’, ’__ror__’, ’__rpow__’, ’__rrshift__’, ’__rshift__’,
’__rsub__’, ’__rtruediv__’, ’__rxor__’, ’__setattr__’, ’__str__’, ’__sub__’, ’__truediv__’,
’__xor__’]
. . .un amplio número de funciones especiales. Y si llamamos dir sobre la cadena
‘a’ el resultado es. . .
140
APÉNDICE B. FUNCIONES INTERNAS DE PYTHON
>>> dir(’a’)
[’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__doc__’, ’__eq__’, ’__ge__’,
’__getattribute__’, ’__getitem__’, ’__getnewargs__’, ’__getslice__’, ’__gt__’, ’__hash__’,
’__init__’, ’__le__’, ’__len__’, ’__lt__’, ’__mod__’, ’__mul__’, ’__ne__’, ’__new__’,
’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__rmod__’, ’__rmul__’, ’__setattr__’,
’__str__’, ’capitalize’, ’center’, ’count’, ’decode’, ’encode’, ’endswith’, ’expandtabs’,
’find’, ’index’, ’isalnum’, ’isalpha’, ’isdigit’, ’islower’, ’isspace’, ’istitle’,
’isupper’, ’join’, ’ljust’, ’lower’, ’lstrip’, ’partition’, ’replace’, ’rfind’, ’rindex’,
’rjust’, ’rpartition’, ’rsplit’, ’rstrip’, ’split’, ’splitlines’, ’startswith’, ’strip’,
’swapcase’, ’title’, ’translate’, ’upper’, ’zfill’]
Que muestra un conjunto de funciones como capitalize (que sirve para poner
en mayúscula la primera letra de una cadena). . .
>>> print(’aaaaa’.capitalize())
Aaaaa
. . .isalnum (es una función que retorna True si la cadena es ‘alfanumérica’—-es
decir si únicamente contiene números y letras, sin sı́mbolos ‘raros’), isalpha (es una
función que retorna True si una cadena contiene únicamente letras), y ası́ sucesivamente.
Dir puede ser útil cuando tienes una variable y quieres descubrir rápidamente
qué puedes hacer con ella, qué funciones y qué propiedades tiene.
eval
La función eval toma como parámetro una cadena y la ejecuta como si fuese
una expresión de Python. Es parecido a la palabra reservada exec pero funciona
algo diferente. Con exec se pueden crear miniprogramas de Python, sin embargo,
con eval únicamente se permite que la cadena contenga expresiones simples, como
en:
>>> eval(’10*5’)
50
file/open
file es una función para abrir un fichero (se puede usar indistintamente la
función open). Retorna un objeto fichero que tiene funciones para acceder a la información del fichero (su contenido, su tamaño y otras más). Puedes acceder a más
información sobre el uso de esta función en el Capı́tulo 7.
141
float
La función float convierte una cadena o un número entero en un número
de coma flotante (con decimales). Un número de coma flotante es un número con
coma decimal (también se llaman números reales). Por ejemplo, el número 10 es un
‘entero’, pero el 10.0, 10.1 10.253, son ‘flotantes’. Puedes convertir una cadena en
un flotante ejecutando:
>>> float(’12’)
12.0
También puedes utilizar la coma (el punto) decimal en la propia cadena:
>>> float(’123.456789’)
123.456789
Un número se puede transformar en un flotante ejecutando:
>>> float(200)
200.0
Y desde luego, si conviertes un número que ya es flotante con la función float, el
resultado es el propio número flotante:
>>> float(100.123)
100.123
Si se llama a float sin argumentos, el resultado es el número 0.0.
>>> float()
0.0
int
La función int convierte una cadena (que contenga un número entero) o un
número cualquiera en un número entero. Por ejemplo:
142
APÉNDICE B. FUNCIONES INTERNAS DE PYTHON
>>> int(123.456)
123
>>> int(’123’)
123
Esta función trabaja de un modo diferente a la función float. Si intentas
convertir un número de coma flotante que esté en una cadena obtendrás un mensaje
de error:
>>> int(’123.456’)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ’123.456’
Si llamas a int sin argumentos el valor que se retorna es 0.
>>> int()
0
len
La función len retorna la longitud de un objeto. En el caso de una cadena
retorna el número de caracteres de la cadena:
>>> len(’esto es una cadena de prueba’)
28
Para una lista o un tupla devuelve el número de elementos que contiene:
>>>
>>>
4
>>>
>>>
6
milista = [ ’a’, ’b’, ’c’, ’d’ ]
print(len(milista))
mitupla = (1,2,3,4,5,6)
print(len(mitupla))
Para un mapa o diccionario también retorna el número de elementos:
>>> mimapa = { ’a’ : 100, ’b’ : 200, ’c’ : 300 }
>>> print(len(mimapa))
3
En los bucles puede resultar muy útil esta función. Si quisieras recorrer los elementos
de una lista podrı́as hacer lo siguiente:
143
>>> milista = [ ’a’, ’b’, ’c’, ’d’ ]
>>> for elemento in milista:
...
print(elemento)
Lo que imprimirı́a todos los elementos de la lista (a,b,c,d)—pero si lo que quisieras
hacer fuese imprimir el ı́ndice de la posición en la que se encuentra cada elemento
de la lista. . . En ese caso necesitas la longitud de la lista y recorrer los elementos
como sigue:
>>> milista = [ ’a’, ’b’, ’c’, ’d’ ]
>>> longitud = len(milista)
>>> for x in range(0, longitud):
...
print(’el elemento en la posición %s es %s’ % (x, milista[x]))
...
el elemento en la posición 0 es a
el elemento en la posición 1 es b
el elemento en la posición 2 es c
el elemento en la posición 3 es d
Almacenamos la longitud de la lista en la variable ‘longitud’, luego usamos esa
variable en la función range para crear el bucle.
max
La función max retorna el elemento mayor de una lista, tupla o cadena. Por
ejemplo:
>>> milista = [ 5, 4, 10, 30, 22 ]
>>> print(max(milista))
30
En una cadena retorna el carácter mayor:
>>> s = ’abdhg’
>>> print(max(s))
h
No es necesario utilizar listas, tuplas o cadenas. Puedes ejecutar la función max
pasando directamente varios parámetros:
>>> print(max(10, 300, 450, 50, 90))
450
144
APÉNDICE B. FUNCIONES INTERNAS DE PYTHON
min
La función min funciona de la misma forma que max, con la diferencia de que
retorna el elemento más pequeño de una lista, tupla o cadena:
>>> milista = [ 5, 4, 10, 30, 22 ]
>>> print(min(milista))
4
range
La función range se utiliza principalmente para los bucles for, cuando quieres
ejecutar un trozo de código (un bloque) un número determinado de veces. Lo vimos
en el Capı́tulo 5. Allı́ vimos cómo utilizarla con dos argumentos. Pero también se
puede utilizar con tres parámetros (o argumentos).
Veamos de nuevo un ejemplo con dos argumentos:
>>> for x in range(0, 5):
...
print(x)
...
0
1
2
3
4
Lo que puede que no te hayas dado cuenta aún es que la función range en realidad
retorna un objeto especial (llamado ‘iterador’) que es el que usa el bucle for para
poder repetir las veces que se indique. Puedes convertir el iterador en una lista
(utilizando la función list). Puedes probarlo imprimiendo el valor de retorno de la
función range utilizando la función list:
>>> print(list(range(0, 5)))
[0, 1, 2, 3, 4]
Para conseguir una lista de números que puedas utilizar en otra parte de tu programa
puedes hacer algo ası́:
>>>
>>>
[0,
16,
mi_lista_de_numeros = list(range(0, 30))
print(mi_lista_de_numeros)
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
La función range también puede recibir un tercer argumento (parámetro), denomi-
145
nado ‘step’1 (los primeros argumentos se denominan ‘start’ y ‘stop’). Si no se pasa
el parámetro ‘step’ el valor que se utiliza por defecto es 1. ¿Qué sucede cuando
pasamos el número 2 en este tercer parámetro? Puedes verlo en el siguiente ejemplo:
>>> mi_lista_de_numeros = list(range(0, 30, 2))
>>> print(my_lista_de_numeros)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
Cada número de la lista es el anterior + 2. Ya habrás adivinado lo que hace el
parámetro ‘step’.
Podemos probar con pasos mayores:
>>> milista = list(range(0, 500, 50))
>>> print(milista)
[0, 50, 100, 150, 200, 250, 300, 350, 400, 450]
Que crea un lista desde el 0 al 500 (pero sin incluir el último, como siempre),
incrementando los números de 50 en 50.
sum
La función sum suma los elementos de una lista y retorna el número total.
Por ejemplo:
>>> mlista = list(range(0, 500, 50))
>>> print(milista)
[0, 50, 100, 150, 200, 250, 300, 350, 400, 450]
>>> print(sum(milista))
2250
1
En inglés ‘step’ significa ‘paso’.
146
APÉNDICE B. FUNCIONES INTERNAS DE PYTHON
Apéndice C
Unos cuantos módulos de Python
Python tiene un gran número de módulos disponibles para hacer toda clase de
cosas. Si quieres leer sobre ellos, puedes echarle un vistazo a la documentación de
Python en: http://docs.python.org/modindex.html, no obstante, vamos a explicar
algunos de los módulos más útiles en este apéndice. Un aviso, si decides echarle un
vistazo a la documentación de Python—la lista de módulos es muy amplia y algunos
son muy complicados de utilizar.
El módulo ‘random’
Si has jugado alguna vez al juego en el que pides a alquien que adivine un
número entre el 1 y el 100, enseguida se te ocurrirá para qué utilizar el módulo
random. Random (significa ‘aleatorio’) contiene unas funciones que son útiles para
generar. . . números aleatorios. Puede servir para pedirle al ordenador que elija un
número. Las funciones más útiles son randint, choice y shuffle. La primera función,
randint, elige un número aleatorio de entre un número de inicio y fin (en otras
palabras, entre 1 y 100, o entre 100 and 1000, o entre 1000 y 5000, u otros dos
cualquiera). Por ejemplo:
>>> import random
>>> print(random.randint(1, 100))
58
>>> print(random.randint(100, 1000))
861
>>> print(random.randint(1000, 5000))
3795
Los números que salgan en tu consola no tienen necesariamente que coincidir,
ya que el ordenador elegirá un número diferente cada vez que ejecutes randint. Por
147
148
APÉNDICE C. UNOS CUANTOS MÓDULOS DE PYTHON
eso se llaman números ‘aleatorios’.
Podemos utilizar esta función para crear un simple juego de adivinanzas utilizando un bucle while:
import random
import sys
num = random.randint(1, 100)
while True:
print(’Piensa un número entre el 1 y el 100’)
chk = sys.stdin.readline()
i = int(chk)
if i == num:
print(’¡Acertaste!’)
break
elif i < num:
print(’Prueba con uno mayor’)
elif i > num:
print(’Prueba con uno menor’)
Utiliza choice si tienes una lista de números y quieres elegir al azar uno de
ellos. Por ejemplo:
>>> import random
>>> list1 = [ ’a’, ’b’, ’c’, ’d’, ’e’, ’f’, ’g’, ’h’ ]
>>> print(random.choice(list1))
c
>>> list2 = [ ’helado’, ’pasteles’, ’bizcocho’, ’tarta de merengue’, ’esponja’ ]
>>> print(random.choice(list2))
bizcocho
Como antes el resultado que salga en tu consola no tiene que coincidir con el
del ejemplo puesto que la elección es ‘aleatoria’.
Y finalmente, utiliza shuffle si quieres mezclar una lista (como si barajaras
unas cartas)
>>> import random
>>> list1 = [ ’a’, ’b’, ’c’, ’d’, ’e’, ’f’, ’g’, ’h’ ]
>>> list2 = [ ’helado’, ’pasteles’, ’bizcocho’, ’tarta de merengue’, ’esponja’ ]
>>> random.shuffle(list1)
>>> print(list1)
[’h’, ’e’, ’a’, ’b’, ’c’, ’g’, ’f’, ’d’]
>>> random.shuffle(list2)
>>> print(list2)
[ ’esponja’, ’pasteles’, ’bizcocho’, ’helados’, ’tarta de merengue’ ]
Como en los casos anteriores, el resultado que obtengas puede ser diferente al
del ejemplo.
149
El módulo ‘sys’
El módulo sys contiene útiles funciones de ‘sistema’. Lo que significa que son
muy importantes dentro de Python. Algunas de las más útiles en este módulo sys
son: exit, stdin, stdout, y version.
La función exit es otra forma de finalizar la consola de Python. Por ejemplo,
si tecleas:
>>> import sys
>>> sys.exit()
Se cerrará la consola de Python. Dependiendo de que uses Windows, Mac o
Linux, pasarán diferentes cosas—pero el resultado final será que la consola de Python
termina de ejecutarse.
stdin se ha utilizado en este libro (ver Capı́tulo 6), para pedir a quien esté usando el programa con el fin de que introduzca algunos valores. Por ejemplo:
>>> import sys
>>> mivar = sys.stdin.readline()
Esto es un texto de prueba que tecleo por consola
>>> print(mivar)
Esto es un texto de prueba que tecleo por consola
stdout es lo contrario—se utiliza para escribir mensajes en la consola. En cierto
modo, es lo mismo que print, pero funciona más como un fichero, por eso, algunas
veces es más útil usar stdout que print:
>>> import sys
>>> l = sys.stdout.write(’esto es una prueba’)
esto es una prueba>>>
¿Te has dado cuenta en dónde aparece el prompt (>>>)? No es un error,
está al final del mensaje. Eso es porque, al contrario que print, cuando utilizas write
no se mueve automáticamente a la siguiente lı́nea. Para hacer lo mismo que print
con la función write podemos hacer lo siguiente:
>>> import sys
>>> l = sys.stdout.write(’esto es una prueba\n’)
esto es una prueba
>>>
(Observa que stdout.write retorna el número de caracteres que ha escrito—prueba
print(l) para ver el resultado).
150
APÉNDICE C. UNOS CUANTOS MÓDULOS DE PYTHON
\n es un carácter de escape que representa el carácter de salto de lı́nea (el carácter
que se imprime en pantalla cuando pulsas la tecla Intro. Que no es que muestre nada
en pantalla, es que cambia de lı́nea). Un carácter de escape es un carácter especial
que puedes utilizar en las cadenas cuando no puedes teclear directamente el carácter
verdadero. Por ejemplo, si quieres crear una cadena que tenga un salto de lı́nea en
medio, podrı́as intentar teclear la tecla Intro, pero Python mostrarı́a un error:
>>> s = ’prueba
File "<stdin>", line 1
s = ’prueba
^
SyntaxError: EOL while scanning single-quoted string
En su lugar, puedes utilizar el carácter de escape que representa el salto de
lı́nea:
>>> s = ’prueba\n prueba’
Finalmente, version es una función que sirve para mostrar la versión de Python que
se está ejecutando:
>>> import sys
>>> print(sys.version)
2.5.1c1 (release25-maint, Apr 12 2007, 21:00:25)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)]
En este caso el resultado que se muestre en tu consola dependerá de la versión
de Python y de Sistema Operativo que estés ejecutando.
El módulo ‘time’
El módulo de Python denominado ‘time’ dispone de funciones para mostrar. . .
bueno, es obvio, el tiempo. Sin embargo, si pruebas a ejecutar la función más evidente
(time), el resultado no será lo que estés esperando:
>>> import time
>>> print(time.time())
1179918604.34
El número que retorna time() es el número de segundos que han pasado desde
el uno de enero de 1970 (a las cero horas, cero minutos, cero segundos). Puedes
151
pensar que esto no es muy útil, sin embargo en ocasiones tiene su propósito. Por
ejemplo, si haces un programa y quieres saber lo rápido que se ejecutan algunas
partes del mismo, puedes registrar el tiempo al principio del trozo que quieres medir, luego registrar el tiempo al final y comparar los valores. Por ejemplo, ¿Cuánto
tardará imprimir todos los números del 0 al 100.000? Podemos hacer una función
como la siguiente:
>>> def muchos_numeros(max):
...
for x in range(0, max):
...
print(x)
Luego ejecutamos la función:
>>> muchos_numeros(100000)
Pero si quisiéramos conocer cuanto ha tardado, podemos modificar la función y usar
el módulo time:
>>> def muchos_numeros(max):
...
t1 = time.time()
...
for x in range(0, max):
...
print(x)
...
t2 = time.time()
...
print(’tardó %s segundos’ % (t2-t1))
Si la ejecutamos de nuevo:
>>> muchos_numeros(100000)
0
1
2
3
.
.
.
99997
99998
99999
tardó 6.92557406425 segundos
Evidentemente, en tu ordenador puede tardar más o menos que el del ejemplo.
Dependiendo de lo rápido que sea.
152
APÉNDICE C. UNOS CUANTOS MÓDULOS DE PYTHON
¿Cómo funciona? La primera vez que se ejecuta la función time() asignamos
el valor que retorna a la variable t1. Luego se ejecuta el bucle y se imprimen todos
los números. Después volvemos a ejecutar time() y asignamos el valor a la variable
t2. Puesto que el bucle tardó varios segundos, el valor de t2 será mayor (será más
tarde, puesto que time mide el tiempo) que el valor de t1 (el número de segundos
que han pasado desde el 1 de enero de 1970 se ha incrementado). Por eso, si restas
t2 de t1, el resultado medirá el número de segundos que se ha tardado en imprimir
todos los números.
Otras funciones disponibles en el módulo time son: asctime, ctime, localtime,
sleep, strftime, and strptime.
La función asctime toma una fecha en forma de tupla (recuerda: una tupla es
una lista de valores que no se puede modificar) y la convierte en formato cadena para
su lectura. También se puede ejecutar sin pasarle ningún parámetro y retornará en
una cadena la fecha y hora actual:
>>> import time
>>> print(time.asctime())
Sun May 27 20:11:12 2007
Para ejecutarla con un parámetro, primero necesitamos crear una tupla con valores
correctos para la fecha y la hora. Vamos a asignar la tupla a la variable t:
>>> t = (2007, 5, 27, 10, 30, 48, 6, 0, 0)
Los valores de la secuencia son, en este orden, el año, mes, dı́a, horas, minutos,
segundos, dia de la semana (0 es el lunes, 1 es el martes, y ası́ hasta el 6 que es el
domingo) y finalmente el dı́a del año y si existe horario de verano o no (0 es que no
y 1 que sı́). Al ejecutar asctime con la tupla anterior, obtenemos:
>>>
>>>
>>>
Sun
import time
t = (2007, 5, 27, 10, 30, 48, 6, 0, 0)
print(time.asctime(t))
May 27 10:30:48 2007
Ten cuidado con los valores de la tupla. Puedes crear una tupla que tenga una fecha
sin sentido en la realidad:
>>>
>>>
>>>
Mon
import time
t = (2007, 5, 27, 10, 30, 48, 0, 0, 0)
print(time.asctime(t))
May 27 10:30:48 2007
Debido a que el valor del ‘dı́a de la semana’ era 0 (en lugar de 6), la función asctime
ahora piensa que el 27 de mayo es lunes en lugar del verdadero dı́a que es—domingo.
153
La función ctime se utiliza para convertir un número de segundos en una forma
legible. Por ejemplo, podemos utilizar la función time() que explicamos al principio
de esta sección para obtener el número de segundos y pasar el resultado a ctime
para que convertir los segundos en una cadena con la fecha en formato legible:
>>> import time
>>> t = time.time()
>>> print(t)
1180264952.57
>>> print(time.ctime(t))
Sun May 27 23:22:32 2007
La función localtime retorna la fecha actual como una tupla de la misma forma que
anteriormente:
>>> import time
>>> print(time.localtime())
(2007, 5, 27, 23, 25, 47, 6, 147, 0)
Por eso, este valor se lo podemos pasar como parámetro a la función asctime:
>>>
>>>
>>>
Sun
import time
t = time.localtime()
print(time.asctime(t))
May 27 23:27:22 2007
La función sleep es bastante útil cuando quieres retardar la ejecución de tu programa
durante un cierto perı́odo de tiempo. Por ejemplo, si quisieras imprimir un número
cada segundo, el siguiente bucle no serı́a muy útil:
>>> for x in range(1, 61):
...
print(x)
...
1
2
3
4
Imprimirı́a todos los números del 1 al 60 casi instantáneamente. Sin embargo,
si le dices a Python que ‘duerma’ durante un segundo entre cada print:
154
APÉNDICE C. UNOS CUANTOS MÓDULOS DE PYTHON
>>> for x in range(1, 61):
...
print(x)
...
time.sleep(1)
...
Habrá un retardo de 1 segundo entre cada número. Decirle al ordenador que ‘duerma’
un tiempo puede que no parezca muy útil, pero a veces lo es. Piensa en tu reloj
despertador, el que te despierta por la mañana. Cuando pulsas el botón deja de
sonar durante unos minutos, lo que de permite seguir durmiendo unos minutos (al
menos hasta que alguien te llama para desayunar). La función sleep es igual de útil
en ciertas ocasiones.
La función strftime se utiliza para cambiar la forma en la que se muestra la
fecha y la hora y strptime se utiliza para tomar una cadena y convertirla en una
tupla de fecha/hora.
Veamos primero strftime. Antes vimos como convertir una tupla en una cadena
de fecha utilizando asctime:
>>> t = (2007, 5, 27, 10, 30, 48, 6, 0, 0)
>>> print(time.asctime(t))
Sun May 27 10:30:48 2007
En muchas situaciones esto es suficiente. Pero si no nos gusta cómo se muestra la
fecha—por ejemplo, si únicamente quisiéramos mostrar la fecha y no la hora, lo
podemos hacer con la función strftime:
>>> print(time.strftime(’%d %b %Y’, t))
27 May 2007
Como ves, strftime toma dos parámetros: el primero es una cadena de formato
de fecha y hora (que describe cómo debe mostrarse), el segundo es una tupla que
contenga los valores como en los casos anteriores. El formato, %d %b %Y es una
forma de decir: ‘muestra el dı́a, el mes y el año’. Si quisiéramos mostrar el mes en
forma de número podrı́amos hacerlo ası́:
>>> print(time.strftime(’%d/%m/%Y’, t))
27/05/2007
Este formato está diciendo lo siguiente, ‘muestra el dı́a, luego una barra inclinada (también llamada slash), luego muestra el mes como un número del 1 al 12,
luego otra barra inclinada y al final muestra el año’. Existen diferentes valores que
se pueden utilizar en una cadena para formatear fechas:
155
%a
%A
%b
%B
%c
%d
%H
%I
%j
%m
%M
%p
%S
%U
%w
%x
%X
%y
%Y
Una versión corta del dı́a de la semana (por ejemplo, Mon, Tues,
Wed, Thurs, Fri, Sat, y Sun)
El nombre completo del dı́a de la semana (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
Una versión corta del mes (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug,
Sep, Oct , Nov, Dec)
El nombre completo del mes (January, February, March, April, May,
y ası́ sucesivamente)
La fecha y hora completa en el mismo formato que utiliza asctime
El dı́a del mes de forma numérica (del 01 al 31)
La hora del dı́a, en formato de 24 horas (de 00 a 23)
La hora del dı́a, en formato de 12 horas (de 01 a 12)
El dı́a del año en forma numérica (de 001 a 366)
El mes en forma numérica (de 01 a 12)
El minuto en forma numérica (de 00 a 59)
La mañana o la tarde en forma: AM o PM
El segundo en forma numérica
El número de la semana del año (de 00 a 53)
El dı́a de la semana en forma numérica: el 0 es domingo, el 1 es
lunes, el 2 es martes, hasta el 6 que es sábado
un formato simple de fecha (normalmente mes/dı́a/año—por ejemplo, 03/25/07)
un formato simple de hora (normalmente hora:minuto:segundo—
por ejemplo 10:30:53)
el año con dos dı́gitos (por ejemplo, 2007 serı́a 07)
el año con cuatro dı́gitos (por ejemplo 2007)
La función strptime es casi lo contrario de la función strftime—toma una cadena y la convierte en una tupla que contiene la fecha y la hora. También toma los
mismos valores de la cadena de formateo. Por ejemplo:
>>> import time
>>> t = time.strptime(’05 Jun 2007’, ’%d %b %Y’)
>>> print(t)
(2007, 6, 5, 0, 0, 0, 1, 156, -1)
Si la fecha de nuestra cadena fuese en formato dı́a/mes/año (por ejemplo, 01/02/2007),
podrı́amos utilizar:
156
APÉNDICE C. UNOS CUANTOS MÓDULOS DE PYTHON
>>> import time
>>> t = time.strptime(’01/02/2007’, ’%d/%m/%Y’)
>>> print(t)
(2007, 2, 1, 0, 0, 0, 3, 32, -1)
O si la fecha fuese en formato mes/dı́a/año, usarı́amos:
>>> import time
>>> t = time.strptime(’03/05/2007’, ’%m/%d/%Y’)
>>> print(t)
(2007, 3, 5, 0, 0, 0, 0, 64, -1)
Podemos combinar las dos funciones para convertir una cadena de fecha de un
formato a otro. Hagámoslo en una función:
>>> import time
>>> def convertir_fecha(cadena_fecha, format1, format2):
...
t = time.strptime(cadena_fecha, format1)
...
return time.strftime(format2, t)
...
Podemos utilizar esta función pasándole la cadena de fecha, el formato de esa cadena
y, por último, el formato en que queremos que se devuelva la fecha, por ejemplo:
>>> print(convertir_fecha(’03/05/2007’, ’%m/%d/%Y’, ’%d %B %Y’))
05 March 2007
Apéndice D
Respuestas a “Cosas que puedes
probar”
Aquı́ puedes encontrar las respuestas a las preguntas de la sección “Cosas que
puedes probar” de cada capı́tulo.
Capı́tulo 2
1. La respuesta del Ejercicio 1 podrı́a ser como sigue:
>>> juguetes = [ ’coche’, ’Nintendo Wii’, ’ordenador’, ’bicicleta’ ]
>>> comidas = [ ’pasteles’, ’chocolate’, ’helado’ ]
>>> favoritos = juguetes + comidas
>>> print(favoritos)
[ ’coche’, ’Nintendo Wii’, ’ordenador’, ’bicicleta’, ’pasteles’, ’chocolate’, ’helado’ ]
2. La respuesta al Ejercicio 2 consiste en sumar el resultado de multiplicar 3 por 25
y el resultado de multiplicar 10 por 32. Las siguientes fórmulas muestran el resultado:
>>> print(3 * 25 + 10 * 32)
395
Sin embargo, ya que miramos el uso de los paréntesis en el Capı́tulo 2, podrı́as
utilizar paréntesis, aunque en esta fórmula no fuesen necesarios:
>>> print((3 * 25) + (10 * 32))
395
La respuesta es la misma ya que en Python la multiplicación se hace siempre antes
que la suma. Según hemos puesto los paréntesis, le estamos diciendo a Python que
157
158
APÉNDICE D. RESPUESTAS A “COSAS QUE PUEDES PROBAR”
haga primero las multiplicaciones, que es lo mismo que pasa en el caso anterior sin
los paréntesis. Sin embargo la segunda fórmula queda más clara que la primera—
porque aclara inmediatamente al que la lee qué operaciones se hacen antes. Un
programador con poco conocimiento (que no conozca el orden en que ejecuta Python
las operaciones) podrı́a pensar que en la primera ecuación lo que pasa es que se
multiplica 3 por 25, luego se suma 10, y luego se multiplica el resultado por 32 (que
darı́a como resultado 2720—y que es completamente equivocado). Con los paréntesis
queda un poquito más claro lo que se calcula antes.
3. La respuesta al Ejercicio 3 será parecida a lo siguiente:
>>> nombre = ’Mary’
>>> apellidos = ’Wilson’
>>> print(’Mi nombre es %s %s’ % (nombre, apellidos))
Mi nombre es Mary Wilson
Capı́tulo 3
1. Un rectángulo es como un cuadrado, excepto en que dos de sus lados son más
largos que los otros dos. Para dibujarlo con la tortuga habrá que decirle a la tortuga
las siguientes operaciones:
muévete un número de pı́xeles.
gira a la izquierda.
muévete un número menor de pı́xeles.
gira a la izquierda.
muévete el mismo número de pı́xeles que en el primer movimiento.
gira a la izquierda.
muévete el número de pı́xeles del segundo movimiento.
Por ejemplo, el siguiente código dibujará el rectángulo de la figura D.1.
159
Figura D.1: La tortuga dibujando un rectángulo.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
import turtle
t = turtle.Pen()
t.forward(150)
t.left(90)
t.forward(50)
t.left(90)
t.forward(150)
t.left(90)
t.forward(50)
2. Un triángulo es un poco más complicado de dibujar, porque necesitas conocer algo
más sobre ángulos y longitudes de sus lados. Si no has estudiado aún los ángulos en
el colegio, verás que es más complicado de lo que parece. Puedes dibujar un triángulo
(ver figura D.2) si usas el siguiente código:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
import turtle
t = turtle.Pen()
t.forward(100)
t.left(135)
t.forward(70)
t.left(90)
t.forward(70)
160
APÉNDICE D. RESPUESTAS A “COSAS QUE PUEDES PROBAR”
Figura D.2: Tortuga dibujando un triángulo.
Capı́tulo 4
1. El código del ejercicio 1 imprimirá: “Tengo una moto”.
El segundo ejemplo del ejercicio 1 imprimirá: “Tengo un coche”. Ya que 80+30 no
es menor que 100, lo que hace que se ejecute el código que está en el else.
2. Una posible respuesta para el ejercicio 2 serı́a:
>>>
>>>
...
...
...
...
...
mivariable = 200
if mivariable < 100:
print(’hola’)
elif mivariable >= 100 and mivariable <=200:
print(’chao’)
else:
print(’adios’)
Capı́tulo 5
1. El bucle para justo después del primer print. Por eso cuando ejecutas el código el
resultado es:
161
>>> for x in range(0, 20):
...
print(’hola %s’ % x)
...
if x < 9:
...
break
hola 0
La razón por la que se para es que al principio del bucle el valor de la variable x es
cero. Como cero es un valor menor que nueve, la condición de la sentencia if es cierta,
por lo que se ejecuta el código que hay dentro, el código interior es la sentencia break
que sirve para decirle a Python que finalice el bucle en el que está la sentencia.
2. Para conocer cuánto dinero consigues cuando te pagan el 3 % de interés, necesitas
multiplicar el número por 0.03. Para comenzar tendrı́amos que crear una variable
que almacene el dinero que tenemos en nuestros ahorros.
>>> ahorros = 100
Para conocer el interés de un año habrı́a que multiplicar los ahorros por 0.03:
>>> ahorros = 100
>>> print(ahorros * 0.03)
3.0
Son ¡3 euros! No está mal, teniendo en cuenta que no hemos tenido que hacer
nada para conseguirlo. Necesitamos imprimir este valor y sumarlo al total de nuestros
ahorros, y luego hacerlo 10 veces para saber el total que nos pagan en 10 años:
>>> ahorros = 100
>>> for anyo in range(1, 11):
...
interes = ahorro * 0.03
...
print(’el interés ganado en el a~
no %s es %s’ % (anyo, interes))
...
ahorro = ahorro + interes
...
el interés ganado en el a~
no 1 es 3.0
el interés ganado en el a~
no 2 es 3.09
el interés ganado en el a~
no 3 es 3.1827
el interés ganado en el a~
no 4 es 3.278181
el interés ganado en el a~
no 5 es 3.37652643
el interés ganado en el a~
no 6 es 3.4778222229
el interés ganado en el a~
no 7 es 3.58215688959
el interés ganado en el a~
no 8 es 3.68962159627
el interés ganado en el a~
no 9 es 3.80031024416
el interés ganado en el a~
no 10 es 3.91431955149
En la primera lı́nea creamos un bucle for utilizando la variable anyo y la función
range para contar de 1 a 10. La segunda lı́nea calcula el interés, multiplicando el
162
APÉNDICE D. RESPUESTAS A “COSAS QUE PUEDES PROBAR”
valor de la variable ahorros por 0.03. La siguiente lı́nea es la sentencia print—que
utiliza marcadores en la cadena de formato ( %s) para mostrar los valores del anyo e
interes. Finalmente, en la última lı́nea, sumamos el interés a la cantidad ahorrada, lo
que significa que al siguiente año el interés se calculará sobre unos ahorros mayores.
Los decimales, en el resultado, después del punto decimal, te pueden confundir un
poco, pero lo que se observa es que al ir añadiendo los intereses de cada año a los
ahorros, el interés que se gana cada año se va incrementando un poquito. El código
que hemos escrito podrı́a ser un poco más útil si mostrase la cantidad ahorrada cada
año:
>>> ahorros = 100
>>> for anyo in range(1, 11):
...
interes = ahorros * 0.03
...
print(’el interés ganado para unos ahorros de %s en el a~
no %s es %s’ %
...
(ahorros, anyo, interes))
...
ahorro = ahorro + interes
...
el intereś ganado para unos ahorros de 100 en el a~
no 1 es 3.0
el intereś ganado para unos ahorros de 103.0 en el a~
no 2 es 3.09
el intereś ganado para unos ahorros de 106.09 en el a~
no 3 es 3.1827
el intereś ganado para unos ahorros de 109.2727 en el a~
no 4 es 3.278181
el intereś ganado para unos ahorros de 112.550881 en el a~
no 5 es 3.37652643
el intereś ganado para unos ahorros de 115.92740743 en el a~
no 6 es 3.4778222229
el intereś ganado para unos ahorros de 119.405229653 en el a~
no 7 es 3.58215688959
el intereś ganado para unos ahorros de 122.987386542 en el a~
no 8 es 3.68962159627
el intereś ganado para unos ahorros de 126.677008139 en el a~
no 9 es 3.80031024416
el intereś ganado para unos ahorros de 130.477318383 en el a~
no 10 es 3.91431955149
Capı́tulo 6
1. Convertir el bucle for en una función es bastante sencillo. La función será parecida
a esto:
>>> def calcular_interes(ahorros, tasa):
...
for anyo in range(1, 11):
...
interes = ahorro * tasa
...
print(’el interés ganado para unos ahorros de %s en el a~
no %s es %s’ %
...
(ahorros, anyo, interes))
...
ahorro = ahorro + interes
Si comparas la función con el código anterior, te darás cuenta que, aparte de la
primera lı́nea, el único cambio al original es que en lugar de utilizar directamente el
valor 0.03 como tasa de interés ahora tenemos el parámetro tasa para poder calcular
para diferentes valores de tasas de interés. Como el ahorro ya era una variable no
163
hay que hacer ningún cambio cuando se convierte en un parámetro. Si ejecutas esta
función con los mismos valores que hemos usado hasta ahora, el resultado es el
mismo que antes:
>>> calcular_interes(100, 0.03)
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
el intereś ganado para unos ahorros
de
de
de
de
de
de
de
de
de
de
100 en el a~
no 1 es 3.0
103.0 en el a~
no 2 es 3.09
106.09 en el a~
no 3 es 3.1827
109.2727 en el a~
no 4 es 3.278181
112.550881 en el a~
no 5 es 3.37652643
115.92740743 en el a~
no 6 es 3.4778222229
119.405229653 en el a~
no 7 es 3.58215688959
122.987386542 en el a~
no 8 es 3.68962159627
126.677008139 en el a~
no 9 es 3.80031024416
130.477318383 en el a~
no 10 es 3.91431955149
2. Modificar la función para pasarle el año como parámetro requiere unos cambios
mı́nimos:
>>> def calcular_interes(ahorros, tasa, anyos):
...
for anyo in range(1, anyos):
...
interes = ahorro * tasa
...
print(’el interés ganado para unos ahorros de %s en el a~
no %s es %s’ %
...
(ahorros, anyo, interes))
...
ahorro = ahorro + interes
Ahora podemos modificar la cantidad inicial, la tasa de interés y el número de años
sin ningún esfuerzo:
>>> calcular_interes(1000, 0.05, 6)
el interés ganado para unos ahorros
el interés ganado para unos ahorros
el interés ganado para unos ahorros
el interés ganado para unos ahorros
el interés ganado para unos ahorros
de
de
de
de
de
1000 en el a~
no 1 es 50.0
1050.0 en el a~
no 2 es 52.5
1102.5 en el a~
no 3 es 55.125
1157.625 en el a~
no 4 es 57.88125
1215.50625 en el a~
no 5 es 60.7753125
3. Este miniprograma es un poco más complicado que la función que ya hemos
creado. En primer lugar necesitamos importar el módulo sys para poder pedir por
pantalla los valores con al función readline de stdin. Aparte de esto, la función es
muy similar a la anterior:
164
APÉNDICE D. RESPUESTAS A “COSAS QUE PUEDES PROBAR”
>>> import sys
>>> def calcular_interes():
...
print(’Teclea la cantidad que tienes de ahorros:’)
...
ahorros = float(sys.stdin.readline())
...
print(’Teclea la tasa de interés’)
...
tasa = float(sys.stdin.readline())
...
print(’Teclea el número de a~
nos:’)
...
anyos = int(sys.stdin.readline())
...
for anyo in range(1, anyos):
...
interes = ahorro * tasa
...
print(’el interés ganado para unos ahorros de %s en el a~
no %s es %s’ %
...
(ahorros, anyo, interes))
...
ahorro = ahorro + interes
Cuando ejecutamos la función obtenemos algo como lo siguiente:
>>> calcular_interes()
Teclea la cantidad que tienes de ahorros:
500
Teclea la tasa de interés:
0.06
Teclea el número de a~
nos:
12
el interés ganado para unos ahorros de 500.0 en el a~
no 1 es 30.0
el interés ganado para unos ahorros de 530.0 en el a~
no 2 es 31.8
el interés ganado para unos ahorros de 561.8 en el a~
no 3 es 33.708
el interés ganado para unos ahorros de 595.508 en el a~
no 4 es 35.73048
el interés ganado para unos ahorros de 631.23848 en el a~
no 5 es 37.8743088
el interés ganado para unos ahorros de 669.1127888 en el a~
no 6 es 40.146767328
el interés ganado para unos ahorros de 709.259556128 en el a~
no 7 es 42.5555733677
el interés ganado para unos ahorros de 751.815129496 en el a~
no 8 es 45.1089077697
el interés ganado para unos ahorros de 796.924037265 en el a~
no 9 es 47.8154422359
el interés ganado para unos ahorros de 844.739479501 en el a~
no 10 es 50.6843687701
el interés ganado para unos ahorros de 895.423848271 en el a~
no 11 es 53.7254308963
Otra forma que tendrı́amos de hacer esto mismo es aprovechar la función original
de cálculo de interés:
>>> def calcular_interes(ahorros, tasa, anyos):
...
for anyo in range(1, anyos):
...
interes = ahorro * tasa
...
print(’el interés ganado para unos ahorros de %s en el a~
no %s es %s’ %
...
(ahorros, anyo, interes))
...
ahorro = ahorro + interes
Y crear una nueva función que se “aproveche” de ella. ¡Para eso son las funciones!
Para reutilizar código de diversas formas. A la nueva función la vamos a llamar
pedir y calcular interes.
165
>>> def pedir_calcular_interes():
...
print(’Teclea la cantidad que tienes de ahorros:’)
...
ahorros = float(sys.stdin.readline())
...
print(’Teclea la tasa de interés’)
...
tasa = float(sys.stdin.readline())
...
print(’Teclea el número de a~
nos:’)
...
anyos = int(sys.stdin.readline())
...
calcular_interes(ahorros, tasa, anyos)
Ası́ tenemos dos funciones, una que calcula el interés con parámetros, y otra que
pide por pantalla los datos y utiliza a la primera para efectuar los cálculos.
Capı́tulo 8
1. Una forma difı́cil de dibujar un octágono que requiere mucho que teclear:
import turtle
t = turtle.Pen()
>>> t.forward(50)
>>> t.right(45)
>>> t.forward(50)
>>> t.right(45)
>>> t.forward(50)
>>> t.right(45)
>>> t.forward(50)
>>> t.right(45)
>>> t.forward(50)
>>> t.right(45)
>>> t.forward(50)
>>> t.right(45)
>>> t.forward(50)
>>> t.right(45)
>>> t.forward(50)
La tortuga se mueve 50 pı́xeles y luego gira 45 grados. Lo hacemos 8 veces. ¡Mucho
que teclear!
La forma sencila es utilizar el siguiente código:
>>> for x in range(0,8):
...
t.forward(50)
...
t.right(45)
2. Si echas un vistazo a las otras funciones del Capı́tulo 8, ya sabrás como crear
una forma y rellenarla. Podemos convertir el código para crear un octágono en una
función que recibe como parámetro un color.
166
APÉNDICE D. RESPUESTAS A “COSAS QUE PUEDES PROBAR”
Figura D.3: La tortuga dibujando un octágono.
>>> def octagono(red, green, blue):
...
t.color(red, green, blue)
...
t.begin_fill()
...
for x in range(0,8):
...
t.forward(50)
...
t.right(45)
...
t.end_fill()
Activamos el color, luego activamos el relleno. Después ejecutamos el bucle
para dibujar un octágono, al finalizar desactivamos el relleno. Para probarlo vamos
a dibujar un octágono azul (ver figura D.4):
>>> octagono(0, 0, 1)
167
Figura D.4: la tortuga dibujando un octágono azul.
Índice alfabético
ámbito, 70
open, 72, 140
range, 52, 144
sum, 145
bloques de código, 54
cadena de varias lı́neas, 17
cadenas, 17
caracteres de escape, 150
colores hexadecimales, 107
coma o punto flotante, 10
condiciones, 33
combinando, 41
consola de Python, 5
división, 11
espacio en blanco, 56
for - bucle, 51
formatos de fecha/hora, 154
funciones, 68
abs, 137
bool, 137
cmp, 138
dir, 139
eval, 140
fichero, 79
close, 80
read, 79
write, 79
file, 140
float, 141
int, 141
len, 142
max, 143
min, 144
grados, 28
if - sentencia, 33
if then else - sentencia, 38
igualdad, 47
listas, 19
añadir elementos, 21
quitar elementos, 22
reemplazar, 21
unir listas, 22
módulos, 73, 147
os, 114
random, 104, 147
choice, 148
randint, 147
randrange, 104
shuffle, 148
sys, 74, 149
exit, 149
stdin, 74, 149
stdout, 149
version, 150
time, 73, 150
asctimes, 152
ctime, 153
localtime, 74, 153
sleep, 153
strftime, 154
strptime, 155
168
169
ÍNDICE ALFABÉTICO
time (función), 150
tkinter, 99
animación básica, 115
bind all, 118
Canvas, 101
create arc, 108
create image, 112
create line, 102
create oval, 109
create polygon, 110
create rectange, 103
eventos, 117
move, 116
multiplicación, 9, 11
None, 43
operador módulo, 84
operadores, 11
orden de las operaciones, 12
palabras clave o reservadas
and, 123
as, 123
assert, 124
break, 62, 124
class, 125
del, 125
elif, 126
else, 126
except, 126
exec, 126
finally, 127
for, 127
from, 128
global, 129
if, 130
import, 130
in, 130
is, 131
lambda, 131
not, 131
or, 132
pass, 133
print, 134
raise, 134
return, 134
try, 135
while, 135
with, 135
yield, 136
parámetros con nombre, 100
Pen, 26
pixels, 28
Python, 3
resta, 11
return, 69
suma, 11
tuplas, 23
turtle, 25
avanzado, 81
backward, 31
clear, 30
color, 85
negro, 88
down, 31
fill, 88
forward, 26
girando a la derecha, 28
girando a la izquierda, 28
reset, 31
up, 31
variables, 13, 15
while - bucle, 63
Fly UP