Documente Academic
Documente Profesional
Documente Cultură
La exploracion de la informacion
Version 0.0.9-d2
Charles Severance
Prologo
Python para Informatica: La remezcla de un libro abierto
Es natural que para aquellos academicos que continuamente han escuchado
publique o perezca quieran siempre crear algo desde su inicio. Este libro es
un experimento al no iniciarse de cero sino mas bien remezclando el libro titulado Pensar Python: Como pensar como un cientfico de computo escrito por
Allen B. Downey, Jeff Elkner y otros.
En diciembre de 2009 me estaba preparando para ensenar SI502 - Programacion
en red (Networked Programming) en la Universidad de Michigan, por quinta vez
seguida, y decid que era hora de escribir una gua didactica para Python que se
enfocara en la exploracion de datos en vez de en entender algoritmos y abstracciones. Mi meta en SI502 es ensenarle a la gente destrezas para manejar datos en
la vida diaria utilizando Python. Pocos de mis estudiantes planeaban ser programadores de computadoras profesionales. La mayora, en cambio, planeaban ser
bibliotecarios, administradores, abogados, biologos, economistas, etc. y simplemente queran desarrollar destrezas en el manejo de la tecnologa en su campo.
Pareca como si no se pudiera encontrar el libro perfecto orientado al manejo de
los datos en Python para el curso que planeaba ensenar, as que decid yo mismo
escribir tal libro. Afortunadamente, en una reunion de la facultad tres semanas
antes de empezar a escribir mi nuevo libro desde cero, durante una jornada de vacaciones, el Dr. Atul Prakash me mostro el libro Pensar Python el cual e l haba
usado para ensenar su curso de Python durante ese semestre. Es un texto de Informatica muy bien escrito con un e nfasis en explicaciones pequenas, directas y
faciles de aprender.
La estructura global se ha cambiado de modo que se logre hacer el analisis de los
datos tan rapido como sea posible y, desde el principio, tiene una serie de ejemplos
y ejercicios sobre el analisis de los datos.
Los captulos 2 al 10 son similares al libro Pensar Python pero han sufrido grandes
cambios. Los ejemplos numerados y los ejercicios se han reemplazado con ejercicios que tienen que ver con el manejo de datos. Los temas se presentan en el
orden necesario para ir construyendo soluciones de analisis de datos cada vez mas
sofisticadas. Algunos temas como try y except se han desplazado para presentarlos como parte del captulo sobre afirmaciones condicionales (conditionals). A
iv
Chapter 0. Prologo
las funciones (Functions) se les da un tratamiento ligero hasta que sean necesarias
para manejar la complejidad de un programa en vez de introducirlas como concepto abstracto temprano en la leccion. Casi todas las funciones definidas por
el usuario (user-defined functions) han sido quitadas de los ejemplos y ejercicios
fuera del Captulo 4. La palabra recursion1 no se menciona en el libro.
El material de los captulos 1 y 11 al 16 es completamente nuevo, con un enfoque
aplicado al uso en el mundo real y se presentan ejemplos sencillos de Python para
el analisis de datos, incluyendo expresiones regulares (regular expressions) en la
realizacion de busquedas y analisis sintactico en la automatizacion de tareas en
su computador, recuperacion de datos a traves de red, recabacion (scraping) de
datos de paginas web, utilizando servicios web, en el analisis sintactico (parsing
de datos en XML y JSON, y en la creacion y uso de bases de datos estructuradas
en lenguaje de consulta (Structured Query Language).
El objetivo primordial de estos cambios es pasar de un enfoque de Ciencias de
computacion a Informatica y solo incluir temas de tecnologa u tiles aun si alguien
no elije ser programador como profesion.
Los estudiantes que encuentren este libro interesante y quieran continuar explorando deben mirar el libro de Allen B. Downeys Pensar Python. Por causa de que
hay relacion entre muchos de los temas en los dos libros, los estudiantes rapidamente adquiriran destrezas en a reas adicionales de programacion tecnica y pensamiento algortmico cubierto en Pensar Python, y siendo que los dos libros se
han escrito en un estilo similar, usted podra avanzar rapidamente a traves del libro
Pensar Python con un mnimo esfuerzo.
Como titular de los derechos de autor de Pensar Python, Allen me ha dado permiso
de cambiar la licencia del libro en lo que al material de su obra que aparece en
este libro se refiere, para convertirla de GNU Free Documentation License a la
mas reciente licencia de Creative Commons Reconocimiento Compartir. Esto
se adecua al cambio general en la documentacion abierta de licencias de GFDL
a CC-BY-SA (p. ej. Wikipedia). Al usar la licencia CC-BY-SA se mantiene la
fuerte tradicion de copyleft mientras que se abren aun mas las oportunidades para
nuevos autores de usar este material como lo consideren apropiado.
Pienso que este libro es un ejemplo de porque el material de dominio publico es tan
importante para el futuro de la educacion y quiero agradecerle a Allen B. Downey
y a la imprenta de la Universidad de Cambridge por su decision visionaria de
facilitar este libro bajo la licencia de derechos de autor de dominio publico, open
Copyright. Espero que esten contentos con los resultados de mi esfuerzo y espero
que usted, el lector, quede satisfecho con nuestro esfuerzo colectivo.
Me gustara agradecerle a Allen B. Downey y a Lauren Cowles por su ayuda, paciencia y gua en el manejo y resolucion de los asuntos realacionados al copyright
de este libro.
1A
v
Charles Severance
www.dr-chuck.com
Ann Arbor, MI, USA
Septiembre 9, 2013
Charles Severance es profesor clnico asociado de la facultad de Informatica de la
Universidad de Michigan.
vi
Chapter 0. Prologo
Contents
viii
Contents
Chapter 1
What
Next?
What
Next?
What
Next?
What
Next?
What
Next?
PDA
Por ejemplo, mire los tres primeros parrafos de este captulo y dgame cual es la
palabra mas comun. Mientras que usted es capaz de leer y comprender las palabras
en cuestion de segundos, contarlas es doloroso porque no es el tipo de problema
que la mente humana ha sido disenada para resolver. Para una computadora es
todo lo contrario, leer y comprender el texto de un pedazo de papel es difcil
para una computadora, pero contar las palabras y decirle a usted cuantas veces la
palabra mas comun fue usada es muy facil para la computadora:
python palabras.py
Enter file:palabras.txt
de 7
Pick
Me!
Pick
Me!
Pick
Me!
Pick
Me!
Buy
Me :)
PDA
encontraremos en nuestra vida diaria. Cuando usted comience, usted es tanto programador como usuario de sus propios programas. En la medida en que adquiera
mas destreza como programador y programar se sienta como una actividad mas
y mas creativa para usted, se le ocurriran ideas sobre el desarrollo de programas
para otros.
Software
Input
Output
Devices
What
Next?
Central
Processing
Unit
Main
Memory
Network
Secondary
Memory
Las definiciones funcionales de alto nivel de estas partes son las siguientes:
La Unidad Central de Procesamiento conocida por sus siglas en ingles
como CPU es esa parte de la computadora que ha sido construida para obsesionarse con la cuestion que hay que hacer despues?. Si su computadora
tiene una capacidad de 3.0 Gigahertz, eso significa que el CPU preguntara
que hay que hacer despues? tres mil millones de veces por segundo.
Usted va a tener que aprender como hablar rapido para mantener el ritmo de
la CPU.
La Memoria Principal se usa para almacenar la informacion que la CPU
necesita de afan. La memoria principal es casi tan rapida como la CPU, pero
la informacion almacenada en la memoria principal desaparece cuando se
apaga la computadora.
La Memoria Secundaria tambien se usa para almacenar informacion, pero
es mucho mas lenta que la memoria principal. La ventaja de la memoria secundaria es que puede almacenar informacion aun cuando la computadora
Mientras que la mayora de los detalles sobre como trabajan estos componentes es
mejor dejarselo a los que construyen computadoras, conocer la terminologa ayuda
para podernos referir a estos componentes cuando escribimos nuestros programas.
Como programador, su trabajo es utilizar y coordinar cada uno de estos recursos
para dar solucion a los problemas para los cuales usted necesita analizar los datos
que necesita usar. Como programador usted va a hablarle la mayora del tiempo
a la CPU para decirle que debe hacer despues. Algunas veces usted le va a decir
a la CPU que utilice la memoria principal, la memoria secundaria, la red o los
dispositivos de entrada/salida (input/output).
Software
Input
Output
Devices
What
Next?
Central
Processing
Unit
Main
Memory
Network
Secondary
Memory
You
Usted tiene que ser la persona que le responda a la CPU la pregunta Que debe
hacer despues?, pero sera muy incomodo reducirlo a usted a un tamano de 5mm
e insertarlo en la computadora solo para poder emitir un comando tres mil millones de veces por segundo. As que en vez de hacer eso, usted debe escribir
sus instrucciones de antemano. A estas instrucciones almancenadas les llamamos
programa y al acto de escribir estas instrucciones y escribirlas correctamente,
programacion.
del
elif
else
except
exec
finally
for
from
global
if
import
in
is
lambda
not
or
pass
print
raise
return
try
while
with
yield
Antes de que pueda conversar con Python, usted primero debe instalar la aplicacion de Python (software) en su computadora y aprender como iniciar Python en
ella. Esto es demasiado detalle para este captulo, as que le sugiero que consulte
www.pythonlearn.com donde he detallado instrucciones e imagenes de pantalla
para mostrar como se instala Python en los sistemas Macintosh y Windows. En
algun momento, usted va a estar en una terminal o ventana de comando y va a
escribir python y el interprete de Python va a comenzar a ejecutar los comandos
en modo interactivo y le va a aparecer algo as:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
Esto no va bien. A menos que se le ocurra algo rapido, los habitantes de ese planeta
lo pueden atacar con sus espadas, ensartarlo en un palo, cocinarlo en fuego, y
comerselo a la cena.
Por fortuna, usted llevaba una copia de este libro en su viaje y buscando llego
exactamente a esta pagina e intento nuevamente:
>>> print 'Hello world!'
Hello world!
Usted notara que el error es diferente en los dos primeros intentos. El segundo
error es diferente porque if es una palabra reservada y Python vio la palabra
reservada y penso que usted estaba tratando de decirle algo, pero la sintaxis de
la oracion no era correcta.
La manera apropiada de decirle good-bye a Python es escribiendo quit() en los
smbolos de la terminal que aparecen as >>>. Le hubiera tomado bastante adivinar
eso, as que tener el libro a la mano probablemente le resultara u til.
El Lenguage de Maquina se ve muy sencillo por encima, dado que consiste solo
de ceros y unos, pero su sintaxis es aun muy compleja y mucho mas elaborada que
Python. As que muy pocos programadores escriben en lenguage de maquina. En
lugar de eso, lo que hacemos es construir varios traductores que le permitan a los
programadores escribir en lenguages de alto nivel como Python o JavaScript y estos traductores convierten los programas a lenguage de maquina para la ejecucion
de los programas en la CPU.
Siendo que el lenguage de maquina esta asociado al hardware de la computadora,
el lenguage de maquina no es portable a traves de los diferentes tipos de hardware. Los Programas escritos en lenguages de alto nivel se pueden mover entre
las diferentes computadoras usando un interprete diferente en la nueva computadora o al recopilar el codigo para crear una version de lenguage de maquina del
programa que se pretende usar en otra computadora diferente.
Estos interpretes de lenguages de programacion se ubican en dos categorias generales: (1) interpretes y (2) compiladores.
Un interprete lee el codigo fuente del programa como ha sido escrito por el programador, analiza el codigo e interpreta las instrucciones al instante. Python es
un interprete y cuando estamos ejecutando la aplicacion Python, interactivamente,
podemos escribir una lnea de Python (una oracion) y Python la procesa de inmediato, y queda listo para que nosotros escribamos otra lnea en Python.
Algunas de las lneas en Python le dicen a Python que usted quiere que recuerde
algunos valores para mas tarde. Necesitamos escoger un nombre para almacenar
ese valor en memoria y podemos usar ese nombre simbolico para recuperar el
valor mas tarde. Usamos el termino variable para referirnos al nombre con el cual
se almacenan esos datos.
>>>
>>>
6
>>>
>>>
42
>>>
x = 6
print x
y = x * 7
print y
En este ejemplo, le pedimos a Python que recuerde el valor seis y que se lo asigne
a x de modo que podamos recuperar el valor mas tarde. Verificamos que en efecto
Python ha recordado el valor usando print. Luego le pedimos a Python que recupere x y lo multiplique por siete y que ponga el nuevo valor asignandoselo a y.
Despues le pedimos a Python que imprima el valor actual en y.
10
Aunque estamos escribiendo estos comandos en Python una lnea a la vez, Python
los trata como una secuencia ordenada de oraciones y es capaz de recuperar datos
creados en frases escritas desde el principio. Estamos escribiendo nuestro primer
parrafo sencillo con cuatro oraciones en un orden logico y significativo.
La naturaleza de un interpreter es ser capaz de mantener una conversacion interactiva como se muestra arriba. Un compilador necesita que se le entregue el programa entero en un archivo y luego lo procesa para traducirlo al codigo de fuente
de alto nivel en lenguage de maquina, despues, el compilador pone el lenguage de
maquina resultante en un archivo para ser ejecutado mas tarde.
Si usted tiene un sistema Windows, a menudo estos programas ejecutables de
lenguage de maquina tienen un sufijo .exe o .dll que significa ejecutable y
biblioteca dinamicamente cargable, respectivamente. En Linux y Macintosh no
hay sufijo que indentifique un archivo como ejecutable.
Si usted abriera un archivo ejecutable en un editor de texto, vera algo completamente ilegible:
?ELFAAA@@@@@@@@@B@C@A@@@\xa0\x82
DH4@@@\x90]@@@@@@4@ @G@(@$@!@F@
@@4@@@4\x80DH4\x80DH\xe0@@@\xe0@@@E
@@@D@@@C@@@TA@@T\x81DHT\x81DHS
@@@S@@@D@@@A@@@A\DHQVhT\x83DH\xe8
....
Esto es mas de lo que usted realmente necesita saber para convertirse en un programador de Python, pero algunas veces vale la pena contestar esas pequennas
inquietudes desde el comienzo.
11
cat hello.py
'Hello world!'
python hello.py
world!
El csev$ es el indicador del sistema operativo, y cat hello.py nos muestra que
el archivo hello.py tiene un programa Pytnon de una lnea para imprimir una
frase (string).
Llamamos al interprete de Python y le decimos que lea el codigo fuente del archivo
hello.py en vez de entrar las lneas de codigo interactivamente.
Usted observara que no hubo necesidad de escribir quit() al final del arcivo del
programa en Python. Cuando Python esta leyendo el codigo fuente de un archivo,
sabe que tiene que parar cuando llega al final del archivo.
12
rapida y precisa de modo que pueda pasar el fin de semana haciendo algo mas
divertido.
Por ejemplo mire el siguiente texto sobre un payaso y un carro. Mire el texto y
encuentre la palabra mas comun y cuantas veces aparece.
el payaso corre tras el carro
y el carro corre a la carpa
y la carpa cae sobre el payaso
y el carro
Despues imagnese que usted este haciendo esta tarea buscando en millones de
lneas de texto. Francamente sera mas rapido que usted aprenda Python y escriba un programa en Python para contar las palabras, que darle un vistazo a las
palabras.
La mejor noticia es que yo ya escrib un programa sencillo para encontrar la palabra mas comun en un archivo de texto. Yo lo escrib, lo verifique y ahora se lo
doy a usted para que lo utilice y ahorre tiempo.
name = raw_input('Enter file:')
handle = open(name, 'r')
text = handle.read()
words = text.split()
counts = dict()
for word in words:
counts[word] = counts.get(word,0) + 1
bigcount = None
bigword = None
for word,count in counts.items():
if bigcount is None or count > bigcount:
bigword = word
bigcount = count
print bigword, bigcount
Usted nisiquiera tiene que saber Python para usar este programa. Usted tendra que
llegar al captulo 10 de este libro para entender completamente las maravillosas
tecnicas de Python que se usaron para escribir ese programa. Usted es el usuario,
simplemente use el programa y maravllese de la inteligencia del lenguage y como
le ahorra tiempo y esfuerzo. Usted simplemente escribe el codigo en un archivo
y le da el nombre de words.py lo ejecuta, o puede bajar el archivo de http:
//www.pythonlearn.com/code/ para ejecutarlo.
Este es un buen ejemplo de como Python y el lenguage Python actuan como intermediarios entre usted como (usuario) y yo como (programador). Python es una
manera para que nosotros intercambiemos instrucciones secuenciales u tiles (i.e.
programas) en un lenguage comun que pueden ser usadas por cualquiera que instale Python en su computadora. As que ninguno de nosotros esta hablando con
Python, sino que nos comunicamos a traves de Python.
13
14
Mientras que pareciera que Python gusta de todos los demas, Python los conoce
personalmente y se reciente. Por este resentimiento, Python toma nuestro programa perfectamente escrito y lo rechaza como si no fuera idoneo solo para
tormentarnos.
>>> primt 'Hello world!'
File "<stdin>", line 1
primt 'Hello world!'
Nada se gana con argumentar con Python. Es una herramienta, no tiene emociones
y esta feliz y listo para servirlo a usted cuando lo necesite. Sus mensajes de errores
suenan cruel, pero son solo la manera de Python pedir ayuda. Ha mirado lo que
usted ha escrito y sencillamente no puede entender lo que lee.
Python es mucho mas como un perro, amoroso incondicionalemnte, que se comunica con unas pocas palabras clave que entiende, mir andolo con una mirada dulce
en su cara (>>>) y esperando que usted diga algo que pueda entender. Cuando
Python dice SyntaxError: invalid syntax, esta simplemente moviendo su cola y
diciendo , Parece que usted esta diciendo algo, pero yo no entiendo lo que quiere
decir, pero por favor siga hablando conmigo (>>>).
En la medida que sus programas se vuelvan mas sofisticados, usted encontrara tres
tipos de errores en general:
Errores sintacticos: Estos son los primeros errores que usted hara y los mas
faciles de arreglar. Un error sintactico (syntax error) significa que usted
ha violado las reglas de gramatica de Python. Python hace lo mejor que
puede para mostrar la lnea y letra donde nota que hay un problema. La
u nica parte complicada de los errores sintacticos es que algunas veces el
error que se necesita corregir esta realmente mas arriba de donde Python
muestra que hubo un error. As que la lnea y la letra que Python indica en
donde se encuentra el error sintactico (syntax error) puede ser solo un punto
de partida para su investigacion.
15
16
aparecen al principio, usted vera que en verdad ha aprendido bastante material aun
cuando el material que este estudiando actualmente le parezca impenetrable.
Generalmente cuando se esta aprendiendo el primer lenguage de programacion,
hay ciertos momentos maravillosos de luz donde usted puede contemplar la escultura despues de haber estado martillando una roca.
Si algo parece particularmente difcil, usualmente no tiene valor el quedarse en
ello toda la noche y comenzarlo. Toma un descanso, una siesta, algo de comer,
explquele a alguien la parte con la que estas teniendo problema (o quizas a su
perro), y luego regrese al asunto con una mirada refrescada. Le aseguro que una
vez que aprenda los conceptos de programacion en el libro, usted mirara hacia
atras y vera lo simple y elegante que era y que simplemente le tomo un poco de
tiempo absorberlo.
1.12 Glosario
bug: Un error en el programa.
unidad central de procesamiento: El corazon de la computadora. Es lo que ejecuta el software que escribimos; llamado tambien CPU o procesador.
1.13. Ejercicios
17
1.13 Ejercicios
Exercise 1.1 Cual es la funcion de la memoria secundaria de una computadora?
a) Ejecutar todas la computacion y logica del programa
b) Recuperar paginas web de Internet
c) Almacenar informacion a largo plazo - aun mas alla de que se apague
d) Tomar entradas por escrito del usuario
Exercise 1.2 Que es un programa?
Exercise 1.3 Cual es la diferencia entre compilador e interprete?
Exercise 1.4 Cual de los siguientes contiene codigo de maquina (machine
code)?
a) El interprete Python
b) El teclado
c) Archivo fuente en Python
d) Un documento de procesador de palabras (word processing)
Exercise 1.5 Que hay de malo en el siguiente codigo?:
18
a) 43
b) 44
c) x + 1
d) Error porque x = x + 1 no es posible matematicamente
Exercise 1.8 Explique cada una de las siguientes utilizando un ejemplo de una
capacidad humana: (1) Unidad Central de Procesamiento, (2) Memoria Principal,
(3) Memoria Secundaria, (4) Dispositivo de entrada (Input Device), y (5) Dispositivo de salida (Output Device). Por ejemplo, Cual es el equivalente humano de
la Unidad Central de Procesamiento?
Exercise 1.9 Como se arregla un error sintactico, Syntax Error?
Chapter 2
Variables, expresiones y
afirmaciones
2.1 Valores y tipos
Un valor es una de las cosas basicas con las que un programa trabaja tales como
una letra o un numero. Los valores que hemos visto hasta ahora son 1, 2, y
'Hello, World!'.
Estos valores pertenecen a diferentes tipos: 2 es un numero entero y
'Hello, World!' es una cadena de texto, llamada as por cuanto contiene una
cadena (string) de letras. Usted (y el interprete) puede identificar cadenas de texto
porque se encierran entre comillas (quotation mark).
El comando print tambien funciona para numeros enteros. Nosotros usamos el
comando python para ejecutar el interprete.
python
>>> print 4
4
No cabe duda que las cadenas de texto (strings) pertenecen al tipo str y los enteros pertenecen al tipo int. Menos obvio son los numeros con puntos decimales
que pertenecen al tipo llamado float porque estos numeros se representan en un
formato llamado floating-point.
>>> type(3.2)
<type 'float'>
20
Bien, esto no es lo que esperamos. Python interpreta 1,000,000 como una secuencia de enteros separada por una coma, lo cual se imprime con spacios entre
si.
Este es el primer ejemplo que tenemos de error de semantica: el codigo se ejecuta
sin reportar error, pero no hace lo correcto.
2.2 Variables
Una de las caractersticas mas poderosas de un lenguage de programacion es la
capacidad de manipular variables. Una es un nombre que se refiere a un valor.
Una declaracion crea nuevas variables y asigna valores:
>>> message = 'Y ahora para algo completamente diferente'
>>> n = 17
>>> pi = 3.1415926535897931
Este ejemplo establece tres valores. La primera asigna una cadena a una nueva
variable llamada message; la segunda asigna un entero 17 a n; la tercera asigna el
valor (aproximado) de a pi.
Para desplegar el valor de una variable, usted puede usar un comando para imprimir:
>>> print n
17
>>> print pi
3.14159265359
21
>>> type(message)
<type 'str'>
>>> type(n)
<type 'int'>
>>> type(pi)
<type 'float'>
76trombones es ilegal porque no comienza con una letra. more@ es ilegal porque
contiene un caractere ilegal, @. Pero que tiene de malo class?
Resulta que class es una de las palabras clave (keywords) de Python. El
interprete utiliza palabras clave (keywords) para reconocer la estructura del programa, y no se pueden utilizar para nombrar variables.
Python reserva 31 palabras clave o keywords1 para su uso:
and
as
assert
break
class
continue
def
1 En
del
elif
else
except
exec
finally
for
from
global
if
import
in
is
lambda
not
or
pass
print
raise
return
try
while
with
yield
Python 3.0, exec ya no se considera una palabra clave o keyword, pero nonlocal s.
22
hour-1
hour*60+minute
minute/60
5**2
(5+9)*(15-7)
2.6. Expresiones
23
2.6 Expresiones
Una expresion es una combinacion de valores, variables y operadores. Un valor
por s mismo se considera una expresion y as mismo una variable, por esta razon
las siguientes son todas expresiones legales(asumiendo que a la variable x se le ha
asignada un valor):
17
x
x + 17
Pero en un script, una expresion por s misma no hace nada. Esto es una fuente
de confusion muy comun para principiantes.
Exercise 2.1 Escriba la siguiente afirmacion en el interprete de Python para ver
lo que hace:
Exercise 2.2 5
x = 5
x + 1
24
Cuando tenga duda, siempre ponga parentesis en sus expresiones para asegurarse
que la computacion se realicen en el order que usted intenta.
quotient = 7 / 3
print quotient
remainder = 7 % 3
print remainder
first = 10
second = 15
print first+second
first = '100'
25
Antes de tomar el input del usuario, es una buena idea desplegar un mensaje indicando que debe escribir el usuario. Usted puede pasar una cadena de palabras o
string a raw_input para que lo desplegue al usuario antes de recibir el:
>>> name = raw_input('What is your name?\n')
What is your name?
Chuck
>>> print name
Chuck
26
2.11 Comentarios
En la medidad que los programas se vuelvan mas grandes y mas complicados, se
hace mas difcil leerlos. El lenguage formal es denso y a vececes es difcil mirar
un segmento de codigo y entender que hace o por que.
Por esta razon, una buena idea es agreagar notas a sus programas para explicar en
un lenguage natural lo que hace el program. A estas notas se les llama comentarios y comienzan con el smbolo #:
# compute the percentage of the hour that has elapsed
percentage = (minute * 100) / 60
En este caso, el comentario aparece en una lnea por si solo. Tambien se pueden
poner comentarios al final de la lnea:
percentage = (minute * 100) / 60
# percentage of an hour
# assign 5 to v
# velocity in meters/second.
27
sus propios programas. Por ejemplo, los siguientes tres programas son identicos
en terminos de alcance, pero muy diferentes al leerlos y tratar de entenderlos.
a = 35.0
b = 12.50
c = a * b
print c
hours = 35.0
rate = 12.50
pay = hours * rate
print pay
x1q3z9ahd = 35.0
x1q3z9afd = 12.50
x1q3p9afd = x1q3z9ahd * x1q3z9afd
print x1q3p9afd
El interprete de Python ve estos tres programas exactamente iguales, pero los humanos los ven y los entienden de una manera muy diferente. Los humanos van a
entender mas rapidamente la intencion del segundo programa porque el programador ha escogido nombres de variable que reflejan la intencion del programador
con relacion a los datos que se almacenan en cada variable.
A estos nombres de variables sabiamente escogidas se les llama nombres de variable mnemotecnicos. La palabra mnemotecnica4 que significa ayuda a memorizar. Se escogen nombres de variable mnemotecnicas para ayudar a recordar, en
primer lugar, porque se ha creado la variable.
Mientras que todo esto suena bien y es una buena idea utilizar variables
mnemotecnicas, este tipo de variables pueden obstaculizar el paso del programador aprendiz en su habilidad de analizar y comprender el codigo. Esto se debe
a que el principiante en programacion no ha memorizado aun las palabras reservadas (estas son solo 31) y algunas veces nombres de variables que son demasiado
descriptivas comienzan a verse como parte del lenguage y no como simples nombres de variables bien escogidas.
Tome nota del siguiente ejemplo de codigo de Python que circula (loop) entre los
mismos datos. Cubriremos el concepto de loops pronto, pero por ahora trate de
pensar en lo que significa:
for word in words:
print word
?Que esta ocurriendo aqu? ?Cual de los signos (for, word, in, etc.) son palabras
reservadas y cuales son simplemente nombres de variables? ?Entiende Python
en un nivel fundamental la nocion de palabras? Los programadores principiantes
4 Vease http://en.wikipedia.org/wiki/Mnemonic para una descripci
on extendida de la palabra mnemonic.
28
tienen dificultad separando las partes de codigo que deben ser igual en este ejemplo y las partes del codigo que son simplemente selecciones hechas por el programador.
El siguiente codigo es equivalent al codigo de arriba:
for slice in pizza:
print slice
Es mas facil para el programador principiante ver todo el codigo y saber que partes
son palabras reservadas definidas por Python y que partes son simplemente nombres de variables escogidas por el programador. Es claro que Python no tiene una
comprension fundamental de pizza y pedazos y el hecho de que una pizza consiste
de una o mas pedazos.
Pero si nuestro programa es sobre lectura de datos y encontrar palabras en los
datos, pizza y slice (pedazos) son nombres de variables mnemotecnicos. Escogerlos como variables distrae la atencion del significado del programa.
Despues de un corto tiempo, usted aprendera las palabras reservadas mas comunes
y comenzara a ver las palabras reservadas como si le saltaran a la vista:
for word in words:
print word
Las partes del codigo que estan definidas por Python (for, in, print, y :) estan
en negrilla y las variables que escogio el programador (word y words) no estan en
negrilla. Muchos editores de texto conocen la sintactica de Python y colorean las
palabras reservadas de manera diferente para darle una clave y ayudarle a separar
sus variables de las palabras reservadas. Despues de cierto tiempo usted empezara
a leer Python y rapidamente determinar que es una variable y que es una palabra
reservada.
2.13 Depuracion
Hasta aqu el error sintactico mas comun que usted vaya a cometer es un nombre
de variable ilegal, como class y yield, las cuales son palabras claves, o oddjob
y US$, los cuales contienen caracteres ilegales.
Si usted coloca un espacio en el nomre de una variable, Python cree que son dos
operandos sin un operador:
>>> bad name = 5
SyntaxError: invalid syntax
Para los errores sintacticos, el mensaje de error no es muy u til. Los mensajes mas
comunes son SyntaxError: invalid syntax y SyntaxError: invalid
token, ninguno de los dos es muy informativo.
2.14. Glosario
29
Per la division ocurre primero, as que el resultado que usted tendra sera /2, lo
cual no es la misma cosa. No hay ninguna manera que Python sepa lo que usted
quiere escribir, de modo que, en este caso, a usted no le aparecera un mensaje de
error; solo obtendra la respuesta incorrecta.
2.14 Glosario
assignment o asignatura: Una afirmacion que asigna un valor a una variable.
concatenar: Unir dos operandos.
comentario: Informacion en un programa con el proposito de informar a otros
programadores (o cualquiera que lea el codigo fuente) y que no tiene efecto
alguno en la ejecucion del programa.
evaluar: Simplificar una expresion al realizar las operaciones para obtener un
solo valor.
expression o expresion: Una combinacion de variables, operadores y valores que
representa un resultado de valor singular.
floating-point o punto flotante: Un tipo que representa numeros con partes en
fracciones.
floor division: La operacion que divide dos numeros y parte la seccion de la
fraccion.
integer o numero
entero: Un tipo que representa numeros enteros.
keyword o palabra clave: Una palabra reservada que usa el compilador para
analizar un programa. Usted no puede usar palabras claves como if, def, y
while para nombrar variables.
30
mnemotecnicas: Una ayuda para recordar. A menudo damos a las variables nombres con menmotecnicas para ayudarnos a recordar lo que se almacena en
la variable.
modulus operator o modulo operador: Un operador denotado con un signo de
porcentaje (%), que funciona en numeros enteros y deja un residuo cuando
un numero es dividido por otro.
operando: Uno de los valores en el que un operador opera.
operador: Un smbolo especial que representa un calculo simple como suma,
multiplicacion o concatenacion de cadenas (string).
reglas de precedencia: La serie de reglas que gobieran el orden en el cual se
evaluan las expresiones que involucran multiples operadores y operandos.
statement o afirmacion: Un segmento de codigo que representa un comando o
accion. Hasta ahora, las afirmaciones que hemos visto son asignaturas y
comandos de impresion (print statements).
string o cadena: Un tipo que representa una secuencia de caracteres.
tipo: Una categoria de valores. Los tipos que hemos visto hasta ahora son
numeros enteros (tipo int), punto flotante (numero decimal) (type float),
y cadena o strings (type str).
valor: Uno de las unidades basicas de datos, como un numero o una cadena de
palabras que un programa manipula.
variable: Un nombre que se refiere a un valor.
2.15 Exercicios
Exercise 2.3 Escriba un programa que use raw_input que requiera que el usuario
entre su nombre y luego le de la bienvenida.
Enter your name: Chuck
Hello Chuck
Exercise 2.4 Escriba un programa que requiera del usuario entrar las horas y el
valor por hora para calcular el pago total.
Enter Hours: 35
Enter Rate: 2.75
Pay: 96.25
No nos preocuparemos de que el salario tenga exactamente dos dgitos despues del
decimal, por ahora. Si usted quiere, puede ensayar con las functiones integradas
de Python round para redondear apropiadamente el resultado del pago en dos
espacios decimales.
2.15. Exercicios
31
32
Chapter 3
Ejecucion condicional
3.1 Expresiones booleanas
Una expresion booleana es una expresion que es o falsa o verdadera. Los siguientes ejemplo utilizan el operador ==, el cual compara dos operandos y produce
True si son iguales y False si no lo son:
>>> 5 == 5
True
>>> 5 == 6
False
True y False son valores especiales que pertenecen al tipo bool; estos no son
cadenas o strings:
>>> type(True)
<type 'bool'>
>>> type(False)
<type 'bool'>
!= y
> y
< y
>= y
<= y
is y
is not y
#
#
#
#
#
#
#
x
x
x
x
x
x
x
no
es
es
es
es
es
no
es igual a y
mayor que y
menor que y
mayor o igual a y
menor o igual a y
lo mismo que y
es lo mismo que y
34
This flexibility can be useful, but there are some subtleties to it that might be
confusing. You might want to avoid it (unless you know what you are doing).
The boolean expression after the if statement is called the condition. We end the
if statement with a colon character (:) and the line(s) after the if statement are
indented.
x>0
no
yes
print 'x is positive'
If the logical condition is true, then the indented statement gets executed. If the
logical condition is false, the indented statement is skipped.
35
if statements have the same structure as function definitions or for loops. The
statement consists of a header line that ends with the colon character (:) followed
by an indented block. Statements like this are called compound statements because they stretch across more than one line.
There is no limit on the number of statements that can appear in the body, but there
has to be at least one. Occasionally, it is useful to have a body with no statements
(usually as a place keeper for code you havent written yet). In that case, you can
use the pass statement, which does nothing.
if x < 0 :
pass
If you enter an if statement in the Python interpreter, the prompt will change from
three chevrons to three dots to indicate you are in the middle of a block of statements as shown below:
>>> x = 3
>>> if x < 10:
...
print 'Small'
...
Small
>>>
If the remainder when x is divided by 2 is 0, then we know that x is even, and the
program displays a message to that effect. If the condition is false, the second set
of statements is executed.
no
print 'x is odd'
x%2 == 0
yes
print 'x is even'
36
Since the condition must be true or false, exactly one of the alternatives will be
executed. The alternatives are called branches, because they are branches in the
flow of execution.
elif is an abbreviation of else if. Again, exactly one branch will be executed.
x<y
x>y
yes
yes
print 'less'
print 'greater'
print 'equal'
Each condition is checked in order. If the first is false, the next is checked, and so
on. If one of them is true, the corresponding branch executes, and the statement
ends. Even if more than one condition is true, only the first true branch executes.
37
The outer conditional contains two branches. The first branch contains a simple statement. The second branch contains another if statement, which has two
branches of its own. Those two branches are both simple statements, although
they could have been conditional statements as well.
yes
x == y
no
yes
print 'equal'
x<y
print 'less'
no
print 'greater'
Although the indentation of the statements makes the structure apparent, nested
conditionals become difficult to read very quickly. In general, it is a good idea to
avoid them when you can.
Logical operators often provide a way to simplify nested conditional statements.
For example, we can rewrite the following code using a single conditional:
if 0 < x:
if x < 10:
print 'x is a positive single-digit number.'
38
When we are executing these statements in the Python interpreter, we get a new
prompt from the interpreter, think oops and move on to our next statement.
However if this code is placed in a Python script and this error occurs, your script
immediately stops in its tracks with a traceback. It does not execute the following
statement.
Here is a sample program to convert a Fahrenheit temperature to a Celsius temperature:
inp = raw_input('Enter Fahrenheit Temperature:')
fahr = float(inp)
cel = (fahr - 32.0) * 5.0 / 9.0
print cel
If we execute this code and give it invalid input, it simply fails with an unfriendly
error message:
python fahren.py
Enter Fahrenheit Temperature:72
22.2222222222
python fahren.py
Enter Fahrenheit Temperature:fred
Traceback (most recent call last):
File "fahren.py", line 2, in <module>
fahr = float(inp)
ValueError: invalid literal for float(): fred
There is a conditional execution structure built into Python to handle these types of
expected and unexpected errors called try / except. The idea of try and except
is that you know that some sequence of instruction(s) may have a problem and
you want to add some statements to be executed if an error occurs. These extra
statements (the except block) are ignored if there is no error.
You can think of the try and except feature in Python as an insurance policy
on a sequence of statements.
We can rewrite our temperature converter as follows:
39
Python starts by executing the sequence of statements in the try block. If all goes
well, it skips the except block and proceeds. If an exception occurs in the try
block, Python jumps out of the try block and executes the sequence of statements
in the except block.
python fahren2.py
Enter Fahrenheit Temperature:72
22.2222222222
python fahren2.py
Enter Fahrenheit Temperature:fred
Please enter a number
= 6
= 2
>= 2 and (x/y) > 2
= 1
= 0
>= 2 and (x/y) > 2
40
False
>>> x = 6
>>> y = 0
>>> x >= 2 and (x/y) > 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>>
The third calculation failed because Python was evaluating (x/y) and y was zero
which causes a runtime error. But the second example did not fail because the
first part of the expression x >= 2 evaluated to False so the (x/y) was not ever
executed due to the short circuit rule and there was no error.
We can construct the logical expression to strategically place a guard evaluation
just before the evaluation that might cause an error as follows:
>>> x = 1
>>> y = 0
>>> x >= 2 and y != 0 and (x/y) > 2
False
>>> x = 6
>>> y = 0
>>> x >= 2 and y != 0 and (x/y) > 2
False
>>> x >= 2 and (x/y) > 2 and y != 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>>
In the first logical expression, x >= 2 is False so the evaluation stops at the and.
In the second logical expression x >= 2 is True but y != 0 is False so we never
reach (x/y).
In the third logical expression, the y != 0 is after the (x/y) calculation so the
expression fails with an error.
In the second expression, we say that y != 0 acts as a guard to insure that we
only execute (x/y) if y is non-zero.
3.9 Depuracion
The traceback Python displays when an error occurs contains a lot of information,
but it can be overwhelming, especially when there are many frames on the stack.
The most useful parts are usually:
What kind of error it was, and
Where it occurred.