algoritmos-programacion-python2

23
Unidad 1 Algunos conceptos básicos En esta unidad hablaremos de lo que es un programa de computadora e introduciremos unos cuantos conceptos referidos a la programación y a la ejecución de programas. Utilizare- mos en todo momento el lenguaje de programación Python para ilustrar esos conceptos. 1.1. Computadoras y programas En la actualidad, la mayoría de nosotros utilizamos computadoras permanentemente: para mandar correos electrónicos, navegar por Internet, chatear, jugar, escribir textos. Las computadoras se usan para actividades tan disímiles como predecir las condiciones meteorológicas de la próxima semana, guardar historias clínicas, diseñar aviones, llevar la con- tabilidad de las empresas o controlar una fábrica. Y lo interesante aquí (y lo que hace apasio- nante a esta carrera) es que el mismo aparato sirve para realizar todas estas actividades: uno no cambia de computadora cuando se cansa de chatear y quiere jugar al solitario. Muchos denen una computadora moderna como “una máquina que almacena y manipula información bajo el control de un programa que puede cambiar”. Aparecen acá dos conceptos que son claves: por un lado se habla de una máquina que almacena información, y por el otro lado, esta máquina está controlada por un programa que puede cambiar. Una calculadora sencilla, de esas que sólo tienen 10 teclas para los dígitos, una tecla para cada una de las 4 operaciones, un signo igual, encendido y CLEAR, también es una máquina que almacena información y que está controlada por un programa. Pero lo que diferencia a esta calculadora de una computadora es que en la calculadora el programa no puede cambiar. Un programa de computadora es un conjunto de instrucciones paso a paso que le indican a una computadora cómo realizar una tarea dada, y en cada momento uno puede elegir ejecutar un programa de acuerdo a la tarea que quiere realizar. Las instrucciones se deben escribir en un lenguaje que nuestra computadora entienda. Los lenguajes de programación son lenguajes diseñados especialmente para dar órdenes a una computadora, de manera exacta y no ambigua. Sería muy agradable poder darle las órdenes a la computadora en castellano, pero el problema del castellano, y de las lenguas habladas en general, es su ambigüedad: Si alguien nos dice “Comprá el collar sin monedas”, no sabremos si nos pide que compremos el collar que no tiene monedas, o que compremos un collar y que no usemos monedas para la compra. Habrá que preguntarle a quien nos da la orden cuál es la interpretación correcta. Pero tales dudas no pueden aparecer cuando se le dan órdenes a una computadora. Este curso va a tratar precisamente de cómo se escriben programas para hacer que una 7

Upload: michael-camilo-palma-escobar

Post on 15-Sep-2015

2 views

Category:

Documents


1 download

DESCRIPTION

algoritmos

