Introducción
a la programación
con Python
Andrés Marzal
Isabel Gracia

Departamento de lenguajes y sistemas informáticos
C...
Introducci´n a la programaci´n
o
o
con Python

Andr´s Marzal
e

Isabel Gracia

Departamento de Lenguajes y Sistemas Inform...
Prefacio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Andrés ...
Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9

IV

Introducción a la programación con Python - UJI
Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9



Introducción a la programación con Python - UJI
Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9

VI

Introducción a la programación con Python - UJI
Prefacio

˂˂Introducci´n a la programaci´n con Python˃˃ e ˂˂Introducci´n a la programaci´n con C˃˃
o
o
o
o
desarrollan el ...
estudiante.
Hemos de recalcar que este libro pretende ense˜ar a programar y no es un manual
n
exhaustivo sobre el lenguaje...
hola mundo.py

hola mundo 1.py

print ’ Hola,’, ’mundo!’
!

1

Si, aunque haya varias versiones, no aparece un n´mero al fi...
entorno de programaci´n PythonG. Finalmente, agradecemos la colaboraci´n de cuantos
o
o
nos han hecho llegar sugerencias o...
Cap´
ıtulo 1

Introducci´n
o
¿Qu´ sabes de este asunto? pregunt´ el Rey a Alicia.
e
o
Nada dijo Alicia.
¿Absolutament...
1
2
3
4

.
.
.

Memoria

Unidad Central de Proceso
Unidad de Control Unidad Aritm´tico-L´gica
e
o

Utilizaremos un lenguaj...
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . ....
a) 01111111 + 00000001

b) 01010101 + 10101010

c) 00000011 + 00000001

.....................................................
es [−128, 127]) y, principalmente, de que una sola operaci´n de suma basta para obtener
o
el resultado correcto de una adi...
1.3.

Programas y lenguajes de programaci´n
o

Antes de detenernos a hablar de la codificaci´n de la informaci´n est´bamos ...
La CPU es un ingenioso sistema de circuitos electr´nicos capaz de interpretar el
o
significado de cada una de esas secuenci...
Ahora, la tercera instrucci´n dice que hemos de tomar el valor de la direcci´n 13 (el valor
o
o
21), dividirlo por 3 y dep...
1.3.2.

Lenguaje ensamblador

En los primeros tiempos de la inform´tica los programas se introduc´ en el ordenador
a
ıan
d...
¡Hola, mundo!

Nos gustar´ mostrarte el aspecto de los programas escritos en lenguajes ensambladores
ıa
reales con un par ...
La complejidad intr´
ınseca de las construcciones de los lenguajes naturales dificulta
enormemente el an´lisis sint´ctico d...
Compiladores e int´rpretes. . . de idiomas
e

Puede resultarte de ayuda establecer una analog´ entre compiladores e int´rp...
Python ofrece un entorno interactivo que facilita la realizaci´n de pruebas y ayuda
o
a despejar dudas acerca de ciertas c...
Python est´ en todas partes de Industrial Light  Magic. Se usa para extender
a
la capacidad de nuestras aplicaciones y par...
telecomunicaciones ATT, se conoce popularmente por KR C y est´ pr´cticamente en
a a
desuso. En los a˜os 80, C fue modificad...
La torre de Babel

Hemos dicho que los lenguajes de programaci´n de alto nivel pretend´ entre otros
o
ıan,
objetivos, pali...
4.
5.
6.

coger un huevo,

romper la c´scara,
a

verter el contenido del huevo en la sart´n,
e

7. aderezar con sal,

8. e...
Ingredientes: 10 cc. de aceite de oliva, un huevo de gallina y una pizca de sal.
M´todo:
e
1.

poner aceite en una sart´n,...
4.

si son diferentes, volver al paso 1; en caso contrario, somos millonarios.

Como ves, cada uno de los pasos del m´todo...
· 10 Dise˜a un algoritmo que calcule el IVA (16%) de un producto dado su precio de
n
venta sin IVA.
· 11 ¿Podemos llamar a...
Cap´
ıtulo 2

Una calculadora avanzada
¿Sabes sumar? le pregunt´ la Reina Blanca. ¿Cu´nto es uno m´s uno
o
a
a
m´s uno ...
[GCC 3.3] on linux2
Type help, copyright, credits or license for more information.


El prompt es la serie de caracteres ˂...
Final de fichero

La ˂˂marca de final de fichero˃˃ indica que un fichero ha terminado. ¡Pero nosotros no
trabajamos con un fich...
2 +
−1 -

3

1

2

As´ se obtiene el resultado final: el valor 2.
ı
Si deseamos calcular (1−(2+3)) podemos hacerlo a˜adiend...
Espacios en blanco

Parece que se puede hacer un uso bastante liberal de los espacios en blanco en una
expresi´n.
o
10 + 2...
El operador identidad s´lo sirve para, en ocasiones, poner ´nfasis en que un n´mero
o
e
u
es positivo. (El ordenador consi...
+
2

*
4

5

Pero, ¡atenci´n!, el cambio de signo tiene mayor prioridad que la multiplicaci´n y la
o
o
divisi´n:
o
↱

↱

 ...
↱

 2 ** 3
8

Pero, ¡ojo!, la exponenciaci´n es asociativa por la derecha. La expresi´n 2 ** 3 **
o
o
(32 ) = 29 = 512, y ...
-

↱

 -1
-1

1

La tabla 2.1 resume las caracter´
ısticas de los operadores Python: su aridad (n´mero
u
de operandos), as...
ˆ
SyntaxError: invalid syntax

En este ejemplo hemos cerrado un par´ntesis cuando no hab´ otro abierto previae
ıa
mente, l...
2.2.

Tipos de datos

Vamos a efectuar un experimento de resultado curioso:
↱

 3 / 2
1

¡El resultado de dividir 3 entre ...
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Ippython
Upcoming SlideShare
Loading in …5
×

Ippython

485 views
399 views

Published on

un buen manual de Python

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
485
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Ippython

  1. 1. Introducción a la programación con Python Andrés Marzal Isabel Gracia Departamento de lenguajes y sistemas informáticos Codis d’assignatura II04 i IG04 Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 Introducción a la programación con Python - UJI
  2. 2. Introducci´n a la programaci´n o o con Python Andr´s Marzal e Isabel Gracia Departamento de Lenguajes y Sistemas Inform´ticos a Universitat Jaume I Edita: Publicacions de la Universitat Jaume I. Servei de Comunicació i Publicacions Campus del Riu Sec. Edifici Rectorat i Serveis Centrals. 12071 Castelló de la Plana http://www.tenda.uji.es e-mail: publicacions@uji.es Col·lecció Sapientia, 23 www.sapientia.uji.es ISBN: 978-84-692-5869-9 Aquest text està subjecte a una llicència Reconeixement-NoComercial-CompartirIgual de Creative Commons, que permet copiar, distribuir i comunicar públicament l’obra sempre que especifique l’autor i el nom de la publicació i sense objectius comercials, i també permet crear obres derivades, sempre que siguen distribuïdes amb aquesta mateixa llicència. http://creativecommons.org/licenses/by-nc-sa/2.5/es/deed.ca Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 II Introducción a la programación con Python - UJI
  3. 3. Prefacio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 III 1 Introducción a la programación con Python - UJI
  4. 4. Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 IV Introducción a la programación con Python - UJI
  5. 5. Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 Introducción a la programación con Python - UJI
  6. 6. Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 VI Introducción a la programación con Python - UJI
  7. 7. Prefacio ˂˂Introducci´n a la programaci´n con Python˃˃ e ˂˂Introducci´n a la programaci´n con C˃˃ o o o o desarrollan el temario de la asignatura ˂˂Metodolog´ y tecnolog´ de la programaci´n˃˃ de ıa ıa o las titulaciones de Ingenier´ Inform´tica e Ingenier´ T´cnica en Inform´tica de Gesti´n ıa a ıa e a o de la Universitat Jaume I. En ella se pretende ense˜ar a programar y, a diferencia de lo n que es usual en cursos introductorios a la programaci´n, se propone el aprendizaje con o dos lenguajes de programaci´n: Python y C. o ¿Por qu´ dos lenguajes de programaci´n? Python y C son bien diferentes. El primero e o es un lenguaje de muy alto nivel que permite expresar algoritmos de forma casi directa (ha llegado a considerarse ˂˂pseudoc´digo ejecutable˃˃) y hemos comprobado que se trata o de un lenguaje particularmente adecuado para la ense˜anza de la programaci´n. Esta n o impresi´n se ve corroborada por la adopci´n de Python como lenguaje introductorio en o o otras universidades. El lenguaje C exige una gran atenci´n a multitud de detalles que o dificultan la implementaci´n de algoritmos a un estudiante que se enfrenta por primera o vez al desarrollo de programas. No obstante, C sigue siendo un lenguaje de programaci´n o de referencia y debe formar parte del curr´ ıculum de todo inform´tico: su proximidad al a computador nos permite controlar con gran precisi´n el consumo de recursos computacioo nales. Aprender Python antes que C permite estudiar las estructuras de control y de datos b´sicas con un alto nivel de abstracci´n y, as´ entender mejor qu´ supone, exactamente, a o ı, e la mayor complejidad de la programaci´n en C y hasta qu´ punto es mayor el grado o e de control que nos otorga. Por ejemplo, una vez se han estudiado listas en Python, su implementaci´n en C permite al estudiante no perder de vista el objetivo ultimo: conso ´ truir una entidad con cierto nivel de abstracci´n usando unas herramientas concretas (los o punteros). De ese modo se evita una desafortunada confusi´n entre estructuras din´micas o a y punteros que es frecuente cuando ´stas se estudian unicamente a la luz de un lenguaje e ´ como C. En cierto modo, pues, Python y C se complementan en el aprendizaje y ofrecen una visi´n m´s rica y completa de la programaci´n. Las similitudes y diferencias entre o a o ambos permiten al estudiante inferir m´s f´cilmente qu´ es fundamental y qu´ accesorio a a e e o accidental al dise˜ar programas en un lenguaje de programaci´n cualquiera. n o ¿Y por qu´ otro libro de texto introductorio a la programaci´n? Ciertamente hay muchos e o libros que ense˜an a programar desde cero. Creemos que estos dos libros de texto se n diferencia de ellos tanto en el hecho de estudiar secuencialmente dos lenguajes como en la forma en que se exponen y desarrollan los conocimientos. Hemos procurado adoptar siempre el punto de vista del estudiante y presentar los conceptos y estrategias para dise˜ar programas b´sicos paso a paso, incrementalmente. La experiencia docente nos ha n a ido mostrando toda una serie l´ ıneas de razonamiento inapropiadas, errores y vicios en los que caen muchos estudiantes. El texto trata de exponer, con mayor o menor fortuna, esos razonamientos, errores y vicios para que el estudiante los tenga presentes y procure evitarlos. As´ en el desarrollo de algunos programas llegamos a ofrecer versiones err´neas ı, o para, acto seguido, estudiar sus defectos y mostrar una versi´n corregida. Los apuntes o est´n repletos de cuadros que pretenden profundizar en aspectos marginales, llamar la a atenci´n sobre alg´n extremo, ofrecer algunas pinceladas de historia o, sencillamente, o u desviarse de lo sustancial con alguna digresi´n que podr´ resultar motivadora para el o ıa Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 1 Introducción a la programación con Python - UJI
  8. 8. estudiante. Hemos de recalcar que este libro pretende ense˜ar a programar y no es un manual n exhaustivo sobre el lenguaje de programaci´n Python. Son particularmente rese˜ables o n dos omisiones: los diccionarios y las clases. No forman parte de esta edici´n (aunque o posiblemente se incluir´n en otra posterior) porque hemos preferido centrarnos en aquellos a aspectos que tanto Python como C presentan en com´n. La orientaci´n a objetos se puede u o tratar a partir del material expuesto en estos vol´menes, pero hubiera resultado dif´ u ıcil incluir estos contenidos en el volumen de Python y no poder tratarlos adecuadamente en el volumen dedicado a C. Queremos aprovechar para dar un consejo a los estudiantes que no nos cansamos de repetir: es imposible aprender a programar limit´ndose a leer unos apuntes o a seguir a pasivamente una explicaci´n en clase (especialmente si el per´ o ıodo de estudio se concentra en una o dos semanas). Programar al nivel propio de un curso introductorio no es particularmente dif´ pero constituye una actividad intelectual radicalmente nueva para ıcil, los estudiantes. Es necesario darse una oportunidad para ir asentando los conocimientos y las estrategias de dise˜o de programas (y as´ superar el curso). Esa oportunidad n ı, requiere tiempo para madurar. . . y trabajo, mucho trabajo; por eso el texto ofrece m´s de a cuatrocientos ochenta ejercicios. S´lo tras haberse enfrentado a buena parte de ellos se o estar´ preparado para demostrar que se ha aprendido lo necesario. a Hay centenares de diferencias entre las dos primeras ediciones (publicadas como apuntes en la Universidad Jaume I y en formato electr´nico en Internet) y ´sta. No s´lo o e o hemos corregido erratas (y errores), hemos a˜adido tambi´n nuevos ejemplos, modificado n e otros, preparado nuevos ejercicios, reubicado ejercicios para que aparezcan en lugares que hemos juzgado m´s apropiados, etc. Los programas se presentan con una tipograf´ a ıa que, creemos, facilita notablemente la lectura. El documento PDF ofrece, adem´s, la a posibilidad de descargar c´modamente el texto de los programas (que se pueden descargar o de http://ocw.uji.es). Esperamos que esta posibilidad se traduzca en un mayor animo ´ del estudiante para experimentar con los programas. Convenios tipogr´ficos a Hemos tratado de seguir una serie de convenios tipogr´ficos a lo largo del texto. Los a programas, por ejemplo, se muestran con fondo gris, as´ ı: print ’ Hola,␣mundo!’ ! 1 Por regla general, las l´ ıneas del programa aparecen numeradas a mano izquierda. Esta numeraci´n tiene por objeto facilitar la referencia a puntos concretos del programa y no o debe reproducirse en el fichero de texto si se copia el programa. Cuando se quiere destacar el nombre del fichero en el que reside un programa, se dispone este en una barra encima del c´digo: o hola mundo.py print ’ Hola,␣mundo!’ ! 1 Si se trabaja con la versi´n electr´nica del libro en formato PDF (disponible en la o o p´gina web http://ocw.uji.es) es posible acceder c´modamente al texto de los proa o gramas. Para ello, basta con desempaquetar el fichero programas.tgz (o programas.zip) en el mismo directorio en el que est´ ubicado el documento PDF. Los programas accesibles e tienen un icono que representa un documento escrito en la esquina superior izquierda. Junto al icono aparece el nombre real del fichero: como ofrecemos varias versiones de un mismo programa, nos hemos visto obligados a seguir un esquema de numeraci´n que modio fica el propio nombre del fichero. La primera versi´n de un fichero llamado hola mundo.py o es hola mundo 1.py, la segunda hola mundo 2.py, y as´ sucesivamente. ı Andrés a la programaci´n con ISBN: Introducci´n Marzal/Isabel Gracia -Python 978-84-692-5869-9 o o 2 Introducción a la programación con Python - c UJI UJI
  9. 9. hola mundo.py hola mundo 1.py print ’ Hola,’, ’mundo!’ ! 1 Si, aunque haya varias versiones, no aparece un n´mero al final del nombre del fichero u descargable, se entiende que esa es la versi´n definitiva. o hola mundo.py hola mundo.py print ’ Hola,␣mundo!’ ! 1 Al pinchar en el icono, se abre un fichero de texto con el navegador web o editor de textos que se indique en las preferencias del visualizador de documentos PDF. Cuando el programa contiene alg´n error grave, aparecen un par de rayos flanqueando u al nombre del programa: E hola mundo.py E rint ’ Hola,␣mundo!’ ! 1 Algunos programas no est´n completos y, por ello, presentan alguna deficiencia. No a obstante, hemos optado por no marcarlos como err´neos cuando ´stos evolucionaban en o e el curso de la exposici´n. o La informaci´n que se muestra por pantalla aparece siempre recuadrada. El resultado o de ejecutar hola mundo.py se mostrar´ as´ a ı: ! Hola, mundo! En ocasiones mostraremos las ´rdenes que deben ejecutarse en un int´rprete de o e o e a ımbolo de d´lar: o ´rdenes Unix. El prompt del int´rprete se representar´ con un s´ ↱ $ python hola_mundo.py Hola, mundo! ! La parte que debe teclear el usuario o el programador se muestra siempre con un fondo gris. El retorno de carro se representa expl´ ıcitamente con el s´ ımbolo . Las sesiones interactivas del int´rprete de Python tambi´n se muestran recuadradas. e e El prompt primario del int´rprete Python se muestra con los caracteres ˂˂˃˃ y el e secundario con ˂˂...˃˃. Las expresiones y sentencias que teclea el programador se destacan con fondo gris. ↱ ↱ ’Hola,’ + ’␣’ + ’mundo!’ ’ Hola, mundo!’ if ’Hola’ == ’mundo’: ... print ’si’ ... else: ... print ’no’ ... no ↱ ! ↱ ↱ ↱ ↱ Agradecimientos Este texto es fruto de la experiencia docente de todo el profesorado de las asignaturas de ˂˂Metodolog´ y tecnolog´ de la programaci´n˃˃ y se ha enriquecido con las aportaciones, ıa ıa o comentarios y correcciones de muchos profesores del departamento de Lenguajes y Sistemas Inform´ticos de la Universitat Jaume I de Castell´: Juan Pablo Aibar Ausina, Rafael a o Berlanga Llavor´ Antonio Castellanos L´pez, Pedro Garc´ Sevilla, Mar´ Dolores Llid´ ı, o ıa ıa o Escriv´, David Llorens Pi˜ana, Jos´ Luis Llopis Borr´s, Juan Miguel Vilar Torres, V´ a n e a ıctor Manuel Jim´nez Pelayo y Ram´n Mollineda C´rdenas. Para todos ellos, nuestro agradee o a cimiento. El agradecimiento a David Llorens Pi˜ana es doble por desarrollar, adem´s, el n a Andrés a la programaci´n con ISBN: Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o 3 Introducción a la programación con Python - UJI c UJI
  10. 10. entorno de programaci´n PythonG. Finalmente, agradecemos la colaboraci´n de cuantos o o nos han hecho llegar sugerencias o han detectado erratas. Castell´ de la Plana, a 8 de octubre de 2009. o Andr´s Marzal Var´ e Isabel Gracia Luengo. e o Andrés Marzal/Isabel Gracia Python Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 o o 4 Introducción a la programación con Python - cUJI UJI
  11. 11. Cap´ ıtulo 1 Introducci´n o ¿Qu´ sabes de este asunto? pregunt´ el Rey a Alicia. e o Nada dijo Alicia. ¿Absolutamente nada? insisti´ el Rey. o Absolutamente nada dijo Alicia. Esto es importante dijo el Rey, volvi´ndose hacia los jurados. e LEWIS CARROLL, Alicia en el pa´ de la maravillas. ıs El objetivo de este curso es ense˜arte a programar, esto es, a dise˜ar algoritmos y expren n sarlos como programas escritos en un lenguaje de programaci´n para poder ejecutarlos o en un computador. Seis t´rminos t´cnicos en el primer p´rrafo. No est´ mal. Vayamos paso a paso: e e a a empezaremos por presentar en qu´ consiste, b´sicamente, un computador. e a 1.1. Computadores El diccionario de la Real Academia define computador electr´nico como ˂˂M´quina electr´o a o nica, anal´gica o digital, dotada de una memoria de gran capacidad y de m´todos de trao e tamiento de la informaci´n, capaz de resolver problemas matem´ticos y l´gicos mediante o a o la utilizaci´n autom´tica de programas inform´ticos.˃˃ o a a La propia definici´n nos da indicaciones acerca de algunos elementos b´sicos del o a computador: la memoria, y alg´n dispositivo capaz de efectuar c´lculos matem´ticos y l´gicos. u a a o La memoria es un gran almac´n de informaci´n. En la memoria almacenamos todo tipo e o de datos: valores num´ricos, textos, im´genes, etc. El dispositivo encargado de efectuar e a operaciones matem´ticas y l´gicas, que recibe el nombre de Unidad Aritm´tico-L´gica a o e o (UAL), es como una calculadora capaz de trabajar con esos datos y producir, a partir de ellos, nuevos datos (el resultado de las operaciones). Otro dispositivo se encarga de transportar la informaci´n de la memoria a la UAL, de controlar a la UAL para que efect´e o u las operaciones pertinentes y de depositar los resultados en la memoria: la Unidad de Control. El conjunto que forman la Unidad de Control y la UAL se conoce por Unidad Central de Proceso (o CPU, del ingl´s ˂˂Central Processing Unit˃˃). e Podemos imaginar la memoria como un armario enorme con cajones numerados y la CPU como una persona que, equipada con una calculadora (la UAL), es capaz de buscar operandos en la memoria, efectuar c´lculos con ellos y dejar los resultados en la memoria. a Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 5 Introducción a la programación con Python - UJI
  12. 12. 1 2 3 4 . . . Memoria Unidad Central de Proceso Unidad de Control Unidad Aritm´tico-L´gica e o Utilizaremos un lenguaje m´s t´cnico: cada uno de los ˂˂cajones˃˃ que conforman la a e memoria recibe el nombre de celda (de memoria) y el n´mero que lo identifica es su u posici´n o direcci´n, aunque a veces usaremos estos dos t´rminos para referirnos tambi´n o o e e a la correspondiente celda. Cada posici´n de memoria permite almacenar una secuencia de unos y ceros de o tama˜o fijo. ¿Por qu´ unos y ceros? Porque la tecnolog´ actual de los computadores n e ıa se basa en la sencillez con que es posible construir dispositivos binarios, es decir, que pueden adoptar dos posibles estados: encendido/apagado, hay corriente/no hay corriente, cierto/falso, uno/cero. . . ¿Es posible representar datos tan variados como n´meros, textos, u im´genes, etc. con s´lo unos y ceros? La respuesta es s´ (aunque con ciertas limitaciones). a o ı Para entenderla mejor, es preciso que nos detengamos brevemente a considerar c´mo se o representa la informaci´n con valores binarios. o 1.2. Codificaci´n de la informaci´n o o Una codificaci´n asocia signos con los elementos de un conjunto a los que denominamos o significados. En occidente, por ejemplo, codificamos los n´meros de cero a nueve con u el conjunto de signos {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Al hacerlo, ponemos en correspondencia estos s´ ımbolos con cantidades, es decir, con su significado: el s´ ımbolo ˂˂6˃˃ representa a la cantidad seis. El conjunto de signos no tiene por qu´ ser finito. Podemos combinar e los d´ ıgitos en secuencias que ponemos en correspondencia con, por ejemplo, los n´meros u naturales. La sucesi´n de d´ o ıgitos ˂˂99˃˃ forma un nuevo signo que asociamos a la cantidad noventa y nueve. Los ordenadores s´lo tienen dos signos b´sicos, {0, 1}, pero se pueden o a combinar en secuencias, as´ que no estamos limitados a s´lo dos posibles significados. ı o Una variable que s´lo puede tomar uno de los dos valores binarios recibe el nombre o de bit (acr´nimo del ingl´s ˂˂binary digit˃˃). Es habitual trabajar con secuencias de bits o e de tama˜o fijo. Una secuencia de 8 bits recibe el nombre de byte (aunque en espa˜ol el n n t´rmino correcto es octeto, ´ste no acaba de imponerse y se usa la voz inglesa). Con una e e secuencia de 8 bits podemos representar 256 (28 ) significados diferentes. El rango [0, 255] de valores naturales comprende 256 valores, as´ que podemos representar cualquiera de ı ellos con un patr´n de 8 bits. Podr´ o ıamos decidir, en principio, que la correspondencia entre bytes y valores naturales es completamente arbitraria. As´ podr´ ı, ıamos decidir que la secuencia 00010011 representa, por ejemplo, el n´mero natural 0 y que la secuencia u 01010111 representa el valor 3. Aunque sea posible esta asociaci´n arbitraria, no es o deseable, pues complica enormemente efectuar operaciones con los valores. Sumar, por ejemplo, obligar´ a tener memorizada una tabla que dijera cu´l es el resultado de efectuar ıa a la operaci´n con cada par de valores, ¡y hay 65536 pares diferentes! o Los sistemas de representaci´n posicional de los n´meros permiten establecer esa o u asociaci´n entre secuencias de bits y valores num´ricos naturales de forma sistem´tica. o e a Centramos el discurso en secuencias de 8 bits, aunque todo lo que exponemos a continuaci´n es v´lido para secuencias de otros tama˜os1 . El valor de una cadena de bits o a n b7 b6 b5 b4 b3 b2 b1 b0 es, en un sistema posicional convencional, 7 bi ·2i . As´ la secuencia ı, i=0 de bits 00001011 codifica el valor 0·27 +0·26 +0·25 +0·24 +1·23 +0·22 +1·21 +1·20 = 8 + 2 + 1 = 11. El bit de m´s a la izquierda recibe el nombre de ˂˂bit m´s significativo˃˃ a a y el bit de m´s a la derecha se denomina ˂˂bit menos significativo˃˃. a Ocho bits ofrecen un rango de valores muy limitado. Es habitual en los ordenadores modernos trabajar con grupos de 4 bytes (32 bits) u 8 bytes (64 bits). 1 Andrés a la programaci´n con ISBN: Introducci´n Marzal/Isabel Gracia -Python 978-84-692-5869-9 o o 6 Introducción a la programación con Python - UJI c UJI
  13. 13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 1 ¿Cu´l es el m´ximo valor que puede representarse con 16 bits y un sistema de a a representaci´n posicional como el descrito? ¿Qu´ secuencia de bits le corresponde? o e · 2 ¿Cu´ntos bits se necesitan para representar los n´meros del 0 al 18, ambos inclua u sive? .................................................................................. El sistema posicional es especialmente adecuado para efectuar ciertas operaciones aritm´ticas. Tomemos por caso la suma. Hay una ˂˂tabla de sumar˃˃ en binario que te e mostramos a continuaci´n: o sumandos 0 0 1 1 0 1 0 1 suma 0 1 1 0 acarreo 0 0 0 1 El acarreo no nulo indica que un d´ ıgito no es suficiente para expresar la suma de dos bits y que debe a˜adirse el valor uno al bit que ocupa una posici´n m´s a la izquierda. n o a Para ilustrar la sencillez de la adici´n en el sistema posicional, hagamos una suma de o dos n´meros de 8 bits usando esta tabla. En este ejemplo sumamos los valores 11 y 3 en u su representaci´n binaria: o + 00001011 00000011 Empezamos por los bits menos significativos. Seg´n la tabla, la suma 1 y 1 da 0 con u acarreo 1: Acarreo + 1 00001011 00000011 0 El segundo d´ ıgito empezando por derecha toma el valor que resulta de sumar a 1 y 1 el acarreo que arrastramos. O sea, 1 y 1 es 0 con acarreo 1, pero al sumar el acarreo que arrastramos de la anterior suma de bits, el resultado final es 1 con acarreo 1: Acarreo + 1 1 00001011 00000011 10 Ya te habr´s hecho una idea de la sencillez del m´todo. De hecho, ya lo conoces bien, a e pues el sistema de numeraci´n que aprendiste en la escuela es tambi´n posicional, s´lo o e o que usando diez d´ ıgitos diferentes en lugar de dos, as´ que el procedimiento de suma es ı esencialmente id´ntico. He aqu´ el resultado final, que es la secuencia de bits 00001110, e ı o sea, el valor 14: Acarreo + 1 1 00001011 00000011 00001110 La circuiter´ electr´nica necesaria para implementar un sumador que act´e como el ıa o u descrito es extremadamente sencilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 3 Calcula las siguientes sumas de n´meros codificados con 8 bits en el sistema u posicional: Andrés Marzal/Isabel Gracia - Python Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 o o 7 Introducción a la programación con Python - UJIUJI c
  14. 14. a) 01111111 + 00000001 b) 01010101 + 10101010 c) 00000011 + 00000001 .................................................................................. Debes tener en cuenta que la suma de dos n´meros de 8 bits puede proporcionar una u cantidad que requiere 9 bits. Suma, por ejemplo, las cantidades 255 (en binario de 8 bits es 11111111) y 1 (que en binario es 00000001): Acarreo 1 1 1 1 1 1 1 11111111 + 00000001 (1)00000000 El resultado es la cantidad 256, que en binario se expresa con 9 bits, no con 8. Decimos en este caso que la suma ha producido un desbordamiento. Esta anomal´ debe ser tenida ıa en cuenta cuando se usa o programa un ordenador. Hasta el momento hemos visto c´mo codificar valores positivos. ¿Podemos representar o tambi´n cantidades negativas? La respuesta es s´ Consideremos brevemente tres formas e ı. de hacerlo. La primera es muy intuitiva: consiste en utilizar el bit m´s significativo para a codificar el signo; si vale 0, por ejemplo, el n´mero expresado con los restantes bits es u positivo (con la representaci´n posicional que ya conoces), y si vale 1, es negativo. Por o ejemplo, el valor de 00000010 es 2 y el de 10000010 es −2. Efectuar sumas con valores positivos y negativos resulta relativamente complicado si codificamos as´ el signo de un ı n´mero. Esta mayor complicaci´n se traslada tambi´n a la circuiter´ necesaria. Mala u o e ıa cosa. Una forma alternativa de codificar cantidades positivas y negativas es el denominado ˂˂complemento a uno˃˃. Consiste en lo siguiente: se toma la representaci´n posicional de o un n´mero (que debe poder expresarse con 7 bits) y se invierten todos sus bits si es u negativo. La suma de n´meros codificados as´ es relativamente sencilla: se efect´a la u ı u suma convencional y, si no se ha producido un desbordamiento, el resultado es el valor que se deseaba calcular; pero si se produce un desbordamiento, la soluci´n se obtiene o sumando el valor 1 al resultado de la suma (sin tener en cuenta ya el bit desbordado). Ve´moslo con un ejemplo. Sumemos el valor 3 al valor −2 en complemento a uno: a Acarreo 1 1 1 1 1 1 1 00000011 + 11111101 (1)00000000 ↓ 00000000 + 00000001 00000001 La primera suma ha producido un desbordamiento. El resultado correcto resulta de sumar una unidad a los 8 primeros bits. La codificaci´n en complemento a uno tiene algunas desventajas. Una de ellas es que o hay dos formas de codificar el valor 0 (con 8 bits, por ejemplo, tanto 00000000 como 11111111 representan el valor 0) y, por tanto, s´lo podemos representar 255 valores o ([−127, 127]), en lugar de 256. Pero el principal inconveniente es la lentitud con que se realizan operaciones como la suma: cuando se produce un desbordamiento se han de efectuar dos adiciones, es decir, se ha de invertir el doble de tiempo. Una codificaci´n alternativa (y que es la utilizada en los ordenadores) es la denominao da ˂˂complemento a dos˃˃. Para cambiar el signo a un n´mero hemos de invertir todos sus u bits y sumar 1 al resultado. Esta codificaci´n, que parece poco natural, tiene las ventajas o de que s´lo hay una forma de representar el valor nulo (el rango de valores representados o Andrés Marzal/Isabel Gracia Python Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 o o 8 Introducción a la programación con Python - cUJI UJI
  15. 15. es [−128, 127]) y, principalmente, de que una sola operaci´n de suma basta para obtener o el resultado correcto de una adici´n. Repitamos el ejemplo anterior. Sumemos 3 y −2, o pero en complemento a dos: Acarreo 1 1 1 1 1 1 00000011 + 11111110 (1)00000001 Si ignoramos el bit desbordado, el resultado es correcto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 4 Codifica en complemento a dos de 8 bits los siguientes valores: a) 4 ·5 b) −4 c) 0 d) 127 e) 1 b) −4 + 3 c) 127 − 128 d) 128 − 127 e) 1 − 1 f) −1 Efect´a las siguientes sumas y restas en complemento a dos de 8 bits: u a) 4 + 4 f) 1 − 2 .................................................................................. Bueno, ya hemos hablado bastante acerca de c´mo codificar n´meros (aunque m´s o u a adelante ofreceremos alguna reflexi´n acerca de c´mo representar valores con parte fraco o cional). Preocup´monos por un instante acerca de c´mo representar texto. Hay una tabla e o que pone en correspondencia 127 s´ ımbolos con secuencias de bits y que se ha asumido como est´ndar. Es la denominada tabla ASCII, cuyo nombre son las siglas de ˂˂American a Standard Code for Information Interchange˃˃. La correspondencia entre secuencias de bits y caracteres determinada por la tabla es arbitraria, pero aceptada como est´ndar. La letra a ˂˂a˃˃, por ejemplo, se codifica con la secuencia de bits 01100001 y la letra ˂˂A˃˃ se codifica con 01000001. En el ap´ndice A se muestra esta tabla. El texto se puede codificar, pues, e como una secuencia de bits. Aqu´ tienes el texto ˂˂Hola˃˃ codificado con la tabla ASCII: ı 01001000 01101111 01101100 01100001 Pero, cuando vemos ese texto en pantalla, no vemos una secuencia de bits, sino la letra ˂˂H˃˃, seguida de la letra ˂˂o˃˃,. . . Lo que realmente vemos es un gr´fico, un patr´n de a o p´ ıxeles almacenado en la memoria del ordenador y que se muestra en la pantalla. Un bit de valor 0 puede mostrarse como color blanco y un bit de valor 1 como color negro. La letra ˂˂H˃˃ que ves en pantalla, por ejemplo, es la visualizaci´n de este patr´n de bits: o o 01000010 01000010 01000010 01111110 01000010 01000010 01000010 En la memoria del ordenador se dispone de un patr´n de bits para cada car´cter2 . o a Cuando se detecta el c´digo ASCII 01001000, se muestra en pantalla el patr´n de bits o o correspondiente a la representaci´n gr´fica de la ˂˂H˃˃. Truculento, pero eficaz. o a No s´lo podemos representar caracteres con patrones de p´ o ıxeles: todos los gr´ficos a de ordenador son simples patrones de p´ ıxeles dispuestos como una matriz. Como puedes ver, basta con ceros y unos para codificar la informaci´n que manejamos o en un ordenador: n´meros, texto, im´genes, etc. u a 2 La realidad es cada vez m´s compleja. Los sistemas modernos almacenan los caracteres en memoria de a otra forma, pero hablar de ello supone desviarnos mucho de lo que queremos contar. Andrés Marzal/Isabel Gracia - Python Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 o o 9 Introducción a la programación con Python - UJIUJI c
  16. 16. 1.3. Programas y lenguajes de programaci´n o Antes de detenernos a hablar de la codificaci´n de la informaci´n est´bamos comentando o o a que la memoria es un gran almac´n con cajones numerados, es decir, identificables con e valores num´ricos: sus respectivas direcciones. En cada caj´n se almacena una secuencia e o de bits de tama˜o fijo. La CPU, el ˂˂cerebro˃˃ del ordenador, es capaz de ejecutar acciones n especificadas mediante secuencias de instrucciones. Una instrucci´n describe una acci´n o o muy simple, del estilo de ˂˂suma esto con aquello˃˃, ˂˂multiplica las cantidades que hay en tal y cual posici´n de memoria˃˃, ˂˂deja el resultado en tal direcci´n de memoria˃˃, ˂˂haz o o una copia del dato de esta direcci´n en esta otra direcci´n˃˃, ˂˂averigua si la cantidad o o almacenada en determinada direcci´n es negativa˃˃, etc. Las instrucciones se representan o mediante combinaciones particulares de unos y ceros (valores binarios) y, por tanto, se pueden almacenar en la memoria. Combinando inteligentemente las instrucciones en una secuencia podemos hacer que la CPU ejecute c´lculos m´s complejos. Una secuencia de instrucciones es un programa. a a Si hay una instrucci´n para multiplicar pero ninguna para elevar un n´mero al cubo, poo u demos construir un programa que efect´e este ultimo c´lculo a partir de las instrucciones u a ´ disponibles. He aqu´ grosso modo, una secuencia de instrucciones que calcula el cubo a ı, partir de productos: 1. Toma el n´mero y multipl´ u ıcalo por s´ mismo. ı 2. Multiplica el resultado de la ultima operaci´n por el n´mero original. o u ´ Las secuencias de instrucciones que el ordenador puede ejecutar reciben el nombre de programas en c´digo de m´quina, porque el lenguaje de programaci´n en el que est´n o a o a expresadas recibe el nombre de c´digo de m´quina. Un lenguaje de programaci´n es o a o cualquier sistema de notaci´n que permite expresar programas. o 1.3.1. C´digo de m´quina o a El c´digo de m´quina codifica las secuencias de instrucciones como sucesiones de unos o a y ceros que siguen ciertas reglas. Cada familia de ordenadores dispone de su propio repertorio de instrucciones, es decir, de su propio c´digo de m´quina. o a Un programa que, por ejemplo, calcula la media de tres n´meros almacenados en las u posiciones de memoria 10, 11 y 12, respectivamente, y deja el resultado en la posici´n o de memoria 13, podr´ tener el siguiente aspecto expresado de forma comprensible para ıa nosotros: 1 2 3 4 Memoria Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o Detener En realidad, el contenido de cada direcci´n estar´ codificado como una serie de unos o ıa y ceros, as´ que el aspecto real de un programa como el descrito arriba podr´ ser ´ste: ı ıa e 1 2 3 4 . . . Memoria 10101011 00001010 00001011 00001101 10101011 00001101 00001100 00001101 00001110 00001101 00000011 00001101 00000000 00000000 00000000 00000000 Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 Introducci´n a la programaci´n con Python o o Unidad Central de Proceso (CPU) Unidad de Control 10 10 Unidad Aritm´tico-L´gica e o Introducción a la programación con Python - UJI c UJI
  17. 17. La CPU es un ingenioso sistema de circuitos electr´nicos capaz de interpretar el o significado de cada una de esas secuencias de bits y llevar a cabo las acciones que codifican. Cuando la CPU ejecuta el programa empieza por la instrucci´n contenida en o la primera de sus posiciones de memoria. Una vez ha ejecutado una instrucci´n, pasa a o la siguiente, y sigue as´ hasta encontrar una instrucci´n que detenga la ejecuci´n del ı o o programa. Supongamos que en las direcciones de memoria 10, 11 y 12 se han almacenado los valores 5, 10 y 6, respectivamente. Representamos as´ la memoria: ı 1 2 3 4 .. . 10 11 12 .. . Memoria Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o Detener .. . 5 10 6 .. . Naturalmente, los valores de las posiciones 10, 11 y 12 estar´n codificados en binario, a aunque hemos optado por representarlos en base 10 en aras de una mayor claridad. La ejecuci´n del programa procede del siguiente modo. En primer lugar, se ejecuta la o instrucci´n de la direcci´n 1, que dice que tomemos el contenido de la direcci´n 10 (el o o o valor 5), lo sumemos al de la direcci´n 11 (el valor 10) y dejemos el resultado (el valor 15) o en la direcci´n de memoria 13. Tras ejecutar esta primera instrucci´n, la memoria queda o o as´ ı: Memoria 1 2 3 4 .. . 10 11 12 13 .. . Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o Detener .. . 5 10 6 15 .. . 1 2 3 4 .. . 10 11 12 13 .. . Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o Detener .. . 5 10 6 21 .. . A continuaci´n, se ejecuta la instrucci´n de la direcci´n 2, que ordena que se tome el o o o contenido de la direcci´n 13 (el valor 15), se sume al contenido de la direcci´n 12 (el o o valor 6) y se deposite el resultado (el valor 21) en la direcci´n 13. La memoria pasa a o quedar en este estado. Andrés Marzal/Isabel Gracia Python Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 o o Memoria 11 11 Introducción a la programación con Python - cUJI UJI
  18. 18. Ahora, la tercera instrucci´n dice que hemos de tomar el valor de la direcci´n 13 (el valor o o 21), dividirlo por 3 y depositar el resultado (el valor 7) en la direcci´n 13. Este es el o estado en que queda la memoria tras ejecutar la tercera instrucci´n: o 1 2 3 4 .. . 10 11 12 13 .. . Memoria Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o Detener .. . 5 10 6 7 .. . Y finalmente, la CPU detiene la ejecuci´n del programa, pues se encuentra con la inso trucci´n Detener en la direcci´n 4. o o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 6 Ejecuta paso a paso el mismo programa con los valores 2, −2 y 0 en las posiciones de memoria 10, 11 y 12, respectivamente. · 7 Dise˜a un programa que calcule la media de cinco n´meros depositados en las n u posiciones de memoria que van de la 10 a la 14 y que deje el resultado en la direcci´n o ¯ de memoria 15. Recuerda que la media x de cinco n´meros x1 , x2 , x3 , x4 y x5 es u ¯ x= 5 i=1 xi 5 = x1 + x2 + x3 + x4 + x5 . 5 · 8 Dise˜a un programa que calcule la varianza de cinco n´meros depositados en las n u posiciones de memoria que van de la 10 a la 14 y que deje el resultado en la direcci´n o de memoria 15. La varianza, que se denota con σ 2 , es σ2 = 5 i=1 (xi 5 ¯ − x )2 , ¯ donde x es la media de los cinco valores. Sup´n que existe una instrucci´n ˂˂Multiplicar el o o contenido de direcci´n a por el contenido de direcci´n b y dejar el resultado en direcci´n o o o c˃˃. .................................................................................. ¿Qu´ instrucciones podemos usar para confeccionar programas? Ya hemos dicho que e el ordenador s´lo sabe ejecutar instrucciones muy sencillas. En nuestro ejemplo, s´lo o o hemos utilizado tres instrucciones distintas: una instrucci´n de suma de la forma ˂˂Sumar contenido de direcciones p y o q y dejar resultado en direcci´n r˃˃; o una instrucci´n de divisi´n de la forma ˂˂Dividir contenido de direcci´n p o o o por q y dejar resultado en direcci´n r˃˃; o y una instrucci´n que indica que se ha llegado al final del programa: Detener. o ¡Pocos programas interesantes podemos hacer con tan s´lo estas tres instrucciones! Nao turalmente, en un c´digo de m´quina hay instrucciones que permiten efectuar sumas, o a restas, divisiones y otras muchas operaciones. Y hay, adem´s, instrucciones que permiten a escoger qu´ instrucci´n se ejecutar´ a continuaci´n, bien directamente, bien en funci´n e o a o o de si se cumple o no determinada condici´n (por ejemplo, ˂˂Si el ´ltimo resultado o u es negativo, pasar a ejecutar la instrucci´n de la posici´n p˃˃). o o Andrés Marzal/Isabel Gracia - Python Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 o o 12 12 Introducción a la programación con Python - UJIUJI c
  19. 19. 1.3.2. Lenguaje ensamblador En los primeros tiempos de la inform´tica los programas se introduc´ en el ordenador a ıan directamente en c´digo de m´quina, indicando uno por uno el valor de los bits de cada una o a de las posiciones de memoria. Para ello se insertaban manualmente cables en un panel de conectores: cada cable insertado en un conector representaba un uno y cada conector sin cable representaba un cero. Como puedes imaginar, programar as´ un computador ı resultaba una tarea ardua, extremadamente tediosa y propensa a la comisi´n de errores. o El m´s m´ a ınimo fallo conduc´ a un programa incorrecto. Pronto se dise˜aron notaciones ıa n que simplificaban la programaci´n: cada instrucci´n de c´digo de m´quina se representaba o o o a mediante un c´digo mnemot´cnico, es decir, una abreviatura f´cilmente identificable con o e a el prop´sito de la instrucci´n. o o Por ejemplo, el programa desarrollado antes se podr´ representar como el siguiente ıa texto: SUM #10, #11, #13 SUM #13, #12, #13 DIV #13, 3, #13 FIN En este lenguaje la palabra SUM representa la instrucci´n de sumar, DIV la de dividir y o FIN representa la instrucci´n que indica que debe finalizar la ejecuci´n del programa. La o o almohadilla (#) delante de un n´mero indica que deseamos acceder al contenido de la u posici´n de memoria cuya direcci´n es dicho n´mero. Los caracteres que representan el o o u programa se introducen en la memoria del ordenador con la ayuda de un teclado y cada letra se almacena en una posici´n de memoria como una combinaci´n particular de unos o o y ceros (su c´digo ASCII, por ejemplo). o Pero, ¿c´mo se puede ejecutar ese tipo de programa si la secuencia de unos y ceros o que la describe como texto no constituye un programa v´lido en c´digo de m´quina? Con a o a la ayuda de otro programa: el ensamblador. El ensamblador es un programa traductor que lee el contenido de las direcciones de memoria en las que hemos almacenado c´digos o mnemot´cnicos y escribe en otras posiciones de memoria sus instrucciones asociadas en e c´digo de m´quina. o a El repertorio de c´digos mnemot´cnicos traducible a c´digo de m´quina y las reglas o e o a que permiten combinarlos, expresar direcciones, codificar valores num´ricos, etc., recibe e el nombre de lenguaje ensamblador, y es otro lenguaje de programaci´n. o 1.3.3. ¿Un programa diferente para cada ordenador? Cada CPU tiene su propio juego de instrucciones y, en consecuencia, un c´digo de o maquina y uno o m´s lenguajes ensambladores propios. Un programa escrito para una a CPU de la marca Intel no funcionar´ en una CPU dise˜ada por otro fabricante, como a n Motorola3 . ¡Incluso diferentes versiones de una misma CPU tienen juegos de instrucciones que no son totalmente compatibles entre s´ los modelos m´s evolucionados de una familia ı!: a de CPU pueden incorporar instrucciones que no se encuentran en los m´s antiguos4 . a Si queremos que un programa se ejecute en m´s de un tipo de ordenador, ¿habr´ que a a escribirlo de nuevo para cada CPU particular? Durante mucho tiempo se intent´ definir o alg´n tipo de ˂˂lenguaje ensamblador universal˃˃, es decir, un lenguaje cuyos c´digos u o A menos que la CPU se haya dise˜ado expresamente para reproducir el funcionamiento de la primera, n como ocurre con los procesadores de AMD, dise˜ados con el objetivo de ejecutar el c´digo de m´quina de n o a los procesadores de Intel. 4 Por ejemplo, a˜adiendo instrucciones que faciliten la programaci´n de aplicaciones multimedia (como n o ocurre con los Intel Pentium MMX y modelos posteriores) impensables cuando se dise˜´ la primera CPU de no la familia (el Intel 8086). 3 Andrés a la programaci´n con ISBN: Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o 13 13 Introducción a la programación con Python - UJI c UJI
  20. 20. ¡Hola, mundo! Nos gustar´ mostrarte el aspecto de los programas escritos en lenguajes ensambladores ıa reales con un par de ejemplos. Es una tradici´n ilustrar los diferentes lenguajes de o programaci´n con un programa sencillo que se limita a mostrar por pantalla el mensaje o ˂˂Hello, World!˃˃ (˂˂¡Hola, mundo!˃˃), as´ que la seguiremos. He aqu´ ese programa escrito ı ı en los lenguajes ensambladores de dos CPU distintas: a mano izquierda, el de los procesadores 80x86 de Intel (cuyo ultimo representante por el momento es el Pentium ´ 4) y a mano derecha, el de los procesadores de la familia Motorola 68000 (que es el procesador de los primeros ordenadores Apple Macintosh). start: .data move.l #msg,-(a7) msg: .string Hello, World!n move.w #9,-(a7) trap #1 len: addq.l #6,a7 .long . - msg move.w #1,-(a7) .text trap #1 .globl _start addq.l #2,a7 _start: clr -(a7) push $len trap #1 push $msg msg: dc.b Hello, World!,10,13,0 push $1 movl $0x4, %eax call _syscall addl $12, %esp push $0 movl $0x1, %eax call _syscall _syscall: int $0x80 ret Como puedes ver, ambos programas presentan un aspecto muy diferente. Por otra parte, los dos son bastante largos (entre 10 y 20 l´ ıneas) y de dif´ comprensi´n. ıcil o mnemot´cnicos, sin corresponderse con los del c´digo de m´quina de ning´n ordenador e o a u concreto, fuesen f´cilmente traducibles al c´digo de m´quina de cualquier ordenador. a o a Disponer de dicho lenguaje permitir´ escribir los programas una sola vez y ejecutarlos ıa en diferentes ordenadores tras efectuar las correspondientes traducciones a cada c´digo o de m´quina con diferentes programas ensambladores. a Si bien la idea es en principio interesante, presenta serios inconvenientes: Un lenguaje ensamblador universal no puede tener en cuenta c´mo se dise˜ar´n oro n a denadores en un futuro y qu´ tipo de instrucciones soportar´n, as´ que posiblemente e a ı quede obsoleto en poco tiempo. Programar en lenguaje ensamblador (incluso en ese supuesto lenguaje ensamblador universal) es complicad´ ısimo por los numerosos detalles que deben tenerse en cuenta. Adem´s, puestos a dise˜ar un lenguaje de programaci´n general, ¿por qu´ no utilizar a n o e un lenguaje natural, es decir un lenguaje como el castellano o el ingl´s? Programar un e computador consistir´ simplemente, en escribir (¡o pronunciar frente a un micr´fono!) ıa, o un texto en el que indic´semos qu´ deseamos que haga el ordenador usando el mismo a e lenguaje con que nos comunicamos con otras personas. Un programa inform´tico podr´ a ıa encargarse de traducir nuestras frases al c´digo de m´quina, del mismo modo que un o a programa ensamblador traduce lenguaje ensamblador a c´digo de m´quina. Es una idea o a atractiva, pero que queda lejos de lo que sabemos hacer por varias razones: Andrés Marzal/Isabel Gracia Python Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 o o 14 14 Introducción a la programación con Python - cUJI UJI
  21. 21. La complejidad intr´ ınseca de las construcciones de los lenguajes naturales dificulta enormemente el an´lisis sint´ctico de las frases, es decir, comprender su estructura a a y c´mo se relacionan entre s´ los diferentes elementos que las constituyen. o ı 1.3.4. El an´lisis sem´ntico, es decir, la comprensi´n del significado de las frases, es a a o a´n m´s complicado. Las ambig¨edades e imprecisiones del lenguaje natural hacen u a u que sus frases presenten, f´cilmente, diversos significados, aun cuando las podaa mos analizar sint´cticamente. (¿Cu´ntos significados tiene la frase ˂˂Trabaja en un a a banco.˃˃?) Sin una buena comprensi´n del significado no es posible efectuar una o traducci´n aceptable. o Lenguajes de programaci´n de alto nivel o Hay una soluci´n intermedia: podemos dise˜ar lenguajes de programaci´n que, sin ser tan o n o potentes y expresivos como los lenguajes naturales, eliminen buena parte de la complejidad propia de los lenguajes ensambladores y est´n bien adaptados al tipo de problemas e que podemos resolver con los computadores: los denominados lenguajes de programaci´n o de alto nivel. El calificativo ˂˂de alto nivel˃˃ se˜ala su independencia de un ordenador n concreto. Por contraposici´n, los c´digos de m´quina y los lenguajes ensambladores se o o a denominan lenguajes de programaci´n de bajo nivel. o He aqu´ el programa que calcula la media de tres n´meros en un lenguaje de alto ı u nivel t´ ıpico (Python): a = 5 b = 10 c = 6 media = (a + b + c) / 3 Las tres primeras l´ ıneas definen los tres valores y la cuarta calcula la media. Como puedes ver, resulta mucho m´s legible que un programa en c´digo de m´quina o en un lenguaje a o a ensamblador. Para cada lenguaje de alto nivel y para cada CPU se puede escribir un programa que se encargue de traducir las instrucciones del lenguaje de alto nivel a instrucciones de c´digo de m´quina, con lo que se consigue la deseada independencia de los programas con o a respecto a los diferentes sistemas computadores. S´lo habr´ que escribir una versi´n del o a o programa en un lenguaje de programaci´n de alto nivel y la traducci´n de ese programa o o al c´digo de m´quina de cada CPU se realizar´ autom´ticamente. o a a a 1.3.5. Compiladores e int´rpretes e Hemos dicho que los lenguajes de alto nivel se traducen autom´ticamente a c´digo de a o m´quina, s´ pero has de saber que hay dos tipos diferentes de traductores dependiendo a ı, de su modo de funcionamiento: compiladores e int´rpretes. e Un compilador lee completamente un programa en un lenguaje de alto nivel y lo traduce en su integridad a un programa de c´digo de m´quina equivalente. El programa o a de c´digo de m´quina resultante se puede ejecutar cuantas veces se desee, sin necesidad o a de volver a traducir el programa original. Un int´rprete act´a de un modo distinto: lee un programa escrito en un lenguaje de e u alto nivel instrucci´n a instrucci´n y, para cada una de ellas, efect´a una traducci´n a o o u o las instrucciones de c´digo de m´quina equivalentes y las ejecuta inmediatamente. No o a hay un proceso de traducci´n separado por completo del de ejecuci´n. Cada vez que o o ejecutamos el programa con un int´rprete, se repite el proceso de traducci´n y ejecuci´n, e o o ya que ambos son simult´neos. a Andrés a la programaci´n con ISBN: Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o 15 15 Introducción a la programación con Python - UJI c UJI
  22. 22. Compiladores e int´rpretes. . . de idiomas e Puede resultarte de ayuda establecer una analog´ entre compiladores e int´rpretes de ıa e lenguajes de programaci´n y traductores e int´rpretes de idiomas. o e Un compilador act´a como un traductor que recibe un libro escrito en un idioma u determinado (lenguaje de alto nivel) y escribe un nuevo libro que, con la mayor fidelidad posible, contiene una traducci´n del texto original a otro idioma (c´digo de m´quina). o o a El proceso de traducci´n (compilaci´n) tiene lugar una sola vez y podemos leer el libro o o (ejecutar el programa) en el idioma destino (c´digo de m´quina) cuantas veces queramos. o a Un int´rprete de programas act´a como su hom´nimo en el caso de los idiomas. Sup´n e u o o que se imparte una conferencia en ingl´s en diferentes ciudades y un int´rprete ofrece e e su traducci´n simult´nea al castellano. Cada vez que la conferencia es pronunciada, o a el int´rprete debe realizar nuevamente la traducci´n. Es m´s, la traducci´n se produce e o a o sobre la marcha, frase a frase, y no de un tir´n al final de la conferencia. Del mismo modo o act´a un int´rprete de un lenguaje de programaci´n: traduce cada vez que ejecutamos u e o el programa y adem´s lo hace instrucci´n a instrucci´n. a o o Por regla general, los int´rpretes ejecutar´n los programas m´s lentamente, pues e a a al tiempo de ejecuci´n del c´digo de m´quina se suma el que consume la traducci´n o o a o simult´nea. Adem´s, un compilador puede examinar el programa de alto nivel abarcando a a m´s de una instrucci´n cada vez, por lo que es capaz de producir mejores traducciones. a o Un programa interpretado suele ser mucho m´s lento que otro equivalente que haya sido a compilado (¡t´ ıpicamente entre 2 y 100 veces m´s lento!). a Si tan lento resulta interpretar un programa, ¿por qu´ no se usan unicamente compie ´ ladores? Es pronto para que entiendas las razones, pero, por regla general, los int´rpretes e permiten una mayor flexibilidad que los compiladores y ciertos lenguajes de programaci´n o de alto nivel han sido dise˜ados para explotar esa mayor flexibilidad. Otros lenguajes n de programaci´n, por contra, sacrifican la flexibilidad en aras de una mayor velocidad o de ejecuci´n. Aunque nada impide que compilemos o interpretemos cualquier lenguaje de o programaci´n, ciertos lenguajes se consideran apropiados para que la traducci´n se lleve o o a cabo con un compilador y otros no. Es m´s apropiado hablar, pues, de lenguajes de a programaci´n t´ o ıpicamente interpretados y lenguajes de programaci´n t´ o ıpicamente compilados. Entre los primeros podemos citar Python, BASIC, Perl, Tcl, Ruby, Bash, Java o Lisp. Entre los segundos, C, C#, Pascal, C++ o Fortran. En este curso aprenderemos a programar usando dos lenguajes de programaci´n diso tintos: uno interpretado, Python, y otro compilado, C. Este volumen se dedica al lenguaje de programaci´n con Python. Otro volumen de la misma colecci´n se dedica al estudio o o de C, pero partiendo de la base de que ya se sabe programar con Python. 1.3.6. Python Existen muchos otros lenguajes de programaci´n, ¿por qu´ aprender Python? Python o e presenta una serie de ventajas que lo hacen muy atractivo, tanto para su uso profesional como para el aprendizaje de la programaci´n. Entre las m´s interesantes desde el punto o a de vista did´ctico tenemos: a Python es un lenguaje muy expresivo, es decir, los programas Python son muy compactos: un programa Python suele ser bastante m´s corto que su equivalente a en lenguajes como C. (Python llega a ser considerado por muchos un lenguaje de programaci´n de muy alto nivel.) o Python es muy legible. La sintaxis de Python es muy elegante y permite la escritura de programas cuya lectura resulta m´s f´cil que si utiliz´ramos otros lenguajes de a a a programaci´n. o Andrés a la programaci´n con ISBN: Introducci´n Marzal/Isabel Gracia -Python 978-84-692-5869-9 o o 16 16 Introducción a la programación con Python - c UJI UJI
  23. 23. Python ofrece un entorno interactivo que facilita la realizaci´n de pruebas y ayuda o a despejar dudas acerca de ciertas caracter´ ısticas del lenguaje. El entorno de ejecuci´n de Python detecta muchos de los errores de programaci´n o o que escapan al control de los compiladores y proporciona informaci´n muy rica o para detectarlos y corregirlos. Python puede usarse como lenguaje imperativo procedimental o como lenguaje orientado a objetos. Posee un rico juego de estructuras de datos que se pueden manipular de modo sencillo. Estas caracter´ ısticas hacen que sea relativamente f´cil traducir m´todos de c´lculo a a e a programas Python. Python ha sido dise˜ado por Guido van Rossum y est´ en un proceso de continuo n a desarrollo por una gran comunidad de desarrolladores. Aproximadamente cada seis meses se hace p´blica una nueva versi´n de Python. ¡Tranquilo! No es que cada medio a˜o se u o n cambie radicalmente el lenguaje de programaci´n, sino que ´ste se enriquece manteniendo o e en lo posible la compatibilidad con los programas escritos para versiones anteriores. Nosotros utilizaremos caracter´ ısticas de la versi´n 2.3 de Python, por lo que deber´s o a utilizar esa versi´n o una superior. o Una ventaja fundamental de Python es la gratuidad de su int´rprete. Puedes descare gar el int´rprete de la p´gina web http://www.python.org. El int´rprete de Python e a e tiene versiones para pr´cticamente cualquier plataforma en uso: sistemas PC bajo Linux, a sistemas PC bajo Microsoft Windows, sistemas Macintosh de Apple, etc. Para que te vayas haciendo a la idea de qu´ aspecto presenta un programa completo e en Python, te presentamos uno que calcula la media de tres n´meros que introduce por u teclado el usuario y muestra el resultado por pantalla: a = float(raw_input(’Dame un n´mero:’)) u b = float(raw_input(’Dame otro n´mero:’)) u c = float(raw_input(’Y ahora, uno m´s:’)) a media = (a + b + c) / 3 print ’La media es’, media En los ultimos a˜os Python ha experimentado un important´ n ısimo aumento del n´mero u ´ de programadores y empresas que lo utilizan. Aqu´ tienes unas citas que han encabezado ı durante alg´n tiempo la web oficial de Python (http://www.python.org): u Python ha sido parte importante de Google desde el principio, y lo sigue siendo a medida que el sistema crece y evoluciona. Hoy d´ docenas de ıa, ingenieros de Google usan Python y seguimos buscando gente diestra en este lenguaje. PETER NORVIG, director de calidad de b´squedas de Google Inc. u Python juega un papel clave en nuestra cadena de producci´n. Sin ´l, un proo e yecto de la envergadura de ˂˂Star Wars: Episodio II˃˃ hubiera sido muy dif´ ıcil de sacar adelante. Visualizaci´n de multitudes, proceso de lotes, composici´n o o de escenas. . . Python es lo que lo une todo. TOMMY BRUNETTE, director t´cnico senior de Industrial Light Magic . e Andrés a la programaci´n con ISBN: Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o 17 17 Introducción a la programación con Python - UJI c UJI
  24. 24. Python est´ en todas partes de Industrial Light Magic. Se usa para extender a la capacidad de nuestras aplicaciones y para proporcionar la cola que las une. Cada imagen generada por computador que creamos incluye a Python en alg´n punto del proceso. u PHILIP PETERSON, ingeniero principal de I+D de Industrial Light Magic. 1.3.7. C El lenguaje de programaci´n C es uno de los m´s utilizados en el mundo profesional. La o a mayor´ de las aplicaciones comerciales y libres se han desarrollado con el lenguaje de ıa programaci´n C. El sistema operativo Linux, por ejemplo, se ha desarrollado en C en su o pr´ctica totalidad. a ¿Por qu´ es tan utilizado el lenguaje C? C es un lenguaje de prop´sito general e o que permite controlar con gran precisi´n los factores que influyen en la eficiencia de o los programas. Pero esta capacidad de control ˂˂fino˃˃ que ofrece C tiene un precio: la escritura de programas puede ser mucho m´s costosa, pues hemos de estar pendientes a de numerosos detalles. Tan es as´ que muchos programadores afirman que C no es un ı lenguaje de alto nivel, sino de nivel intermedio. ¡Hola de nuevo, mundo! Te presentamos los programas ˂˂¡Hola, mundo!˃˃ en Python (izquierda) y C (derecha). print ’Hello, world!’ #include stdio.h int main(void) { printf(Hello, world!n); return 0; } Como puedes comprobar, Python parece ir directamente al problema: una sola l´ ınea. Empezaremos aprendiendo Python. Aqu´ tienes una version en C del c´lculo de la media de tres n´meros le´ ı a u ıdos por teclado: #include stdio.h int main(void) { double a, b, c, media; printf(Dame un n´mero: ); u scanf(%lf, a); printf(Dame otro n´mero: ); u scanf(%lf, b); printf(Y ahora, uno m´s: ); a scanf(%lf, c); media = (a + b + c) / 3; printf(La media es %fn, media); return 0; } C ha sufrido una evoluci´n desde su dise˜o en los a˜os 70. El C, tal cual fue concebido o n n por sus autores, Brian Kernighan y Dennis Ritchie, de la compa˜´ norteamericana de nıa Andrés a la programaci´n con ISBN: Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o 18 18 Introducción a la programación con Python - UJI c UJI
  25. 25. telecomunicaciones ATT, se conoce popularmente por KR C y est´ pr´cticamente en a a desuso. En los a˜os 80, C fue modificado y estandarizado por el American National n Standards Institute (ANSI), que dio lugar al denominado ANSI C y que ahora se conoce como C89 por el a˜o en que se public´. El est´ndar se revis´ en los a˜os 90 y se n o a o n incorporaron nuevas caracter´ ısticas que mejoran sensiblemente el lenguaje. El resultado es la segunda edici´n del ANSI C, m´s conocida como C99. Esta es la versi´n que o a o estudiaremos en este curso. En la asignatura utilizaremos un compilador de C gratuito: el gcc en su versi´n 3.2 o o superior. Inicialmente se denomin´ a gcc as´ tomando las siglas de GNU C Compiler. o ı GNU es el nombre de un proyecto que tiene por objeto ofrecer un sistema operativo ˂˂libre˃˃ y todas las herramientas que es corriente encontrar en una plataforma Unix. Hoy d´ se ıa ha popularizado enormemente gracias a la plataforma GNU/Linux, que se compone de un n´cleo de sistema operativo de la familia del Unix (Linux) y numerosas herramientas u desarrolladas como parte del proyecto GNU, entre ellas gcc. La versi´n de gcc que o usaremos no soporta a´n todas las caracter´ u ısticas de C99, pero s´ las que aprenderemos ı en el curso. Cualquier distribuci´n reciente de Linux5 incorpora la versi´n de gcc que utilio o zaremos o una superior. Puedes descargar una versi´n de gcc y las utilidades asoo ciadas para Microsoft Windows en http://www.delorie.com/djgpp. En la p´gina a http://www.bloodshed.net/devcpp.html encontrar´s un entorno integrado (editor a de texto, depurador de c´digo, compilador, etc.) que tambi´n usa el compilador gcc. o e ¡Ojo!, no todos los compiladores soportan algunas caracter´ ısticas de la ultima versi´n o ´ de C, as´ que es posible que experimentes alg´n problema de compatibilidad si utilizas ı u un compilador diferente del que te recomendamos. 1.4. M´s all´ de los programas: algoritmos a a Dos programas que resuelven el mismo problema expresados en el mismo o en diferentes lenguajes de programaci´n pero que siguen, en lo fundamental, el mismo procedimieno to, son dos implementaciones del mismo algoritmo. Un algoritmo es, sencillamente, una secuencia de pasos orientada a la consecuci´n de un objetivo. o Cuando dise˜amos un algoritmo podemos expresarlo en uno cualquiera de los nun merosos lenguajes de programaci´n de prop´sito general existentes. Sin embargo, ello o o resulta poco adecuado: no todos los programadores conocen todos los lenguajes y no hay consenso acerca de cu´l es el m´s adecuado para expresar las soluciones a los diferentes problemas, a a cualquiera de los lenguajes de programaci´n presenta particularidades que pueden o interferir en una expresi´n clara y concisa de la soluci´n a un problema. o o Podemos expresar los algoritmos en lenguaje natural, pues el objetivo es comunicar un procedimiento resolutivo a otras personas y, eventualmente, traducirlos a alg´n lenguaje u de programaci´n. Si, por ejemplo, deseamos calcular la media de tres n´meros le´ o u ıdos de teclado podemos seguir este algoritmo: 1. solicitar el valor del primer n´mero, u 2. solicitar el valor del segundo n´mero, u 3. solicitar el valor del tercer n´mero, u 5 En el momento en que se redact´ este texto, las distribuciones m´s populares y recientes de Linux eran o a SuSE 8.2, RedHat 9, Mandrake 9.1 y Debian Woody. Andrés a la programaci´n con ISBN: Introducci´n Marzal/Isabel Gracia -Python 978-84-692-5869-9 o o 19 19 Introducción a la programación con Python - c UJI UJI
  26. 26. La torre de Babel Hemos dicho que los lenguajes de programaci´n de alto nivel pretend´ entre otros o ıan, objetivos, paliar el problema de que cada ordenador utilice su propio c´digo de m´quina. o a Puede que, en consecuencia, est´s sorprendido por el n´mero de lenguajes de prograe u maci´n citados. Pues los que hemos citado son unos pocos de los m´s utilizados: ¡hay o a centenares! ¿Por qu´ tantos? e El primer lenguaje de programaci´n de alto nivel fue Fortran, que se dise˜´ en los o no primeros a˜os 50 (y a´n se utiliza hoy d´ aunque en versiones evolucionadas). Fortran n u ıa, se dise˜´ con el prop´sito de traducir f´rmulas matem´ticas a c´digo de m´quina (de heno o o a o a cho, su nombre proviene de ˂˂FORmula TRANslator˃˃, es decir, ˂˂traductor de f´rmulas˃˃). o Pronto se dise˜aron otros lenguajes de programaci´n con prop´sitos espec´ n o o ıficos: Cobol (Common Business Oriented Language), Lisp (List Processing language), etc. Cada uno de estos lenguajes hac´ f´cil la escritura de programas para solucionar problemas de ıa a ambitos particulares: Cobol para problemas de gesti´n empresarial, Lisp para ciertos o ´ problemas de Inteligencia Artificial, etc. Hubo tambi´n esfuerzos para dise˜ar lenguajes e n de ˂˂prop´sito general˃˃, es decir, aplicables a cualquier dominio, como Algol 60 (Algoo rithmic Language). En la d´cada de los 60 hicieron su aparici´n nuevos lenguajes de e o programaci´n (Algol 68, Pascal, Simula 67, Snobol 4, etc.), pero quiz´ lo m´s notable o a a de esta d´cada fue que se sentaron las bases te´ricas del dise˜o de compiladores e e o n int´rpretes. Cuando la tecnolog´ para el dise˜o de estas herramientas se hizo accesible e ıa n a m´s y m´s programadores hubo un aut´ntico estallido en el n´mero de lenguajes de a a e u programaci´n. Ya en 1969 se hab´ dise˜ado unos 120 lenguajes de programaci´n y se o ıan n o hab´ implementado compiladores o int´rpretes para cada uno de ellos. ıan e La existencia de tant´ ısimos lenguajes de programaci´n cre´ una situaci´n similar a o o o la de la torre de Babel: cada laboratorio o departamento inform´tico usaba un lenguaje a de programaci´n y no hab´ forma de intercambiar programas. o ıa Con los a˜os se ha ido produciendo una selecci´n de aquellos lenguajes de progran o maci´n m´s adecuados para cada tipo de tarea y se han dise˜ado muchos otros que o a n sintetizan lo aprendido de lenguajes anteriores. Los m´s utilizados hoy d´ son C, C++ a ıa , Java, Python, Perl y PHP. Si tienes curiosidad, puedes ver ejemplos del programa ˂˂Hello, world!˃˃ en m´s de a 100 de lenguajes de programaci´n diferentes (y m´s de 400 dialectos) visitando la p´gina o a a http://www.uni-karlsruhe.de/˜uu9r/lang/html/lang-all.en.html 4. sumar los tres n´meros y dividir el resultado por 3, u 1. poner aceite en una sart´n, e 3. calentar el aceite, 5. mostrar el resultado. Como puedes ver, esta secuencia de operaciones define exactamente el proceso que nos permite efectuar el c´lculo propuesto y que ya hemos implementado como programas en a Python y en C. Los algoritmos son independientes del lenguaje de programaci´n. Describen un proo cedimiento que puedes implementar en cualquier lenguaje de programaci´n de prop´sito o o general o, incluso, que puedes ejecutar a mano con l´piz, papel y, quiz´, la ayuda de una a a calculadora. ¡Ojo! No es cierto que cualquier procedimiento descrito paso a paso pueda considerarse un algoritmo. Un algoritmo debe satisfacer ciertas condiciones. Una analog´ con ıa recetas de cocina (procedimientos para preparar platos) te ayudar´ a entender dichas a restricciones. Estudia esta primera receta: 2. encender el fuego, Andrés Marzal/Isabel Gracia Python Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 o o 20 20 Introducción a la programación con Python - cUJI UJI
  27. 27. 4. 5. 6. coger un huevo, romper la c´scara, a verter el contenido del huevo en la sart´n, e 7. aderezar con sal, 8. esperar a que tenga buen aspecto. En principio ya est´: con la receta, sus ingredientes y los utiles necesarios somos capaces a ´ de cocinar un plato. Bueno, no del todo cierto, pues hay unas cuantas cuestiones que no quedan del todo claras en nuestra receta: ¿Qu´ tipo de huevo utilizamos?: ¿un huevo de gallina?, ¿un huevo de rana? e ¿Cu´nta sal utilizamos?: ¿una pizca?, ¿un kilo? a ¿Cu´nto aceite hemos de verter en la sart´n?: ¿un cent´ a e ımetro c´bico?, ¿un litro? u ¿Cu´l es el resultado del proceso?, ¿la sart´n con el huevo cocinado y el aceite? a e En una receta de cocina hemos de dejar bien claro con qu´ ingredientes contamos y e cu´l es el resultado final. En un algoritmo hemos de precisar cu´les son los datos del a a problema (datos de entrada) y qu´ resultado vamos a producir (datos de salida). e Esta nueva receta corrige esos fallos: Ingredientes: 10 cc. de aceite de oliva, una gallina y una pizca de sal. M´todo: e 1. esperar a que la gallina ponga un huevo, 2. poner aceite en una sart´n, e 3. encender el fuego, 4. calentar el aceite, 5. coger el huevo, 6. romper la c´scara, a 7. verter el contenido del huevo en la sart´n, e 8. aderezar con sal, 9. esperar a que tenga buen aspecto. Presentaci´n: depositar el huevo frito, sin aceite, en un plato. o Pero la receta a´n no est´ bien del todo. Hay ciertas indefiniciones en la receta: u a 1. ¿Cu´n caliente ha de estar el aceite en el momento de verter el huevo?, ¿humeando?, a ¿ardiendo? 2. 3. ¿Cu´nto hay que esperar?, ¿un segundo?, ¿hasta que el huevo est´ ennegrecido? a e Y a´n peor, ¿estamos seguros de que la gallina pondr´ un huevo? Podr´ ocurrir u a ıa que la gallina no pusiera huevo alguno. Para que la receta est´ completa, deber´ e ıamos especificar con absoluta precisi´n cada o uno de los pasos que conducen a la realizaci´n del objetivo y, adem´s, cada uno de ellos o a deber´ ser realizable en tiempo finito. ıa No basta con decir m´s o menos c´mo alcanzar el objetivo: hay que decir exactamente a o c´mo se debe ejecutar cada paso y, adem´s, cada paso debe ser realizable en tiempo o a finito. Esta nueva receta corrige algunos de los problemas de la anterior, pero presenta otros de distinta naturaleza: Andrés Marzal/Isabel Gracia Python Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 o o 21 21 Introducción a la programación con Python - cUJI UJI
  28. 28. Ingredientes: 10 cc. de aceite de oliva, un huevo de gallina y una pizca de sal. M´todo: e 1. poner aceite en una sart´n, e 2. encender el fuego a medio gas, 3. calentar el aceite hasta que humee ligeramente, 4. coger un huevo, 5. romper la c´scara con el poder de la mente, sin tocar el huevo, a 6. 7. 8. verter el contenido del huevo en la sart´n, e aderezar con sal, esperar a que tenga buen aspecto. Presentaci´n: depositar el huevo frito, sin aceite, en un plato. o El quinto paso no es factible. Para romper un huevo has de utilizar algo m´s que ˂˂el a poder de la mente˃˃. En todo algoritmo debes utilizar unicamente instrucciones que pueden ´ llevarse a cabo. He aqu´ una receta en la que todos los pasos son realizables: ı Ingredientes: 10 cc. de aceite de oliva, un huevo de gallina y una pizca de sal. M´todo: e 1. poner aceite en una sart´n, e 4. echar una partida al solitario, 2. sintonizar una emisora musical en la radio, 3. encender el fuego a medio gas, 5. calentar el aceite hasta que humee ligeramente, 6. coger un huevo, 7. romper la c´scara, a 8. verter el contenido del huevo en la sart´n, e 9. aderezar con sal, 10. esperar a que tenga buen aspecto. Presentaci´n: depositar el huevo frito, sin aceite, en un plato. o En esta nueva receta hay acciones que, aunque expresadas con suficiente precisi´n y o siendo realizables, no hacen nada util para alcanzar nuestro objetivo (sintonizar la radio ´ y jugar a cartas). En un algoritmo, cada paso dado debe conducir y acercarnos m´s a la a consecuci´n del objetivo. o Hay una consideraci´n adicional que hemos de hacer, aunque en principio parezca o una obviedad: todo algoritmo bien construido debe finalizar tras la ejecuci´n de un n´mero o u finito de pasos. Aunque todos los pasos sean de duraci´n finita, una secuencia de instrucciones puede o requerir tiempo infinito. Piensa en este m´todo para hacerse millonario: e 1. comprar un n´mero de loter´ v´lido para el pr´ximo sorteo, u ıa a o 2. esperar al d´ de sorteo, ıa 3. cotejar el n´mero ganador con el nuestro, u Andrés Marzal/Isabel Gracia Python Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 o o 22 22 Introducción a la programación con Python - cUJI UJI
  29. 29. 4. si son diferentes, volver al paso 1; en caso contrario, somos millonarios. Como ves, cada uno de los pasos del m´todo requiere una cantidad finita de tiempo, pero e no hay ninguna garant´ de alcanzar el objetivo propuesto. ıa En adelante, no nos interesar´n m´s las recetas de cocina ni los procedimientos para a a enriquecerse sin esfuerzo (¡al menos no como objeto de estudio de la asignatura!). Los algoritmos en los que estaremos interesados son aquellos que describen procedimientos de c´lculo ejecutables en un ordenador. Ello limitar´ el ambito de nuestro estudio a la a a ´ manipulaci´n y realizaci´n de c´lculos sobre datos (num´ricos, de texto, etc.). o o a e Abu Ja‘far Mohammed ibn Mˆsˆ Al-Khowˆrizm y Euclides u a a La palabra algoritmo tiene origen en el nombre de un matem´tico persa del siglo IX: Abu a Ja‘far Mohammed ibn Mˆsˆ Al-Khowˆrizm (que significa ˂˂Mohammed, padre de Ja‘far, u a a hijo de Moises, nacido en Khowˆrizm˃˃). Al-Khowˆrizm escribi´ tratados de aritm´tica a a o e y algebra. Gracias a los textos de Al-Khowˆrizm se introdujo el sistema de numeraci´n a o ´ hind´ en el mundo arabe y, m´s tarde, en occidente. u a ´ En el siglo XIII se publicaron los libros Carmen de Algorismo (un tratado de aritm´tica e ¡en verso!) y Algorismus Vulgaris, basados en parte en la Aritm´tica de Al-Khowˆrizm. e a Al-Khowˆrizm escribi´ tambi´n el libro ˂˂Kitab al jabr w’al-muqabala˃˃ (˂˂Reglas de a o e restauraci´n y reducci´n˃˃), que dio origen a una palabra que ya conoces: ˂˂´lgebra˃˃. o o a Abelardo de Bath, uno de los primeros traductores al lat´ de Al-Khowˆrizm, emın a pez´ un texto con ˂˂Dixit Algorismi. . . ˃˃ (˂˂Dijo Algorismo. . . ˃˃), popularizando as´ el o ı t´rmino algorismo, que pas´ a significar ˂˂realizaci´n de c´lculos con numerales hindoe o o a ar´bigos˃˃. En la edad media los abaquistas calculaban con abaco y los algorismistas a ´ con ˂˂algorismos˃˃. En cualquier caso, el concepto de algoritmo es muy anterior a Al-Khowˆrizm. En el a siglo III a.C., Euclides propuso en su tratado ˂˂Elementos˃˃ un m´todo sistem´tico para e a el c´lculo del M´ximo Com´n Divisor (MCD) de dos n´meros. El m´todo, tal cual fue a a u u e propuesto por Euclides, dice as´ ˂˂Dados dos n´meros naturales, a y b, comprobar si ı: u ambos son iguales. Si es as´ a es el MCD. Si no, si a es mayor que b, restar a a el ı, valor de b; pero si a es menor que b, restar a b el valor de a. Repetir el proceso con los nuevos valores de a y b˃˃. Este m´todo se conoce como ˂˂algoritmo de Euclides˃˃, e aunque es frecuente encontrar, bajo ese mismo nombre, un procedimiento alternativo y m´s eficiente: ˂˂Dados dos n´meros naturales, a y b, comprobar si b es cero. Si es as´ a u ı, a es el MCD. Si no, calcular c, el resto de dividir a entre b. Sustituir a por b y b por c y repetir el proceso˃˃. 1. 2. Un algoritmo debe poseer las siguientes caracter´ ısticas: Ha de tener cero o m´s datos de entrada. a Debe proporcionar uno o m´s datos de salida como resultado. a 3. Cada paso del algoritmo ha de estar definido con exactitud, sin la menor ambig¨edad. u 5. Debe ser efectivo, es decir, cada uno de sus pasos ha de poder ejecutarse en tiempo finito con unos recursos determinados (en nuestro caso, con los que proporciona un sistema computador). 4. Ha de ser finito, es decir, debe finalizar tras la ejecuci´n de un n´mero finito de o u pasos, cada uno de los cuales ha de ser ejecutable en tiempo finito. Adem´s, nos interesa que los algoritmos sean eficientes, esto es, que alcancen su a objetivo lo m´s r´pidamente posible y con el menor consumo de recursos. a a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 9 Dise˜a un algoritmo para calcular el area de un c´ n ırculo dado su radio. (Recuerda ´ que el area de un c´ ırculo es π veces el cuadrado del radio.) ´ Andrés Marzal/Isabel Gracia - Python Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 o o 23 23 Introducción a la programación con Python - UJIUJI c
  30. 30. · 10 Dise˜a un algoritmo que calcule el IVA (16%) de un producto dado su precio de n venta sin IVA. · 11 ¿Podemos llamar algoritmo a un procedimiento que escriba en una cinta de papel todos los n´meros decimales de π? u .................................................................................. Andrés Marzal/Isabel Gracia - Python Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 o o 24 24 Introducción a la programación con Python - UJIUJI c
  31. 31. Cap´ ıtulo 2 Una calculadora avanzada ¿Sabes sumar? le pregunt´ la Reina Blanca. ¿Cu´nto es uno m´s uno o a a m´s uno m´s uno m´s uno m´s uno m´s uno m´s uno m´s uno m´s uno m´s a a a a a a a a a uno? No lo s´ dijo Alicia. Perd´ la cuenta. e ı No sabe hacer una adici´n le interrumpi´ la Reina Roja. o o LEWIS CARROLL, Alicia a trav´s del espejo. e El objetivo de este tema es que te familiarices con el entorno interactivo de Python, que aprendas a construir expresiones aritm´ticas almacenando los resultados en variae bles mediante asignaciones y que conozcas los tipos de datos b´sicos del lenguaje de a programaci´n Python. o 2.1. Sesiones interactivas Cuando programamos utilizamos un conjunto de herramientas al que denominamos entorno de programaci´n. Entre estas herramientas tenemos editores de texto (que nos permiten o escribir programas), compiladores o int´rpretes (que traducen los programas a c´digo e o de m´quina), depuradores (que ayudan a detectar errores), analizadores de tiempo de a ejecuci´n (para estudiar la eficiencia de los programas), etc. o Los lenguajes interpretados suelen ofrecer una herramienta de ejecuci´n interactiva. o Con ella es posible dar ´rdenes directamente al int´rprete y obtener una respuesta ino e mediata para cada una de ellas. Es decir, no es necesario escribir un programa completo para empezar a obtener resultados de ejecuci´n, sino que podemos ˂˂dialogar˃˃ con el o int´rprete de nuestro lenguaje de programaci´n: le pedimos que ejecute una orden y nos e o responde con su resultado. El entorno interactivo es de gran ayuda para experimentar con fragmentos de programa antes de incluirlos en una versi´n definitiva. En esta secci´n o o veremos c´mo realizar sesiones de trabajo interactivo con Python.1 o Si hemos instalado Python en nuestro ordenador podemos iniciar una sesi´n de o trabajo escribiendo python en la l´ ınea de ´rdenes Unix.2 El sistema nos responder´ o a dando un mensaje informativo sobre la versi´n de Python que estamos utilizando (y o cu´ndo fue compilada, con qu´ compilador, etc.) y, a continuaci´n, mostrar´ el prompt: a e o a ↱ $ python Python 2.3 (#1, Aug 2 2003, 12:14:49) 1 Abusando del lenguaje, llamaremos indistintamente Python al entorno de programaci´n, al int´rprete o e del lenguaje y al propio lenguaje de programaci´n. o 2 En el entorno Microsoft Windows puedes arrancar el int´rprete interactivo activando el icono correspone diente (que es una caricatura de una serpiente pit´n) o seleccionando el programa desde el men´ ˂˂Inicio˃˃. o u Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 25 25 Introducción a la programación con Python - UJI
  32. 32. [GCC 3.3] on linux2 Type help, copyright, credits or license for more information. El prompt es la serie de caracteres ˂˂˃˃ que aparece en la ultima l´ ınea. El prompt ´ indica que el int´rprete de Python espera que nosotros introduzcamos una orden utilie zando el teclado. La orden Unix python Hemos invocado el entorno interactivo escribiendo python en la l´ ınea de ´rdenes Unix o y pulsando el retorno de carro. Al hacer esto, el entorno de ejecuci´n de ´rdenes Unix o o (al que se suele denominar shell) busca en el ordenador una aplicaci´n llamada python o y la ejecuta. Esa aplicaci´n es un programa que lee una l´ o ınea introducida por teclado, la interpreta como si fuera un fragmento de programa Python y muestra por pantalla el resultado obtenido. (En realidad hace m´s cosas. Ya las iremos viendo.) a Por regla general, la aplicaci´n python reside en /usr/local/bin/ o en o /usr/bin/. Son directorios donde normalmente el shell busca programas. Si al escribir python y dar al retorno de carro no arranca el int´rprete, aseg´rate de que est´ e u a instalado el entorno Python. Si es as´ puedes intentar ejecutar el entorno dando la ruta ı, completa hasta el programa: por ejemplo /usr/local/bin/python. Escribamos una expresi´n aritm´tica, por ejemplo ˂˂2+2˃˃, y pulsemos la tecla de retorno o e de carro. Cuando mostremos sesiones interactivas destacaremos el texto que teclea el usuario con texto sobre fondo gris representaremos con el s´ ımbolo ˂˂ ˃˃ la pulsaci´n de o la tecla de retorno de carro. Python eval´a la expresi´n (es decir, obtiene su resultado) u o y responde mostrando el resultado por pantalla. ↱ ↱ $ python Python 2.3 (#1, Aug 2 2003, 12:14:49) [GCC 3.3] on linux2 Type help, copyright, credits or license for more information. 2+2 4 ↱ La ultima l´ ınea es, nuevamente, el prompt: Python acab´ de ejecutar la ultima orden o ´ ´ (evaluar una expresi´n y mostrar el resultado) y nos pide que introduzcamos una nueva o orden. Si deseamos acabar la sesi´n interactiva y salir del int´rprete Python, debemos o e introducir una marca de final de fichero, que en Unix se indica pulsando la tecla de control y, sin soltarla, tambi´n la tecla d. (De ahora en adelante representaremos una e combinaci´n de teclas como la descrita as´ C-d.) o ı: 2.1.1. Los operadores aritm´ticos e Las operaciones de suma y resta, por ejemplo, se denotan con los s´ ımbolos u operadores + y -, respectivamente, y operan sobre dos valores num´ricos (los operandos). Probemos e algunas expresiones formadas con estos dos operadores: ↱ ↱ ↱ 1 + 2 3 1 + 2 + 3 6 1 - 2 + 3 2 Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o Andrés a la programaci´n con ISBN: 26 26 Introducción a la programación con Python - UJI c UJI
  33. 33. Final de fichero La ˂˂marca de final de fichero˃˃ indica que un fichero ha terminado. ¡Pero nosotros no trabajamos con un fichero, sino con el teclado! En realidad, el ordenador considera al teclado como un fichero. Cuando deseamos ˂˂cerrar el teclado˃˃ para una aplicaci´n, o enviamos una marca de final de fichero desde el teclado. En Unix, la marca de final de fichero se env´ pulsando C-d; en MS-DOS o Microsoft Windows, pulsando C-z. ıa Existe otro modo de finalizar la sesi´n; escribe o ↱ from sys import exit exit() ↱ En ingl´s, ˂˂exit˃˃ significa ˂˂salir˃˃. S´ pero, ¿qu´ significa ˂˂from sys import exit˃˃ y e ı e por qu´ hay un par de par´ntesis detr´s de la palabra ˂˂exit˃˃ en la segunda l´ e e a ınea? M´s a adelante lo averiguaremos. Observa que puedes introducir varias operaciones en una misma l´ ınea o expresi´n. o El orden en que se efect´an las operaciones es (en principio) de izquierda a derecha. u La expresi´n 1 - 2 + 3, por ejemplo, equivale matem´ticamente a ((1 − 2) + 3); por ello o a decimos que la suma y la resta son operadores asociativos por la izquierda. Podemos representar gr´ficamente el orden de aplicaci´n de las operaciones utilia o zando arboles sint´cticos. Un arbol sint´ctico es una representaci´n gr´fica en la que a a o a ´ ´ disponemos los operadores y los operandos como nodos y en los que cada operador est´ a conectado a sus operandos. El arbol sint´ctico de la expresi´n ˂˂1 - 2 + 3˃˃ es ´ste: a o e ´ + 3 1 2 El nodo superior de un arbol recibe el nombre de nodo ra´ Los nodos etiquetados ız. ´ con operadores (representados con c´ ırculos) se denominan nodos interiores. Los nodos interiores tienen uno o m´s nodos hijo o descendientes (de los que ellos son sus resa pectivos nodos padre o ascendientes). Dichos nodos son nodos ra´ de otros (sub)´rboles ız a sint´cticos (¡la definici´n de arbol sint´ctico es auto-referencial!). Los valores resultantes a o a ´ de evaluar las expresiones asociadas a dichos (sub)´rboles constituyen los operandos de a la operaci´n que representa el nodo interior. Los nodos sin descendientes se denomio nan nodos terminales u hojas (representados con cuadrados) y corresponden a valores num´ricos. e La evaluaci´n de cada operaci´n individual en el arbol sint´ctico ˂˂fluye˃˃ de las hojas o o a ´ hacia la ra´ (el nodo superior); es decir, en primer lugar se eval´a la subexpresi´n ˂˂1 - 2˃˃, ız u o que corresponde al sub´rbol m´s profundo. El resultado de la evaluaci´n es −1: a a o + −1 1 3 2 A continuaci´n se eval´a la subexpresi´n que suma el resultado de evaluar ˂˂1 - 2˃˃ al o u o valor 3: Andrés Marzal/Isabel Gracia Python Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 o o 27 27 Introducción a la programación con Python - cUJI UJI
  34. 34. 2 + −1 - 3 1 2 As´ se obtiene el resultado final: el valor 2. ı Si deseamos calcular (1−(2+3)) podemos hacerlo a˜adiendo par´ntesis a la expresi´n n e o aritm´tica: e ↱ 1 - (2 + 3) -4 El arbol sint´ctico de esta nueva expresi´n es a o ´ - 1 + 2 3 En este nuevo arbol, la primera subexpresi´n evaluada es la que corresponde al sub´rbol o a ´ derecho. Observa que en el arbol sint´ctico no aparecen los par´ntesis de la expresi´n. El arbol a e o ´ ´ sint´ctico ya indica el orden en que se procesan las diferentes operaciones y no necesita a par´ntesis. La expresi´n Python, sin embargo, necesita los par´ntesis para indicar ese e o e mismo orden de evaluaci´n. o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 12 ¿Qu´ expresiones Python permiten, utilizando el menor n´mero posible de par´ntesis, e u e efectuar en el mismo orden los c´lculos representados con estos arboles sint´cticos? a a ´ + 4 - 2 1 + 3 + 1 + 1 a) 2 + 2 3 + 3 4 b) 4 c) · 13 Dibuja los arboles sint´cticos correspondientes a las siguientes expresiones arita ´ m´ticas: e a) 1 + 2 + 3 + 4 b) 1 - 2 - 3 - 4 c) 1 - (2 - (3 - 4) + 1) .................................................................................. Los operadores de suma y resta son binarios, es decir, operan sobre dos operandos. El mismo s´ ımbolo que se usa para la resta se usa tambi´n para un operador unario, es decir, e un operador que act´a sobre un unico operando: el de cambio de signo, que devuelve el u ´ valor de su operando cambiado de signo. He aqu´ algunos ejemplos: ı Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 o o Andrés Marzal/Isabel Gracia - Python 2828 Introducción a la programación con Python - UJIUJI c
  35. 35. Espacios en blanco Parece que se puede hacer un uso bastante liberal de los espacios en blanco en una expresi´n. o 10 + 20 + 30 +20 + 30 ↱ 10+ 20+30 ↱ 10 ↱ 10+20+30 ↱ 60 60 60 60 Es as´ Has de respetar, no obstante, unas reglas sencillas: ı. No puedes poner espacios en medio de un n´mero. u ↱ 10 + 2 0 + 30 Los espacios en blanco entre el 2 y el 0 hacen que Python no lea el n´mero 20, u sino el n´mero 2 seguido del n´mero 0 (lo cual es un error, pues no hay operaci´n u u o alguna entre ambos n´meros). u No puedes poner espacios al principio de la expresi´n. o 10 + 20 + 30 ↱ Los espacios en blanco entre el prompt y el 10 provocan un error. A´n es pronto u para que conozcas la raz´n. o ↱ ↱ -3 -3 -(1 + 2) -3 --3 3 ↱ He aqu´ los arboles sint´cticos correspondientes a las tres expresiones del ejemplo: ı a ´ + 3 1 - 2 3 Existe otro operador unario que se representa con el s´ ımbolo +: el operador identidad. El operador identidad no hace nada ˂˂´til˃˃: proporciona como resultado el mismo n´mero u u que se le pasa. ↱ ↱ +3 3 +-3 -3 Andrés a la programaci´n con ISBN: Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o 29 29 Introducción a la programación con Python - UJI c UJI
  36. 36. El operador identidad s´lo sirve para, en ocasiones, poner ´nfasis en que un n´mero o e u es positivo. (El ordenador considera tan positivo el n´mero 3 como el resultado de evaluar u +3.) Los operadores de multiplicaci´n y divisi´n son, respectivamente, * y /: o o 12 / 3 * 2 ↱ 3*4/2 ↱ 4/2 ↱ 2*3 ↱ 6 2 6 8 Observa que estos operadores tambi´n son asociativos por la izquierda: la expresi´n e o 3·4 ˂˂3 * 4 / 2˃˃ equivale a ((3 · 4)/2) = 2 , es decir, tiene el siguiente arbol sint´ctico: a ´ / 2 * 3 4 12 3 y la expresi´n 12 / 3 * 2 equivale a ((12/3) · 2) = o * 2 / 12 · 2, o sea, su arbol sint´ctico es: a ´ 3 ¿Qu´ pasa si combinamos en una misma expresi´n operadores de suma o resta con e o operadores de multiplicaci´n o divisi´n? F´ o o ıjate en que la regla de aplicaci´n de operadores o de izquierda a derecha no siempre se observa: ↱ ↱ 2 * 4 + 5 13 2 + 4 * 5 22 En la segunda expresi´n, primero se ha efectuado el producto 4 * 5 y el resultado o se ha sumado al valor 2. Ocurre que los operadores de multiplicaci´n y divisi´n son o o prioritarios frente a los de suma y resta. Decimos que la multiplicaci´n y la divisi´n o o tienen mayor nivel de precedencia o prioridad que la suma y la resta. El arbol sint´ctico de 2 * 4 + 5 es: a ´ + 5 * 2 y el de 2 + 4 * 5 es: Andrés a la programaci´n con ISBN: Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o 4 30 30 Introducción a la programación con Python - UJI c UJI
  37. 37. + 2 * 4 5 Pero, ¡atenci´n!, el cambio de signo tiene mayor prioridad que la multiplicaci´n y la o o divisi´n: o ↱ ↱ -2 * 2 -4 --2 * 2 4 Los arboles sint´cticos correspondientes a estas dos expresiones son, respectivamente: a ´ * - * 2 - 2 2 2 Si los operadores siguen unas reglas de precedencia que determinan su orden de aplicaci´n, ¿qu´ hacer cuando deseamos un orden de aplicaci´n distinto? Usar par´ntesis, o e o e como hacemos con la notaci´n matem´tica convencional. o a La expresi´n 2 * (4 + 5), por ejemplo, presenta este arbol sint´ctico: o a ´ * 2 + 4 5 Comprob´moslo con el int´rprete: e e ↱ 2 * (4 + 5) 18 Existen m´s operadores en Python. Tenemos, por ejemplo, el operador m´dulo, que a o se denota con el s´ ımbolo de porcentaje % (aunque nada tiene que ver con el c´lculo a de porcentajes). El operador m´dulo devuelve el resto de la divisi´n entera entre dos o o operandos. ↱ ↱ 27 % 5 2 25 % 5 0 El operador % tambi´n es asociativo por la izquierda y su prioridad es la misma que e la de la multiplicaci´n o la divisi´n. o o El ultimo operador que vamos a estudiar es la exponenciaci´n, que se denota con dos o ´ asteriscos juntos, no separados por ning´n espacio en blanco: **. u Lo que en notaci´n matem´tica convencional expresamos como 23 se expresa en Pyo a thon con 2 ** 3. Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o Andrés a la programaci´n con ISBN: 31 31 Introducción a la programación con Python - UJI c UJI
  38. 38. ↱ 2 ** 3 8 Pero, ¡ojo!, la exponenciaci´n es asociativa por la derecha. La expresi´n 2 ** 3 ** o o (32 ) = 29 = 512, y no a (23 )2 = 82 = 64, o sea, su arbol sint´ctico es: 2 equivale a 2 a ´ ** 2 ** 3 2 Por otra parte, la exponenciaci´n tiene mayor precedencia que cualquiera de los otros o operadores presentados. He aqu´ varias expresiones evaluadas con Python y sus correspondientes arboles ı ´ sint´cticos. Est´dialos con atenci´n: a u o + ↱ 2 + 3 ** 2 * 5 47 2 * 5 ** 3 + ↱ 2 + ((3 ** 2) * 5) 47 2 2 * 5 ** 3 + ↱ 2 + 3 ** (2 * 5) 59051 2 2 ** 3 * 2 - ↱ -3 ** 2 -9 ** 3 Introducci´n a la programaci´n con Python o o Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 5 32 32 2 c UJI Introducción a la programación con Python - UJI
  39. 39. - ↱ -1 -1 1 La tabla 2.1 resume las caracter´ ısticas de los operadores Python: su aridad (n´mero u de operandos), asociatividad y precedencia. Operaci´n o Operador Aridad Asociatividad Precedencia Exponenciaci´n o ** Binario Por la derecha 1 ............................................................................ Identidad + Unario  2 Cambio de signo Unario  2 ............................................................................ Multiplicaci´n o * Binario Por la izquierda 3 Divisi´n o / Binario Por la izquierda 3 M´dulo (o resto) o % Binario Por la izquierda 3 ............................................................................ Suma + Binario Por la izquierda 4 Resta Binario Por la izquierda 4 Tabla 2.1: Operadores para expresiones aritm´ticas. El nivel de precedencia 1 es el de e mayor prioridad y el 4 el de menor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 14 ¿Qu´ resultados se obtendr´n al evaluar las siguientes expresiones Python? e a Dibuja el arbol sint´ctico de cada una de ellas, calcula a mano el valor resultante de a ´ cada expresi´n y comprueba, con la ayuda del ordenador, si tu resultado es correcto. o a) 2 + 3 + 1 + 2 c) (2 + 3) * 1 + 2 b) 2 + 3 * 1 + 2 d) (2 + 3) * (1 + 2) a) 2 + (3 · (6/2)) e) +---6 f) -+-+6 c) (4/2)5 · 15 Traduce las siguientes expresiones matem´ticas a Python y eval´alas. Trata de a u utilizar el menor n´mero de par´ntesis posible. u e b) 4+6 2+3 e) (−3)2 d) (4/2)5+1 f) −(32 ) (Nota: El resultado de evaluar cada expresi´n es: a) 11; b) 2; c) 32; d) 64; e) 9; f) −9.) o .................................................................................. 2.1.2. Errores de tecleo y excepciones Cuando introducimos una expresi´n y damos la orden de evaluarla, es posible que nos o equivoquemos. Si hemos formado incorrectamente una expresi´n, Python nos lo indicar´ o a con un mensaje de error. El mensaje de error proporciona informaci´n acerca del tipo de o error cometido y del lugar en el que ´ste ha sido detectado. Aqu´ tienes una expresi´n e ı o err´nea y el mensaje de error correspondiente: o ↱ 1 + 2) File stdin, line 1 1 + 2) Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 o o Andrés Marzal/Isabel Gracia - Python 3333 Introducción a la programación con Python - UJIUJI c
  40. 40. ˆ SyntaxError: invalid syntax En este ejemplo hemos cerrado un par´ntesis cuando no hab´ otro abierto previae ıa mente, lo cual es incorrecto. Python nos indica que ha detectado un error de sintaxis (SyntaxError) y ˂˂apunta˃˃ con una flecha (el car´cter ˆ) al lugar en el que se encuentra. a (El texto ˂˂File stdin , line 1˃˃ indica que el error se ha producido al leer de teclado, esto es, de la entrada est´ndar stdin es una abreviatura del ingl´s ˂˂standard a e input˃˃, que se traduce por ˂˂entrada est´ndar˃˃.) a En Python los errores se denominan excepciones. Cuando Python es incapaz de analizar una expresi´n, produce una excepci´n. Cuando el int´rprete interactivo detecta o o e la excepci´n, nos muestra por pantalla un mensaje de error. o Veamos algunos otros errores y los mensajes que produce Python. ↱ 1 + * 3 File stdin, line 1 1 + * 3 ˆ SyntaxError: invalid syntax 2 + 3 % File stdin, line 1 2 + 3 % ˆ SyntaxError: invalid syntax 1 / 0 Traceback (innermost last): File stdin, line 1, in ? ZeroDivisionError: integer division or modulo ↱ ↱ En el ejemplo, el ultimo error es de naturaleza distinta a los anteriores (no hay ´ un car´cter ˆ apuntando a lugar alguno): se trata de un error de divisi´n por cero a o (ZeroDivisionError), cuando los otros eran errores sint´cticos (SyntaxError). La cantia dad que resulta de dividir por cero no est´ definida y Python es incapaz de calcular un a valor como resultado de la expresi´n 1 / 0. No es un error sint´ctico porque la expresi´n o a o est´ sint´cticamente bien formada: el operador de divisi´n tiene dos operandos, como a a o toca. Edici´n avanzada en el entorno interactivo o Cuando estemos escribiendo una expresi´n puede que cometamos errores y los deteco temos antes de solicitar su evaluaci´n. A´n estaremos a tiempo de corregirlos. La tecla o u de borrado, por ejemplo, elimina el car´cter que se encuentra a la izquierda del cursor. a Puedes desplazar el cursor a cualquier punto de la l´ ınea que est´s editando utilizando a las teclas de desplazamiento del cursor a izquierda y a derecha. El texto que teclees se insertar´ siempre justo a la izquierda del cursor. a Hasta el momento hemos tenido que teclear desde cero cada expresi´n evaluada, aun o cuando muchas se parec´ bastante entre s´ Podemos teclear menos si aprendemos a ıan ı. utilizar algunas funciones de edici´n avanzadas. o Lo primero que hemos de saber es que el int´rprete interactivo de Python memoe riza cada una de las expresiones evaluadas en una sesi´n interactiva por si deseamos o recuperarlas m´s tarde. La lista de expresiones que hemos evaluado constituye la hisa toria de la sesi´n interactiva. Puedes ˂˂navegar˃˃ por la historia utilizando la teclas o de desplazamiento de cursor hacia arriba y hacia abajo. Cada vez que pulses la tecla de desplazamiento hacia arriba recuperar´s una expresi´n m´s antigua. La tecla de a o a desplazamiento hacia abajo permite recuperar expresiones m´s recientes. La expresi´n a o recuperada aparecer´ ante el prompt y podr´s modificarla a tu antojo. a a Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 o o Andrés a la programaci´n con ISBN: 34 34 Introducción a la programación con Python - UJI c UJI
  41. 41. 2.2. Tipos de datos Vamos a efectuar un experimento de resultado curioso: ↱ 3 / 2 1 ¡El resultado de dividir 3 entre 2 no deber´ ser 1, sino 1.5!3 ¿Qu´ ha pasado? ¿Se ha ıa e equivocado Python? No. Python ha actuado siguiendo unas reglas precisas en las que participa un nuevo concepto: el de tipo de dato. 2.2.1. Enteros y flotantes Cada valor utilizado por Python es de un tipo determinado. Hasta el momento s´lo hemos o utilizado datos de tipo entero, es decir, sin decimales. Cuando se efect´a una operaci´n, u o Python tiene en cuenta el tipo de los operandos a la hora de producir el resultado. Si los dos operandos son de tipo entero, el resultado tambi´n es de tipo entero, as´ que la e ı divisi´n entera entre los enteros 3 y 2 produce el valor entero 1. o Si deseamos obtener resultados de tipo real, deberemos usar operandos reales. Los operandos reales deben llevar, en principio, una parte decimal, aunque ´sta sea nula. e ↱ 3.0 / 2.0 1.5 Hay diferencias entre enteros y reales en Python m´s all´ de que los primeros no a a tengan decimales y los segundos s´ El n´mero 3 y el n´mero 3.0, por ejemplo, son ı. u u indistinguibles en matem´ticas, pero s´ son diferentes en Python. ¿Qu´ diferencias hay? a ı e Los enteros suelen ocupar menos memoria. Las operaciones entre enteros son, generalmente, m´s r´pidas. a a As´ pues, utilizaremos enteros a menos que de verdad necesitemos n´meros con decimales. ı u Hemos de precisar algo respecto a la denominaci´n de los n´meros con decimales: o u el t´rmino ˂˂reales˃˃ no es adecuado, ya que induce a pensar en los n´meros reales de e u las matem´ticas. En matem´ticas, los n´meros reales pueden presentar infinitos decimaa a u les, y eso es imposible en un computador. Al trabajar con computadores tendremos que conformarnos con meras aproximaciones a los n´meros reales. u Recuerda que todo en el computador son secuencias de ceros y unos. Deberemos, pues, representar internamente con ellos las aproximaciones a los n´meros reales. Para u facilitar el intercambio de datos, todos los computadores convencionales utilizan una misma codificaci´n, es decir, representan del mismo modo las aproximaciones a los n´meros o u reales. Esta codificaci´n se conoce como ˂˂IEEE Standard 754 floating point˃˃ (que se pueo de traducir por ˂˂Est´ndar IEEE 754 para coma flotante˃˃), as´ que llamaremos n´meros a ı u en formato de coma flotante o simplemente flotantes a los n´meros con decimales que u podemos representar con el ordenador. Un n´mero flotante debe especificarse siguiendo ciertas reglas. En principio, consta u de dos partes: mantisa y exponente. El exponente se separa de la mantisa con la letra ˂˂e˃˃ (o ˂˂E˃˃). Por ejemplo, el n´mero flotante 2e3 (o 2E3) tiene mantisa 2 y exponente 3, u y representa al n´mero 2 · 103 , es decir, 2000. u Una advertencia sobre convenios tipogr´ficos. En espa˜ol, la parte fraccionaria de un n´mero se separa a n u de la parte entera por una coma, y no por un punto. Sin embargo, la norma anglosajona indica que debe utilizarse el punto. Python sigue esta norma, as´ que el n´mero que en espa˜ol se denota como 1,5 debe ı u n escribirse como 1.5 para que Python lo interprete correctamente. En aras de evitar confusiones, utilizaremos siempre el punto como car´cter de separaci´n entre parte entera y fraccionaria de un n´mero. a o u 3 Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 Introducci´n a la programaci´n con Python o o 35 35 Introducción a la programación con Python - UJI c UJI

×