TRANSCRIPT

  • Unidad 1

    Algunos conceptos bsicos

    En esta unidad hablaremos de lo que es un programa de computadora e introduciremosunos cuantos conceptos referidos a la programacin y a la ejecucin de programas. Utilizare-mos en todo momento el lenguaje de programacin Python para ilustrar esos conceptos.

    1.1. Computadoras y programas

    En la actualidad, la mayora de nosotros utilizamos computadoras permanentemente: paramandar correos electrnicos, navegar por Internet, chatear, jugar, escribir textos.

    Las computadoras se usan para actividades tan dismiles como predecir las condicionesmeteorolgicas de la prxima semana, guardar historias clnicas, disear aviones, llevar la con-tabilidad de las empresas o controlar una fbrica. Y lo interesante aqu (y lo que hace apasio-nante a esta carrera) es que el mismo aparato sirve para realizar todas estas actividades: unono cambia de computadora cuando se cansa de chatear y quiere jugar al solitario.

    Muchos denen una computadora moderna como una mquina que almacena ymanipulainformacin bajo el control de un programa que puede cambiar. Aparecen ac dos conceptosque son claves: por un lado se habla de una mquina que almacena informacin, y por el otrolado, esta mquina est controlada por un programa que puede cambiar.

    Una calculadora sencilla, de esas que slo tienen 10 teclas para los dgitos, una tecla paracada una de las 4 operaciones, un signo igual, encendido y CLEAR, tambin es una mquinaque almacena informacin y que est controlada por un programa. Pero lo que diferencia a estacalculadora de una computadora es que en la calculadora el programa no puede cambiar.

    Un programa de computadora es un conjunto de instrucciones paso a paso que le indican a unacomputadora cmo realizar una tarea dada, y en cada momento uno puede elegir ejecutar unprograma de acuerdo a la tarea que quiere realizar.

    Las instrucciones se deben escribir en un lenguaje que nuestra computadora entienda. Loslenguajes de programacin son lenguajes diseados especialmente para dar rdenes a unacomputadora, de manera exacta y no ambigua. Sera muy agradable poder darle las rdenesa la computadora en castellano, pero el problema del castellano, y de las lenguas habladas engeneral, es su ambigedad:

    Si alguien nos dice Compr el collar sin monedas, no sabremos si nos pide que compremosel collar que no tiene monedas, o que compremos un collar y que no usemos monedas para lacompra. Habr que preguntarle a quien nos da la orden cul es la interpretacin correcta. Perotales dudas no pueden aparecer cuando se le dan rdenes a una computadora.

    Este curso va a tratar precisamente de cmo se escriben programas para hacer que una

    7

  • 8 Unidad 1. Conceptos bsicos

    computadora realice una determinada tarea. Vamos a usar un lenguaje especco (Python) por-que es sencillo y elegante, pero ste no ser un curso de Python sino un curso de programacin.

    Sabas que . . .Existen una gran cantidad de programas desarrollados en Python, desde herramientas para servi-dores, como mailman, hasta programas amigables para usuarios nales, como emesene, pasandopor aplicaciones empresariales, openerp, tryton; herramientas de desarrollo,meld,mercurial, ba-zaar, trac; plataformas web, django, turbogears, zope; clientes de bittorrent, bittorrent, bittornado,deluge; montones de juegos de todo tipo, y muchsimas aplicaciones ms.Todas estas aplicaciones son software libre, por lo que se puede obtener y estudiar el cdigo con elque estn hechas

    1.2. El mito de la mquina todopoderosa

    Muchas veces la gente se imagina que con la computadora se puede hacer cualquier cosa,que no hay tareas imposibles de realizar. Ms an, se imaginan que si bien hubo cosas que eranimposibles de realizar hace 50 aos, ya no lo son ms, o no lo sern dentro de algunos aos,cuando las computadoras crezcan en poder (memoria, velocidad), y la computadora se vuelvauna mquina todopoderosa.

    Sin embargo eso no es as: existen algunos problemas, llamados no computables que nuncapodrn ser resueltos por una computadora digital, por ms poderosa que sta sea. La compu-tabilidad es la rama de la computacin que se ocupa de estudiar qu tareas son computables yqu tareas no lo son.

    De la mano del mito anterior, viene el mito del lenguaje todopoderoso: hay problemas queson no computables porque en realidad se utiliza algn lenguaje que no es el apropiado.

    En realidad todas las computadoras pueden resolver los mismos problemas, y eso es inde-pendiente del lenguaje de programacin que se use. Las soluciones a los problemas compu-tables se pueden escribir en cualquier lenguaje de programacin. Eso no signica que no hayalenguajes ms adecuados que otros para la resolucin de determinados problemas, pero laadecuacin est relacionada con temas tales como la elegancia, la velocidad, la facilidad paradescribir un problema de manera simple, etc., nunca con la capacidad de resolucin.

    Los problemas no computables no son los nicos escollos que se le presentan a la compu-tacin. Hay otros problemas que si bien son computables demandan para su resolucin unesfuerzo enorme en tiempo y en memoria. Estos problemas se llaman intratables. El anlisis dealgoritmos se ocupa de separar los problemas tratables de los intratables, encontrar la solu-cin ms barata para resolver un problema dado, y en el caso de los intratables, resolverlos demanera aproximada: no encontramos la verdadera solucin porque no nos alcanzan los recur-sos para eso, pero encontramos una solucin bastante buena y que nos insume muchos menosrecursos (el orden de las respuestas de Google a una bsqueda es un buen ejemplo de unasolucin aproximada pero no necesariamente ptima).

    En este curso trabajaremos con problemas no slo computables sino tambin tratables. Yaprenderemos a medir los recursos que nos demanda una solucin, y empezaremos a buscar lasolucin menos demandante en cada caso particular.

    Algunos ejemplos de los problemas que encararemos y de sus soluciones:

    Problema 1.1. Dado un nmero N se quiere calcular N33.

  • 1.3. Cmo darle instrucciones a la mquina usando Python 9

    Una solucin posible, por supuesto, es hacer el producto N N . . . N , que involucra32 multiplicaciones.

    Otra solucin, mucho ms eciente es:

    Calcular N N .Al resultado anterior mutiplicarlo por s mismo con lo cual ya disponemos de N4.

    Al resultado anterior mutiplicarlo por s mismo con lo cual ya disponemos de N8.

    Al resultado anterior mutiplicarlo por s mismo con lo cual ya disponemos de N16.

    Al resultado anterior mutiplicarlo por s mismo con lo cual ya disponemos de N32.

    Al resultado anterior mutiplicarlo por N con lo cual conseguimos el resultado deseadocon slo 6 multiplicaciones.

    Cada una de estas soluciones representa un algoritmo, es decir un mtodo de clculo, dife-rente. Para un mismo problema puede haber algoritmos diferentes que lo resuelven, cada unocon un costo distinto en trminos de recursos computacionales involucrados.

    Sabas que . . .La palabra algoritmo no es una variacin de logaritmo, sino que proviene de algorismo. En la an-tigedad, los algoristas eran los que calculaban usando la numeracin arbiga y mientras que losabacistas eran los que calculaban usando bacos. Con el tiempo el algorismo se deform en algoritmo,inuenciado por el trmino aritmtica.A su vez el uso de la palabra algorismo proviene del nombre de un matemtico persa famoso, en supoca y para los estudiosos de esa poca, Abu Abdallah Muhammad ibn Ms al-Jwrizm, queliteralmente signica: Padre de Jafar Mohammed, hijo de Moises, nativo de Jiva. Al-Juarismi,como se lo llama usualmente, escribi en el ao 825 el libro Al-Kitb al-mukhtasar f hsb al-gabrwal-muqbala (Compendio del clculo por el mtodo de completado y balanceado), del cualsurgi tambin la palabra lgebra.Hasta hace no mucho tiempo se utilizaba el trmino algoritmo para referirse nicamente a formasde realizar ciertos clculos, pero con el surgimiento de la computacin, el trmino algoritmo pasa abarcar cualquier mtodo para obtener un resultado.

    Problema 1.2. Tenemos que permitir la actualizacin y consulta de una gua telefnica.

    Para este problema no hay una solucin nica: hay muchas y cada una est relacionadacon un contexto de uso. De qu gua estamos hablando: la gua de una pequea ocina, unpequeo pueblo, una gran ciudad, la gua de la Argentina? Y en cada caso de qu tipo deconsulta estamos hablando: hay que imprimir un listado una vez por mes con la gua comple-ta, se trata de una consulta en lnea, etc.? Para cada contexto hay una solucin diferente, conlos datos guardados en una estructura de datos apropiada, y con diferentes algoritmos para laactualizacin y la consulta.

    1.3. Cmo darle instrucciones a la mquina usando Python

    El lenguaje Python nos provee de un intrprete, es decir un programa que interpreta las r-denes que le damos a medida que las escribimos. Para orientarnos, el intrprete presenta una

  • 10 Unidad 1. Conceptos bsicos

    Sabas que . . .Python fue creado a nales de los aos 80, por un programador holands llamado Guido vanRossum, quien sigue siendo an hoy el lder del desarrollo del lenguaje.La versin 2.0, lanzada en 2000, fue un paso muy importante para el lenguaje ya que era muchoms madura, incluyendo un recolector de basura. La versin 2.2, lanzada en diciembre de 2001, fuetambin un hito importante ya que mejor la orientacin a objetos. La ltima versin de esta lneaes la 2.7 que fue lanzada en noviembre de 2010 y an est vigente.En diciembre de 2008, se lanz la versin 3.0, cuya versin actual es la 3.2, de febrero de 2011.Sin embargo, debido a que estas versiones introducen importantes cambios y no son totalmentecompatibles con las versiones anteriores, todava no se la utiliza extensamente.

    lnea de comandos (los comandos son las rdenes) que identica al comienzo con los smbolos>>>, y que llamaremos prompt. En esta lnea, a continuacin del prompt podemos escribir dife-rentes rdenes.

    Algunas rdenes sencillas, por ejemplo, permiten utilizar la lnea de comandos como unacalculadora simple con nmeros enteros. Para esto escribimos la expresin que queremos re-solver en el prompt y presionamos la tecla . El intrprete de Python responde elresultado de la operacin en la lnea siguiente, sin prompt, y luego nos presenta nuevamente elcursor para escribir la siguiente orden.

    >>> 2+35>>>

    Python permite utilizar las operaciones +, -, *, / (divisin entera), y ** (potencia-cin). La sintaxis es la convencional (valores intercalados con operaciones), y se pueden usarparntesis para modicar el orden de asociacin natural de las operaciones (potenciacin, pro-ducto/divisin, suma/resta).

    >>> 5*735>>> 2+3*723>>> (2+3)*735>>> 10/52>>> 5**225>>>

    Otra orden sencilla de Python permite indicarle al intrprete que escriba o imprima porpantalla una palabra o frase, que llamaremos cadena de texto.

    >>> print HolaHola>>> print Como estan?Como estan?>>> print "Bienvenidos y bienvenidas a este curso!"Bienvenidos y bienvenidas a este curso!

  • 1.3. Cmo darle instrucciones a la mquina usando Python 11

    >>>

    print es una instruccin de Python: aqulla que le indica a la mquina que debe imprimirun texto en pantalla, que deber ser ingresado entre comillas simples o dobles " indistinta-mente. Ya veremos con qu otras instrucciones viene equipado Python.

    Pero ya dijimos que como programadores debamos ser capaces de escribir nuevas instruc-ciones para la computadora. Los programas de correo electrnico, navegacin por Internet,chat, juegos, escritura de textos o prediccin de las condiciones meteorolgicas de los prxi-mos das no son ms que grandes instrucciones que se le dan a la mquina, escritas por uno omuchos programadores.

    Llamaremos funcin a una instruccin escrita por un programador.Si queremos escribir una funcin (que llamaremos holaMar) que escribe en una lnea el

    texto Hola Marta! y en la lnea siguiente el texto Estoy programando en Python., lo quedebemos hacer es ingresar el siguiente conjunto de lneas en Python:

    Cdigo 1.1 holaMar: Saluda a Marta

    >>> def holaMar():print "Hola Marta!"print "Estoy programando en Python."

    >>>

    def holaMar(): le indica a Python que estamos escribiendo una instruccin cuyo nom-bre es holaMar. Por qu se ponen esos dos parntesis? Lo veremos dentro de unos p-rrafos. La sangra con la que se escriben las dos instrucciones print le indican a Pyt-hon que estamos escribiendo el cuerpo (es decir las instrucciones que la componen) de lafuncin en cuestin. Las dos teclas que tecleamos despus de ingresar el texto"Estoy programando en Python." le indican a Python que se acab el cuerpo de la fun-cin (y por eso aparece nuevamente el cursor).

    Si ahora queremos que la mquina ejecute la instruccin holaMar, debemos escribirholaMar() a continuacin del cursor de Python:

    >>> holaMar()Hola Marta!Estoy programando en Python.>>>

    Se dice que estamos invocando a la funcin holaMar. Al invocar una funcin, se ejecutanlas instrucciones que habamos escrito en su cuerpo, una a continuacin de la otra.

    Nuestro amigo Pablo seguramente se pondr celoso porque escribimos una funcin que lasaluda aMarta, y nos pedir que escribamos una funcin que lo salude a l. Y as procederemosentonces:

    Cdigo 1.2 holaPab: Saluda a Pablo

    >>> def holaPab():print "Hola Pablo!"print "Estoy programando en Python."

  • 12 Unidad 1. Conceptos bsicos

    Pero, si para cada amigo que quiere que lo saludemos debemos que escribir una funcindistinta, parecera que la computadora no es una gran solucin. A continuacin veremos, sinembargo, que podemos llegar a escribir una nica funcin que se personalice en cada invoca-cin, para saludar a quien querramos. Para eso estn precisamente los parntesis.

    Las funciones tienen partes variables, llamadas parmetros, que se ponen dentro de los pa-rntesis. Escribimos por ejemplo una funcin hola general que nos sirva para saludar a cual-quiera, de la siguiente manera:

    Cdigo 1.3 hola: Saluda a quien sea necesario

    >>> def hola(alguien):print "Hola", alguien,"!"print "Estoy programando en Python."

    En este caso, alguien es un parmetro cuyo valor ser reemplazado por un texto (nombreen este caso) en cada invocacin. Por ejemplo, podemos invocarla dos veces, para saludar aAna y a Juan:

    >>> hola("Ana")Hola Ana !Estoy programando en Python.>>> hola("Juan")Hola Juan !Estoy programando en Python.>>>

    Problema 1.3.1. Escribir un programa que calcule el cuadrado de un nmero dado.

    Solucin. Para resolver este problema, se combinan los recursos utilizados hasta ahora.

    Cdigo 1.4 cuad1: Eleva un nmero al cuadrado y lo imprime

    def cuad1(num):print num*num

    Para invocarlo, deberemos hacer:

    1 >>> cuad1(5)2 253 >>>

    Problema 1.3.2. Permitir que el usuario ingrese el valor a elevar al cuadrado.

    Solucin. Para esto utilizaremos una nueva funcin input que permite leer valores ingresadospor el usuario.

    La ejecucin del programa ser la siguiente:

    >>> cuad2()Ingrese un numero: 525>>>

  • 1.4. Devolver un resultado 13

    Cdigo 1.5 cuad2: Pide un nmero al usuario e imprime su cuadrado

    def cuad2():n = input("Ingrese un nmero: ")cuad1(n)

    1.4. Devolver un resultado

    Las funciones que vimos hasta ahora muestran mensajes, pero no hemos visto funcionesque se comporten como las funciones que conocemos, las de la matemtica, que se usan paracalcular resultados.

    Queremos tambin poder hacer cosas del estilo y = f(x) en nuestros programas. Para ellointroduciremos la instruccin return que indica cul es el valor que tiene quedevolver nuestra funcin.

    En este ejemplo escribimos una funcin que eleva al cuadrado un nmero.

    Cdigo 1.6 cuadrado: Eleva un nmero al cuadrado y lo devuelve

    >>> def cuadrado (x):... cua = x * x... return cua...>>> y = cuadrado (5)>>> y25>>>

    1.5. Una instruccin un poco ms compleja: el ciclo denido

    Problema 1.5.1. Ahora que sabemos construir una funcin que calcula el cuadrado de un n-mero, nos piden que imprimamos los cuadrados de los nmeros del 2 al 8.

    Solucin. Por supuesto que podemos hacer:

    >>> def cuad3():print cuadrado(2)print cuadrado(3)print cuadrado(4)print cuadrado(5)print cuadrado(6)print cuadrado(7)print cuadrado(8)

    >>> cuad3()

  • 14 Unidad 1. Conceptos bsicos

    491625364964>>>

    Se puede hacer algo mejor que esto? Con lo que sabemos de Python hasta el momento, no.Para resolver este tipo de problema (repetir un clculo para los valores contenidos en un

    intervalo dado) de manera eciente, introducimos el concepto de ciclo denido, que tiene lasiguiente forma:

    for x in range(n1, n2):

    Esta instruccin se lee como:

    Generar la secuencia de valores enteros del intervalo [n1, n2), y

    Para cada uno de los valores enteros que toma x en el intervalo generado, se debe hacerlo indicado por .

    Vemos cmo, usando esta construccin, el problema anterior se puede resolver de manerams compacta:

    Solucin. En nuestro caso lo que hay que hacer es invocar a la instruccin print cuadrado(x)que usa la funcin denida en 1.6 para calcular el cuadrado de x, y luego imprime el resultado,cuando x toma los valores 2, 3, . . . , 8.

    La instruccin que describe qu tipo de repeticiones se deben realizar es el encabezado delciclo, y las instrucciones que describen la accin que se repite se llaman cuerpo del ciclo.

    No nos olvidemos que en nuestro ejemplo el ciclo debe recorrer todos los valores enterosentre 2 y 8, por lo tanto:

    for x in range(2, 9): ser el encabezado del ciclo y

    print cuadrado(x) ser el cuerpo del ciclo.

    Vemos entonces cmo resulta el ciclo completo (con su ejecucin):

    AtencinTodas las instrucciones que describen el cuerpo del ciclo deben tener una sangra mayor que elencabezado del ciclo.Esta sangra puede ingresarse mediante espacios o tabuladores, pero es importante que sea la mis-ma para todas las instrucciones del ciclo.

  • 1.6. Construir programas y mdulos 15

    Cdigo 1.7 cuadrados: Imprime los cuadrados del 2 al 8

    >>> for x in range(2, 9):print cuadrado(x)

    491625364964>>>

    1.5.1. Ayuda desde el intrprete

    El intrprete de python nos provee una ayuda en lnea, es decir, nos puede dar la docu-mentacin de una funcin, intruccin, etc, para obtenerla llamamos a help(). Por ejemplopodemos pedir help(input) y nos dara la documentacin de esa funcin.

    Para obtener la documentacin de las instrucciones las debemos poner entre comillas, esdecir help(return), de la misma forma se puede pedir ayuda sobre variables o valores.

    Otra forma de obtener ayuda es mediante dir(variable), que nos va a listar todas lasfunciones que tiene asociadas esa variable. Por ejemplo, mostramos las funciones asociadas auna cadena.

    >>> dir("hola")[__add__, __class__, __contains__, __delattr__, __doc__, __eq__,__ge__, __getattribute__, __getitem__, __getnewargs__, __getslice__,__gt__, __hash__, __init__, __le__, __len__, __lt__, __mod__,__mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__,__rmod__, __rmul__, __setattr__, __str__, capitalize, center,count, decode, encode, endswith, expandtabs, find, index,isalnum, isalpha, isdigit, islower, isspace, istitle, isupper,join, ljust, lower, lstrip, partition, replace, rfind, rindex,rjust, rpartition, rsplit, rstrip, split, splitlines,startswith, strip, swapcase, title, translate, upper, zfill]

    Como se puede ver son muchas las funciones asociadas a las cadenas, pero no necesitamosconocerlas todas, a medida que avancemos veremos algunas.

    1.6. Construir programas y mdulos

    El interprete es muy til para probar cosas, acceder a la ayuda, inspeccionar el lenguaje, etc,pero si escribimos nuestras funciones frente al cursor de Python como hasta ahora, perdemostodas las deniciones cuando salimos de Python. Para conservar los programas que vamosescribiendo, debemos usar algn editor de texto, y guardar el archivo con la extensin .py.

    Por convencin, la primer lnea del archivo deber contener:

    #!/usr/bin/env python

  • 16 Unidad 1. Conceptos bsicos

    Estas dos convenciones indican que se trata de un mdulo o programa Python, es decir unarchivo separado que deber ser ejecutado por Python.

    Sabas que . . .Python es un lenguaje multiplataforma, esto quiere decir, que est pensado para que pueda utili-zarse en una gran variedad de sistemas operativos (Windows, Mac, Linux, etc).Las dos convenciones mencionadas le permiten a distintos sistemas darse cuenta que este archi-vo en particular lo tiene que procesar con Python. En particular, Windows, tradicionalmente, slose ja en la extensin del archivo para saber cmo procesarlo (por eso el .py), mientras que todoslos sistemas derivados de Unix (OS X, Linux, Solaris, etc) analizan los permisos del archivo (enparticular, el permiso de ejecucin) y los primeros caracteres, para saber como procesarlos (por elloes necesario incluir esa primera lnea mgica).

    Problema 1.6.1. Escribir en Python un programa que haga lo siguiente:

    Muestra un mensaje de bienvenida por pantalla.

    Le pide al usuario que introduzca dos nmeros enteros n1 y n2.

    Imprime el cuadrado de todos los nmeros enteros del intervalo [n1, n2).

    Muestra un mensaje de despedida por pantalla.

    Solucin. Para la resolucin del problema, escribiremos nuestro primer mdulo de Python, queguardaremos en el archivo cuad.py, el cdigo de este programa se encuentra en el Cdigo 1.8.

    Cdigo 1.8 cuad.py: Imprime los cuadrados solicitados

    1 #!/usr/bin/env python2 """ Un programa sencillo, para calcular cuadrados de nmeros """3

    4 def main():5 print "Se calcularn cuadrados de nmeros"6

    7 n1 = input("Ingrese un nmero entero: ")8 n2 = input("Ingrese otro nmero entero: ")9

    10 for x in range(n1, n2):11 print x*x12

    13 print "Es todo por ahora"14

    15 main()

    Para ejecutar este mdulo, podemos iniciar Python y luego importarlo. Lo ejecutaremos convalores 5 y 8 de la siguiente manera:

  • 1.7. La forma de un programa Python 17

    >>> import cuadSe calcularn cuadrados de nmerosIngrese un nmero entero: 5Ingrese otro nmero entero: 8253649Es todo por ahora>>>

    La orden import cuad le indica a Python que debe traer a la memoria el mdulocuad.py, tal como lo habamos guardado, y ejecutar su contenido. Al hacer esto, sucendenlas siguientes operaciones:

    Se carga en memoria la funcin main del mdulo cuad (a la que se le asigna el nombrecuad.main), segn la denicin que est en el archivo, y

    se inicia su ejecucin inmediatamente, dado que luego de la denicin se encuentra lainvocacin main().

    Una vez importado el mdulo, cuad.main queda en memoria, y se puede volver a invocarsin necesidad de importar nuevamente:

    >>> cuad.main()Se calcularn cuadrados de nmerosIngrese un nmero entero: 3Ingrese otro nmero entero: 5916Es todo por ahora>>>

    Por otro lado, habiendo cumplido con las convenciones nombradas anteriormente, es posible eje-cutar el archivo como un programa normal, y el sistema se encargar de llamar a Python y darlenuestro archivo para que lo procese y ejecute.

    1.7. La forma de un programa Python

    La primera instruccin de cuad.main es

    5 print "Se calcularn cuadrados de nmeros"

    que lo que hace es mostrar un mensaje por pantalla.Las instrucciones segunda y tercera

    7 n1 = input("Ingrese un nmero entero: ")8 n2 = input("Ingrese otro nmero entero: ")

  • 18 Unidad 1. Conceptos bsicos

    Sabas que . . .En los programas Python que escribimos, podemos operar con cadenas de texto o con nmeros.Las representaciones dentro de la computadora de un nmero y una cadena son muy distintas, elnmero 12345678 se almacena en forma binaria y utiliza unos pocos bytes, mientras que la cadena"12345678", es una sucesin de caracteres, en la que cada nmero es un caracter que ocupa unbyte.La funcin input toma valores numricos, y si se desea ingresar una cadena, debe hacrselo entrecomillas: "hola". Existe, por otro lado, la funcin raw_input, para la cual los valores ingresadosson siempre cadenas de caracteres.

    son instrucciones de entrada: se despliega el texto que est entre comillas y se espera que elusuario ingrese un valor numrico y oprima la tecla .

    Cmo hacer para que los valores que provee el usuario se recuerden a lo largo de todo elprograma? Al valor ingresado se le dar un nombre, de la misma manera que a otros valorescalculados durante la ejecucin. Aparece el concepto de variables de un programa: una variablese usa para darle un nombre a un valor dado y poder de esa manera referirnos al mismo a lolargo del programa.

    En estas dos instrucciones, n1 y n2 son los nombres con los que se mencionarn el primery el segundo entero tipeados por el usuario.

    En el ejemplo de la ltima corrida, se asociar el valor 3 con la variable n1 y el valor 5 conla variable n2.

    Luego de leer esos valores, se procede a ejecutar el ciclo

    10 for x in range(n1, n2):11 print x*x

    Si el valor asociado con n1 es 3, y el valor asociado con n2 es 5, se asociar a x sucesivamentecon los valores 3 y 4, y en cada caso se ejecutar el cuerpo del ciclo indicado (mostrar enpantalla los valores de los cuadrados de 3 y 4).

    Finalmente, cuando se terminan las repeticiones indicadas en el ciclo, se ejecuta la instruc-cin

    13 print "Es todo por ahora"

    que, como ya se ha visto, muestra el mensaje Es todo por ahora por pantalla.

    1.8. Estado y computacin

    A lo largo de la ejecucin de un programa las variables pueden cambiar el valor con el queestn asociadas. En un momento dado uno puede detenerse a observar a qu valor se reerecada una de las variables del programa. Esa foto que indica en un momento dado a qu valorhace referencia cada una de las variables se denomina estado. Tambin hablaremos del estado deuna variable para indicar a qu valor est asociada esa variable, y usaremos la notacin n 13para describir el estado de la variable n (e indicar que est asociada al nmero 13).

    A medida que las variables cambian de valores a los que se reeren, el programa va cam-biando de estado. La sucesin de todos los estados por los que pasa el programa en una ejecu-cin dada se denomina computacin.

    Para ejemplicar estos conceptos veamos qu sucede cuando se ejecuta el programa cuad:

  • 1.9. Depuracin de programas 19

    Instruccin Qu sucede Estadoprint "Se calcularncuadrados de nmeros"

    Se despliega el texto Se calcularn cua-drados de nmeros en la pantalla.

    n1 = input("Ingreseun nmero entero: ")

    Se despliega el texto Ingrese un nmeroentero: en la pantalla y el programa sequeda esperando que el usuario ingreseun nmero.Supondremos que el usuario ingresa elnmero 3 y luego oprime la tecla .Se asocia el nmero 3 con la variable n1.

    n1 3

    n2 = input("Ingreseotro nmero entero: ")

    Se despliega el texto Ingrese otro nme-ro entero: en la pantalla y el programase queda esperando que el usuario ingre-se un nmero.

    n1 3

    Supondremos que el usuario ingresa elnmero 5 y luego oprime la tecla .Se asocia el nmero 5 con la variable n2.

    n1 3n2 5

    for x in range(n1, n2): Se asocia el primer nmero de [n1,n2)con la variable x y se ejecuta el cuerpo delciclo.

    n1 3n2 5x 3

    print x*x Se imprime por pantalla el valor de x * x(9)

    n1 3n2 5x 3

    for x in range(n1, n2): Se asocia el segundo nmero de [n1,n2)con la variable x y se ejecuta el cuerpo delciclo.

    n1 3n2 5x 4

    print x*x Se imprime por pantalla el valor de x * x(16)

    n1 3n2 5x 4

    for x in range(n1, n2): Como no quedan ms valores por trataren [n1,n2), se sale del ciclo.

    n1 3n2 5x 4

    print "Es todo por ahora" Se despliega por pantalla el mensaje Estodo por ahora

    n1 3n2 5x 4

    1.9. Depuracin de programas

    Una manera de seguir la evolucin del estado es insertar instrucciones de impresin ensitios crticos del programa. Esto nos ser de utilidad para detectar errores y tambin paracomprender cmo funcionan determinadas instrucciones.

  • 20 Unidad 1. Conceptos bsicos

    1.10. Ejercicios

    Ejercicio 1.1. Correr tres veces el programa cuad con valores de entrada (3,5), (3,3) y (5,3)respectivamente. Qu sucede en cada caso?

    Ejercicio 1.2. Insertar instrucciones de depuracin que permitan ver el valor asociado con lavariable x en el cuerpo del ciclo for y despus que se sale de tal ciclo. Volver a correr tres vecesel programa cuad con valores de entrada (3,5), (3,3) y (5,3) respectivamente, y explicar lo quesucede.

    Ejercicio 1.3. La salida del programa cuad es poco informativa. Escribir un programanom_cuad que ponga el nmero junto a su cuadrado. Ejecutar el programa nuevo.

    Ejercicio 1.4. Si la salida sigue siendo poco informativa seguir mejorndola hasta que sea losucientemente clara.

  • Unidad 2

    Programas sencillos

    En esta unidad empezaremos a resolver problemas sencillos, y a programarlos en Python.

    2.1. Construccin de programas

    Cuando nos piden que hagamos un programa debemos seguir una cierta cantidad de pasospara asegurarnos de que tendremos xito en la tarea. La accin irreexiva (me piden algo, mesiento frente a la computadora y escribo rpidamente y sin pensarlo lo que me parece que es lasolucin) no constituye una actitud profesional (e ingenieril) de resolucin de problemas. Todaconstruccin tiene que seguir una metodologa, un protocolo de desarrollo, dado.

    Existen muchas metodologas para construir programas, pero en este curso aplicaremosuna metodologa sencilla, que es adecuada para la construccin de programas pequeos, y quese puede resumir en los siguientes pasos:

    1. Analizar el problema. Entender profundamente cul es el problema que se trata de resol-ver, incluyendo el contexto en el cual se usar.

    Una vez analizado el problema, asentar el anlisis por escrito.

    2. Especicar la solucin. ste es el punto en el cual se describe qu debe hacer el programa,sin importar el cmo. En el caso de los problemas sencillos que abordaremos, deberemosdecidir cules son los datos de entrada que se nos proveen, cules son las salidas quedebemos producir, y cul es la relacin entre todos ellos.

    Al especicar el problema a resolver, documentar la especicacin por escrito.

    3. Disear la solucin. ste es el punto en el cul atacamos el cmo vamos a resolver elproblema, cules son los algoritmos y las estructuras de datos que usaremos. Analiza-mos posibles variantes, y las decisiones las tomamos usando como dato de la realidad elcontexto en el que se aplicar la solucin, y los costos asociados a cada diseo.

    Luego de disear la solucin, asentar por escrito el diseo, asegurndonos de que est completo.

    4. Implementar el diseo. Traducir a un lenguaje de programacin (en nuestro caso, y porel momento, Python) el diseo que elegimos en el punto anterior.

    21

  • 22 Unidad 2. Programas sencillos

    La implementacin tambin se debe documentar, con comentarios dentro y fuera del cdigo, alrespecto de qu hace el programa, cmo lo hace y por qu lo hace de esa forma.

    5. Probar el programa. Disear un conjunto de pruebas para probar cada una de sus partespor separado, y tambin la correcta integracin entre ellas. Utilizar el depurador comoinstrumento para descubir dnde se producen ciertos errores.

    Al ejecutar las pruebas, documentar los resultados obtenidos.

    6. Mantener el programa. Realizar los cambios en respuesta a nuevas demandas.

    Cuando se realicen cambios, es necesario documentar el anlisis, la especicacin, el diseo, laimplementacin y las pruebas que surjan para llevar estos cambios a cabo.

    2.2. Realizando un programa sencillo

    Al leer un artculo en una revista norteamericana que contiene informacin de longitudesexpresadas en millas, pies y pulgadas, queremos poder convertir esas distancias de modo quesean fciles de entender. Para ello, decidimos escribir un programa que convierta las longitudesdel sistema ingls al sistema mtrico decimal.

    Antes de comenzar a programar, utilizamos la gua de la seccin anterior, para analizar,especicar, disear, implementar y probar el problema.

    1. Anlisis del problema. En este caso el problema es sencillo: nos dan un valor expresadoen millas, pies y pulgadas y queremos transformarlo en un valor en el sistema mtricodecimal. Sin embargo hay varias respuestas posibles, porque no hemos jado en qu uni-dad queremos el resultado. Supongamos que decidimos que queremos expresar todo enmetros.

    2. Especicacin. Debemos establecer la relacin entre los datos de entrada y los datos desalida. Ante todo debemos averiguar los valores para la conversin de las unidades bsi-cas. Buscando en Internet encontramos la siguiente tabla:

    1 milla = 1.609344 km

    1 pie = 30.48 cm

    1 pulgada = 2.54 cm

    AtencinA lo largo de todo el curso usaremos punto decimal, en lugar de coma decimal, para representarvalores no enteros, dado que esa es la notacin que utiliza Python.

    La tabla obtenida no traduce las longitudes a metros. La manipulamos para llevar todo ametros:

    1 milla = 1609.344 m

    1 pie = 0.3048 m

  • 2.2. Realizando un programa sencillo 23

    1 pulgada = 0.0254 m

    Si una longitud se expresa como Lmillas, F pies y P pulgadas, su conversin a metros secalcular comoM = 1609,344 L+ 0,3048 F + 0,0254 P.Hemos especicado el problema. Pasamos entonces a la prxima etapa.

    3. Diseo. La estructura de este programa es sencilla: leer los datos de entrada, calcular lasolucin, mostrar el resultado, o Entrada-Clculo-Salida.

    Antes de escribir el programa, escribiremos en pseudocdigo (un castellano preciso que seusa para describir lo que hace un programa) una descripcin del mismo:

    Leer cuntas millas tiene la longitud dada(y referenciarlo con la variable millas)

    Leer cuntos pies tiene la longitud dada(y referenciarlo con la variable pies)

    Leer cuntas pulgadas tiene la longitud dada(y referenciarlo con la variable pulgadas)

    Calcular metros = 1609.344 * millas +0.3048 * pies + 0.0254 * pulgadas

    Mostrar por pantalla la variable metros

    4. Implementacin.Ahora estamos en condiciones de traducir este pseudocdigo a un pro-grama en lenguaje Python:

    Cdigo 2.1 ametrico.py: Convierte medidas inglesas a sistema metrico

    1 def main():2 print "Convierte medidas inglesas a sistema metrico"3 millas = input("Cuntas millas?: ")4 pies = input("Y cuntos pies?: ")5 pulgadas = input("Y cuntas pulgadas?: ")6

    7 metros = 1609.344 * millas + 0.3048 * pies + 0.0254 * pulgadas8 print "La longitud es de ", metros, " metros"9 main()

    5. Prueba. Probaremos el programa para valores para los que conocemos la solucin:

    1 milla, 0 pies, 0 pulgadas.0 millas, 1 pie, 0 pulgada.0 millas, 0 pies, 1 pulgada.

    La prueba la documentaremos con la sesin de Python correspondiente a las tres invoca-ciones a ametrico.py.

  • 24 Unidad 2. Programas sencillos

    En la seccin anterior hicimos hincapi en la necesidad de documentar todo el proceso dedesarrollo. En este ejemplo la documentacin completa del proceso lo constituye todo lo escritoen esta seccin.

    AtencinAl entregar un ejercicio, se deber presentar el desarrollo completo con todas las etapas, desde elanlisis hasta las pruebas (y el mantenimiento, si hubo cambios).

    2.3. Piezas de un programa Python

    Para poder empezar a programar en Python es necesario que conocer los elementos queconstituyen un programa en dicho lenguaje y las reglas para construirlos.

    Cuando empezamos a hablar en un idioma extranjero es posible que nos entiendan pese a quecometamos errores. No sucede lo mismo con los lenguajes de programacin: la computadora nonos entender si nos desviamos un poco de alguna de las reglas.

    2.3.1. Nombres

    Ya hemos visto que se usan nombres para denominar a los programas (ametrico) y paradenominar a las funciones dentro de un mdulo (main). Cuando queremos dar nombres avalores usamos variables (millas, pies, pulgadas, metros). Todos esos nombres se llamanidenticadores y Python tiene reglas sobre qu es un identicador vlido y qu no lo es.

    Un identicador comienza con una letra o con guin bajo (_) y luego sigue con una se-cuencia de letras, nmeros y guiones bajos. Los espacios no estn permitidos dentro de losidenticadores.

    Los siguientes son todos identicadores vlidos de Python:

    hola

    hola12t

    _hola

    Hola

    Python distingue maysculas de minsculas, as que Hola es un identicador y hola esotro identicador.

    Por convencin, no usaremos identicadores que empiezan con mayscula.

    Los siguientes son todos identicadores invlidos de Python:

    hola a12t

    8hola

    hola\%

    Hola*9

  • 2.3. Piezas de un programa Python 25

    Python reserva 31 palabras para describir la estructura del programa, y no permite que seusen como identicadores. Cuando en un programa nos encontramos con que un nombre no esadmitido pese a que su formato es vlido, seguramente se trata de una de las palabras de estalista, a la que llamaremos de palabras reservadas. La lista completa de las palabras reservadas dePython aparecen en el cuadro 2.1.

    and del from not whileas elif global or withassert else if pass yieldbreak except import printclass exec in raisecontinue finally is returndef for lambda try

    Cuadro 2.1: Las palabras reservadas de Python. Estas palabras no pueden ser usadas comoidenticadores.

    2.3.2. Expresiones

    Una expresin es una porcin de cdigo Python que produce o calcula un valor (resultado).

    Un valor es una expresin (de hecho es la expresin ms sencilla). Por ejemplo el resulta-do de la expresin 111 es precisamente el nmero 111.

    Una variable es una expresin, y el valor que produce es el que tiene asociado en el estado(si x 5 en el estado, entonces el resultado de la expresin x es el nmero 5).

    Usamos operaciones para combinar expresiones y construir expresiones ms complejas:

    Si x es como antes, x + 1 es una expresin cuyo resultado es 6. Si en el estado millas 1, pies 0 y pulgadas 0, entonces1609.344 * millas + 0.3048 * pies + 0.0254 * pulgadas es una ex-presin cuyo resultado es 1609.344.

    La exponenciacin se representa con el smbolo **. Por ejemplo, x**3 signica x3. Se pueden usar parntesis para indicar un orden de evaluacin: ((b * b) - (4 * a * c)) / (2 * Igual que en la matemtica, si no hay parntesis en la expresin primero se agrupanlas exponenciaciones, luego los productos y cocientes, y luego las sumas y restas.

    Sin embargo, hay que tener cuidado con lo que sucede con los cocientes, porque si xe y son nmeros enteros, entonces x / y se calcula como la divisin entera entre x ey:Si x se reere al valor 12 e y se reere al valor 9 entonces x / y se reere al valor 1.

    Si x e y son nmeros enteros, entonces x % y se calcula como el resto de la divisinentera entre x e y:Si x se reere al valor 12 e y se reere al valor 9 entonces x % y se reere al valor 3.

  • 26 Unidad 2. Programas sencillos

    Los nmeros pueden ser tanto enteros (111, -24), como reales (12.5, 12.0, -12.5). Dentro de lacomputadora se representan de manera diferente, y se comportan de manera diferente frente a lasoperaciones.

    Conocemos tambin dos expresiones muy particulares:

    input, que devuelve el valor ingresado por teclado tal como se lo digita (en parti-cular sirve para ingresar valores numricos).

    raw_input, que devuelve lo ingresado por teclado como si fuera un texto.

    Ejercicio 2.1. Aplicando las reglas matemticas de asociatividad, decidir cules de las siguien-tes expresiones son iguales entre s:

    a) ((b * b) - (4 * a * c)) / (2 * a),

    b) (b * b - 4 * a * c) / (2 * a),

    c) b * b - 4 * a * c / 2 * a,

    d) (b * b) - (4 * a * c / 2 * a)

    e) 1 / 2 * b

    f) b / 2.

    Ejercicio 2.2. En Python hagan lo siguiente: Denle a a, b y c los valores 10, 100 y 1000 respec-tivamente y evalen las expresiones del ejercicio anterior.

    Ejercicio 2.3. En Python hagan lo siguiente: Denle a a, b y c los valores 10.0, 100.0 y 1000.0respectivamente y evalen las expresiones del punto anterior.

    2.4. No slo de nmeros viven los programas

    No slo tendremos expresiones numricas en un programa Python. Recuerden el programaque se us para saludar a muchos amigos:

    def hola(alguien):print "Hola", alguien, "!"print "Estoy programando en Python."

    Para invocar a ese programa y hacer que saludara a Ana haba que escribir hola("Ana").La variable alguien en dicha invocacin queda ligada a un valor que es una cadena de

    caracteres (letras, dgitos, smbolos, etc.), en este caso, "Ana".Python usa tambin una notacin con comillas simples para referirse a las cadenas de ca-

    racteres, y habla de Ana.Como en la seccin anterior, veremos las reglas de qu constituyen expresiones con carac-

    teres:

    Un valor tambin ac es una expresin. Por ejemplo el resultado de la expresin Anaes precisamente Ana.

    Una variable es una expresin, y el valor que produce es el que tiene asociado en el estado(si amiga Ana en el estado, entonces el resultado de la expresin amiga es la cadenaAna).

  • 2.5. Instrucciones 27

    Usamos operaciones para combinar expresiones y construir expresiones ms complejas,pero atencin con qu operaciones estn permitidas sobre cadenas:

    El signo + no representa la suma sino la concatenacin de cadenas: Si amiga es comoantes, amiga + Laura es una expresin cuyo valor es AnaLaura.

    AtencinNo se pueden sumar cadenas ms nmeros.

    >>> amiga="Ana">>> amiga+LauraAnaLaura>>> amiga+3Traceback (most recent call last):File "", line 1, in

    TypeError: cannot concatenate str and int objects>>>

    El signo * se usa para indicar cuntas veces se repite una cadena: amiga * 3 es unaexpresin cuyo valor es AnaAnaAna.

    AtencinNo se pueden multiplicar cadenas entre s

    >>> amiga * 3AnaAnaAna>>> amiga * amigaTraceback (most recent call last):File "", line 1, in

    TypeError: cant multiply sequence by non-int of type str

    2.5. Instrucciones

    Las instrucciones son las rdenes que entiende Python. Ya hemos usado varias instrucciones:

    hemos mostrado valores por pantalla mediante la instruccin print,

    hemos retornado valores de una funcin mediante la instruccin return,

    hemos asociado valores con variables y

    hemos usado un ciclo para repetir un clculo.

    2.6. Ciclos denidos

    Hemos ya usado la instruccin for en el programa que calcula cuadrados de enteros en unrango.

  • 28 Unidad 2. Programas sencillos

    for x in range(n1, n2):print x*x

    Este ciclo se llama denido porque de entrada, y una vez ledos n1 y n2, se sabe exacta-mente cuntas veces se ejecutar el cuerpo y qu valores tomar x.

    Un ciclo denido es de la forma

    for in :

    En nuestro ejemplo la secuencia de valores es el intervalo de enteros [n1, n1+1, ..., n2-1]y la variable es x.

    La secuencia de valores se puede indicar como:

    range(n). Establece como secuencia de valores a [0, 1, ..., n-1].

    range(n1, n2). Establece como secuencia de valores a [n1, n1+1, ..., n2-1].

    Se puede denir a mano una secuencia entre corchetes. Por ejemplo,

    for x in [1, 3, 9, 27]:print x*x

    imprimir los cuadrados de los nmeros 1, 3, 9 y 27.

    2.7. Una gua para el diseo

    En su artculo How to program it, Simon Thompson plantea algunas preguntas a susalumnos que son muy tiles para la etapa de diseo:

    Han visto este problema antes, aunque sea de manera ligeramente diferente?

    Conocen un problema relacionado? Conocen un programa que puede ser til?

    Fjense en la especicacin. Traten de encontrar un problema que les resulte familiar yque tenga la misma especicacin o una parecida.

    Ac hay un problema relacionado con el que ustedes tienen y que ya fue resuelto. Lopueden usar? Pueden usar sus resultados? Pueden usar sus mtodos? Pueden agre-garle alguna parte auxiliar a ese programa del que ya disponen?

    Si no pueden resolver el problema propuesto, traten de resolver uno relacionado. Pue-den imaginarse uno relacionado que sea ms fcil de resolver? Uno ms general? Unoms especco? Un problema anlogo?

    Pueden resolver una parte del problema? Pueden sacar algo til de los datos de entra-da? Pueden pensar qu informacin es til para calcular las salidas? De qu manera sepueden manipular las entradas y las salidas de modo tal que estn ms cerca unas delas otras?

    Usaron todos los datos de entrada? Usaron las condiciones especiales sobre los datosde entrada que aparecen en el enunciado? Han tenido en cuenta todos los requisitos quese enuncian en la especicacin?

  • 2.8. Ejercicios 29

    2.8. Ejercicios

    Ejercicio 2.4. Escribir un ciclo denido para imprimir por pantalla todos los nmeros entre 10y 20.

    Ejercicio 2.5. Escribir un ciclo denido que salude por pantalla a sus cinco mejores amigos/as.

    Ejercicio 2.6. Escribir un programa que use un ciclo denido con rango numrico, que preguntelos nombres de sus cinco mejores amigos/as, y los salude.

    Ejercicio 2.7. Escribir un programa que use un ciclo denido con rango numrico, que preguntelos nombres de sus seis mejores amigos/as, y los salude.

    Ejercicio 2.8. Escribir un programa que use un ciclo denido con rango numrico, que averiguea cuntos amigos quieren saludar, les pregunte los nombres de esos amigos/as, y los salude.